Skip to content

Commit b12b3b0

Browse files
Fuad TabbaMarc Zyngier
authored andcommitted
KVM: arm64: Check whether a VM IOCTL is allowed in pKVM
Certain VM IOCTLs are tied to specific VM features. Since pKVM does not support all features, restrict which IOCTLs are allowed depending on whether the associated feature is supported. Use the existing VM capability check as the source of truth to whether an IOCTL is allowed for a particular VM by mapping the IOCTLs with their associated capabilities. Suggested-by: Oliver Upton <oupton@kernel.org> Signed-off-by: Fuad Tabba <tabba@google.com> Link: https://patch.msgid.link/20251211104710.151771-9-tabba@google.com Signed-off-by: Marc Zyngier <maz@kernel.org>
1 parent 8823485 commit b12b3b0

2 files changed

Lines changed: 23 additions & 0 deletions

File tree

arch/arm64/include/asm/kvm_pkvm.h

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
#include <linux/arm_ffa.h>
1010
#include <linux/memblock.h>
1111
#include <linux/scatterlist.h>
12+
#include <asm/kvm_host.h>
1213
#include <asm/kvm_pgtable.h>
1314

1415
/* Maximum number of VMs that can co-exist under pKVM. */
@@ -51,6 +52,25 @@ static inline bool kvm_pkvm_ext_allowed(struct kvm *kvm, long ext)
5152
}
5253
}
5354

55+
/*
56+
* Check whether the KVM VM IOCTL is allowed in pKVM.
57+
*
58+
* Certain features are allowed only for non-protected VMs in pKVM, which is why
59+
* this takes the VM (kvm) as a parameter.
60+
*/
61+
static inline bool kvm_pkvm_ioctl_allowed(struct kvm *kvm, unsigned int ioctl)
62+
{
63+
long ext;
64+
int r;
65+
66+
r = kvm_get_cap_for_kvm_ioctl(ioctl, &ext);
67+
68+
if (WARN_ON_ONCE(r < 0))
69+
return false;
70+
71+
return kvm_pkvm_ext_allowed(kvm, ext);
72+
}
73+
5474
extern struct memblock_region kvm_nvhe_sym(hyp_memory)[];
5575
extern unsigned int kvm_nvhe_sym(hyp_memblock_nr);
5676

arch/arm64/kvm/arm.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1938,6 +1938,9 @@ int kvm_arch_vm_ioctl(struct file *filp, unsigned int ioctl, unsigned long arg)
19381938
void __user *argp = (void __user *)arg;
19391939
struct kvm_device_attr attr;
19401940

1941+
if (is_protected_kvm_enabled() && !kvm_pkvm_ioctl_allowed(kvm, ioctl))
1942+
return -EINVAL;
1943+
19411944
switch (ioctl) {
19421945
case KVM_CREATE_IRQCHIP: {
19431946
int ret;

0 commit comments

Comments
 (0)