Skip to content

Commit a1b91ac

Browse files
ouptonMarc Zyngier
authored andcommitted
KVM: arm64: selftests: Provide helper for getting default vCPU target
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>
1 parent 1c9604b commit a1b91ac

6 files changed

Lines changed: 23 additions & 13 deletions

File tree

tools/testing/selftests/kvm/arm64/psci_test.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ static struct kvm_vm *setup_vm(void *guest_code, struct kvm_vcpu **source,
8989

9090
vm = vm_create(2);
9191

92-
vm_ioctl(vm, KVM_ARM_PREFERRED_TARGET, &init);
92+
kvm_get_default_vcpu_target(vm, &init);
9393
init.features[0] |= (1 << KVM_ARM_VCPU_PSCI_0_2);
9494

9595
*source = aarch64_vcpu_add(vm, 0, &init, guest_code);

tools/testing/selftests/kvm/arm64/smccc_filter.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ static struct kvm_vm *setup_vm(struct kvm_vcpu **vcpu)
6464
struct kvm_vm *vm;
6565

6666
vm = vm_create(1);
67-
vm_ioctl(vm, KVM_ARM_PREFERRED_TARGET, &init);
67+
kvm_get_default_vcpu_target(vm, &init);
6868

6969
/*
7070
* Enable in-kernel emulation of PSCI to ensure that calls are denied

tools/testing/selftests/kvm/arm64/vpmu_counter_access.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -430,7 +430,7 @@ static void create_vpmu_vm(void *guest_code)
430430
}
431431

432432
/* Create vCPU with PMUv3 */
433-
vm_ioctl(vpmu_vm.vm, KVM_ARM_PREFERRED_TARGET, &init);
433+
kvm_get_default_vcpu_target(vpmu_vm.vm, &init);
434434
init.features[0] |= (1 << KVM_ARM_VCPU_PMU_V3);
435435
vpmu_vm.vcpu = aarch64_vcpu_add(vpmu_vm.vm, 0, &init, guest_code);
436436
vcpu_init_descriptor_tables(vpmu_vm.vcpu);
@@ -525,7 +525,7 @@ static void run_access_test(uint64_t pmcr_n)
525525
* Reset and re-initialize the vCPU, and run the guest code again to
526526
* check if PMCR_EL0.N is preserved.
527527
*/
528-
vm_ioctl(vpmu_vm.vm, KVM_ARM_PREFERRED_TARGET, &init);
528+
kvm_get_default_vcpu_target(vpmu_vm.vm, &init);
529529
init.features[0] |= (1 << KVM_ARM_VCPU_PMU_V3);
530530
aarch64_vcpu_setup(vcpu, &init);
531531
vcpu_init_descriptor_tables(vcpu);

tools/testing/selftests/kvm/get-reg-list.c

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -116,21 +116,24 @@ void __weak finalize_vcpu(struct kvm_vcpu *vcpu, struct vcpu_reg_list *c)
116116
}
117117

118118
#ifdef __aarch64__
119-
static void prepare_vcpu_init(struct vcpu_reg_list *c, struct kvm_vcpu_init *init)
119+
static void prepare_vcpu_init(struct kvm_vm *vm, struct vcpu_reg_list *c,
120+
struct kvm_vcpu_init *init)
120121
{
121122
struct vcpu_reg_sublist *s;
122123

124+
vm_ioctl(vm, KVM_ARM_PREFERRED_TARGET, init);
125+
123126
for_each_sublist(c, s)
124127
if (s->capability)
125128
init->features[s->feature / 32] |= 1 << (s->feature % 32);
126129
}
127130

128131
static struct kvm_vcpu *vcpu_config_get_vcpu(struct vcpu_reg_list *c, struct kvm_vm *vm)
129132
{
130-
struct kvm_vcpu_init init = { .target = -1, };
133+
struct kvm_vcpu_init init;
131134
struct kvm_vcpu *vcpu;
132135

133-
prepare_vcpu_init(c, &init);
136+
prepare_vcpu_init(vm, c, &init);
134137
vcpu = __vm_vcpu_add(vm, 0);
135138
aarch64_vcpu_setup(vcpu, &init);
136139

tools/testing/selftests/kvm/include/arm64/processor.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -357,4 +357,6 @@ static __always_inline u64 ctxt_reg_alias(struct kvm_vcpu *vcpu, u32 encoding)
357357
return KVM_ARM64_SYS_REG(alias);
358358
}
359359

360+
void kvm_get_default_vcpu_target(struct kvm_vm *vm, struct kvm_vcpu_init *init);
361+
360362
#endif /* SELFTEST_KVM_PROCESSOR_H */

tools/testing/selftests/kvm/lib/arm64/processor.c

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -267,19 +267,24 @@ void virt_arch_dump(FILE *stream, struct kvm_vm *vm, uint8_t indent)
267267
}
268268
}
269269

270+
void kvm_get_default_vcpu_target(struct kvm_vm *vm, struct kvm_vcpu_init *init)
271+
{
272+
struct kvm_vcpu_init preferred = {};
273+
274+
vm_ioctl(vm, KVM_ARM_PREFERRED_TARGET, &preferred);
275+
276+
*init = preferred;
277+
}
278+
270279
void aarch64_vcpu_setup(struct kvm_vcpu *vcpu, struct kvm_vcpu_init *init)
271280
{
272281
struct kvm_vcpu_init default_init = { .target = -1, };
273282
struct kvm_vm *vm = vcpu->vm;
274283
uint64_t sctlr_el1, tcr_el1, ttbr0_el1;
275284

276-
if (!init)
285+
if (!init) {
286+
kvm_get_default_vcpu_target(vm, &default_init);
277287
init = &default_init;
278-
279-
if (init->target == -1) {
280-
struct kvm_vcpu_init preferred;
281-
vm_ioctl(vm, KVM_ARM_PREFERRED_TARGET, &preferred);
282-
init->target = preferred.target;
283288
}
284289

285290
vcpu_ioctl(vcpu, KVM_ARM_VCPU_INIT, init);

0 commit comments

Comments
 (0)