From: Andrew Cooper Date: Fri, 13 Apr 2018 18:37:21 +0000 (+0100) Subject: x86/io-apic: Fix 64bit MMIO accesses X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=10bd4aec5dfd0b572269a6ba359bbf798bc98c8c;p=people%2Fandrewcoop%2Fxen-test-framework.git x86/io-apic: Fix 64bit MMIO accesses 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 --- diff --git a/arch/x86/include/arch/io-apic.h b/arch/x86/include/arch/io-apic.h index ec88865..400445c 100644 --- a/arch/x86/include/arch/io-apic.h +++ b/arch/x86/include/arch/io-apic.h @@ -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 */