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 <yakui.zhao@intel.com>
Acked-by: Anthony Xu <anthony.xu@intel.com>
Acked-by: Eddie Dong <eddie.dong@intel.com>
This commit is contained in:
Zhao Yakui 2018-04-17 13:39:45 +08:00 committed by lijinxia
parent 3ba4a3b3da
commit 74438d9471

View File

@ -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);
}