Skip to content

Commit 3956ce1

Browse files
junjiemao1lijinxia
authored andcommitted
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 <junjie.mao@intel.com> Acked-by: Eddie Dong <eddie.dong@intel.com>
1 parent 0f777d3 commit 3956ce1

File tree

3 files changed

+99
-21
lines changed

3 files changed

+99
-21
lines changed

hypervisor/arch/x86/pm.c

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,18 +20,20 @@ void restore_msrs(void)
2020

2121
static void acpi_gas_write(struct acpi_generic_address *gas, uint32_t val)
2222
{
23+
uint16_t val16 = (uint16_t)val;
24+
2325
if (gas->space_id == SPACE_SYSTEM_MEMORY)
24-
mmio_write_word(val, (void *)HPA2HVA(gas->address));
26+
mmio_write_word(val16, HPA2HVA(gas->address));
2527
else
26-
io_write_word(val, gas->address);
28+
io_write_word(val16, gas->address);
2729
}
2830

2931
static uint32_t acpi_gas_read(struct acpi_generic_address *gas)
3032
{
3133
uint32_t ret = 0;
3234

3335
if (gas->space_id == SPACE_SYSTEM_MEMORY)
34-
ret = mmio_read_word((void *)HPA2HVA(gas->address));
36+
ret = mmio_read_word(HPA2HVA(gas->address));
3537
else
3638
ret = io_read_word(gas->address);
3739

hypervisor/common/all_header.c

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
#include <hypervisor.h>
2+
#include <lib/stdarg.h>
3+
#include <lib/util.h>
4+
#include <lib/list.h>
5+
#include <lib/macros.h>
6+
#include <lib/rtl.h>
7+
#include <lib/spinlock.h>
8+
#include <lib/atomic.h>
9+
#include <lib/types.h>
10+
#include <lib/errno.h>
11+
#include <lib/bits.h>
12+
#include <lib/crypto/hkdf.h>
13+
#include <lib/sprintf.h>
14+
#include <lib/mem_mgt.h>
15+
#include <hv_debug.h>
16+
#include <common/acrn_efi.h>
17+
#include <common/schedule.h>
18+
#include <common/irq.h>
19+
#include <common/ptdev.h>
20+
#include <common/hypercall.h>
21+
#include <debug/console.h>
22+
#include <debug/printf.h>
23+
#include <debug/serial.h>
24+
#include <debug/dump.h>
25+
#include <debug/vuart.h>
26+
#include <debug/trace.h>
27+
#include <debug/assert.h>
28+
#include <debug/sbuf.h>
29+
#include <debug/shell.h>
30+
#include <debug/logmsg.h>
31+
#include <hv_lib.h>
32+
#include <public/acrn_common.h>
33+
#include <public/acrn_hv_defs.h>
34+
#include <arch/x86/softirq.h>
35+
#include <arch/x86/vmexit.h>
36+
#include <arch/x86/msr.h>
37+
#include <arch/x86/ioapic.h>
38+
#include <arch/x86/cpuid.h>
39+
#include <arch/x86/multiboot.h>
40+
#include <arch/x86/per_cpu.h>
41+
#include <arch/x86/vtd.h>
42+
#include <arch/x86/vmx.h>
43+
#include <arch/x86/hv_arch.h>
44+
#include <arch/x86/lapic.h>
45+
#include <arch/x86/apicreg.h>
46+
#include <arch/x86/zeropage.h>
47+
#include <arch/x86/host_pm.h>
48+
#include <arch/x86/timer.h>
49+
#include <arch/x86/cpu.h>
50+
#include <arch/x86/mtrr.h>
51+
#include <arch/x86/assign.h>
52+
#include <arch/x86/hob_parse.h>
53+
#include <arch/x86/gdt.h>
54+
#include <arch/x86/mmu.h>
55+
#include <arch/x86/idt.h>
56+
#include <arch/x86/io.h>
57+
#include <arch/x86/cpufeatures.h>
58+
#include <arch/x86/trusty.h>
59+
#include <arch/x86/irq.h>
60+
#include <arch/x86/guest/guest_pm.h>
61+
#include <arch/x86/guest/vlapic.h>
62+
#include <arch/x86/guest/vm.h>
63+
#include <arch/x86/guest/vioapic.h>
64+
#include <arch/x86/guest/ucode.h>
65+
#include <arch/x86/guest/vpic.h>
66+
#include <arch/x86/guest/vcpu.h>
67+
#include <arch/x86/guest/guest.h>
68+
#include <arch/x86/reboot.h>

hypervisor/include/arch/x86/io.h

Lines changed: 26 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
#ifndef IO_H
88
#define IO_H
99

10+
#include <types.h>
11+
1012
/* Definition of a IO port range */
1113
struct vm_io_range {
1214
uint16_t base; /* IO port base */
@@ -61,19 +63,19 @@ static inline uint32_t io_read_long(uint16_t port)
6163

6264
static inline void io_write(uint32_t v, uint16_t addr, size_t sz)
6365
{
64-
if (sz == 1)
65-
io_write_byte(v, addr);
66-
else if (sz == 2)
67-
io_write_word(v, addr);
66+
if (sz == 1U)
67+
io_write_byte((uint8_t)v, addr);
68+
else if (sz == 2U)
69+
io_write_word((uint16_t)v, addr);
6870
else
6971
io_write_long(v, addr);
7072
}
7173

7274
static inline uint32_t io_read(uint16_t addr, size_t sz)
7375
{
74-
if (sz == 1)
76+
if (sz == 1U)
7577
return io_read_byte(addr);
76-
if (sz == 2)
78+
if (sz == 2U)
7779
return io_read_word(addr);
7880
return io_read_long(addr);
7981
}
@@ -159,27 +161,30 @@ int dm_emulate_pio_post(struct vcpu *vcpu);
159161
*/
160162
static inline void mmio_write_long(uint32_t value, void *addr)
161163
{
162-
*((volatile int32_t *)addr) = value;
164+
volatile uint32_t *addr32 = (volatile uint32_t *)addr;
165+
*addr32 = value;
163166
}
164167

165168
/** Writes a 16 bit value to a memory mapped IO device.
166169
*
167170
* @param value The 16 bit value to write.
168171
* @param addr The memory address to write to.
169172
*/
170-
static inline void mmio_write_word(uint32_t value, void *addr)
173+
static inline void mmio_write_word(uint16_t value, void *addr)
171174
{
172-
*((volatile uint16_t *)addr) = value;
175+
volatile uint16_t *addr16 = (volatile uint16_t *)addr;
176+
*addr16 = value;
173177
}
174178

175179
/** Writes an 8 bit value to a memory mapped IO device.
176180
*
177181
* @param value The 8 bit value to write.
178182
* @param addr The memory address to write to.
179183
*/
180-
static inline void mmio_write_byte(uint32_t value, void *addr)
184+
static inline void mmio_write_byte(uint8_t value, void *addr)
181185
{
182-
*((volatile uint8_t *)addr) = value;
186+
volatile uint8_t *addr8 = (volatile uint8_t *)addr;
187+
*addr8 = value;
183188
}
184189

185190
/** Reads a 32 bit value from a memory mapped IO device.
@@ -223,27 +228,30 @@ static inline uint8_t mmio_read_byte(void *addr)
223228
*/
224229
static inline void __mmio_write_long(uint32_t value, void *addr)
225230
{
226-
*((volatile uint32_t *)addr) = value;
231+
volatile uint32_t *addr32 = (volatile uint32_t *)addr;
232+
*addr32 = value;
227233
}
228234

229235
/** Writes a 16 bit value to a memory mapped IO device (ROM code version).
230236
*
231237
* @param value The 16 bit value to write.
232238
* @param addr The memory address to write to.
233239
*/
234-
static inline void __mmio_write_word(uint32_t value, void *addr)
240+
static inline void __mmio_write_word(uint16_t value, void *addr)
235241
{
236-
*((volatile uint16_t *)addr) = value;
242+
volatile uint16_t *addr16 = (volatile uint16_t *)addr;
243+
*addr16 = value;
237244
}
238245

239246
/** Writes an 8 bit value to a memory mapped IO device (ROM code version).
240247
*
241248
* @param value The 8 bit value to write.
242249
* @param addr The memory address to write to.
243250
*/
244-
static inline void __mmio_write_byte(uint32_t value, void *addr)
251+
static inline void __mmio_write_byte(uint8_t value, void *addr)
245252
{
246-
*((volatile uint8_t *)addr) = value;
253+
volatile uint8_t *addr8 = (volatile uint8_t *)addr;
254+
*addr8 = value;
247255
}
248256

249257
/** 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)
299307
* @param mask The mask to apply to the value read.
300308
* @param value The 16 bit value to write.
301309
*/
302-
static inline void setw(void *addr, uint32_t mask, uint32_t value)
310+
static inline void setw(void *addr, uint16_t mask, uint16_t value)
303311
{
304312
mmio_write_word((mmio_read_word(addr) & ~mask) | value, addr);
305313
}
@@ -311,7 +319,7 @@ static inline void setw(void *addr, uint32_t mask, uint32_t value)
311319
* @param mask The mask to apply to the value read.
312320
* @param value The 8 bit value to write.
313321
*/
314-
static inline void setb(void *addr, uint32_t mask, uint32_t value)
322+
static inline void setb(void *addr, uint8_t mask, uint8_t value)
315323
{
316324
mmio_write_byte((mmio_read_byte(addr) & ~mask) | value, addr);
317325
}

0 commit comments

Comments
 (0)