[PATCH v19 00/13] HVF: Add support for platform vGIC and nested virtualisation

Mohamed Mediouni posted 13 patches 1 month ago
Patches applied successfully (tree, apply log)
git fetch https://github.com/patchew-project/qemu tags/patchew/20260307180330.75168-1-mohamed@unpredictable.fr
Maintainers: Cameron Esfahani <dirty@apple.com>, Roman Bolshakov <rbolshakov@ddn.com>, Phil Dennis-Jordan <phil@philjordan.eu>, Peter Maydell <peter.maydell@linaro.org>, Paolo Bonzini <pbonzini@redhat.com>, Alexander Graf <agraf@csgraf.de>
There is a newer version of this series
accel/hvf/hvf-all.c                |  55 ++
accel/stubs/hvf-stub.c             |  11 +
hw/arm/virt.c                      |  37 +-
hw/intc/arm_gicv3_common.c         |   4 +
hw/intc/arm_gicv3_hvf.c            | 828 +++++++++++++++++++++++++++++
hw/intc/arm_gicv3_hvf_stub.c       |  25 +
hw/intc/meson.build                |   2 +
include/hw/intc/arm_gicv3_common.h |   4 +
include/system/hvf.h               |   8 +
system/vl.c                        |   2 +
target/arm/hvf/hvf.c               | 162 +++++-
target/arm/hvf/sysreg.c.inc        |  44 ++
target/arm/hvf_arm.h               |   5 +
13 files changed, 1171 insertions(+), 16 deletions(-)
create mode 100644 hw/intc/arm_gicv3_hvf.c
create mode 100644 hw/intc/arm_gicv3_hvf_stub.c
[PATCH v19 00/13] HVF: Add support for platform vGIC and nested virtualisation
Posted by Mohamed Mediouni 1 month ago
Link to branch: https://github.com/mediouni-m/qemu hvf-irqchip-and-nested
(tag for this submission: hvf-irqchip-and-nested-v19)

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

The first two patches are from the SME enablement series and are present for the
series to be buildable on its own.

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).

This series doesn't contain EL2 physical timer emulation, which is
needed if not leveraging the Apple vGIC. As such, nested virt requires kernel-irqchip=on.

Known issues:
- 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

v10:

- A bit of changes across the board
- move HVF irqchip save/restore into irqchip code
- block nested virt support when kernel-irqchip=off with a GICv2 as
we don't implement an emulated physical timer yet.

v11:
- fixups for the save/restore Apple GIC state patch
- block the same registers as the revert in 28b0ed32b32c7e5094cf2f1ec9c0645c65fad2aa
for "hvf: sync registers used at EL2"
- drop patch that warns instead of aborts on mismatch

v12:
- Have the SME2 series at the start of this.
- Adaptation for the SME2 series.

v13:
- include "fix SME capabilities reporting" patch instead of it being standalone
- include "remove hvf_arm.h include" patch at the beginning of the series

v14:
- Turns out that the HVF SME2 patches broke the build for pretty much anything
non-macOS, and didn't address that properly in v13
- Addressed some checkpatch nits

v15:
- Pick new revision of SME2 patches
- separate disable nested virt when SME on patch

v16/17:
- Availability checks as needed except for the vGIC code, where they're
just skipped instead as availability is checked elsewhere.
- Some tiny cleanups
- v17: one more (optional to take) cleanup commit

v18:

- Some tiny nits here and there but that's about it.
- Drop some patches on top as CI isn't ready for them yet

v19:

- change hvf_nested_virt_enable(bool) from a macro to a function call

Mohamed Mediouni (13):
  hw/intc: Add hvf vGIC interrupt controller support
  hw/intc: arm_gicv3_hvf: save/restore Apple GIC state
  accel, hw/arm, include/system/hvf: infrastructure changes for HVF vGIC
  target/arm: hvf: instantiate GIC early
  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: arm: disable SME when nested virt is active
  hvf: enable nested virtualisation support

 accel/hvf/hvf-all.c                |  55 ++
 accel/stubs/hvf-stub.c             |  11 +
 hw/arm/virt.c                      |  37 +-
 hw/intc/arm_gicv3_common.c         |   4 +
 hw/intc/arm_gicv3_hvf.c            | 828 +++++++++++++++++++++++++++++
 hw/intc/arm_gicv3_hvf_stub.c       |  25 +
 hw/intc/meson.build                |   2 +
 include/hw/intc/arm_gicv3_common.h |   4 +
 include/system/hvf.h               |   8 +
 system/vl.c                        |   2 +
 target/arm/hvf/hvf.c               | 162 +++++-
 target/arm/hvf/sysreg.c.inc        |  44 ++
 target/arm/hvf_arm.h               |   5 +
 13 files changed, 1171 insertions(+), 16 deletions(-)
 create mode 100644 hw/intc/arm_gicv3_hvf.c
 create mode 100644 hw/intc/arm_gicv3_hvf_stub.c

-- 
2.50.1 (Apple Git-155)


Re: [PATCH v19 00/13] HVF: Add support for platform vGIC and nested virtualisation
Posted by Peter Maydell 1 month ago
On Sat, 7 Mar 2026 at 18:03, Mohamed Mediouni <mohamed@unpredictable.fr> wrote:
>
> Link to branch: https://github.com/mediouni-m/qemu hvf-irqchip-and-nested
> (tag for this submission: hvf-irqchip-and-nested-v19)
>
> This series adds support for nested virtualisation when using HVF on arm64 Macs.
>
> The first two patches are from the SME enablement series and are present for the
> series to be buildable on its own.
>
> 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).
>
> This series doesn't contain EL2 physical timer emulation, which is
> needed if not leveraging the Apple vGIC. As such, nested virt requires kernel-irqchip=on.

Hi; I think at this point this series has unfortunately missed the
softfreeze deadline for 11.0, and we should be aiming to get it in
for early in the 11.1 cycle. I will keep it on my list to apply then.

thanks
-- PMM
Re: [PATCH v19 00/13] HVF: Add support for platform vGIC and nested virtualisation
Posted by Mohamed Mediouni 1 month ago

> On 9. Mar 2026, at 14:20, Peter Maydell <peter.maydell@linaro.org> wrote:
> 
> On Sat, 7 Mar 2026 at 18:03, Mohamed Mediouni <mohamed@unpredictable.fr> wrote:
>> 
>> Link to branch: https://github.com/mediouni-m/qemu hvf-irqchip-and-nested
>> (tag for this submission: hvf-irqchip-and-nested-v19)
>> 
>> This series adds support for nested virtualisation when using HVF on arm64 Macs.
>> 
>> The first two patches are from the SME enablement series and are present for the
>> series to be buildable on its own.
>> 
>> 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).
>> 
>> This series doesn't contain EL2 physical timer emulation, which is
>> needed if not leveraging the Apple vGIC. As such, nested virt requires kernel-irqchip=on.
> 
> Hi; I think at this point this series has unfortunately missed the
> softfreeze deadline for 11.0, and we should be aiming to get it in
> for early in the 11.1 cycle. I will keep it on my list to apply then.
> 
Hello,

That’s quite unfortunate :/ Too close to the softfreeze tomorrow I guess?

Thank you though, think we got quite close to it with even an attempt of a pull before
last-minute issues resulted in it not getting quite there. Hopefully future series will go more smoothly
than my first ones :)

Thank you,
-Mohamed

> thanks
> -- PMM
Re: [PATCH v19 00/13] HVF: Add support for platform vGIC and nested virtualisation
Posted by Philippe Mathieu-Daudé 1 month ago
On 9/3/26 14:32, Mohamed Mediouni wrote:
> 
> 
>> On 9. Mar 2026, at 14:20, Peter Maydell <peter.maydell@linaro.org> wrote:
>>
>> On Sat, 7 Mar 2026 at 18:03, Mohamed Mediouni <mohamed@unpredictable.fr> wrote:
>>>
>>> Link to branch: https://github.com/mediouni-m/qemu hvf-irqchip-and-nested
>>> (tag for this submission: hvf-irqchip-and-nested-v19)
>>>
>>> This series adds support for nested virtualisation when using HVF on arm64 Macs.
>>>
>>> The first two patches are from the SME enablement series and are present for the
>>> series to be buildable on its own.
>>>
>>> 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).
>>>
>>> This series doesn't contain EL2 physical timer emulation, which is
>>> needed if not leveraging the Apple vGIC. As such, nested virt requires kernel-irqchip=on.
>>
>> Hi; I think at this point this series has unfortunately missed the
>> softfreeze deadline for 11.0, and we should be aiming to get it in
>> for early in the 11.1 cycle. I will keep it on my list to apply then.
>>
> Hello,
> 
> That’s quite unfortunate :/ Too close to the softfreeze tomorrow I guess?
> 
> Thank you though, think we got quite close to it with even an attempt of a pull before
> last-minute issues resulted in it not getting quite there. Hopefully future series will go more smoothly
> than my first ones :)

While we mentioned to our users that HVF/ARM is "supported" in our
documentation (commit 16595bcd0e2 "docs: Document that hvf on Arm
is supported"), it isn't "supported" by maintainers as in the
MAINTAINERS definitions:

            Supported:   Someone is actually paid to look after this.
            Maintained:  Someone actually looks after it.

It is marked as "maintained", thus developers caring are not paid to
do so (commit a1477da3dde "hvf: Add Apple Silicon support"). So it
is hard to follow / review / merge all the patches mailing list traffic.

If we want to consider it as first tier class accelerator, we should
at least improve our CI testing harness.

I started few series / patches around it, but quickly got overflowed:

- tests/qtest/migration: Update framework to allow using HVF accelerator
https://lore.kernel.org/qemu-devel/20250128135429.8500-1-philmd@linaro.org/

- split/arm: Run EL2 using TCG and EL1/EL0 in hardware with HVF
https://lore.kernel.org/qemu-devel/41c83d3f-e5dc-42c5-a743-1aafc4cce27a@linaro.org/

Some files already test nested guests and could be expanded:

$ git grep -li nested tests/functional/aarch64/
tests/functional/aarch64/test_device_passthrough.py
tests/functional/aarch64/test_kvm.py
tests/functional/aarch64/test_rme_sbsaref.py
tests/functional/aarch64/test_rme_virt.py

Regards,

Phil.

> 
> Thank you,
> -Mohamed
> 
>> thanks
>> -- PMM
>