[PATCH v16 15/45] KVM: arm64: CCA: Don't expose unsupported capabilities for realm guests
Gavin Shan
gshan at redhat.com
Mon Aug 31 21:29:22 PDT 2026
Hi Steve,
On 8/3/26 11:43 PM, Steven Price wrote:
> From: Suzuki K Poulose <suzuki.poulose at arm.com>
>
> RMM v2.0 provides no mechanism for the host to perform debug operations
> on the guest. So limit the extensions that are visible to an allowlist
> so that only those capabilities we can support are advertised.
>
> Signed-off-by: Suzuki K Poulose <suzuki.poulose at arm.com>
> Signed-off-by: Steven Price <steven.price at arm.com>
> ---
> Changes since v13:
> * Add missing check in kvm_vm_ioctl_enable_cap().
> Changes since v10:
> * Add a kvm_realm_ext_allowed() function which limits which extensions
> are exposed to an allowlist. This removes the need for special casing
> various extensions.
> Changes since v7:
> * Remove the helper functions and inline the kvm_is_realm() check with
> a ternary operator.
> * Rewrite the commit message to explain this patch.
> ---
> arch/arm64/kvm/arm.c | 26 ++++++++++++++++++++++++++
> 1 file changed, 26 insertions(+)
>
> diff --git a/arch/arm64/kvm/arm.c b/arch/arm64/kvm/arm.c
> index c4d906861736..6f39831dcf5d 100644
> --- a/arch/arm64/kvm/arm.c
> +++ b/arch/arm64/kvm/arm.c
> @@ -135,6 +135,26 @@ int kvm_arch_vcpu_should_kick(struct kvm_vcpu *vcpu)
> return kvm_vcpu_exiting_guest_mode(vcpu) == IN_GUEST_MODE;
> }
>
> +static bool kvm_realm_ext_allowed(long ext)
> +{
> + switch (ext) {
> + case KVM_CAP_IRQCHIP:
> + case KVM_CAP_ARM_PSCI:
> + case KVM_CAP_ARM_PSCI_0_2:
> + case KVM_CAP_NR_VCPUS:
> + case KVM_CAP_MAX_VCPUS:
> + case KVM_CAP_MAX_VCPU_ID:
> + case KVM_CAP_MSI_DEVID:
> + case KVM_CAP_ARM_VM_IPA_SIZE:
> + case KVM_CAP_ARM_PTRAUTH_ADDRESS:
> + case KVM_CAP_ARM_PTRAUTH_GENERIC:
> + case KVM_CAP_ARM_RMI:
> + case KVM_CAP_SYNC_MMU:
> + return true;
> + }
> + return false;
> +}
> +
Nitpick: The code can be simplified a bit if @kvm is passed to kvm_realm_ext_allowed().
In this way, kvm_realm_ext_allowed() looks similar to kvm_pkvm_ext_allowed().
static bool kvm_realm_ext_allowed(struct kvm *kvm, long ext)
{
if (!kvm || !kvm_is_realm(kvm))
return true;
switch (ext) {
case KVM_CAP_IRQCHIP:
:
case KVM_CAP_SYNC_MMU:
return true;
}
return false;
}
> int kvm_vm_ioctl_enable_cap(struct kvm *kvm,
> struct kvm_enable_cap *cap)
> {
> @@ -146,6 +166,9 @@ int kvm_vm_ioctl_enable_cap(struct kvm *kvm,
> if (is_protected_kvm_enabled() && !kvm_pkvm_ext_allowed(kvm, cap->cap))
> return -EINVAL;
>
> + if (kvm && kvm_is_realm(kvm) && !kvm_realm_ext_allowed(cap->cap))
> + return -EINVAL;
> +
if (!kvm_realm_ext_allowed(kvm, cap->cap))
return -EINVAL;
> switch (cap->cap) {
> case KVM_CAP_ARM_NISV_TO_USER:
> r = 0;
> @@ -380,6 +403,9 @@ int kvm_vm_ioctl_check_extension(struct kvm *kvm, long ext)
> if (is_protected_kvm_enabled() && !kvm_pkvm_ext_allowed(kvm, ext))
> return 0;
>
> + if (kvm && kvm_is_realm(kvm) && !kvm_realm_ext_allowed(ext))
> + return 0;
> +
if (!kvm_realm_ext_allowed(kvm, ext))
return 0;
> switch (ext) {
> case KVM_CAP_IRQCHIP:
> r = vgic_present;
Thanks,
Gavin
More information about the linux-arm-kernel
mailing list