On Wed, Feb 14, 2024 at 5:18 AM Daniel Henrique Barboza <dbarb...@ventanamicro.com> wrote: > > The 'virt' machine makes assumptions on the Advanced Core-Local > Interruptor, or aclint, based on 'tcg_enabled()' conditionals. This > will impact MSI related tests support when adding a RISC-V 'virt' libqos > machine. The accelerator used in that case, 'qtest', isn't being > accounted for and we'll error out if we try to enable aclint. > > Create a new virt_aclint_allowed() helper to gate the aclint code > considering both TCG and 'qtest' accelerators. The error message is > left untouched, mentioning TCG only, because we don't expect the > regular user to be aware of 'qtest'. > > We want to add 'qtest' support for aclint only, leaving the TCG specific > bits out of it. This is done by changing the current format we use > today: > > if (tcg_enabled()) { > if (s->have_aclint) { - aclint logic - } > else { - non-aclint, TCG logic - } > } > > into: > > if (virt_aclint_allowed() && s->have_aclint) { > - aclint logic - > } else if (tcg_enabled()) { > - non-aclint, TCG logic - > } > > Signed-off-by: Daniel Henrique Barboza <dbarb...@ventanamicro.com>
Reviewed-by: Alistair Francis <alistair.fran...@wdc.com> Alistair > --- > hw/riscv/virt.c | 52 +++++++++++++++++++++++++------------------------ > 1 file changed, 27 insertions(+), 25 deletions(-) > > diff --git a/hw/riscv/virt.c b/hw/riscv/virt.c > index 54ad809b44..a094af97c3 100644 > --- a/hw/riscv/virt.c > +++ b/hw/riscv/virt.c > @@ -48,6 +48,7 @@ > #include "sysemu/tcg.h" > #include "sysemu/kvm.h" > #include "sysemu/tpm.h" > +#include "sysemu/qtest.h" > #include "hw/pci/pci.h" > #include "hw/pci-host/gpex.h" > #include "hw/display/ramfb.h" > @@ -61,6 +62,11 @@ static bool virt_use_kvm_aia(RISCVVirtState *s) > return kvm_irqchip_in_kernel() && s->aia_type == > VIRT_AIA_TYPE_APLIC_IMSIC; > } > > +static bool virt_aclint_allowed(void) > +{ > + return tcg_enabled() || qtest_enabled(); > +} > + > static const MemMapEntry virt_memmap[] = { > [VIRT_DEBUG] = { 0x0, 0x100 }, > [VIRT_MROM] = { 0x1000, 0xf000 }, > @@ -725,14 +731,12 @@ static void create_fdt_sockets(RISCVVirtState *s, const > MemMapEntry *memmap, > > create_fdt_socket_memory(s, memmap, socket); > > - if (tcg_enabled()) { > - if (s->have_aclint) { > - create_fdt_socket_aclint(s, memmap, socket, > - &intc_phandles[phandle_pos]); > - } else { > - create_fdt_socket_clint(s, memmap, socket, > - &intc_phandles[phandle_pos]); > - } > + if (virt_aclint_allowed() && s->have_aclint) { > + create_fdt_socket_aclint(s, memmap, socket, > + &intc_phandles[phandle_pos]); > + } else if (tcg_enabled()) { > + create_fdt_socket_clint(s, memmap, socket, > + &intc_phandles[phandle_pos]); > } > } > > @@ -1409,7 +1413,7 @@ static void virt_machine_init(MachineState *machine) > exit(1); > } > > - if (!tcg_enabled() && s->have_aclint) { > + if (!virt_aclint_allowed() && s->have_aclint) { > error_report("'aclint' is only available with TCG acceleration"); > exit(1); > } > @@ -1446,23 +1450,22 @@ static void virt_machine_init(MachineState *machine) > hart_count, &error_abort); > sysbus_realize(SYS_BUS_DEVICE(&s->soc[i]), &error_fatal); > > - if (tcg_enabled()) { > - if (s->have_aclint) { > - if (s->aia_type == VIRT_AIA_TYPE_APLIC_IMSIC) { > - /* Per-socket ACLINT MTIMER */ > - riscv_aclint_mtimer_create(memmap[VIRT_CLINT].base + > + if (virt_aclint_allowed() && s->have_aclint) { > + if (s->aia_type == VIRT_AIA_TYPE_APLIC_IMSIC) { > + /* Per-socket ACLINT MTIMER */ > + riscv_aclint_mtimer_create(memmap[VIRT_CLINT].base + > i * RISCV_ACLINT_DEFAULT_MTIMER_SIZE, > RISCV_ACLINT_DEFAULT_MTIMER_SIZE, > base_hartid, hart_count, > RISCV_ACLINT_DEFAULT_MTIMECMP, > RISCV_ACLINT_DEFAULT_MTIME, > RISCV_ACLINT_DEFAULT_TIMEBASE_FREQ, true); > - } else { > - /* Per-socket ACLINT MSWI, MTIMER, and SSWI */ > - riscv_aclint_swi_create(memmap[VIRT_CLINT].base + > + } else { > + /* Per-socket ACLINT MSWI, MTIMER, and SSWI */ > + riscv_aclint_swi_create(memmap[VIRT_CLINT].base + > i * memmap[VIRT_CLINT].size, > base_hartid, hart_count, false); > - riscv_aclint_mtimer_create(memmap[VIRT_CLINT].base + > + riscv_aclint_mtimer_create(memmap[VIRT_CLINT].base + > i * memmap[VIRT_CLINT].size + > RISCV_ACLINT_SWI_SIZE, > RISCV_ACLINT_DEFAULT_MTIMER_SIZE, > @@ -1470,21 +1473,20 @@ static void virt_machine_init(MachineState *machine) > RISCV_ACLINT_DEFAULT_MTIMECMP, > RISCV_ACLINT_DEFAULT_MTIME, > RISCV_ACLINT_DEFAULT_TIMEBASE_FREQ, true); > - riscv_aclint_swi_create(memmap[VIRT_ACLINT_SSWI].base + > + riscv_aclint_swi_create(memmap[VIRT_ACLINT_SSWI].base + > i * memmap[VIRT_ACLINT_SSWI].size, > base_hartid, hart_count, true); > - } > - } else { > - /* Per-socket SiFive CLINT */ > - riscv_aclint_swi_create( > + } > + } else if (tcg_enabled()) { > + /* Per-socket SiFive CLINT */ > + riscv_aclint_swi_create( > memmap[VIRT_CLINT].base + i * memmap[VIRT_CLINT].size, > base_hartid, hart_count, false); > - riscv_aclint_mtimer_create(memmap[VIRT_CLINT].base + > + riscv_aclint_mtimer_create(memmap[VIRT_CLINT].base + > i * memmap[VIRT_CLINT].size + RISCV_ACLINT_SWI_SIZE, > RISCV_ACLINT_DEFAULT_MTIMER_SIZE, base_hartid, > hart_count, > RISCV_ACLINT_DEFAULT_MTIMECMP, > RISCV_ACLINT_DEFAULT_MTIME, > RISCV_ACLINT_DEFAULT_TIMEBASE_FREQ, true); > - } > } > > /* Per-socket interrupt controller */ > -- > 2.43.0 > >