Re: [PATCH v13 13/48] kvm: arm64: Don't expose unsupported capabilities for realm guests
From: Steven Price
Date: Thu Mar 19 2026 - 11:25:22 EST
On 19/03/2026 14:09, Suzuki K Poulose wrote:
> On 18/03/2026 15:53, Steven Price wrote:
>> From: Suzuki K Poulose <suzuki.poulose@xxxxxxx>
>>
>> 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@xxxxxxx>
>> Signed-off-by: Steven Price <steven.price@xxxxxxx>
>> ---
>> 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.
Indeed - thanks for spotting.
Thanks,
Steve
> Suzuki
>
>> switch (ext) {
>> case KVM_CAP_IRQCHIP:
>> r = vgic_present;
>