]> xenbits.xensource.com Git - people/dariof/xen.git/commitdiff
VT-d: return full destination ID for IO-APIC reads
authorJan Beulich <jbeulich@suse.com>
Wed, 3 Apr 2019 08:15:54 +0000 (10:15 +0200)
committerJan Beulich <jbeulich@suse.com>
Wed, 3 Apr 2019 08:15:54 +0000 (10:15 +0200)
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 <jbeulich@suse.com>
Acked-by: Andrew Cooper <andrew.cooper3@citrix.com>
Acked-by: Kevin Tian <kevin.tian@intel.com>
xen/drivers/passthrough/vtd/intremap.c

index 1d198560918eed11bfa1645eb8cba8bc1d3a14bd..09f15a51d8d8856714d23a20864e925378083c26 100644 (file)
@@ -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);