Re: [PATCH v13 13/48] kvm: arm64: Don't expose unsupported capabilities for realm guests

Suzuki K Poulose
2026-03-19T14:10:44Z

On 18/03/2026 15:53, Steven Price wrote:
> From: Suzuki K Poulose <suzuki.poulose@arm.com>
>
> RMM v1.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@arm.com>
> Signed-off-by: Steven Price <steven.price@arm.com>
> ---
> 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 | 22 ++++++++++++++++++++++
> 1 file changed, 22 insertions(+)
>
> diff --git a/arch/arm64/kvm/arm.c b/arch/arm64/kvm/arm.c
> index 9b17bdfaf0c2..ddbf080e4f55 100644
> --- a/arch/arm64/kvm/arm.c
> +++ b/arch/arm64/kvm/arm.c
> @@ -357,6 +357,25 @@ static bool kvm_has_full_ptr_auth(void)
> (apa + api + apa3) == 1);
> }
>
> +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:
> + return true;
> + }
> + return false;
> +}
> +
> int kvm_vm_ioctl_check_extension(struct kvm *kvm, long ext)
> {
> int r;
> @@ -364,6 +383,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;
> +

We need a similar check in in kvm_vm_ioctl_enable_cap() to prevent
enabling the filtered caps ? Otherwise looks good to me.

Suzuki

> switch (ext) {
> case KVM_CAP_IRQCHIP:
> r = vgic_present;