From 74438d9471217d205e90f4aba7343925db3aec7a Mon Sep 17 00:00:00 2001 From: Zhao Yakui Date: Tue, 17 Apr 2018 13:39:45 +0800 Subject: [PATCH] HV: Add the volatile to avoid optimization for mmio_read/write access If subsequent write is on the same address, maybe the compiler will optimize the access of MMIO memory and only the last write takes effect.In such case it is wrong. For example: mmio_write_long(0x25, addr); mmio_write_long(0x26, addr); mmio_write_long(0x27, addr); After volatile is added, it can avoid the above possible optimization and assure that each write takes effect. Signed-off-by: Zhao Yakui Acked-by: Anthony Xu Acked-by: Eddie Dong --- include/arch/x86/io.h | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/include/arch/x86/io.h b/include/arch/x86/io.h index 30c5be4ef..0dbf9c0c5 100644 --- a/include/arch/x86/io.h +++ b/include/arch/x86/io.h @@ -182,7 +182,7 @@ int dm_emulate_pio_post(struct vcpu *vcpu); */ static inline void mmio_write_long(uint32_t value, void *addr) { - *((uint32_t *)addr) = value; + *((volatile int32_t *)addr) = value; } /** Writes a 16 bit value to a memory mapped IO device. @@ -192,7 +192,7 @@ static inline void mmio_write_long(uint32_t value, void *addr) */ static inline void mmio_write_word(uint32_t value, void *addr) { - *((uint16_t *)addr) = value; + *((volatile uint16_t *)addr) = value; } /** Writes an 8 bit value to a memory mapped IO device. @@ -202,7 +202,7 @@ static inline void mmio_write_word(uint32_t value, void *addr) */ static inline void mmio_write_byte(uint32_t value, void *addr) { - *((uint8_t *)addr) = value; + *((volatile uint8_t *)addr) = value; } /** Reads a 32 bit value from a memory mapped IO device. @@ -213,7 +213,7 @@ static inline void mmio_write_byte(uint32_t value, void *addr) */ static inline uint32_t mmio_read_long(void *addr) { - return *((uint32_t *)addr); + return *((volatile uint32_t *)addr); } /** Reads a 16 bit value from a memory mapped IO device. @@ -224,7 +224,7 @@ static inline uint32_t mmio_read_long(void *addr) */ static inline uint16_t mmio_read_word(void *addr) { - return *((uint16_t *)addr); + return *((volatile uint16_t *)addr); } /** Reads an 8 bit value from a memory mapped IO device. @@ -235,7 +235,7 @@ static inline uint16_t mmio_read_word(void *addr) */ static inline uint8_t mmio_read_byte(void *addr) { - return *((uint8_t *)addr); + return *((volatile uint8_t *)addr); } @@ -246,7 +246,7 @@ static inline uint8_t mmio_read_byte(void *addr) */ static inline void __mmio_write_long(uint32_t value, void *addr) { - *((uint32_t *)addr) = value; + *((volatile uint32_t *)addr) = value; } /** Writes a 16 bit value to a memory mapped IO device (ROM code version). @@ -256,7 +256,7 @@ static inline void __mmio_write_long(uint32_t value, void *addr) */ static inline void __mmio_write_word(uint32_t value, void *addr) { - *((uint16_t *)addr) = value; + *((volatile uint16_t *)addr) = value; } /** Writes an 8 bit value to a memory mapped IO device (ROM code version). @@ -266,7 +266,7 @@ static inline void __mmio_write_word(uint32_t value, void *addr) */ static inline void __mmio_write_byte(uint32_t value, void *addr) { - *((uint8_t *)addr) = value; + *((volatile uint8_t *)addr) = value; } /** Reads a 32 bit value from a memory mapped IO device (ROM code version). @@ -277,7 +277,7 @@ static inline void __mmio_write_byte(uint32_t value, void *addr) */ static inline uint32_t __mmio_read_long(void *addr) { - return *((uint32_t *)addr); + return *((volatile uint32_t *)addr); } /** Reads a 16 bit value from a memory mapped IO device (ROM code version). @@ -288,7 +288,7 @@ static inline uint32_t __mmio_read_long(void *addr) */ static inline uint16_t __mmio_read_word(void *addr) { - return *((uint16_t *)addr); + return *((volatile uint16_t *)addr); } /** Reads an 8 bit value from a memory mapped IO device (ROM code version). @@ -299,7 +299,7 @@ static inline uint16_t __mmio_read_word(void *addr) */ static inline uint8_t __mmio_read_byte(void *addr) { - return *((uint8_t *)addr); + return *((volatile uint8_t *)addr); }