Currently QEMU will continue to emulate the AIA MSI devices and enable the AIA extension for guest OS when the host kernel doesn't support the in-kernel AIA irqchip. This will cause an illegal instruction exception when the guest OS uses the IMSIC devices. Add additional checks to ensure the guest OS only uses the AIA MSI device when the host kernel supports the in-kernel AIA chip.
Signed-off-by: Yong-Xuan Wang <[email protected]> Reviewed-by: Jim Shu <[email protected]> --- hw/riscv/virt.c | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/hw/riscv/virt.c b/hw/riscv/virt.c index 45a8c4f8190d..0d8e047844a6 100644 --- a/hw/riscv/virt.c +++ b/hw/riscv/virt.c @@ -1567,12 +1567,19 @@ static void virt_machine_init(MachineState *machine) } } - if (kvm_enabled() && virt_use_kvm_aia(s)) { - kvm_riscv_aia_create(machine, IMSIC_MMIO_GROUP_MIN_SHIFT, - VIRT_IRQCHIP_NUM_SOURCES, VIRT_IRQCHIP_NUM_MSIS, - memmap[VIRT_APLIC_S].base, - memmap[VIRT_IMSIC_S].base, - s->aia_guests); + if (kvm_enabled() && s->aia_type == VIRT_AIA_TYPE_APLIC_IMSIC) { + if (virt_use_kvm_aia(s)) { + kvm_riscv_aia_create(machine, IMSIC_MMIO_GROUP_MIN_SHIFT, + VIRT_IRQCHIP_NUM_SOURCES, + VIRT_IRQCHIP_NUM_MSIS, + memmap[VIRT_APLIC_S].base, + memmap[VIRT_IMSIC_S].base, + s->aia_guests); + } else { + error_report("Host machine doesn't support in-kernel APLIC MSI, " + "please use aia=none or aia=aplic"); + exit(1); + } } if (riscv_is_32bit(&s->soc[0])) { -- 2.17.1
