From 24469e6a383e32edfb1000550b4a6dcd6416a994 Mon Sep 17 00:00:00 2001 From: Jan Beulich Date: Wed, 3 Apr 2019 10:15:54 +0200 Subject: [PATCH] VT-d: return full destination ID for IO-APIC reads In x2APIC mode it is 32 bits wide. Not having returned the full value was mostly benign: We never modify the ID based on its original value; full new values get written at all times. It was "just" debug logging which ended up wrong this way (and which will need adjustment itself as well, to also consume the full value). Signed-off-by: Jan Beulich Acked-by: Andrew Cooper Acked-by: Kevin Tian --- xen/drivers/passthrough/vtd/intremap.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/xen/drivers/passthrough/vtd/intremap.c b/xen/drivers/passthrough/vtd/intremap.c index 1d19856091..09f15a51d8 100644 --- a/xen/drivers/passthrough/vtd/intremap.c +++ b/xen/drivers/passthrough/vtd/intremap.c @@ -314,8 +314,13 @@ static int remap_entry_to_ioapic_rte( old_rte->dest_mode = iremap_entry->remap.dm; old_rte->trigger = iremap_entry->remap.tm; old_rte->__reserved_2 = 0; - old_rte->dest.logical.__reserved_1 = 0; - old_rte->dest.logical.logical_dest = iremap_entry->remap.dst >> 8; + if ( x2apic_enabled ) + old_rte->dest.dest32 = iremap_entry->remap.dst; + else + { + old_rte->dest.logical.__reserved_1 = 0; + old_rte->dest.logical.logical_dest = iremap_entry->remap.dst >> 8; + } unmap_vtd_domain_page(iremap_entries); spin_unlock_irqrestore(&ir_ctrl->iremap_lock, flags); -- 2.30.2