Skip to content

Commit a3163dc

Browse files
Fuad TabbaMarc Zyngier
authored andcommitted
KVM: arm64: Use KVM extension checks for allowed protected VM capabilities
Use KVM extension checks as the source for determining which capabilities are allowed for protected VMs. KVM extension checks is the natural place for this, since it is also the interface exposed to users. Signed-off-by: Fuad Tabba <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Marc Zyngier <[email protected]>
1 parent 27f5cf8 commit a3163dc

File tree

3 files changed

+33
-45
lines changed

3 files changed

+33
-45
lines changed

arch/arm64/include/asm/kvm_pkvm.h

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,31 @@ int pkvm_init_host_vm(struct kvm *kvm);
2020
int pkvm_create_hyp_vm(struct kvm *kvm);
2121
void pkvm_destroy_hyp_vm(struct kvm *kvm);
2222

23+
/*
24+
* This functions as an allow-list of protected VM capabilities.
25+
* Features not explicitly allowed by this function are denied.
26+
*/
27+
static inline bool kvm_pvm_ext_allowed(long ext)
28+
{
29+
switch (ext) {
30+
case KVM_CAP_IRQCHIP:
31+
case KVM_CAP_ARM_PSCI:
32+
case KVM_CAP_ARM_PSCI_0_2:
33+
case KVM_CAP_NR_VCPUS:
34+
case KVM_CAP_MAX_VCPUS:
35+
case KVM_CAP_MAX_VCPU_ID:
36+
case KVM_CAP_MSI_DEVID:
37+
case KVM_CAP_ARM_VM_IPA_SIZE:
38+
case KVM_CAP_ARM_PMU_V3:
39+
case KVM_CAP_ARM_SVE:
40+
case KVM_CAP_ARM_PTRAUTH_ADDRESS:
41+
case KVM_CAP_ARM_PTRAUTH_GENERIC:
42+
return true;
43+
default:
44+
return false;
45+
}
46+
}
47+
2348
extern struct memblock_region kvm_nvhe_sym(hyp_memory)[];
2449
extern unsigned int kvm_nvhe_sym(hyp_memblock_nr);
2550

arch/arm64/kvm/arm.c

Lines changed: 2 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -80,31 +80,6 @@ int kvm_arch_vcpu_should_kick(struct kvm_vcpu *vcpu)
8080
return kvm_vcpu_exiting_guest_mode(vcpu) == IN_GUEST_MODE;
8181
}
8282

83-
/*
84-
* This functions as an allow-list of protected VM capabilities.
85-
* Features not explicitly allowed by this function are denied.
86-
*/
87-
static bool pkvm_ext_allowed(struct kvm *kvm, long ext)
88-
{
89-
switch (ext) {
90-
case KVM_CAP_IRQCHIP:
91-
case KVM_CAP_ARM_PSCI:
92-
case KVM_CAP_ARM_PSCI_0_2:
93-
case KVM_CAP_NR_VCPUS:
94-
case KVM_CAP_MAX_VCPUS:
95-
case KVM_CAP_MAX_VCPU_ID:
96-
case KVM_CAP_MSI_DEVID:
97-
case KVM_CAP_ARM_VM_IPA_SIZE:
98-
case KVM_CAP_ARM_PMU_V3:
99-
case KVM_CAP_ARM_SVE:
100-
case KVM_CAP_ARM_PTRAUTH_ADDRESS:
101-
case KVM_CAP_ARM_PTRAUTH_GENERIC:
102-
return true;
103-
default:
104-
return false;
105-
}
106-
}
107-
10883
int kvm_vm_ioctl_enable_cap(struct kvm *kvm,
10984
struct kvm_enable_cap *cap)
11085
{
@@ -113,7 +88,7 @@ int kvm_vm_ioctl_enable_cap(struct kvm *kvm,
11388
if (cap->flags)
11489
return -EINVAL;
11590

116-
if (kvm_vm_is_protected(kvm) && !pkvm_ext_allowed(kvm, cap->cap))
91+
if (kvm_vm_is_protected(kvm) && !kvm_pvm_ext_allowed(cap->cap))
11792
return -EINVAL;
11893

11994
switch (cap->cap) {
@@ -311,7 +286,7 @@ int kvm_vm_ioctl_check_extension(struct kvm *kvm, long ext)
311286
{
312287
int r;
313288

314-
if (kvm && kvm_vm_is_protected(kvm) && !pkvm_ext_allowed(kvm, ext))
289+
if (kvm && kvm_vm_is_protected(kvm) && !kvm_pvm_ext_allowed(ext))
315290
return 0;
316291

317292
switch (ext) {

arch/arm64/kvm/hyp/nvhe/pkvm.c

Lines changed: 6 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -329,32 +329,20 @@ static void pkvm_init_features_from_host(struct pkvm_hyp_vm *hyp_vm, const struc
329329

330330
bitmap_zero(allowed_features, KVM_VCPU_MAX_FEATURES);
331331

332-
/*
333-
* For protected VMs, always allow:
334-
* - PSCI v0.2
335-
*/
336332
set_bit(KVM_ARM_VCPU_PSCI_0_2, allowed_features);
337333

338-
/*
339-
* Check if remaining features are allowed:
340-
* - Performance Monitoring
341-
* - Scalable Vectors
342-
* - Pointer Authentication
343-
*/
344-
if (FIELD_GET(ARM64_FEATURE_MASK(ID_AA64DFR0_EL1_PMUVer), PVM_ID_AA64DFR0_ALLOW))
334+
if (kvm_pvm_ext_allowed(KVM_CAP_ARM_PMU_V3))
345335
set_bit(KVM_ARM_VCPU_PMU_V3, allowed_features);
346336

347-
if (FIELD_GET(ARM64_FEATURE_MASK(ID_AA64PFR0_EL1_SVE), PVM_ID_AA64PFR0_ALLOW))
348-
set_bit(KVM_ARM_VCPU_SVE, allowed_features);
349-
350-
if (FIELD_GET(ARM64_FEATURE_MASK(ID_AA64ISAR1_EL1_API), PVM_ID_AA64ISAR1_ALLOW) &&
351-
FIELD_GET(ARM64_FEATURE_MASK(ID_AA64ISAR1_EL1_APA), PVM_ID_AA64ISAR1_ALLOW))
337+
if (kvm_pvm_ext_allowed(KVM_CAP_ARM_PTRAUTH_ADDRESS))
352338
set_bit(KVM_ARM_VCPU_PTRAUTH_ADDRESS, allowed_features);
353339

354-
if (FIELD_GET(ARM64_FEATURE_MASK(ID_AA64ISAR1_EL1_GPI), PVM_ID_AA64ISAR1_ALLOW) &&
355-
FIELD_GET(ARM64_FEATURE_MASK(ID_AA64ISAR1_EL1_GPA), PVM_ID_AA64ISAR1_ALLOW))
340+
if (kvm_pvm_ext_allowed(KVM_CAP_ARM_PTRAUTH_GENERIC))
356341
set_bit(KVM_ARM_VCPU_PTRAUTH_GENERIC, allowed_features);
357342

343+
if (kvm_pvm_ext_allowed(KVM_CAP_ARM_SVE))
344+
set_bit(KVM_ARM_VCPU_SVE, allowed_features);
345+
358346
bitmap_and(kvm->arch.vcpu_features, host_kvm->arch.vcpu_features,
359347
allowed_features, KVM_VCPU_MAX_FEATURES);
360348
}

0 commit comments

Comments
 (0)