mirror of
git://git.yoctoproject.org/linux-yocto.git
synced 2026-01-27 12:47:24 +01:00
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>
This commit is contained in:
parent
1c9604ba23
commit
a1b91ac238
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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 */
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user