Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

KVM: selftests: Move setting a vCPU's entry point to a dedicated API

Extract the code to set a vCPU's entry point out of vm_arch_vcpu_add() and
into a new API, vcpu_arch_set_entry_point(). Providing a separate API
will allow creating a KVM selftests hardness that can handle tests that
use different entry points for sub-tests, whereas *requiring* the entry
point to be specified at vCPU creation makes it difficult to create a
generic harness, e.g. the boilerplate setup/teardown can't easily create
and destroy the VM and vCPUs.

Signed-off-by: Thomas Huth <thuth@redhat.com>
Link: https://lore.kernel.org/r/20240208204844.119326-4-thuth@redhat.com
Signed-off-by: Sean Christopherson <seanjc@google.com>

+48 -22
+7 -4
tools/testing/selftests/kvm/include/kvm_util_base.h
··· 969 969 * Input Args: 970 970 * vm - Virtual Machine 971 971 * vcpu_id - The id of the VCPU to add to the VM. 972 - * guest_code - The vCPU's entry point 973 972 */ 974 - struct kvm_vcpu *vm_arch_vcpu_add(struct kvm_vm *vm, uint32_t vcpu_id, 975 - void *guest_code); 973 + struct kvm_vcpu *vm_arch_vcpu_add(struct kvm_vm *vm, uint32_t vcpu_id); 974 + void vcpu_arch_set_entry_point(struct kvm_vcpu *vcpu, void *guest_code); 976 975 977 976 static inline struct kvm_vcpu *vm_vcpu_add(struct kvm_vm *vm, uint32_t vcpu_id, 978 977 void *guest_code) 979 978 { 980 - return vm_arch_vcpu_add(vm, vcpu_id, guest_code); 979 + struct kvm_vcpu *vcpu = vm_arch_vcpu_add(vm, vcpu_id); 980 + 981 + vcpu_arch_set_entry_point(vcpu, guest_code); 982 + 983 + return vcpu; 981 984 } 982 985 983 986 /* Re-create a vCPU after restarting a VM, e.g. for state save/restore tests. */
+18 -6
tools/testing/selftests/kvm/lib/aarch64/processor.c
··· 365 365 indent, "", pstate, pc); 366 366 } 367 367 368 - struct kvm_vcpu *aarch64_vcpu_add(struct kvm_vm *vm, uint32_t vcpu_id, 369 - struct kvm_vcpu_init *init, void *guest_code) 368 + void vcpu_arch_set_entry_point(struct kvm_vcpu *vcpu, void *guest_code) 369 + { 370 + vcpu_set_reg(vcpu, ARM64_CORE_REG(regs.pc), (uint64_t)guest_code); 371 + } 372 + 373 + static struct kvm_vcpu *__aarch64_vcpu_add(struct kvm_vm *vm, uint32_t vcpu_id, 374 + struct kvm_vcpu_init *init) 370 375 { 371 376 size_t stack_size; 372 377 uint64_t stack_vaddr; ··· 386 381 aarch64_vcpu_setup(vcpu, init); 387 382 388 383 vcpu_set_reg(vcpu, ARM64_CORE_REG(sp_el1), stack_vaddr + stack_size); 389 - vcpu_set_reg(vcpu, ARM64_CORE_REG(regs.pc), (uint64_t)guest_code); 384 + return vcpu; 385 + } 386 + 387 + struct kvm_vcpu *aarch64_vcpu_add(struct kvm_vm *vm, uint32_t vcpu_id, 388 + struct kvm_vcpu_init *init, void *guest_code) 389 + { 390 + struct kvm_vcpu *vcpu = __aarch64_vcpu_add(vm, vcpu_id, init); 391 + 392 + vcpu_arch_set_entry_point(vcpu, guest_code); 390 393 391 394 return vcpu; 392 395 } 393 396 394 - struct kvm_vcpu *vm_arch_vcpu_add(struct kvm_vm *vm, uint32_t vcpu_id, 395 - void *guest_code) 397 + struct kvm_vcpu *vm_arch_vcpu_add(struct kvm_vm *vm, uint32_t vcpu_id) 396 398 { 397 - return aarch64_vcpu_add(vm, vcpu_id, NULL, guest_code); 399 + return __aarch64_vcpu_add(vm, vcpu_id, NULL); 398 400 } 399 401 400 402 void vcpu_args_set(struct kvm_vcpu *vcpu, unsigned int num, ...)
+6 -3
tools/testing/selftests/kvm/lib/riscv/processor.c
··· 277 277 0, 0, 0, 0, 0, 0); 278 278 } 279 279 280 - struct kvm_vcpu *vm_arch_vcpu_add(struct kvm_vm *vm, uint32_t vcpu_id, 281 - void *guest_code) 280 + void vcpu_arch_set_entry_point(struct kvm_vcpu *vcpu, void *guest_code) 281 + { 282 + vcpu_set_reg(vcpu, RISCV_CORE_REG(regs.pc), (unsigned long)guest_code); 283 + } 284 + 285 + struct kvm_vcpu *vm_arch_vcpu_add(struct kvm_vm *vm, uint32_t vcpu_id) 282 286 { 283 287 int r; 284 288 size_t stack_size; ··· 316 312 317 313 /* Setup stack pointer and program counter of guest */ 318 314 vcpu_set_reg(vcpu, RISCV_CORE_REG(regs.sp), stack_vaddr + stack_size); 319 - vcpu_set_reg(vcpu, RISCV_CORE_REG(regs.pc), (unsigned long)guest_code); 320 315 321 316 /* Setup default exception vector of guest */ 322 317 vcpu_set_reg(vcpu, RISCV_GENERAL_CSR_REG(stvec), (unsigned long)guest_unexp_trap);
+7 -6
tools/testing/selftests/kvm/lib/s390x/processor.c
··· 155 155 virt_dump_region(stream, vm, indent, vm->pgd); 156 156 } 157 157 158 - struct kvm_vcpu *vm_arch_vcpu_add(struct kvm_vm *vm, uint32_t vcpu_id, 159 - void *guest_code) 158 + void vcpu_arch_set_entry_point(struct kvm_vcpu *vcpu, void *guest_code) 159 + { 160 + vcpu->run->psw_addr = (uintptr_t)guest_code; 161 + } 162 + 163 + struct kvm_vcpu *vm_arch_vcpu_add(struct kvm_vm *vm, uint32_t vcpu_id) 160 164 { 161 165 size_t stack_size = DEFAULT_STACK_PGS * getpagesize(); 162 166 uint64_t stack_vaddr; 163 167 struct kvm_regs regs; 164 168 struct kvm_sregs sregs; 165 169 struct kvm_vcpu *vcpu; 166 - struct kvm_run *run; 167 170 168 171 TEST_ASSERT(vm->page_size == 4096, "Unsupported page size: 0x%x", 169 172 vm->page_size); ··· 187 184 sregs.crs[1] = vm->pgd | 0xf; /* Primary region table */ 188 185 vcpu_sregs_set(vcpu, &sregs); 189 186 190 - run = vcpu->run; 191 - run->psw_mask = 0x0400000180000000ULL; /* DAT enabled + 64 bit mode */ 192 - run->psw_addr = (uintptr_t)guest_code; 187 + vcpu->run->psw_mask = 0x0400000180000000ULL; /* DAT enabled + 64 bit mode */ 193 188 194 189 return vcpu; 195 190 }
+10 -3
tools/testing/selftests/kvm/lib/x86_64/processor.c
··· 562 562 sync_global_to_guest(vm, host_cpu_is_amd); 563 563 } 564 564 565 - struct kvm_vcpu *vm_arch_vcpu_add(struct kvm_vm *vm, uint32_t vcpu_id, 566 - void *guest_code) 565 + void vcpu_arch_set_entry_point(struct kvm_vcpu *vcpu, void *guest_code) 566 + { 567 + struct kvm_regs regs; 568 + 569 + vcpu_regs_get(vcpu, &regs); 570 + regs.rip = (unsigned long) guest_code; 571 + vcpu_regs_set(vcpu, &regs); 572 + } 573 + 574 + struct kvm_vcpu *vm_arch_vcpu_add(struct kvm_vm *vm, uint32_t vcpu_id) 567 575 { 568 576 struct kvm_mp_state mp_state; 569 577 struct kvm_regs regs; ··· 605 597 vcpu_regs_get(vcpu, &regs); 606 598 regs.rflags = regs.rflags | 0x2; 607 599 regs.rsp = stack_vaddr; 608 - regs.rip = (unsigned long) guest_code; 609 600 vcpu_regs_set(vcpu, &regs); 610 601 611 602 /* Setup the MP state */