diff --git a/hypervisor/dm/vuart.c b/hypervisor/dm/vuart.c index 46797d1d0..f3f21a6aa 100644 --- a/hypervisor/dm/vuart.c +++ b/hypervisor/dm/vuart.c @@ -548,31 +548,22 @@ static bool vuart_read(struct acrn_vcpu *vcpu, uint16_t offset_arg, __unused siz } /* - * @pre: vuart_idx = 0 or 1 + * @pre: vuart_idx < MAX_VUART_NUM_PER_VM */ static bool vuart_register_io_handler(struct acrn_vm *vm, uint16_t port_base, uint32_t vuart_idx) { - uint32_t pio_idx; bool ret = true; struct vm_io_range range = { .base = port_base, .len = 8U }; - switch (vuart_idx) { - case 0U: - pio_idx = UART_PIO_IDX0; - break; - case 1U: - pio_idx = UART_PIO_IDX1; - break; - default: + if (vuart_idx < MAX_VUART_NUM_PER_VM) { + register_pio_emulation_handler(vm, UART_PIO_IDX0 + vuart_idx, &range, vuart_read, vuart_write); + } else { printf("Not support vuart index %d, will not register \n", vuart_idx); ret = false; } - if (ret != 0U) { - register_pio_emulation_handler(vm, pio_idx, &range, vuart_read, vuart_write); - } return ret; } diff --git a/hypervisor/include/arch/x86/asm/guest/vmx_io.h b/hypervisor/include/arch/x86/asm/guest/vmx_io.h index aceff2a94..de2699edf 100644 --- a/hypervisor/include/arch/x86/asm/guest/vmx_io.h +++ b/hypervisor/include/arch/x86/asm/guest/vmx_io.h @@ -15,10 +15,9 @@ #define PIC_ELC_PIO_IDX (PIC_SECONDARY_PIO_IDX + 1U) #define PCI_CFGADDR_PIO_IDX (PIC_ELC_PIO_IDX + 1U) #define PCI_CFGDATA_PIO_IDX (PCI_CFGADDR_PIO_IDX + 1U) -/* When MAX_VUART_NUM_PER_VM is larger than 2, UART_PIO_IDXn should also be added here */ +/* MAX_VUART_NUM_PER_VM is 8, so allocate UART_PIO_IDX0~UART_PIO_IDX0 + 7 for 8 vuart */ #define UART_PIO_IDX0 (PCI_CFGDATA_PIO_IDX + 1U) -#define UART_PIO_IDX1 (UART_PIO_IDX0 + 1U) -#define PM1A_EVT_PIO_IDX (UART_PIO_IDX1 + 1U) +#define PM1A_EVT_PIO_IDX (UART_PIO_IDX0 + MAX_VUART_NUM_PER_VM) #define PM1A_CNT_PIO_IDX (PM1A_EVT_PIO_IDX + 1U) #define PM1B_EVT_PIO_IDX (PM1A_CNT_PIO_IDX + 1U) #define PM1B_CNT_PIO_IDX (PM1B_EVT_PIO_IDX + 1U)