On Fri, 16 Jan 2026 at 13:52, Mohamed Mediouni <[email protected]> wrote: > > On Hypervisor.framework for macOS and WHPX for Windows, the provided > environment is a GICv3 without ITS. > > As such, support a GICv3 w/ GICv2m for that scenario. > > Signed-off-by: Mohamed Mediouni <[email protected]> > > Reviewed-by: Pierrick Bouvier <[email protected]> > --- > hw/arm/virt-acpi-build.c | 5 ++++- > hw/arm/virt.c | 8 ++++++++ > include/hw/arm/virt.h | 2 ++ > 3 files changed, 14 insertions(+), 1 deletion(-) > > diff --git a/hw/arm/virt-acpi-build.c b/hw/arm/virt-acpi-build.c > index 03b4342574..40ea6b6dd5 100644 > --- a/hw/arm/virt-acpi-build.c > +++ b/hw/arm/virt-acpi-build.c > @@ -960,7 +960,10 @@ build_madt(GArray *table_data, BIOSLinker *linker, > VirtMachineState *vms) > build_append_int_noprefix(table_data, memmap[VIRT_GIC_ITS].base, > 8); > build_append_int_noprefix(table_data, 0, 4); /* Reserved */ > } > - } else { > + } > + > + if (!(vms->gic_version != VIRT_GIC_VERSION_2 && vms->its) > + && !vms->no_gicv3_with_gicv2m) { > const uint16_t spi_base = vms->irqmap[VIRT_GIC_V2M] + ARM_SPI_BASE; > > /* 5.2.12.16 GIC MSI Frame Structure */ > diff --git a/hw/arm/virt.c b/hw/arm/virt.c > index 4badc1a734..275f26d439 100644 > --- a/hw/arm/virt.c > +++ b/hw/arm/virt.c > @@ -959,6 +959,8 @@ static void create_gic(VirtMachineState *vms, > MemoryRegion *mem) > > if (vms->gic_version != VIRT_GIC_VERSION_2 && vms->its) { > create_its(vms); > + } else if (vms->gic_version != VIRT_GIC_VERSION_2 && > !vms->no_gicv3_with_gicv2m) { > + create_v2m(vms); > } else if (vms->gic_version == VIRT_GIC_VERSION_2) { > create_v2m(vms); > } > @@ -2449,6 +2451,8 @@ static void machvirt_init(MachineState *machine) > vms->ns_el2_virt_timer_irq = ns_el2_virt_timer_present() && > !vmc->no_ns_el2_virt_timer_irq; > > + vms->no_gicv3_with_gicv2m = vmc->no_gicv3_with_gicv2m; > + > fdt_add_timer_nodes(vms); > fdt_add_cpu_nodes(vms); > > @@ -3497,6 +3501,7 @@ static void virt_instance_init(Object *obj) > vms->its = true; > /* Allow ITS emulation if the machine version supports it */ > vms->tcg_its = !vmc->no_tcg_its; > + vms->no_gicv3_with_gicv2m = false; > > /* Default disallows iommu instantiation */ > vms->iommu = VIRT_IOMMU_NONE; > @@ -3549,7 +3554,10 @@ DEFINE_VIRT_MACHINE_AS_LATEST(11, 0) > > static void virt_machine_10_2_options(MachineClass *mc) > { > + VirtMachineClass *vmc = VIRT_MACHINE_CLASS(OBJECT_CLASS(mc)); > + > virt_machine_11_0_options(mc); > + vmc->no_gicv3_with_gicv2m = true; > compat_props_add(mc->compat_props, hw_compat_10_2, hw_compat_10_2_len); > }
The MSI controller selection logic is already pretty confusing, and this is making it more complicated. I don't think we should need this machine back compatibility, because currently there is no setup where you can have a GICv3 that doesn't also have either an ITS or no MSI controller. I think also that we can make the code cleaner if we: (1) clean the existing "pick an MSI controller" logic up so that we do it up front, the same way we do "pick a GIC version" (2) add the new "msi" property and deprecate the old "its" one (3) then add the gicv3-with-gicv2m-on-hvf logic to that I see this series adds an "msi" property, but it also makes the old "its" property an OnOffAuto -- do we really need both ? I wrote some code for this this afternoon before I realised that you'd done the "msi" property in that series (so the duplication with your work is my fault). I'll send them out as an RFC to give an idea of what I have in mind. thanks -- PMM
