]> xenbits.xensource.com Git - people/andrewcoop/xen-test-framework.git/commitdiff
x86/io-apic: Fix 64bit MMIO accesses
authorAndrew Cooper <andrew.cooper3@citrix.com>
Fri, 13 Apr 2018 18:37:21 +0000 (19:37 +0100)
committerAndrew Cooper <andrew.cooper3@citrix.com>
Fri, 13 Apr 2018 18:37:21 +0000 (19:37 +0100)
While most of the IO-APIC registers are 64 bits wide, the spec states that
they must be accessed with 32bit accesses.

Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
arch/x86/include/arch/io-apic.h

index ec888659db0a4117a388e0591a6214be511d3901..400445c7facdeb0f574f85cef3b85371d45a068f 100644 (file)
@@ -37,9 +37,7 @@ static inline uint32_t ioapic_read32(unsigned int reg)
 
 static inline uint64_t ioapic_read64(unsigned int reg)
 {
-    *(volatile uint64_t *)_p(IOAPIC_DEFAULT_BASE + IOAPIC_REGSEL) = reg;
-
-    return *(volatile uint64_t *)_p(IOAPIC_DEFAULT_BASE + IOAPIC_IOWIN);
+    return ioapic_read32(reg) | (uint64_t)ioapic_read32(reg + 1) << 32;
 }
 
 static inline void ioapic_write32(unsigned int reg, uint32_t val)
@@ -50,8 +48,8 @@ static inline void ioapic_write32(unsigned int reg, uint32_t val)
 
 static inline void ioapic_write64(unsigned int reg, uint64_t val)
 {
-    *(volatile uint64_t *)_p(IOAPIC_DEFAULT_BASE + IOAPIC_REGSEL) = reg;
-    *(volatile uint64_t *)_p(IOAPIC_DEFAULT_BASE + IOAPIC_IOWIN) = val;
+    ioapic_write32(reg, val);
+    ioapic_write32(reg + 1, val >> 32);
 }
 
 #endif /* !XTF_X86_IO_APIC_H */