[PATCH v2 0/3] KVM: arm64: Honour KVM_VM_TYPE_ARM_IPA_SIZE under pKVM
From: Fuad Tabba
Date: Thu Nov 05 2026 - 02:57:05 EST
Hi folks,
Changes since v1 [1]:
- Dropped v1's kvm_get_ipa_max() patch. EL2 checks the requested IPA
size against a copy of the host's limit taken at init.
- Added patch 2, which aligns the PGD of EL2's selftest VM.
- Rebased on 7.4-rc1.
pKVM ignores KVM_VM_TYPE_ARM_IPA_SIZE: every VM gets the host's IPA
limit, and an out-of-range request is accepted. So the vgic_init
selftest fails on any pKVM host whose limit exceeds 40 bits.
With patch 3, a VM gets the IPA size its VMM requested, and EL2 rejects
one the host itself would reject.
Patch 1 rejects a PGD donation that isn't aligned to its size, which
crashes EL2 today. It's first because patch 3 lets the host choose
that size. Patch 2 aligns the PGD of EL2's own selftest VM under
CONFIG_NVHE_EL2_DEBUG.
A VMM that requests less than the host limit now gets that size. One
passing the default type gets 40 bits. On a host whose limit is below
40 bits the default type is rejected, as it is without pKVM. kvmtool
and QEMU request the size their memory map spans, and crosvm the host
limit, so none of them places anything beyond its request.
On QEMU, with 7.4-rc1 as a 64K/PA_BITS_48 pKVM host on a 52-bit part,
KVM_RUN fails on a 52-bit VM's first access to a memslot above 2^48.
With patch 3 the guest writes through it. The same kernel, with
CONFIG_NVHE_EL2_DEBUG, panics at pKVM init on cortex-a57, which patch 2
fixes.
On an M4, whose limit is 40 bits, pKVM now rejects a 44-bit request, as
the M4 does without pKVM. A protected kvmtool guest there boots with the
32 bits it requests.
Based on Linux 7.4-rc1 (6628e7d4c6b25).
Cheers,
/fuad
[1] https://lore.kernel.org/all/20260917091826.2639205-1-fuad.tabba@xxxxxxxxx/
Fuad Tabba (2):
KVM: arm64: Align the pKVM selftest VM's stage-2 PGD
KVM: arm64: Honour the requested IPA size under pKVM
Quentin Perret (1):
KVM: arm64: Check PGD alignment when creating a pVM
arch/arm64/include/asm/kvm_hyp.h | 1 +
arch/arm64/kvm/arm.c | 1 +
arch/arm64/kvm/hyp/nvhe/mem_protect.c | 2 +-
arch/arm64/kvm/hyp/nvhe/pkvm.c | 34 +++++++++++++++++++++------
arch/arm64/kvm/mmu.c | 4 +---
5 files changed, 31 insertions(+), 11 deletions(-)
base-commit: 6628e7d4c6b25c8d18f1345e3a20d21829aae7e4
--
2.47.3