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

Reply via email to