Skip to content

Commit

Permalink
HV: Add the volatile to avoid optimization for mmio_read/write access
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
yakuizhao authored and jren1 committed May 15, 2018
1 parent 2473970 commit 6b4ad0b
Showing 1 changed file with 12 additions and 12 deletions.
24 changes: 12 additions & 12 deletions hypervisor/include/arch/x86/io.h
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand All @@ -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.
Expand All @@ -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.
Expand All @@ -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.
Expand All @@ -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.
Expand All @@ -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);
}


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


Expand Down

0 comments on commit 6b4ad0b

Please sign in to comment.