From 3956ce1596ce487e6b5ed562c3b7280be77d76d3 Mon Sep 17 00:00:00 2001 From: Junjie Mao Date: Mon, 9 Jul 2018 21:25:14 +0800 Subject: [PATCH] HV: io: spell out explicit narrowing of integers The MMIO/PIO write APIs in io.h always take a uint32_t value but may uses it as 8, 16 or 32-bit integers. This patch converts the prototypes to align with their functionality. The pointer conversion and assignment are splitted to separate statements to prevent static checkers from being confused about the underlying types. v1 -> v2: * Change the prototype of mmio-related functions, instead of keeping the explicit conversions internal. The addresses are kept void* since in most cases hva (in void*) is passed. Signed-off-by: Junjie Mao Acked-by: Eddie Dong --- hypervisor/arch/x86/pm.c | 8 ++-- hypervisor/common/all_header.c | 68 ++++++++++++++++++++++++++++++++ hypervisor/include/arch/x86/io.h | 44 ++++++++++++--------- 3 files changed, 99 insertions(+), 21 deletions(-) create mode 100644 hypervisor/common/all_header.c diff --git a/hypervisor/arch/x86/pm.c b/hypervisor/arch/x86/pm.c index 8726de87a..08edcaacf 100644 --- a/hypervisor/arch/x86/pm.c +++ b/hypervisor/arch/x86/pm.c @@ -20,10 +20,12 @@ void restore_msrs(void) static void acpi_gas_write(struct acpi_generic_address *gas, uint32_t val) { + uint16_t val16 = (uint16_t)val; + if (gas->space_id == SPACE_SYSTEM_MEMORY) - mmio_write_word(val, (void *)HPA2HVA(gas->address)); + mmio_write_word(val16, HPA2HVA(gas->address)); else - io_write_word(val, gas->address); + io_write_word(val16, gas->address); } static uint32_t acpi_gas_read(struct acpi_generic_address *gas) @@ -31,7 +33,7 @@ static uint32_t acpi_gas_read(struct acpi_generic_address *gas) uint32_t ret = 0; if (gas->space_id == SPACE_SYSTEM_MEMORY) - ret = mmio_read_word((void *)HPA2HVA(gas->address)); + ret = mmio_read_word(HPA2HVA(gas->address)); else ret = io_read_word(gas->address); diff --git a/hypervisor/common/all_header.c b/hypervisor/common/all_header.c new file mode 100644 index 000000000..85bf977d2 --- /dev/null +++ b/hypervisor/common/all_header.c @@ -0,0 +1,68 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include diff --git a/hypervisor/include/arch/x86/io.h b/hypervisor/include/arch/x86/io.h index 69678d25f..8e716e0f5 100644 --- a/hypervisor/include/arch/x86/io.h +++ b/hypervisor/include/arch/x86/io.h @@ -7,6 +7,8 @@ #ifndef IO_H #define IO_H +#include + /* Definition of a IO port range */ struct vm_io_range { uint16_t base; /* IO port base */ @@ -61,19 +63,19 @@ static inline uint32_t io_read_long(uint16_t port) static inline void io_write(uint32_t v, uint16_t addr, size_t sz) { - if (sz == 1) - io_write_byte(v, addr); - else if (sz == 2) - io_write_word(v, addr); + if (sz == 1U) + io_write_byte((uint8_t)v, addr); + else if (sz == 2U) + io_write_word((uint16_t)v, addr); else io_write_long(v, addr); } static inline uint32_t io_read(uint16_t addr, size_t sz) { - if (sz == 1) + if (sz == 1U) return io_read_byte(addr); - if (sz == 2) + if (sz == 2U) return io_read_word(addr); return io_read_long(addr); } @@ -159,7 +161,8 @@ int dm_emulate_pio_post(struct vcpu *vcpu); */ static inline void mmio_write_long(uint32_t value, void *addr) { - *((volatile int32_t *)addr) = value; + volatile uint32_t *addr32 = (volatile uint32_t *)addr; + *addr32 = value; } /** Writes a 16 bit value to a memory mapped IO device. @@ -167,9 +170,10 @@ static inline void mmio_write_long(uint32_t value, void *addr) * @param value The 16 bit value to write. * @param addr The memory address to write to. */ -static inline void mmio_write_word(uint32_t value, void *addr) +static inline void mmio_write_word(uint16_t value, void *addr) { - *((volatile uint16_t *)addr) = value; + volatile uint16_t *addr16 = (volatile uint16_t *)addr; + *addr16 = value; } /** Writes an 8 bit value to a memory mapped IO device. @@ -177,9 +181,10 @@ static inline void mmio_write_word(uint32_t value, void *addr) * @param value The 8 bit value to write. * @param addr The memory address to write to. */ -static inline void mmio_write_byte(uint32_t value, void *addr) +static inline void mmio_write_byte(uint8_t value, void *addr) { - *((volatile uint8_t *)addr) = value; + volatile uint8_t *addr8 = (volatile uint8_t *)addr; + *addr8 = value; } /** Reads a 32 bit value from a memory mapped IO device. @@ -223,7 +228,8 @@ static inline uint8_t mmio_read_byte(void *addr) */ static inline void __mmio_write_long(uint32_t value, void *addr) { - *((volatile uint32_t *)addr) = value; + volatile uint32_t *addr32 = (volatile uint32_t *)addr; + *addr32 = value; } /** Writes a 16 bit value to a memory mapped IO device (ROM code version). @@ -231,9 +237,10 @@ static inline void __mmio_write_long(uint32_t value, void *addr) * @param value The 16 bit value to write. * @param addr The memory address to write to. */ -static inline void __mmio_write_word(uint32_t value, void *addr) +static inline void __mmio_write_word(uint16_t value, void *addr) { - *((volatile uint16_t *)addr) = value; + volatile uint16_t *addr16 = (volatile uint16_t *)addr; + *addr16 = value; } /** Writes an 8 bit value to a memory mapped IO device (ROM code version). @@ -241,9 +248,10 @@ static inline void __mmio_write_word(uint32_t value, void *addr) * @param value The 8 bit value to write. * @param addr The memory address to write to. */ -static inline void __mmio_write_byte(uint32_t value, void *addr) +static inline void __mmio_write_byte(uint8_t value, void *addr) { - *((volatile uint8_t *)addr) = value; + volatile uint8_t *addr8 = (volatile uint8_t *)addr; + *addr8 = value; } /** Reads a 32 bit value from a memory mapped IO device (ROM code version). @@ -299,7 +307,7 @@ static inline void setl(void *addr, uint32_t mask, uint32_t value) * @param mask The mask to apply to the value read. * @param value The 16 bit value to write. */ -static inline void setw(void *addr, uint32_t mask, uint32_t value) +static inline void setw(void *addr, uint16_t mask, uint16_t value) { mmio_write_word((mmio_read_word(addr) & ~mask) | value, addr); } @@ -311,7 +319,7 @@ static inline void setw(void *addr, uint32_t mask, uint32_t value) * @param mask The mask to apply to the value read. * @param value The 8 bit value to write. */ -static inline void setb(void *addr, uint32_t mask, uint32_t value) +static inline void setb(void *addr, uint8_t mask, uint8_t value) { mmio_write_byte((mmio_read_byte(addr) & ~mask) | value, addr); }