From: Suzuki K Poulose <suzuki.poulose@arm.com>
To: Marc Zyngier <maz@kernel.org>
Cc: kvm@vger.kernel.org, kvmarm@lists.linux.dev, will@kernel.org,
catalin.marinas@arm.com, linux-kernel@vger.kernel.org,
linux-arm-kernel@lists.infradead.org, steven.price@arm.com,
aneesh.kumar@kernel.org, oupton@kernel.org, gshan@redhat.com,
joey.gouly@arm.com, tabba@google.com, yuzenghui@huawei.com,
linux-coco@lists.linux.dev, gankulkarni@os.amperecomputing.com,
sdonthineni@nvidia.com, alpergun@google.com,
fj0570is@fujitsu.com, WeiLin.Chang@arm.com,
lpieralisi@kernel.org, enju.kohei@fujitsu.com,
sudeep.holla@arm.com, jonathan.cameron@oss.qualcomm.com
Subject: Re: [PATCH v22 05/23] KVM: arm64: Track the type of VM in kvm_arch
Date: Tue, 6 Oct 2026 10:49:24 +0200 [thread overview]
Message-ID: <e2070fdf-a598-468b-a43b-13d56ac79721@arm.com> (raw)
In-Reply-To: <87cxtn2pp8.wl-maz@kernel.org>
On 06/10/2026 09:33, Marc Zyngier wrote:
> On Mon, 05 Oct 2026 10:07:36 +0100,
> Suzuki K Poulose <suzuki.poulose@arm.com> wrote:
>>
>> KVM arm64 has different types of VMs with all the different modes in which
>> the hypervisor code can be run. e.g., VHE, nVHE, pKVM etc. Then there is
>> protected VM and normal VMs with pKVM. We might soon add other types,
>> e.g., Arm CCA Realm. So in an effort to make the handling of these
>> different types of VMs a bit more friendly to the eyes, add a VM flavor to
>> the kvm_arch and we could then add handlers for different operations based
>> on the VM type.
>>
>> Keep the flavor initialisation at the beginning to allow for the detection
>> early enough and fail out on any unsupported requests.
>>
>> With that, add wrappers for checking the "type" of a VM and replace the
>> existing users with the new wrappers.
>>
>> Given we already have the construct of "kvm_vm_is_protected" in the core
>> KVM code, use that for all confidential compute guests including Realms
>> that we are about to add. Adds __VM_PROTECTED marker vm flavor to draw the
>> boundary for "protected VMs". In later patches, we would add Realm VMs,
>> which would also be classified as protected.
>>
>> Add a explicit helper to detect if a given VM is a "protected" VM under pKVM.
>> Change the existing users that precisely want to check the VM type. These
>> include :
>> - kvm_arch_prepare_memory_region - For preventing memslot changes after
>> pVM creation.
>>
>> All the others are retained as a wider check for confidential guest VMs.
>> These are:
>> - kvm_vm_ioctl_set_counter_offset - For disallowing timer offset
>> configuration
>> - io_mem_abort for dabt handling without valid syndrome information
>>
>> Both of which are true for Realms too.
>>
>> Realms support is restricted to VHE host and thus "kvm_vm_is_protected()"
>> checks in the pkvm hyp specific code doesn't need to change, as the only
>> protected guests it deals with is "protected pKVM" guests. To tighten this
>> init_pkvm_hyp_vm() restricts the hyp copy of the vm_flavor to the ones it
>> supports.
>>
>> vcpu_is_protected() usage from nVHE hyp code is tricky, as we need to
>> convert the vcpu->kvm to the HYP VA before checking the flavor. This
>> involves kern_hyp_va() usage in asm/kvm_host.h. To avoid build breaks,
>> include asm/kvm_mmu.h to arm64/kvm/mmio.c.
>>
>> While at it move the psci_version around to keep the structure packed.
>>
>> Suggested-by: Marc Zyngier <maz@kernel.org>
>> Tested-by: Gavin Shan <gshan@redhat.com>
>> Signed-off-by: Suzuki K Poulose <suzuki.poulose@arm.com>
>> ---
>> Changes since v21:
>> - Drop kern_hyp_va() and restrict nvhe code to always use vcpu_is_protected_pkvm()
>> - Drop kvm_vm_is_unprotected_pkvm() and open code the check
>> - Move psci_version field in kvm_arch around to keep the structure packed
>> ---
>> arch/arm64/include/asm/kvm_host.h | 42 +++++++++++++++++++++++---
>> arch/arm64/include/asm/kvm_pkvm.h | 4 +--
>> arch/arm64/kvm/arm.c | 33 ++++++++++++++++----
>> arch/arm64/kvm/hyp/include/nvhe/pkvm.h | 2 +-
>> arch/arm64/kvm/hyp/nvhe/pkvm.c | 6 +++-
>> arch/arm64/kvm/hyp/nvhe/switch.c | 4 +--
>> arch/arm64/kvm/hyp/nvhe/timer-sr.c | 2 +-
>> arch/arm64/kvm/mmio.c | 1 +
>> arch/arm64/kvm/mmu.c | 2 +-
>> arch/arm64/kvm/pkvm.c | 6 ++--
>> 10 files changed, 79 insertions(+), 23 deletions(-)
>>
>> diff --git a/arch/arm64/include/asm/kvm_host.h b/arch/arm64/include/asm/kvm_host.h
>> index 286489a69dff5..dedb5df15a803 100644
>> --- a/arch/arm64/include/asm/kvm_host.h
>> +++ b/arch/arm64/include/asm/kvm_host.h
>> @@ -257,7 +257,6 @@ struct kvm_protected_vm {
>> pkvm_handle_t handle;
>> struct kvm_hyp_memcache teardown_mc;
>> struct kvm_hyp_memcache stage2_teardown_mc;
>> - bool is_protected;
>> bool is_created;
>>
>> /*
>> @@ -306,9 +305,22 @@ enum fgt_group_id {
>> __NR_FGT_GROUP_IDS__
>> };
>>
>> +enum kvm_arm_vm_flavor {
>> + VM_NVHE,
>> + VM_VHE,
>> + VM_PKVM, /* Normal guests on pKVM */
>> + MARKER(__VM_PROTECTED),
>> + VM_PROTECTED_PKVM, /* Protected VM */
>> + VM_FLAVOR_MAX
>> +};
>> +
>> struct kvm_arch {
>> struct kvm_s2_mmu mmu;
>>
>> + enum kvm_arm_vm_flavor vm_flavor;
>> + /* Mandated version of PSCI */
>> + u32 psci_version;
>> +
>> /*
>> * Fine-Grained UNDEF, mimicking the FGT layout defined by the
>> * architecture. We track them globally, as we present the
>> @@ -332,9 +344,6 @@ struct kvm_arch {
>> /* Timers */
>> struct arch_timer_vm_data timer_data;
>>
>> - /* Mandated version of PSCI */
>> - u32 psci_version;
>> -
>> /* Protects VM-scoped configuration data */
>> struct mutex config_lock;
>>
>> @@ -1504,9 +1513,32 @@ struct kvm *kvm_arch_alloc_vm(void);
>>
>> #define __KVM_HAVE_ARCH_FLUSH_REMOTE_TLBS_RANGE
>>
>> -#define kvm_vm_is_protected(kvm) (is_protected_kvm_enabled() && (kvm)->arch.pkvm.is_protected)
>> +#define kvm_vm_is_protected(kvm) ((kvm)->arch.vm_flavor >= __VM_PROTECTED)
>>
>> +#ifdef __KVM_NVHE_HYPERVISOR__
>> +/*
>> + * Accessing vcpu->kvm from nVHE hyp stub is tricky, as we need to convert the
>> + * pointer to the hyp VA. With pKVM, the nVHE code runs with the hyp_vcpu,
>> + * which is populated correctly. Always vcpu_is_protected_pkvm(), which is
>
> Always *use*?
Ack
>
>> + * gated on is_protected_kvm_enabled().
>> + */
>> +#define vcpu_is_protected(vcpu) BUILD_BUG_ON(1)
>> +#else
>> #define vcpu_is_protected(vcpu) kvm_vm_is_protected((vcpu)->kvm)
>> +#endif
>> +
>> +#define kvm_vm_is_protected_pkvm(kvm) \
>> + (is_protected_kvm_enabled() && ((kvm)->arch.vm_flavor == VM_PROTECTED_PKVM))
>> +/*
>> + * Rely on is_protected_kvm_enabled() check in kvm_vm_is_protected_pkvm() to
>> + * make sure the vcpu->kvm is always valid VA in the context
>> + */
>> +#define vcpu_is_protected_pkvm(vcpu) \
>> + ({ \
>> + struct kvm *__kvm = READ_ONCE((vcpu)->kvm); \
>> + \
>> + (__kvm && kvm_vm_is_protected_pkvm(__kvm)); \
>> + })
>
> But why do we have to have this pkvm-specific stuff? I thought we had
> established it is not necessary in [1].
My bad. I need to wear the glasses :-(
>
> I really want to avoid any backend-specific helper, as it really gets
> in the way of maintainability.
Agreed. I will fix this. Apologies
Cheers
Suzuki
>
> M.
>
> [1] https://lore.kernel.org/r/86pkxs2npx.wl-maz@kernel.org
>
>
next prev parent reply other threads:[~2026-10-06 8:49 UTC|newest]
Thread overview: 64+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-05 9:07 [PATCH v22 00/23] KVM: arm64: CCA: Add basic plumbing for Realms Suzuki K Poulose
2026-10-05 9:07 ` [PATCH v22 01/23] KVM: arm64: protected VM: Handle user writes to CNTVCT_EL0/CNTPCT_EL0 Suzuki K Poulose
2026-10-06 0:02 ` Gavin Shan
2026-10-05 9:07 ` [PATCH v22 02/23] KVM: arm64: Disable Steal time accounting for protected guests Suzuki K Poulose
2026-10-06 0:03 ` Gavin Shan
2026-10-05 9:07 ` [PATCH v22 03/23] KVM: arm64: Include kvm_emulate.h in kvm/arm_psci.h Suzuki K Poulose
2026-10-05 9:07 ` [PATCH v22 04/23] KVM: arm64: Avoid including linux/kvm_host.h in kvm_pgtable.h Suzuki K Poulose
2026-10-05 9:07 ` [PATCH v22 05/23] KVM: arm64: Track the type of VM in kvm_arch Suzuki K Poulose
2026-10-06 3:55 ` Gavin Shan
2026-10-06 8:33 ` Marc Zyngier
2026-10-06 8:49 ` Suzuki K Poulose [this message]
2026-10-05 9:07 ` [PATCH v22 06/23] KVM: arm64: Don't call vcpu_set_pauth_traps for pKVM host Suzuki K Poulose
2026-10-06 0:29 ` Gavin Shan
2026-10-05 9:07 ` [PATCH v22 07/23] KVM: arm64: Refactor the vcpu_load to allow for VM specific callbacks Suzuki K Poulose
2026-10-05 9:07 ` [PATCH v22 08/23] KVM: arm64: Add vcpu load/put call backs for flavors Suzuki K Poulose
2026-10-06 2:15 ` Gavin Shan
2026-10-05 9:07 ` [PATCH v22 09/23] KVM: arm64: Prevent unsupported vcpu features for VM types Suzuki K Poulose
2026-10-06 2:24 ` Gavin Shan
2026-10-06 2:25 ` Gavin Shan
2026-10-06 5:16 ` Suzuki K Poulose
2026-10-06 8:50 ` Marc Zyngier
2026-10-05 9:07 ` [PATCH v22 10/23] KVM: arm64: Consolidate stage2 unmap range into kvm_stage2_unmap_range Suzuki K Poulose
2026-10-06 2:37 ` Gavin Shan
2026-10-05 9:07 ` [PATCH v22 11/23] KVM: arm64: Add VM specific callback for S2 MMU operations Suzuki K Poulose
2026-10-06 3:00 ` Gavin Shan
2026-10-06 5:22 ` Suzuki K Poulose
2026-10-06 9:24 ` Marc Zyngier
2026-10-06 10:36 ` Suzuki K Poulose
2026-10-06 15:14 ` Suzuki K Poulose
2026-10-05 9:07 ` [PATCH v22 12/23] KVM: arm64: Use a local kvm pointer in kvm_handle_guest_abort() Suzuki K Poulose
2026-10-06 3:02 ` Gavin Shan
2026-10-05 9:07 ` [PATCH v22 13/23] KVM: arm64: Abstract out memory abort handling Suzuki K Poulose
2026-10-06 3:07 ` Gavin Shan
2026-10-06 5:25 ` Suzuki K Poulose
2026-10-05 9:07 ` [PATCH v22 14/23] KVM: arm64: Mandate VGIC v3 for pKVM VMs and Realms Suzuki K Poulose
2026-10-06 3:10 ` Gavin Shan
2026-10-05 9:07 ` [PATCH v22 15/23] KVM: arm64: CCA: Add a new mode for supporting Realm guests Suzuki K Poulose
2026-10-06 3:11 ` Gavin Shan
2026-10-05 9:07 ` [PATCH v22 16/23] KVM: arm64: CCA: Add VCPU load/put for Realms Suzuki K Poulose
2026-10-06 3:16 ` Gavin Shan
2026-10-06 5:09 ` Suzuki K Poulose
2026-10-05 9:07 ` [PATCH v22 17/23] KVM: arm64: CCA: Add bare minimal S2 operations for Realm Suzuki K Poulose
2026-10-06 3:18 ` Gavin Shan
2026-10-05 9:07 ` [PATCH v22 18/23] KVM: arm64: CCA: Introduce Realms Suzuki K Poulose
2026-10-06 3:42 ` Gavin Shan
2026-10-06 5:10 ` Suzuki K Poulose
2026-10-05 9:07 ` [PATCH v22 19/23] KVM: arm64: CCA: Don't expose unsupported capabilities for realm guests Suzuki K Poulose
2026-10-06 4:58 ` Gavin Shan
2026-10-05 9:07 ` [PATCH v22 20/23] KVM: arm64: CCA: WARN on injected undef exceptions Suzuki K Poulose
2026-10-06 3:49 ` Gavin Shan
2026-10-05 9:07 ` [PATCH v22 21/23] KVM: arm64: CCA: Support timers in realm RECs Suzuki K Poulose
2026-10-06 5:44 ` Gavin Shan
2026-10-05 9:07 ` [PATCH v22 22/23] KVM: arm64: CCA: Expose SVE VL register before VCPU finalization Suzuki K Poulose
2026-10-06 5:35 ` Gavin Shan
2026-10-06 5:57 ` Suzuki K Poulose
2026-10-05 9:07 ` [PATCH v22 23/23] KVM: arm64: CCA: Control user register access for Realms Suzuki K Poulose
2026-10-05 9:30 ` sashiko-bot
2026-10-05 13:08 ` Suzuki K Poulose
2026-10-06 5:47 ` Gavin Shan
2026-10-06 6:01 ` Suzuki K Poulose
2026-10-06 6:16 ` Gavin Shan
2026-10-06 12:36 ` Suzuki K Poulose
2026-10-06 22:00 ` Gavin Shan
2026-10-06 6:23 ` Gavin Shan
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=e2070fdf-a598-468b-a43b-13d56ac79721@arm.com \
--to=suzuki.poulose@arm.com \
--cc=WeiLin.Chang@arm.com \
--cc=alpergun@google.com \
--cc=aneesh.kumar@kernel.org \
--cc=catalin.marinas@arm.com \
--cc=enju.kohei@fujitsu.com \
--cc=fj0570is@fujitsu.com \
--cc=gankulkarni@os.amperecomputing.com \
--cc=gshan@redhat.com \
--cc=joey.gouly@arm.com \
--cc=jonathan.cameron@oss.qualcomm.com \
--cc=kvm@vger.kernel.org \
--cc=kvmarm@lists.linux.dev \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-coco@lists.linux.dev \
--cc=linux-kernel@vger.kernel.org \
--cc=lpieralisi@kernel.org \
--cc=maz@kernel.org \
--cc=oupton@kernel.org \
--cc=sdonthineni@nvidia.com \
--cc=steven.price@arm.com \
--cc=sudeep.holla@arm.com \
--cc=tabba@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.