All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] Fixing ioapic write order in io_apic_write_remap_rte
@ 2010-08-09  3:18 Han, Weidong
  2010-08-09  8:26 ` Jan Beulich
  0 siblings, 1 reply; 3+ messages in thread
From: Han, Weidong @ 2010-08-09  3:18 UTC (permalink / raw)
  To: Xen-devel; +Cc: Jiang, Yunhong, Kay, Allen M, Keir Fraser

[-- Attachment #1: Type: text/plain, Size: 1091 bytes --]

At the end of io_apic_write_remap_rte, it writes new entry (remapped interrupt) to ioapic. But it writes low 32 bits before high 32 bits, it unmasks interrupt before writing high 32 bits if 'mask' bit in low 32 bits is cleared. Thus it may result in issues. This patch fixes this issue by writing high 32 bits before low 32 bits. 

Signed-off-by: Jiang, Yunhong <yunhong.jiang@intel.com>
Signed-off-by: Weidong Han <weidong.han@intel.com>

diff -r 6c18aa5a848e xen/drivers/passthrough/vtd/intremap.c
--- a/xen/drivers/passthrough/vtd/intremap.c	Mon Aug 02 12:49:12 2010 -0400
+++ b/xen/drivers/passthrough/vtd/intremap.c	Fri Aug 06 11:47:03 2010 -0400
@@ -444,10 +444,10 @@ void io_apic_write_remap_rte(
     }
 
     /* write new entry to ioapic */
+    *IO_APIC_BASE(apic) = reg + 1;
+    *(IO_APIC_BASE(apic)+4) = *(((u32 *)&old_rte)+1);
     *IO_APIC_BASE(apic) = reg;
     *(IO_APIC_BASE(apic)+4) = *(((u32 *)&old_rte)+0);
-    *IO_APIC_BASE(apic) = reg + 1;
-    *(IO_APIC_BASE(apic)+4) = *(((u32 *)&old_rte)+1);
 }
 
 #if defined(__i386__) || defined(__x86_64__)

[-- Attachment #2: fix-IR-write.patch --]
[-- Type: application/octet-stream, Size: 630 bytes --]

diff -r 6c18aa5a848e xen/drivers/passthrough/vtd/intremap.c
--- a/xen/drivers/passthrough/vtd/intremap.c	Mon Aug 02 12:49:12 2010 -0400
+++ b/xen/drivers/passthrough/vtd/intremap.c	Fri Aug 06 11:47:03 2010 -0400
@@ -444,10 +444,10 @@ void io_apic_write_remap_rte(
     }
 
     /* write new entry to ioapic */
+    *IO_APIC_BASE(apic) = reg + 1;
+    *(IO_APIC_BASE(apic)+4) = *(((u32 *)&old_rte)+1);
     *IO_APIC_BASE(apic) = reg;
     *(IO_APIC_BASE(apic)+4) = *(((u32 *)&old_rte)+0);
-    *IO_APIC_BASE(apic) = reg + 1;
-    *(IO_APIC_BASE(apic)+4) = *(((u32 *)&old_rte)+1);
 }
 
 #if defined(__i386__) || defined(__x86_64__)

[-- Attachment #3: Type: text/plain, Size: 138 bytes --]

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2010-08-09  8:49 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-08-09  3:18 [PATCH] Fixing ioapic write order in io_apic_write_remap_rte Han, Weidong
2010-08-09  8:26 ` Jan Beulich
2010-08-09  8:49   ` Weidong Han

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.