[PATCH v9 00/12] HVF: Add support for platform vGIC and nested virtualisation

Mohamed Mediouni posted 12 patches 1 week, 3 days ago
Failed in applying to current master (apply log)
accel/hvf/hvf-all.c                |  51 ++
accel/stubs/hvf-stub.c             |   2 +
hw/arm/virt.c                      |  32 +-
hw/intc/arm_gicv3_common.c         |   3 +
hw/intc/arm_gicv3_hvf.c            | 735 +++++++++++++++++++++++++++++
hw/intc/meson.build                |   1 +
include/hw/intc/arm_gicv3_common.h |   1 +
include/system/hvf.h               |   8 +
system/vl.c                        |   2 +
target/arm/hvf/hvf.c               | 196 +++++++-
target/arm/hvf/sysreg.c.inc        |  35 ++
11 files changed, 1052 insertions(+), 14 deletions(-)
create mode 100644 hw/intc/arm_gicv3_hvf.c
[PATCH v9 00/12] HVF: Add support for platform vGIC and nested virtualisation
Posted by Mohamed Mediouni 1 week, 3 days ago
Link to branch: https://github.com/mediouni-m/qemu hvf-irqchip-and-nested
(tag for this submission: hvf-irqchip-and-nested-v9)

This series adds supports for nested virtualisation when using HVF on arm64 Macs.

It has two parts:
- Apple vGICv3 support and necessary infrastructure changes for it
- Nested virtualisation support. Note that the nested virtualisation implementation
shipping as of macOS 26.3 is nVHE only (but it _does_ use VNCR as shipped).

It's rebased on top of the WHPX arm64 series.

Known issues:
- This series doesn't contain EL2 physical timer emulation, which is
needed if not leveraging the Apple vGIC.

- when nested virt is enabled, no UI response within EDK2
and a permanent wait. Workaround: -boot menu=on,splash-time=0.

Apple Feedback Assistant item: FB21649319

When the VM is running at EL2 at the very moment the virtual timer fires:
HV_EXIT_REASON_VTIMER_ACTIVATED doesn’t fire (when not using the provided vGIC)
- using a GICv2 doesn’t require having transition notifiers which Hypervisor.framework doesn’t have…)

and when using the provided vGIC, the interrupt never gets delivered back to the guest

Linux as a guest OS is fine with this… but the reference ArmVirtQemu edk2 build always uses the virtual timer even when running EFI at EL2, so it gets broken unless this patch is applied to edk2:

diff of ArmVirtPkg/ArmVirt.dsc.inc:

-  ArmGenericTimerCounterLib|ArmPkg/Library/ArmGenericTimerVirtCounterLib/ArmGenericTimerVirtCounterLib.inf
+  ArmGenericTimerCounterLib|ArmPkg/Library/ArmGenericTimerPhyCounterLib/ArmGenericTimerPhyCounterLib.inf^M

Changelog:

v1->v2:
Oops. I did a mistake when preparing my patches.

- Add hvf_arm_el2_enable(_) call to virt_set_virt
- Fix nested virt support check to add HVF

v2->v3:
- LORC_EL1 patch was merged separately, remove from this series.
- fix LPIs when kernel-irqchip disabled and using TCG
- remove spurious if case in vGIC supported version detection (inapplicable now)
- Add hvf_enabled() check in combination with hvf kernel-irqchip checks
- cleanly fail on attempt to use the platform vGIC together with ITS

v3->v4:
- GIC state save improvements, including saving the opaque Apple-specific state
- Saving HVF system register state when using the vGIC and/or EL2

v5:
- oops, fixed up save/restore to be functional
- misc changes otherwise

v6:
- Addressing review comments

v7:
- Address review comments, adapt around Qemu changes and bugfixes.

v8:
- Rebase, and misc fixes

v9:
- Misc fixes from WHPX review comments
- Split enablement commit for EL2 into its own separate commit

Based-on: https://patchew.org/QEMU/20260127182805.73212-1-mohamed@unpredictable.fr/

Mohamed Mediouni (12):
  hw/intc: Add hvf vGIC interrupt controller support
  accel, hw/arm, include/system/hvf: infrastructure changes for HVF vGIC
  target/arm: hvf: instantiate GIC early
  hvf: save/restore Apple GIC state
  hw/arm, target/arm: nested virtualisation on HVF
  hvf: only call hvf_sync_vtimer() when running without the platform
    vGIC
  hvf: gate ARM_FEATURE_PMU register emulation behind not being at EL2
  hvf: arm: allow exposing minimal PMU when running with nested virt on
  target/arm: hvf: add asserts for code paths not leveraged when using
    the vGIC
  hvf: sync registers used at EL2
  target/arm: hvf: pass through CNTHCTL_EL2 and MDCCINT_EL1
  hvf: enable nested virtualisation support

 accel/hvf/hvf-all.c                |  51 ++
 accel/stubs/hvf-stub.c             |   2 +
 hw/arm/virt.c                      |  32 +-
 hw/intc/arm_gicv3_common.c         |   3 +
 hw/intc/arm_gicv3_hvf.c            | 735 +++++++++++++++++++++++++++++
 hw/intc/meson.build                |   1 +
 include/hw/intc/arm_gicv3_common.h |   1 +
 include/system/hvf.h               |   8 +
 system/vl.c                        |   2 +
 target/arm/hvf/hvf.c               | 196 +++++++-
 target/arm/hvf/sysreg.c.inc        |  35 ++
 11 files changed, 1052 insertions(+), 14 deletions(-)
 create mode 100644 hw/intc/arm_gicv3_hvf.c

-- 
2.50.1 (Apple Git-155)