]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
KVM: arm64: selftests: Provide helper for getting default vCPU target
authorOliver Upton <oliver.upton@linux.dev>
Wed, 17 Sep 2025 21:20:37 +0000 (14:20 -0700)
committerMarc Zyngier <maz@kernel.org>
Wed, 24 Sep 2025 18:23:32 +0000 (19:23 +0100)
The default vCPU target in KVM selftests is pretty boring in that it
doesn't enable any vCPU features. Expose a helper for getting the
default target to prepare for cramming in more features. Call
KVM_ARM_PREFERRED_TARGET directly from get-reg-list as it needs
fine-grained control over feature flags.

Signed-off-by: Oliver Upton <oliver.upton@linux.dev>
Reviewed-by: Itaru Kitayama <itaru.kitayama@fujitsu.com>
Signed-off-by: Marc Zyngier <maz@kernel.org>
tools/testing/selftests/kvm/arm64/psci_test.c
tools/testing/selftests/kvm/arm64/smccc_filter.c
tools/testing/selftests/kvm/arm64/vpmu_counter_access.c
tools/testing/selftests/kvm/get-reg-list.c
tools/testing/selftests/kvm/include/arm64/processor.h
tools/testing/selftests/kvm/lib/arm64/processor.c

index cf208390fd0e6f4e6652669d9988f9bdb80bba5d..0d4680da66d11e6af75574d8d635f5fcc13ffd0f 100644 (file)
@@ -89,7 +89,7 @@ static struct kvm_vm *setup_vm(void *guest_code, struct kvm_vcpu **source,
 
        vm = vm_create(2);
 
-       vm_ioctl(vm, KVM_ARM_PREFERRED_TARGET, &init);
+       kvm_get_default_vcpu_target(vm, &init);
        init.features[0] |= (1 << KVM_ARM_VCPU_PSCI_0_2);
 
        *source = aarch64_vcpu_add(vm, 0, &init, guest_code);
index eb5551d21dbefac6fba1c709200803e28f167218..a8e22d866ea7a0762dcfca7652d297cef350e402 100644 (file)
@@ -64,7 +64,7 @@ static struct kvm_vm *setup_vm(struct kvm_vcpu **vcpu)
        struct kvm_vm *vm;
 
        vm = vm_create(1);
-       vm_ioctl(vm, KVM_ARM_PREFERRED_TARGET, &init);
+       kvm_get_default_vcpu_target(vm, &init);
 
        /*
         * Enable in-kernel emulation of PSCI to ensure that calls are denied
index 36a3a8b4e0b563d729cdac68aa205209f3a02f1f..2a8f31c8e59fe8dd5a211fdfc4d27c1f58696be2 100644 (file)
@@ -430,7 +430,7 @@ static void create_vpmu_vm(void *guest_code)
        }
 
        /* Create vCPU with PMUv3 */
-       vm_ioctl(vpmu_vm.vm, KVM_ARM_PREFERRED_TARGET, &init);
+       kvm_get_default_vcpu_target(vpmu_vm.vm, &init);
        init.features[0] |= (1 << KVM_ARM_VCPU_PMU_V3);
        vpmu_vm.vcpu = aarch64_vcpu_add(vpmu_vm.vm, 0, &init, guest_code);
        vcpu_init_descriptor_tables(vpmu_vm.vcpu);
@@ -525,7 +525,7 @@ static void run_access_test(uint64_t pmcr_n)
         * Reset and re-initialize the vCPU, and run the guest code again to
         * check if PMCR_EL0.N is preserved.
         */
-       vm_ioctl(vpmu_vm.vm, KVM_ARM_PREFERRED_TARGET, &init);
+       kvm_get_default_vcpu_target(vpmu_vm.vm, &init);
        init.features[0] |= (1 << KVM_ARM_VCPU_PMU_V3);
        aarch64_vcpu_setup(vcpu, &init);
        vcpu_init_descriptor_tables(vcpu);
index 91f05f78e8249124332e9a28fef53daf4e746fd1..f4644c9d2d3b42cf24f6e595496dabe477f815b3 100644 (file)
@@ -116,10 +116,13 @@ void __weak finalize_vcpu(struct kvm_vcpu *vcpu, struct vcpu_reg_list *c)
 }
 
 #ifdef __aarch64__
-static void prepare_vcpu_init(struct vcpu_reg_list *c, struct kvm_vcpu_init *init)
+static void prepare_vcpu_init(struct kvm_vm *vm, struct vcpu_reg_list *c,
+                             struct kvm_vcpu_init *init)
 {
        struct vcpu_reg_sublist *s;
 
+       vm_ioctl(vm, KVM_ARM_PREFERRED_TARGET, init);
+
        for_each_sublist(c, s)
                if (s->capability)
                        init->features[s->feature / 32] |= 1 << (s->feature % 32);
@@ -127,10 +130,10 @@ static void prepare_vcpu_init(struct vcpu_reg_list *c, struct kvm_vcpu_init *ini
 
 static struct kvm_vcpu *vcpu_config_get_vcpu(struct vcpu_reg_list *c, struct kvm_vm *vm)
 {
-       struct kvm_vcpu_init init = { .target = -1, };
+       struct kvm_vcpu_init init;
        struct kvm_vcpu *vcpu;
 
-       prepare_vcpu_init(c, &init);
+       prepare_vcpu_init(vm, c, &init);
        vcpu = __vm_vcpu_add(vm, 0);
        aarch64_vcpu_setup(vcpu, &init);
 
index 5a4b29c1b9657cb248141f66dae1bbca00fb295d..87f50efed720f56e7fd640974fbde68bab600b24 100644 (file)
@@ -357,4 +357,6 @@ static __always_inline u64 ctxt_reg_alias(struct kvm_vcpu *vcpu, u32 encoding)
        return KVM_ARM64_SYS_REG(alias);
 }
 
+void kvm_get_default_vcpu_target(struct kvm_vm *vm, struct kvm_vcpu_init *init);
+
 #endif /* SELFTEST_KVM_PROCESSOR_H */
index 311660a9f655257f22506a6275d71a4c773367e6..5ae65fefd48cc8c0632dcd2bf54fd04153a87697 100644 (file)
@@ -267,19 +267,24 @@ void virt_arch_dump(FILE *stream, struct kvm_vm *vm, uint8_t indent)
        }
 }
 
+void kvm_get_default_vcpu_target(struct kvm_vm *vm, struct kvm_vcpu_init *init)
+{
+       struct kvm_vcpu_init preferred = {};
+
+       vm_ioctl(vm, KVM_ARM_PREFERRED_TARGET, &preferred);
+
+       *init = preferred;
+}
+
 void aarch64_vcpu_setup(struct kvm_vcpu *vcpu, struct kvm_vcpu_init *init)
 {
        struct kvm_vcpu_init default_init = { .target = -1, };
        struct kvm_vm *vm = vcpu->vm;
        uint64_t sctlr_el1, tcr_el1, ttbr0_el1;
 
-       if (!init)
+       if (!init) {
+               kvm_get_default_vcpu_target(vm, &default_init);
                init = &default_init;
-
-       if (init->target == -1) {
-               struct kvm_vcpu_init preferred;
-               vm_ioctl(vm, KVM_ARM_PREFERRED_TARGET, &preferred);
-               init->target = preferred.target;
        }
 
        vcpu_ioctl(vcpu, KVM_ARM_VCPU_INIT, init);