mirror of
https://github.com/projectacrn/acrn-hypervisor.git
synced 2025-07-04 19:17:34 +00:00
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:
parent
3ba4a3b3da
commit
74438d9471
@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user