From: Mostafa Saleh <smostafa@google.com>
To: Will Deacon <will@kernel.org>
Cc: kvmarm@lists.linux.dev, linux-arm-kernel@lists.infradead.org,
Marc Zyngier <maz@kernel.org>, Oliver Upton <oupton@kernel.org>,
Joey Gouly <joey.gouly@arm.com>,
Suzuki K Poulose <suzuki.poulose@arm.com>,
Zenghui Yu <yuzenghui@huawei.com>,
Catalin Marinas <catalin.marinas@arm.com>,
Quentin Perret <qperret@google.com>,
Fuad Tabba <tabba@google.com>,
Vincent Donnefort <vdonnefort@google.com>
Subject: Re: [PATCH 00/30] KVM: arm64: Add support for protected guest memory with pKVM
Date: Fri, 13 Mar 2026 15:31:30 +0000 [thread overview]
Message-ID: <abQt0l8BjwGJqXe-@google.com> (raw)
In-Reply-To: <20260105154939.11041-1-will@kernel.org>
Hi Will,
On Mon, Jan 05, 2026 at 03:49:08PM +0000, Will Deacon wrote:
> Hi folks,
>
> Although pKVM has been shipping in Android kernels for a while now,
> protected guest (pVM) support has been somewhat languishing upstream.
> This has partly been because we've been waiting for guest_memfd() but
> also because it hasn't been clear how to expose pVMs to userspace (which
> is necessary for testing) without getting everything in place beforehand.
> This has led to frustration on both sides of the fence [1] and so this
> patch series attempts to get things moving again by exposing pVM
> features in an incremental fashion based on top of anonymous memory,
> which is what we have been using in Android. The big difference between
> this series and the Android implementation is the graceful handling of
> host stage-2 faults arising from accesses made using kernel mappings.
> The hope is that this will unblock pKVM upstreaming efforts while the
> guest_memfd() work continues to evolve.
>
> Specifically, this patch series implements support for protected guest
> memory with pKVM, where pages are unmapped from the host as they are
> faulted into the guest and can be shared back from the guest using pKVM
> hypercalls. Protected guests are created using a new machine type
> identifier and can be booted to a shell using the kvmtool patches
> available at [2], which finally means that we are able to test the pVM
> logic in pKVM. Since this is an incremental step towards full isolation
> from the host (for example, the CPU register state and DMA accesses are
> not yet isolated), creating a pVM requires a developer Kconfig option to
> be enabled in addition to booting with 'kvm-arm.mode=protected' and
> results in a kernel taint.
>
> More information about what is and what isn't implemented is described
> in the pkvm.rst documentation added by this series. The intention is to
> update this file as we introduce additional protection features and
> ultimately to remove the taint.
>
> The series is loosely structured as follows:
>
> Patch 1: A dependent pgtable fix that I sent out previously
> Patches 2-8: Cleanups/fixes to the existing code to prepare for pVMs
> Patches 9-14: Support for memory donation and reclaim
> Patches 15-22: Handling of bad host accesses to protected memory
> Patches 23-25: Support for SHARE and UNSHARE guest hypercalls
> Patches 26-27: UAPI and developer documentation
> Patches 28-30: Selftest additions for new page ownership transitions
>
> Patches are based on v6.19-rc4 and are also available at [3].
>
> All feedback welcome.
>
> Cheers,
>
> Will
>
> [1] https://lore.kernel.org/all/aS9rmMgNna7I5g4F@kernel.org/
> [2] https://git.kernel.org/pub/scm/linux/kernel/git/will/kvmtool.git/log/?h=pkvm
> [3] https://git.kernel.org/pub/scm/linux/kernel/git/will/linux.git/log/?h=kvm/protected-memory
>
> Cc: Marc Zyngier <maz@kernel.org>
> Cc: Oliver Upton <oupton@kernel.org>
> Cc: Joey Gouly <joey.gouly@arm.com>
> Cc: Suzuki K Poulose <suzuki.poulose@arm.com>
> Cc: Zenghui Yu <yuzenghui@huawei.com>
> Cc: Catalin Marinas <catalin.marinas@arm.com>
> Cc: Quentin Perret <qperret@google.com>
> Cc: Fuad Tabba <tabba@google.com>
> Cc: Vincent Donnefort <vdonnefort@google.com>
> Cc: Mostafa Saleh <smostafa@google.com>
>
> --->8
>
> Fuad Tabba (1):
> KVM: arm64: Expose self-hosted debug regs as RAZ/WI for protected
> guests
>
> Quentin Perret (2):
> KVM: arm64: Refactor enter_exception64()
> KVM: arm64: Inject SIGSEGV on illegal accesses
>
> Will Deacon (27):
> KVM: arm64: Invert KVM_PGTABLE_WALK_HANDLE_FAULT to fix pKVM walkers
> KVM: arm64: Remove redundant 'pgt' pointer checks from MMU notifiers
> KVM: arm64: Rename __pkvm_pgtable_stage2_unmap()
> KVM: arm64: Don't advertise unsupported features for protected guests
> KVM: arm64: Remove pointless is_protected_kvm_enabled() checks from
> hyp
> KVM: arm64: Ignore MMU notifier callbacks for protected VMs
> KVM: arm64: Prevent unsupported memslot operations on protected VMs
> KVM: arm64: Split teardown hypercall into two phases
> KVM: arm64: Introduce __pkvm_host_donate_guest()
> KVM: arm64: Hook up donation hypercall to pkvm_pgtable_stage2_map()
> KVM: arm64: Handle aborts from protected VMs
> KVM: arm64: Introduce __pkvm_reclaim_dying_guest_page()
> KVM: arm64: Hook up reclaim hypercall to pkvm_pgtable_stage2_destroy()
> KVM: arm64: Generalise kvm_pgtable_stage2_set_owner()
> KVM: arm64: Introduce host_stage2_set_owner_metadata_locked()
> KVM: arm64: Annotate guest donations with handle and gfn in host
> stage-2
> KVM: arm64: Introduce hypercall to force reclaim of a protected page
> KVM: arm64: Reclaim faulting page from pKVM in spurious fault handler
> KVM: arm64: Return -EFAULT from VCPU_RUN on access to a poisoned pte
> KVM: arm64: Add hvc handler at EL2 for hypercalls from protected VMs
> KVM: arm64: Implement the MEM_SHARE hypercall for protected VMs
> KVM: arm64: Implement the MEM_UNSHARE hypercall for protected VMs
> KVM: arm64: Allow userspace to create protected VMs when pKVM is
> enabled
> KVM: arm64: Add some initial documentation for pKVM
> KVM: arm64: Extend pKVM page ownership selftests to cover guest
> donation
> KVM: arm64: Register 'selftest_vm' in the VM table
> KVM: arm64: Extend pKVM page ownership selftests to cover forced
> reclaim
I tested the patches on Lenovo ideacenter Mini X Gen 10 Snapdragon with
nvhe as for some reason I am facing issues with hvhe on this HW even
with upstream.
I can boot ToT Linux kernel as both protected and non-protected VMs using
the kvmtool version in here.
For reference, I am using:
- Config: defconfig + CONFIG_PROTECTED_VM_UAPI + CONFIG_ARM_PKVM_GUEST
- Run: ./lkvm-static run --irqchip gicv3 -k Image -d rootfs.ext2 --force-pci -c 1 --debug (--protected)
For the whole series:
Tested-by: Mostafa Saleh <smostafa@google.com>
Thanks,
Mostafa
>
> .../admin-guide/kernel-parameters.txt | 4 +-
> Documentation/virt/kvm/arm/index.rst | 1 +
> Documentation/virt/kvm/arm/pkvm.rst | 101 ++++
> arch/arm64/include/asm/kvm_asm.h | 7 +-
> arch/arm64/include/asm/kvm_emulate.h | 5 +
> arch/arm64/include/asm/kvm_host.h | 7 +
> arch/arm64/include/asm/kvm_pgtable.h | 27 +-
> arch/arm64/include/asm/kvm_pkvm.h | 4 +-
> arch/arm64/include/asm/virt.h | 6 +
> arch/arm64/kvm/Kconfig | 10 +
> arch/arm64/kvm/arm.c | 8 +-
> arch/arm64/kvm/hyp/exception.c | 100 ++--
> arch/arm64/kvm/hyp/include/nvhe/mem_protect.h | 9 +
> arch/arm64/kvm/hyp/include/nvhe/memory.h | 6 +
> arch/arm64/kvm/hyp/include/nvhe/pkvm.h | 7 +-
> arch/arm64/kvm/hyp/nvhe/hyp-main.c | 95 ++--
> arch/arm64/kvm/hyp/nvhe/mem_protect.c | 500 ++++++++++++++++--
> arch/arm64/kvm/hyp/nvhe/pkvm.c | 223 +++++++-
> arch/arm64/kvm/hyp/nvhe/switch.c | 1 +
> arch/arm64/kvm/hyp/nvhe/sys_regs.c | 8 +
> arch/arm64/kvm/hyp/pgtable.c | 22 +-
> arch/arm64/kvm/mmu.c | 122 ++++-
> arch/arm64/kvm/pkvm.c | 149 +++++-
> arch/arm64/mm/fault.c | 31 +-
> include/uapi/linux/kvm.h | 5 +
> 25 files changed, 1249 insertions(+), 209 deletions(-)
> create mode 100644 Documentation/virt/kvm/arm/pkvm.rst
>
> --
> 2.52.0.351.gbe84eed79e-goog
>
next prev parent reply other threads:[~2026-03-13 15:31 UTC|newest]
Thread overview: 68+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-01-05 15:49 [PATCH 00/30] KVM: arm64: Add support for protected guest memory with pKVM Will Deacon
2026-01-05 15:49 ` [PATCH 01/30] KVM: arm64: Invert KVM_PGTABLE_WALK_HANDLE_FAULT to fix pKVM walkers Will Deacon
2026-01-06 14:33 ` Quentin Perret
2026-01-10 10:22 ` (subset) " Oliver Upton
2026-01-05 15:49 ` [PATCH 02/30] KVM: arm64: Remove redundant 'pgt' pointer checks from MMU notifiers Will Deacon
2026-01-06 14:32 ` Quentin Perret
2026-01-09 14:31 ` Will Deacon
2026-01-09 17:31 ` Will Deacon
2026-01-05 15:49 ` [PATCH 03/30] KVM: arm64: Rename __pkvm_pgtable_stage2_unmap() Will Deacon
2026-01-05 15:49 ` [PATCH 04/30] KVM: arm64: Don't advertise unsupported features for protected guests Will Deacon
2026-01-05 15:49 ` [PATCH 05/30] KVM: arm64: Expose self-hosted debug regs as RAZ/WI " Will Deacon
2026-01-05 15:49 ` [PATCH 06/30] KVM: arm64: Remove pointless is_protected_kvm_enabled() checks from hyp Will Deacon
2026-01-06 14:40 ` Quentin Perret
2026-01-09 14:23 ` Will Deacon
2026-01-05 15:49 ` [PATCH 07/30] KVM: arm64: Ignore MMU notifier callbacks for protected VMs Will Deacon
2026-01-05 15:49 ` [PATCH 08/30] KVM: arm64: Prevent unsupported memslot operations on " Will Deacon
2026-01-05 15:49 ` [PATCH 09/30] KVM: arm64: Split teardown hypercall into two phases Will Deacon
2026-01-05 15:49 ` [PATCH 10/30] KVM: arm64: Introduce __pkvm_host_donate_guest() Will Deacon
2026-01-06 14:48 ` Quentin Perret
2026-01-09 14:30 ` Will Deacon
2026-01-09 15:10 ` Quentin Perret
2026-01-05 15:49 ` [PATCH 11/30] KVM: arm64: Hook up donation hypercall to pkvm_pgtable_stage2_map() Will Deacon
2026-01-05 15:49 ` [PATCH 12/30] KVM: arm64: Handle aborts from protected VMs Will Deacon
2026-01-05 15:49 ` [PATCH 13/30] KVM: arm64: Introduce __pkvm_reclaim_dying_guest_page() Will Deacon
2026-01-06 16:26 ` Vincent Donnefort
2026-01-05 15:49 ` [PATCH 14/30] KVM: arm64: Hook up reclaim hypercall to pkvm_pgtable_stage2_destroy() Will Deacon
2026-01-06 14:59 ` Quentin Perret
2026-01-09 14:35 ` Will Deacon
2026-01-09 14:57 ` Quentin Perret
2026-01-05 15:49 ` [PATCH 15/30] KVM: arm64: Refactor enter_exception64() Will Deacon
2026-01-05 15:49 ` [PATCH 16/30] KVM: arm64: Inject SIGSEGV on illegal accesses Will Deacon
2026-01-05 15:49 ` [PATCH 17/30] KVM: arm64: Generalise kvm_pgtable_stage2_set_owner() Will Deacon
2026-01-06 15:20 ` Quentin Perret
2026-01-09 18:46 ` Will Deacon
2026-01-17 0:03 ` Will Deacon
2026-01-05 15:49 ` [PATCH 18/30] KVM: arm64: Introduce host_stage2_set_owner_metadata_locked() Will Deacon
2026-01-05 15:49 ` [PATCH 19/30] KVM: arm64: Annotate guest donations with handle and gfn in host stage-2 Will Deacon
2026-01-06 16:01 ` Fuad Tabba
2026-01-09 14:42 ` Will Deacon
2026-01-12 9:25 ` Fuad Tabba
2026-01-05 15:49 ` [PATCH 20/30] KVM: arm64: Introduce hypercall to force reclaim of a protected page Will Deacon
2026-01-06 15:44 ` Quentin Perret
2026-01-09 17:47 ` Will Deacon
2026-01-05 15:49 ` [PATCH 21/30] KVM: arm64: Reclaim faulting page from pKVM in spurious fault handler Will Deacon
2026-01-05 15:49 ` [PATCH 22/30] KVM: arm64: Return -EFAULT from VCPU_RUN on access to a poisoned pte Will Deacon
2026-01-06 15:54 ` Quentin Perret
2026-01-09 14:57 ` Will Deacon
2026-01-09 15:29 ` Quentin Perret
2026-01-09 17:35 ` Will Deacon
2026-01-05 15:49 ` [PATCH 23/30] KVM: arm64: Add hvc handler at EL2 for hypercalls from protected VMs Will Deacon
2026-01-06 15:52 ` Vincent Donnefort
2026-01-05 15:49 ` [PATCH 24/30] KVM: arm64: Implement the MEM_SHARE hypercall for " Will Deacon
2026-01-06 15:45 ` Vincent Donnefort
2026-01-09 15:01 ` Will Deacon
2026-01-05 15:49 ` [PATCH 25/30] KVM: arm64: Implement the MEM_UNSHARE " Will Deacon
2026-01-06 15:50 ` Vincent Donnefort
2026-01-05 15:49 ` [PATCH 26/30] KVM: arm64: Allow userspace to create protected VMs when pKVM is enabled Will Deacon
2026-01-05 15:49 ` [PATCH 27/30] KVM: arm64: Add some initial documentation for pKVM Will Deacon
2026-01-06 15:59 ` Vincent Donnefort
2026-01-09 15:04 ` Will Deacon
2026-01-05 15:49 ` [PATCH 28/30] KVM: arm64: Extend pKVM page ownership selftests to cover guest donation Will Deacon
2026-01-05 15:49 ` [PATCH 29/30] KVM: arm64: Register 'selftest_vm' in the VM table Will Deacon
2026-01-05 15:49 ` [PATCH 30/30] KVM: arm64: Extend pKVM page ownership selftests to cover forced reclaim Will Deacon
2026-03-13 15:31 ` Mostafa Saleh [this message]
2026-04-20 8:02 ` [PATCH 00/30] KVM: arm64: Add support for protected guest memory with pKVM Pavan Kondeti
2026-04-20 10:00 ` Will Deacon
2026-04-20 11:26 ` Pavan Kondeti
2026-04-21 4:15 ` Pavan Kondeti
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=abQt0l8BjwGJqXe-@google.com \
--to=smostafa@google.com \
--cc=catalin.marinas@arm.com \
--cc=joey.gouly@arm.com \
--cc=kvmarm@lists.linux.dev \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=maz@kernel.org \
--cc=oupton@kernel.org \
--cc=qperret@google.com \
--cc=suzuki.poulose@arm.com \
--cc=tabba@google.com \
--cc=vdonnefort@google.com \
--cc=will@kernel.org \
--cc=yuzenghui@huawei.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.