diff --git a/hypervisor/acpi_parser/dmar_parse.c b/hypervisor/acpi_parser/dmar_parse.c index c2b30b556..3f9e3d254 100644 --- a/hypervisor/acpi_parser/dmar_parse.c +++ b/hypervisor/acpi_parser/dmar_parse.c @@ -6,7 +6,7 @@ #include #include -#include +#include #include #include #include diff --git a/hypervisor/arch/x86/guest/pm.c b/hypervisor/arch/x86/guest/pm.c index 4009541fd..c788f4b8b 100644 --- a/hypervisor/arch/x86/guest/pm.c +++ b/hypervisor/arch/x86/guest/pm.c @@ -7,7 +7,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/hypervisor/arch/x86/guest/vm_reset.c b/hypervisor/arch/x86/guest/vm_reset.c index d0138735a..ff27b2f91 100644 --- a/hypervisor/arch/x86/guest/vm_reset.c +++ b/hypervisor/arch/x86/guest/vm_reset.c @@ -5,7 +5,7 @@ */ #include -#include +#include #include #include #include diff --git a/hypervisor/arch/x86/ioapic.c b/hypervisor/arch/x86/ioapic.c index d6ad71c8e..20ca19b8c 100644 --- a/hypervisor/arch/x86/ioapic.c +++ b/hypervisor/arch/x86/ioapic.c @@ -12,7 +12,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/hypervisor/arch/x86/irq.c b/hypervisor/arch/x86/irq.c index 0726ade64..0beb93cb8 100644 --- a/hypervisor/arch/x86/irq.c +++ b/hypervisor/arch/x86/irq.c @@ -8,7 +8,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/hypervisor/arch/x86/pm.c b/hypervisor/arch/x86/pm.c index 1eb5569f0..93c391a3c 100644 --- a/hypervisor/arch/x86/pm.c +++ b/hypervisor/arch/x86/pm.c @@ -7,7 +7,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/hypervisor/arch/x86/tsc.c b/hypervisor/arch/x86/tsc.c index 25a2be766..52f8408d3 100644 --- a/hypervisor/arch/x86/tsc.c +++ b/hypervisor/arch/x86/tsc.c @@ -8,7 +8,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/hypervisor/arch/x86/vtd.c b/hypervisor/arch/x86/vtd.c index 8ec97f202..5f69a68d1 100644 --- a/hypervisor/arch/x86/vtd.c +++ b/hypervisor/arch/x86/vtd.c @@ -13,7 +13,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/hypervisor/debug/npk_log.c b/hypervisor/debug/npk_log.c index 617eea4cd..8037c0af4 100644 --- a/hypervisor/debug/npk_log.c +++ b/hypervisor/debug/npk_log.c @@ -6,8 +6,8 @@ #include #include #include -#include #include +#include #include #include #include diff --git a/hypervisor/debug/uart16550.c b/hypervisor/debug/uart16550.c index 5f393dc8b..79b549bcb 100644 --- a/hypervisor/debug/uart16550.c +++ b/hypervisor/debug/uart16550.c @@ -8,7 +8,7 @@ #include #include #include -#include +#include #include #include diff --git a/hypervisor/dm/vgpio.c b/hypervisor/dm/vgpio.c index efdf3ad22..f83d6f372 100644 --- a/hypervisor/dm/vgpio.c +++ b/hypervisor/dm/vgpio.c @@ -41,7 +41,7 @@ #include #include #include -#include +#include #include #ifdef P2SB_VGPIO_DM_ENABLED diff --git a/hypervisor/dm/vpci/pci_pt.c b/hypervisor/dm/vpci/pci_pt.c index e28104030..70f41a808 100644 --- a/hypervisor/dm/vpci/pci_pt.c +++ b/hypervisor/dm/vpci/pci_pt.c @@ -32,7 +32,7 @@ #include #include #include -#include +#include #include #include #include "vpci_priv.h" diff --git a/hypervisor/dm/vpci/vmsix.c b/hypervisor/dm/vpci/vmsix.c index e39c3818a..a08c601fd 100644 --- a/hypervisor/dm/vpci/vmsix.c +++ b/hypervisor/dm/vpci/vmsix.c @@ -27,7 +27,7 @@ */ #include -#include +#include #include #include #include diff --git a/hypervisor/dm/vpci/vpci.c b/hypervisor/dm/vpci/vpci.c index daa0db799..783976493 100644 --- a/hypervisor/dm/vpci/vpci.c +++ b/hypervisor/dm/vpci/vpci.c @@ -30,7 +30,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/hypervisor/dm/vrtc.c b/hypervisor/dm/vrtc.c index fd5c747be..2e408913c 100644 --- a/hypervisor/dm/vrtc.c +++ b/hypervisor/dm/vrtc.c @@ -26,7 +26,7 @@ */ #include -#include +#include #include #include #include @@ -822,4 +822,4 @@ void vrtc_init(struct acrn_vm *vm) /** * @} - */ \ No newline at end of file + */ diff --git a/hypervisor/hw/pci.c b/hypervisor/hw/pci.c index d5cd83283..9b1bfede1 100644 --- a/hypervisor/hw/pci.c +++ b/hypervisor/hw/pci.c @@ -32,7 +32,7 @@ */ #include #include -#include +#include #include #include #include diff --git a/hypervisor/include/arch/x86/asm/io.h b/hypervisor/include/arch/x86/asm/io.h index 9bf1f62ce..9bcd7d998 100644 --- a/hypervisor/include/arch/x86/asm/io.h +++ b/hypervisor/include/arch/x86/asm/io.h @@ -1,25 +1,26 @@ /* - * Copyright (C) 2018-2022 Intel Corporation. + * Copyright (C) 2018-2025 Intel Corporation. * * SPDX-License-Identifier: BSD-3-Clause */ -#ifndef IO_H -#define IO_H +#ifndef X86_IO_H +#define X86_IO_H #include +#define HAS_ARCH_PIO /* X86 architecture only supports 16 bits IO space */ #define IO_SPACE_BITMASK 0xffffU /* Write 1 byte to specified I/O port */ -static inline void pio_write8(uint8_t value, uint16_t port) +static inline void arch_pio_write8(uint8_t value, uint16_t port) { asm volatile ("outb %0,%1"::"a" (value), "dN"(port)); } /* Read 1 byte from specified I/O port */ -static inline uint8_t pio_read8(uint16_t port) +static inline uint8_t arch_pio_read8(uint16_t port) { uint8_t value; @@ -28,13 +29,13 @@ static inline uint8_t pio_read8(uint16_t port) } /* Write 2 bytes to specified I/O port */ -static inline void pio_write16(uint16_t value, uint16_t port) +static inline void arch_pio_write16(uint16_t value, uint16_t port) { asm volatile ("outw %0,%1"::"a" (value), "dN"(port)); } /* Read 2 bytes from specified I/O port */ -static inline uint16_t pio_read16(uint16_t port) +static inline uint16_t arch_pio_read16(uint16_t port) { uint16_t value; @@ -43,13 +44,13 @@ static inline uint16_t pio_read16(uint16_t port) } /* Write 4 bytes to specified I/O port */ -static inline void pio_write32(uint32_t value, uint16_t port) +static inline void arch_pio_write32(uint32_t value, uint16_t port) { asm volatile ("outl %0,%1"::"a" (value), "dN"(port)); } /* Read 4 bytes from specified I/O port */ -static inline uint32_t pio_read32(uint16_t port) +static inline uint32_t arch_pio_read32(uint16_t port) { uint32_t value; @@ -57,154 +58,4 @@ static inline uint32_t pio_read32(uint16_t port) return value; } -static inline void pio_write(uint32_t v, uint16_t addr, size_t sz) -{ - if (sz == 1U) { - pio_write8((uint8_t)v, addr); - } else if (sz == 2U) { - pio_write16((uint16_t)v, addr); - } else { - pio_write32(v, addr); - } -} - -static inline uint32_t pio_read(uint16_t addr, size_t sz) -{ - uint32_t ret; - if (sz == 1U) { - ret = pio_read8(addr); - } else if (sz == 2U) { - ret = pio_read16(addr); - } else { - ret = pio_read32(addr); - } - return ret; -} - -/** Writes a 64 bit value to a memory mapped IO device. - * - * @param value The 64 bit value to write. - * @param addr The memory address to write to. - */ -static inline void mmio_write64(uint64_t value, void *addr) -{ - volatile uint64_t *addr64 = (volatile uint64_t *)addr; - *addr64 = value; -} - -/** Writes a 32 bit value to a memory mapped IO device. - * - * @param value The 32 bit value to write. - * @param addr The memory address to write to. - */ -static inline void mmio_write32(uint32_t value, void *addr) -{ - volatile uint32_t *addr32 = (volatile uint32_t *)addr; - *addr32 = value; -} - -/** Writes a 16 bit value to a memory mapped IO device. - * - * @param value The 16 bit value to write. - * @param addr The memory address to write to. - */ -static inline void mmio_write16(uint16_t value, void *addr) -{ - volatile uint16_t *addr16 = (volatile uint16_t *)addr; - *addr16 = value; -} - -/** Writes an 8 bit value to a memory mapped IO device. - * - * @param value The 8 bit value to write. - * @param addr The memory address to write to. - */ -static inline void mmio_write8(uint8_t value, void *addr) -{ - volatile uint8_t *addr8 = (volatile uint8_t *)addr; - *addr8 = value; -} - -/** Reads a 64 bit value from a memory mapped IO device. - * - * @param addr The memory address to read from. - * - * @return The 64 bit value read from the given address. - */ -static inline uint64_t mmio_read64(const void *addr) -{ - return *((volatile const uint64_t *)addr); -} - -/** Reads a 32 bit value from a memory mapped IO device. - * - * @param addr The memory address to read from. - * - * @return The 32 bit value read from the given address. - */ -static inline uint32_t mmio_read32(const void *addr) -{ - return *((volatile const uint32_t *)addr); -} - -/** Reads a 16 bit value from a memory mapped IO device. - * - * @param addr The memory address to read from. - * - * @return The 16 bit value read from the given address. - */ -static inline uint16_t mmio_read16(const void *addr) -{ - return *((volatile const uint16_t *)addr); -} - -/** Reads an 8 bit value from a memory mapped IO device. - * - * @param addr The memory address to read from. - * - * @return The 8 bit value read from the given address. - */ -static inline uint8_t mmio_read8(const void *addr) -{ - return *((volatile const uint8_t *)addr); -} - -static inline uint64_t mmio_read(const void *addr, uint64_t sz) -{ - uint64_t val; - switch (sz) { - case 1U: - val = (uint64_t)mmio_read8(addr); - break; - case 2U: - val = (uint64_t)mmio_read16(addr); - break; - case 4U: - val = (uint64_t)mmio_read32(addr); - break; - default: - val = mmio_read64(addr); - break; - } - return val; -} - -static inline void mmio_write(void *addr, uint64_t sz, uint64_t val) -{ - switch (sz) { - case 1U: - mmio_write8((uint8_t)val, addr); - break; - case 2U: - mmio_write16((uint16_t)val, addr); - break; - case 4U: - mmio_write32((uint32_t)val, addr); - break; - default: - mmio_write64(val, addr); - break; - } -} - -#endif /* _IO_H defined */ +#endif /* X86_IO_H defined */ diff --git a/hypervisor/include/common/io.h b/hypervisor/include/common/io.h new file mode 100644 index 000000000..dc65d508d --- /dev/null +++ b/hypervisor/include/common/io.h @@ -0,0 +1,261 @@ +/* + * Copyright (C) 2025 Intel Corporation. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef IO_H +#define IO_H + +#include +#include + +#ifndef HAS_ARCH_PIO +/* Write 1 byte to specified I/O port */ +static inline void arch_pio_write8(__unused uint8_t value, __unused uint16_t port){} + +/* Read 1 byte from specified I/O port */ +static inline uint8_t arch_pio_read8(__unused uint16_t port) { return 0xffU;} + +/* Write 2 bytes to specified I/O port */ +static inline void arch_pio_write16(__unused uint16_t value, __unused uint16_t port) {} + +/* Read 2 bytes from specified I/O port */ +static inline uint16_t arch_pio_read16(__unused uint16_t port) { return 0xffffU;} + +/* Write 4 bytes to specified I/O port */ +static inline void arch_pio_write32(__unused uint32_t value, __unused uint16_t port) {} + +/* Read 4 bytes to specified I/O port */ +static inline uint32_t arch_pio_read32(__unused uint16_t port) { return 0xffffffffU;} + +/* Write 8 bytes to specified I/O port */ +static inline void arch_pio_write(__unused uint64_t v, __unused uint16_t addr, __unused size_t sz) {} + +/* Read 8 bytes to specified I/O port */ +static inline uint64_t arch_pio_read(__unused uint16_t addr, __unused size_t sz) { return 0xffffffffU;} +#endif /* HAS_ARCH_PIO */ + +#ifndef HAS_ARCH_MMIO +/** Writes a 64 bit value to a memory mapped IO device. + * + * @param value The 64 bit value to write. + * @param addr The memory address to write to. + */ +static inline void arch_mmio_write64(uint64_t value, void *addr) +{ + volatile uint64_t *addr64 = (volatile uint64_t *)addr; + *addr64 = value; +} + +/** Writes a 32 bit value to a memory mapped IO device. + * + * @param value The 32 bit value to write. + * @param addr The memory address to write to. + */ +static inline void arch_mmio_write32(uint32_t value, void *addr) +{ + volatile uint32_t *addr32 = (volatile uint32_t *)addr; + *addr32 = value; +} + +/** Writes a 16 bit value to a memory mapped IO device. + * + * @param value The 16 bit value to write. + * @param addr The memory address to write to. + */ +static inline void arch_mmio_write16(uint16_t value, void *addr) +{ + volatile uint16_t *addr16 = (volatile uint16_t *)addr; + *addr16 = value; +} + +/** Writes an 8 bit value to a memory mapped IO device. + * + * @param value The 8 bit value to write. + * @param addr The memory address to write to. + */ +static inline void arch_mmio_write8(uint8_t value, void *addr) +{ + volatile uint8_t *addr8 = (volatile uint8_t *)addr; + *addr8 = value; +} + +/** Reads a 64 bit value from a memory mapped IO device. + * + * @param addr The memory address to read from. + * + * @return The 64 bit value read from the given address. + */ +static inline uint64_t arch_mmio_read64(const void *addr) +{ + return *((volatile const uint64_t *)addr); +} + +/** Reads a 32 bit value from a memory mapped IO device. + * + * @param addr The memory address to read from. + * + * @return The 32 bit value read from the given address. + */ +static inline uint32_t arch_mmio_read32(const void *addr) +{ + return *((volatile const uint32_t *)addr); +} + +/** Reads a 16 bit value from a memory mapped IO device. + * + * @param addr The memory address to read from. + * + * @return The 16 bit value read from the given address. + */ +static inline uint16_t arch_mmio_read16(const void *addr) +{ + return *((volatile const uint16_t *)addr); +} + +/** Reads an 8 bit value from a memory mapped IO device. + * + * @param addr The memory address to read from. + * + * @return The 8 bit value read from the given address. + */ +static inline uint8_t arch_mmio_read8(const void *addr) +{ + return *((volatile const uint8_t *)addr); +} +#endif /* HAS_ARCH_MMIO */ + +static inline uint8_t mmio_read8(const void *addr) +{ + return arch_mmio_read8(addr); +} + +static inline uint16_t mmio_read16(const void *addr) +{ + return arch_mmio_read16(addr); +} + +static inline uint32_t mmio_read32(const void *addr) +{ + return arch_mmio_read32(addr); +} + +static inline uint64_t mmio_read64(const void *addr) +{ + return arch_mmio_read64(addr); +} + +static inline uint64_t mmio_read(const void *addr, uint64_t sz) +{ + uint64_t val; + switch (sz) { + case 1U: + val = (uint64_t)arch_mmio_read8(addr); + break; + case 2U: + val = (uint64_t)arch_mmio_read16(addr); + break; + case 4U: + val = (uint64_t)arch_mmio_read32(addr); + break; + default: + val = arch_mmio_read64(addr); + break; + } + return val; +} + +static inline void mmio_write8(uint8_t v, void *addr) +{ + arch_mmio_write8(v, addr); +} + +static inline void mmio_write16(uint16_t v, void *addr) +{ + arch_mmio_write16(v, addr); +} + +static inline void mmio_write32(uint32_t v, void *addr) +{ + arch_mmio_write32(v, addr); +} + +static inline void mmio_write64(uint64_t v, void *addr) +{ + arch_mmio_write64(v, addr); +} + +static inline void mmio_write(void *addr, uint64_t sz, uint64_t val) +{ + switch (sz) { + case 1U: + mmio_write8((uint8_t)val, addr); + break; + case 2U: + mmio_write16((uint16_t)val, addr); + break; + case 4U: + mmio_write32((uint32_t)val, addr); + break; + default: + mmio_write64(val, addr); + break; + } +} + +static inline void pio_write8(uint8_t v, uint16_t addr) +{ + arch_pio_write8(v, addr); +} + +static inline void pio_write16(uint16_t v, uint16_t addr) +{ + arch_pio_write16(v, addr); +} + +static inline void pio_write32(uint32_t v, uint16_t addr) +{ + arch_pio_write32(v, addr); +} + +static inline void pio_write(uint32_t v, uint16_t addr, size_t sz) +{ + if (sz == 1U) { + pio_write8((uint8_t)v, addr); + } else if (sz == 2U) { + pio_write16((uint16_t)v, addr); + } else { + pio_write32(v, addr); + } +} + +static inline uint8_t pio_read8(uint16_t addr) +{ + return arch_pio_read8(addr); +} + +static inline uint16_t pio_read16(uint16_t addr) +{ + return arch_pio_read16(addr); +} + +static inline uint32_t pio_read32(uint16_t addr) +{ + return arch_pio_read32(addr); +} + +static inline uint32_t pio_read(uint16_t addr, size_t sz) +{ + uint32_t ret; + if (sz == 1U) { + ret = pio_read8(addr); + } else if (sz == 2U) { + ret = pio_read16(addr); + } else { + ret = pio_read32(addr); + } + return ret; +} + +#endif /* IO_H defined */