[RFC 3/6] KVM: arm64: Wire up TLBID vDomain configuration ioctls

From: Jinqian Yang

Date: Fri Oct 30 2026 - 02:56:33 EST


Report KVM_CAP_ARM_TLBIDOMAIN from kvm_vm_ioctl_check_extension(),
and bridge KVM_ARM_VCPU_SET_VDOMAIN and KVM_ARM_GET_VDOMAIN_NUM to
their kvm_arm_* helpers, letting userspace configure each vCPU's
vDomain bitmap and get the number of vDomains.

Signed-off-by: Jinqian Yang <yangjinqian1@xxxxxxxxxx>
Signed-off-by: Zhou Wang <wangzhou1@xxxxxxxxxxxxx>
---
arch/arm64/kvm/arm.c | 31 +++++++++++++++++++++++++++++++
1 file changed, 31 insertions(+)

diff --git a/arch/arm64/kvm/arm.c b/arch/arm64/kvm/arm.c
index 809d33b8e5be..4dfea015eaaa 100644
--- a/arch/arm64/kvm/arm.c
+++ b/arch/arm64/kvm/arm.c
@@ -598,6 +598,13 @@ int kvm_vm_ioctl_check_extension(struct kvm *kvm, long ext)
case KVM_CAP_ARM_PTRAUTH_GENERIC:
r = kvm_has_full_ptr_auth();
break;
+ case KVM_CAP_ARM_TLBIDOMAIN:
+ if (IS_ENABLED(CONFIG_KVM_ARM_VTLBID) && has_vhe() &&
+ system_supports_tlbid())
+ r = 1;
+ else
+ r = 0;
+ break;
case KVM_CAP_ARM_EAGER_SPLIT_CHUNK_SIZE:
if (kvm)
r = kvm->arch.mmu.split_page_chunk_size;
@@ -2437,6 +2444,17 @@ long kvm_arch_vcpu_ioctl(struct file *filp,

return kvm_arm_vcpu_finalize(vcpu, what);
}
+ case KVM_ARM_VCPU_SET_VDOMAIN: {
+ struct kvm_arm_set_vdomain vdomain;
+
+ if (!kvm_vcpu_initialized(vcpu))
+ return -ENOEXEC;
+
+ if (copy_from_user(&vdomain, argp, sizeof(vdomain)))
+ return -EFAULT;
+
+ return kvm_arm_vcpu_set_vdomain(vcpu, &vdomain);
+ }
default:
r = -EINVAL;
}
@@ -2578,6 +2596,19 @@ int kvm_arch_vm_ioctl(struct file *filp, unsigned int ioctl, unsigned long arg)
return -EFAULT;
return kvm_vm_ioctl_get_reg_writable_masks(kvm, &range);
}
+ case KVM_ARM_GET_VDOMAIN_NUM: {
+ struct kvm_arm_get_vdomain vdomain;
+ int ret;
+
+ ret = kvm_arm_get_vdomain_num(kvm, &vdomain);
+ if (ret)
+ return ret;
+
+ if (copy_to_user(argp, &vdomain, sizeof(vdomain)))
+ return -EFAULT;
+
+ return 0;
+ }
default:
return -EINVAL;
}
--
2.33.0