Message ID | 20210923191610.3814698-11-oupton@google.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | KVM: arm64: Implement PSCI SYSTEM_SUSPEND support | expand |
On Thu, Sep 23, 2021 at 07:16:09PM +0000, Oliver Upton wrote: > Split up the current test into several helpers that will be useful to > subsequent test cases added to the PSCI test suite. > > Signed-off-by: Oliver Upton <oupton@google.com> > --- > .../testing/selftests/kvm/aarch64/psci_test.c | 68 ++++++++++++------- > 1 file changed, 45 insertions(+), 23 deletions(-) > > diff --git a/tools/testing/selftests/kvm/aarch64/psci_test.c b/tools/testing/selftests/kvm/aarch64/psci_test.c > index 8d043e12b137..90312be335da 100644 > --- a/tools/testing/selftests/kvm/aarch64/psci_test.c > +++ b/tools/testing/selftests/kvm/aarch64/psci_test.c > @@ -45,7 +45,7 @@ static uint64_t psci_affinity_info(uint64_t target_affinity, > return res.a0; > } > > -static void guest_main(uint64_t target_cpu) > +static void guest_test_cpu_on(uint64_t target_cpu) > { > GUEST_ASSERT(!psci_cpu_on(target_cpu, CPU_ON_ENTRY_ADDR, CPU_ON_CONTEXT_ID)); > uint64_t target_state; > @@ -69,12 +69,10 @@ static void vcpu_power_off(struct kvm_vm *vm, uint32_t vcpuid) > vcpu_set_mp_state(vm, vcpuid, &mp_state); > } > > -int main(void) > +static struct kvm_vm *setup_vm(void *guest_code) > { > - uint64_t target_mpidr, obs_pc, obs_x0; > struct kvm_vcpu_init init; > struct kvm_vm *vm; > - struct ucall uc; > > vm = vm_create(VM_MODE_DEFAULT, DEFAULT_GUEST_PHY_PAGES, O_RDWR); > kvm_vm_elf_load(vm, program_invocation_name); > @@ -83,31 +81,28 @@ int main(void) > vm_ioctl(vm, KVM_ARM_PREFERRED_TARGET, &init); > init.features[0] |= (1 << KVM_ARM_VCPU_PSCI_0_2); > > - aarch64_vcpu_add_default(vm, VCPU_ID_SOURCE, &init, guest_main); > - aarch64_vcpu_add_default(vm, VCPU_ID_TARGET, &init, guest_main); > + aarch64_vcpu_add_default(vm, VCPU_ID_SOURCE, &init, guest_code); > + aarch64_vcpu_add_default(vm, VCPU_ID_TARGET, &init, guest_code); > > - /* > - * make sure the target is already off when executing the test. > - */ > - vcpu_power_off(vm, VCPU_ID_TARGET); > + return vm; > +} > > - get_reg(vm, VCPU_ID_TARGET, ARM64_SYS_REG(MPIDR_EL1), &target_mpidr); > - vcpu_args_set(vm, VCPU_ID_SOURCE, 1, target_mpidr & MPIDR_HWID_BITMASK); > - vcpu_run(vm, VCPU_ID_SOURCE); > +static void enter_guest(struct kvm_vm *vm, uint32_t vcpuid) > +{ > + struct ucall uc; > > - switch (get_ucall(vm, VCPU_ID_SOURCE, &uc)) { > - case UCALL_DONE: > - break; > - case UCALL_ABORT: > + vcpu_run(vm, vcpuid); > + if (get_ucall(vm, vcpuid, &uc) == UCALL_ABORT) > TEST_FAIL("%s at %s:%ld", (const char *)uc.args[0], __FILE__, > uc.args[1]); > - break; > - default: > - TEST_FAIL("Unhandled ucall: %lu", uc.cmd); > - } > +} > > - get_reg(vm, VCPU_ID_TARGET, ARM64_CORE_REG(regs.pc), &obs_pc); > - get_reg(vm, VCPU_ID_TARGET, ARM64_CORE_REG(regs.regs[0]), &obs_x0); > +static void assert_vcpu_reset(struct kvm_vm *vm, uint32_t vcpuid) > +{ > + uint64_t obs_pc, obs_x0; > + > + get_reg(vm, vcpuid, ARM64_CORE_REG(regs.pc), &obs_pc); > + get_reg(vm, vcpuid, ARM64_CORE_REG(regs.regs[0]), &obs_x0); > > TEST_ASSERT(obs_pc == CPU_ON_ENTRY_ADDR, > "unexpected target cpu pc: %lx (expected: %lx)", > @@ -115,7 +110,34 @@ int main(void) > TEST_ASSERT(obs_x0 == CPU_ON_CONTEXT_ID, > "unexpected target context id: %lx (expected: %lx)", > obs_x0, CPU_ON_CONTEXT_ID); > +} > > +static void host_test_cpu_on(void) > +{ > + uint64_t target_mpidr; > + struct kvm_vm *vm; > + struct ucall uc; > + > + vm = setup_vm(guest_test_cpu_on); > + > + /* > + * make sure the target is already off when executing the test. > + */ > + vcpu_power_off(vm, VCPU_ID_TARGET); > + > + get_reg(vm, VCPU_ID_TARGET, ARM64_SYS_REG(MPIDR_EL1), &target_mpidr); > + vcpu_args_set(vm, VCPU_ID_SOURCE, 1, target_mpidr & MPIDR_HWID_BITMASK); > + enter_guest(vm, VCPU_ID_SOURCE); > + > + if (get_ucall(vm, VCPU_ID_SOURCE, &uc) != UCALL_DONE) > + TEST_FAIL("Unhandled ucall: %lu", uc.cmd); > + > + assert_vcpu_reset(vm, VCPU_ID_TARGET); > kvm_vm_free(vm); > +} > + > +int main(void) > +{ > + host_test_cpu_on(); > return 0; > } > -- > 2.33.0.685.g46640cef36-goog > Hard to read diff, but I think the refactoring comes out right. Please do this refactoring before adding the new test in the next revision, though. Anyway, ignoring the new test context, which I think is changing with the next revision Reviewed-by: Andrew Jones <drjones@redhat.com> Thanks, drew
Hi Drew, On Tue, Oct 5, 2021 at 6:45 AM Andrew Jones <drjones@redhat.com> wrote: > > On Thu, Sep 23, 2021 at 07:16:09PM +0000, Oliver Upton wrote: > > Split up the current test into several helpers that will be useful to > > subsequent test cases added to the PSCI test suite. > > > > Signed-off-by: Oliver Upton <oupton@google.com> > > --- > > .../testing/selftests/kvm/aarch64/psci_test.c | 68 ++++++++++++------- > > 1 file changed, 45 insertions(+), 23 deletions(-) > > > > diff --git a/tools/testing/selftests/kvm/aarch64/psci_test.c b/tools/testing/selftests/kvm/aarch64/psci_test.c > > index 8d043e12b137..90312be335da 100644 > > --- a/tools/testing/selftests/kvm/aarch64/psci_test.c > > +++ b/tools/testing/selftests/kvm/aarch64/psci_test.c > > @@ -45,7 +45,7 @@ static uint64_t psci_affinity_info(uint64_t target_affinity, > > return res.a0; > > } > > > > -static void guest_main(uint64_t target_cpu) > > +static void guest_test_cpu_on(uint64_t target_cpu) > > { > > GUEST_ASSERT(!psci_cpu_on(target_cpu, CPU_ON_ENTRY_ADDR, CPU_ON_CONTEXT_ID)); > > uint64_t target_state; > > @@ -69,12 +69,10 @@ static void vcpu_power_off(struct kvm_vm *vm, uint32_t vcpuid) > > vcpu_set_mp_state(vm, vcpuid, &mp_state); > > } > > > > -int main(void) > > +static struct kvm_vm *setup_vm(void *guest_code) > > { > > - uint64_t target_mpidr, obs_pc, obs_x0; > > struct kvm_vcpu_init init; > > struct kvm_vm *vm; > > - struct ucall uc; > > > > vm = vm_create(VM_MODE_DEFAULT, DEFAULT_GUEST_PHY_PAGES, O_RDWR); > > kvm_vm_elf_load(vm, program_invocation_name); > > @@ -83,31 +81,28 @@ int main(void) > > vm_ioctl(vm, KVM_ARM_PREFERRED_TARGET, &init); > > init.features[0] |= (1 << KVM_ARM_VCPU_PSCI_0_2); > > > > - aarch64_vcpu_add_default(vm, VCPU_ID_SOURCE, &init, guest_main); > > - aarch64_vcpu_add_default(vm, VCPU_ID_TARGET, &init, guest_main); > > + aarch64_vcpu_add_default(vm, VCPU_ID_SOURCE, &init, guest_code); > > + aarch64_vcpu_add_default(vm, VCPU_ID_TARGET, &init, guest_code); > > > > - /* > > - * make sure the target is already off when executing the test. > > - */ > > - vcpu_power_off(vm, VCPU_ID_TARGET); > > + return vm; > > +} > > > > - get_reg(vm, VCPU_ID_TARGET, ARM64_SYS_REG(MPIDR_EL1), &target_mpidr); > > - vcpu_args_set(vm, VCPU_ID_SOURCE, 1, target_mpidr & MPIDR_HWID_BITMASK); > > - vcpu_run(vm, VCPU_ID_SOURCE); > > +static void enter_guest(struct kvm_vm *vm, uint32_t vcpuid) > > +{ > > + struct ucall uc; > > > > - switch (get_ucall(vm, VCPU_ID_SOURCE, &uc)) { > > - case UCALL_DONE: > > - break; > > - case UCALL_ABORT: > > + vcpu_run(vm, vcpuid); > > + if (get_ucall(vm, vcpuid, &uc) == UCALL_ABORT) > > TEST_FAIL("%s at %s:%ld", (const char *)uc.args[0], __FILE__, > > uc.args[1]); > > - break; > > - default: > > - TEST_FAIL("Unhandled ucall: %lu", uc.cmd); > > - } > > +} > > > > - get_reg(vm, VCPU_ID_TARGET, ARM64_CORE_REG(regs.pc), &obs_pc); > > - get_reg(vm, VCPU_ID_TARGET, ARM64_CORE_REG(regs.regs[0]), &obs_x0); > > +static void assert_vcpu_reset(struct kvm_vm *vm, uint32_t vcpuid) > > +{ > > + uint64_t obs_pc, obs_x0; > > + > > + get_reg(vm, vcpuid, ARM64_CORE_REG(regs.pc), &obs_pc); > > + get_reg(vm, vcpuid, ARM64_CORE_REG(regs.regs[0]), &obs_x0); > > > > TEST_ASSERT(obs_pc == CPU_ON_ENTRY_ADDR, > > "unexpected target cpu pc: %lx (expected: %lx)", > > @@ -115,7 +110,34 @@ int main(void) > > TEST_ASSERT(obs_x0 == CPU_ON_CONTEXT_ID, > > "unexpected target context id: %lx (expected: %lx)", > > obs_x0, CPU_ON_CONTEXT_ID); > > +} > > > > +static void host_test_cpu_on(void) > > +{ > > + uint64_t target_mpidr; > > + struct kvm_vm *vm; > > + struct ucall uc; > > + > > + vm = setup_vm(guest_test_cpu_on); > > + > > + /* > > + * make sure the target is already off when executing the test. > > + */ > > + vcpu_power_off(vm, VCPU_ID_TARGET); > > + > > + get_reg(vm, VCPU_ID_TARGET, ARM64_SYS_REG(MPIDR_EL1), &target_mpidr); > > + vcpu_args_set(vm, VCPU_ID_SOURCE, 1, target_mpidr & MPIDR_HWID_BITMASK); > > + enter_guest(vm, VCPU_ID_SOURCE); > > + > > + if (get_ucall(vm, VCPU_ID_SOURCE, &uc) != UCALL_DONE) > > + TEST_FAIL("Unhandled ucall: %lu", uc.cmd); > > + > > + assert_vcpu_reset(vm, VCPU_ID_TARGET); > > kvm_vm_free(vm); > > +} > > + > > +int main(void) > > +{ > > + host_test_cpu_on(); > > return 0; > > } > > -- > > 2.33.0.685.g46640cef36-goog > > > > Hard to read diff, but I think the refactoring comes out right. Yeah, this one's nasty, sorry about that. Thanks for parsing it out, heh. > Please do this refactoring before adding the new test in the next revision, though. > This is 10/11 in the series, and the test is 11/11. I'm not seeing any context belonging to the last patch, but perhaps I'm missing something obvious. > Reviewed-by: Andrew Jones <drjones@redhat.com> Thanks! -- Best, Oliver
On Tue, Oct 05, 2021 at 07:54:01AM -0700, Oliver Upton wrote: > Hi Drew, > > On Tue, Oct 5, 2021 at 6:45 AM Andrew Jones <drjones@redhat.com> wrote: > > > > On Thu, Sep 23, 2021 at 07:16:09PM +0000, Oliver Upton wrote: > > > Split up the current test into several helpers that will be useful to > > > subsequent test cases added to the PSCI test suite. > > > > > > Signed-off-by: Oliver Upton <oupton@google.com> > > > --- > > > .../testing/selftests/kvm/aarch64/psci_test.c | 68 ++++++++++++------- > > > 1 file changed, 45 insertions(+), 23 deletions(-) > > > > > > diff --git a/tools/testing/selftests/kvm/aarch64/psci_test.c b/tools/testing/selftests/kvm/aarch64/psci_test.c > > > index 8d043e12b137..90312be335da 100644 > > > --- a/tools/testing/selftests/kvm/aarch64/psci_test.c > > > +++ b/tools/testing/selftests/kvm/aarch64/psci_test.c > > > @@ -45,7 +45,7 @@ static uint64_t psci_affinity_info(uint64_t target_affinity, > > > return res.a0; > > > } > > > > > > -static void guest_main(uint64_t target_cpu) > > > +static void guest_test_cpu_on(uint64_t target_cpu) > > > { > > > GUEST_ASSERT(!psci_cpu_on(target_cpu, CPU_ON_ENTRY_ADDR, CPU_ON_CONTEXT_ID)); > > > uint64_t target_state; > > > @@ -69,12 +69,10 @@ static void vcpu_power_off(struct kvm_vm *vm, uint32_t vcpuid) > > > vcpu_set_mp_state(vm, vcpuid, &mp_state); > > > } Context from last patch. > > > > > > -int main(void) > > > +static struct kvm_vm *setup_vm(void *guest_code) > > > { > > > - uint64_t target_mpidr, obs_pc, obs_x0; > > > struct kvm_vcpu_init init; > > > struct kvm_vm *vm; > > > - struct ucall uc; > > > > > > vm = vm_create(VM_MODE_DEFAULT, DEFAULT_GUEST_PHY_PAGES, O_RDWR); > > > kvm_vm_elf_load(vm, program_invocation_name); > > > @@ -83,31 +81,28 @@ int main(void) > > > vm_ioctl(vm, KVM_ARM_PREFERRED_TARGET, &init); > > > init.features[0] |= (1 << KVM_ARM_VCPU_PSCI_0_2); > > > > > > - aarch64_vcpu_add_default(vm, VCPU_ID_SOURCE, &init, guest_main); > > > - aarch64_vcpu_add_default(vm, VCPU_ID_TARGET, &init, guest_main); > > > + aarch64_vcpu_add_default(vm, VCPU_ID_SOURCE, &init, guest_code); > > > + aarch64_vcpu_add_default(vm, VCPU_ID_TARGET, &init, guest_code); Context from last patch. > > > > > > - /* > > > - * make sure the target is already off when executing the test. > > > - */ > > > - vcpu_power_off(vm, VCPU_ID_TARGET); > > > + return vm; > > > +} > > > > > > - get_reg(vm, VCPU_ID_TARGET, ARM64_SYS_REG(MPIDR_EL1), &target_mpidr); > > > - vcpu_args_set(vm, VCPU_ID_SOURCE, 1, target_mpidr & MPIDR_HWID_BITMASK); > > > - vcpu_run(vm, VCPU_ID_SOURCE); > > > +static void enter_guest(struct kvm_vm *vm, uint32_t vcpuid) > > > +{ > > > + struct ucall uc; > > > > > > - switch (get_ucall(vm, VCPU_ID_SOURCE, &uc)) { > > > - case UCALL_DONE: > > > - break; > > > - case UCALL_ABORT: > > > + vcpu_run(vm, vcpuid); > > > + if (get_ucall(vm, vcpuid, &uc) == UCALL_ABORT) > > > TEST_FAIL("%s at %s:%ld", (const char *)uc.args[0], __FILE__, > > > uc.args[1]); > > > - break; > > > - default: > > > - TEST_FAIL("Unhandled ucall: %lu", uc.cmd); > > > - } > > > +} > > > > > > - get_reg(vm, VCPU_ID_TARGET, ARM64_CORE_REG(regs.pc), &obs_pc); > > > - get_reg(vm, VCPU_ID_TARGET, ARM64_CORE_REG(regs.regs[0]), &obs_x0); > > > +static void assert_vcpu_reset(struct kvm_vm *vm, uint32_t vcpuid) > > > +{ > > > + uint64_t obs_pc, obs_x0; > > > + > > > + get_reg(vm, vcpuid, ARM64_CORE_REG(regs.pc), &obs_pc); > > > + get_reg(vm, vcpuid, ARM64_CORE_REG(regs.regs[0]), &obs_x0); > > > > > > TEST_ASSERT(obs_pc == CPU_ON_ENTRY_ADDR, > > > "unexpected target cpu pc: %lx (expected: %lx)", > > > @@ -115,7 +110,34 @@ int main(void) > > > TEST_ASSERT(obs_x0 == CPU_ON_CONTEXT_ID, > > > "unexpected target context id: %lx (expected: %lx)", > > > obs_x0, CPU_ON_CONTEXT_ID); > > > +} > > > > > > +static void host_test_cpu_on(void) > > > +{ > > > + uint64_t target_mpidr; > > > + struct kvm_vm *vm; > > > + struct ucall uc; > > > + > > > + vm = setup_vm(guest_test_cpu_on); > > > + > > > + /* > > > + * make sure the target is already off when executing the test. > > > + */ > > > + vcpu_power_off(vm, VCPU_ID_TARGET); > > > + > > > + get_reg(vm, VCPU_ID_TARGET, ARM64_SYS_REG(MPIDR_EL1), &target_mpidr); > > > + vcpu_args_set(vm, VCPU_ID_SOURCE, 1, target_mpidr & MPIDR_HWID_BITMASK); > > > + enter_guest(vm, VCPU_ID_SOURCE); > > > + > > > + if (get_ucall(vm, VCPU_ID_SOURCE, &uc) != UCALL_DONE) > > > + TEST_FAIL("Unhandled ucall: %lu", uc.cmd); > > > + > > > + assert_vcpu_reset(vm, VCPU_ID_TARGET); > > > kvm_vm_free(vm); > > > +} > > > + > > > +int main(void) > > > +{ > > > + host_test_cpu_on(); > > > return 0; > > > } > > > -- > > > 2.33.0.685.g46640cef36-goog > > > > > > > Hard to read diff, but I think the refactoring comes out right. > > Yeah, this one's nasty, sorry about that. Thanks for parsing it out, heh. > > > Please do this refactoring before adding the new test in the next revision, though. > > > > This is 10/11 in the series, and the test is 11/11. I'm not seeing any > context belonging to the last patch, but perhaps I'm missing something > obvious. It's not much, but nicer to have none. Thanks, drew > > > Reviewed-by: Andrew Jones <drjones@redhat.com> > > Thanks! > > -- > Best, > Oliver >
diff --git a/tools/testing/selftests/kvm/aarch64/psci_test.c b/tools/testing/selftests/kvm/aarch64/psci_test.c index 8d043e12b137..90312be335da 100644 --- a/tools/testing/selftests/kvm/aarch64/psci_test.c +++ b/tools/testing/selftests/kvm/aarch64/psci_test.c @@ -45,7 +45,7 @@ static uint64_t psci_affinity_info(uint64_t target_affinity, return res.a0; } -static void guest_main(uint64_t target_cpu) +static void guest_test_cpu_on(uint64_t target_cpu) { GUEST_ASSERT(!psci_cpu_on(target_cpu, CPU_ON_ENTRY_ADDR, CPU_ON_CONTEXT_ID)); uint64_t target_state; @@ -69,12 +69,10 @@ static void vcpu_power_off(struct kvm_vm *vm, uint32_t vcpuid) vcpu_set_mp_state(vm, vcpuid, &mp_state); } -int main(void) +static struct kvm_vm *setup_vm(void *guest_code) { - uint64_t target_mpidr, obs_pc, obs_x0; struct kvm_vcpu_init init; struct kvm_vm *vm; - struct ucall uc; vm = vm_create(VM_MODE_DEFAULT, DEFAULT_GUEST_PHY_PAGES, O_RDWR); kvm_vm_elf_load(vm, program_invocation_name); @@ -83,31 +81,28 @@ int main(void) vm_ioctl(vm, KVM_ARM_PREFERRED_TARGET, &init); init.features[0] |= (1 << KVM_ARM_VCPU_PSCI_0_2); - aarch64_vcpu_add_default(vm, VCPU_ID_SOURCE, &init, guest_main); - aarch64_vcpu_add_default(vm, VCPU_ID_TARGET, &init, guest_main); + aarch64_vcpu_add_default(vm, VCPU_ID_SOURCE, &init, guest_code); + aarch64_vcpu_add_default(vm, VCPU_ID_TARGET, &init, guest_code); - /* - * make sure the target is already off when executing the test. - */ - vcpu_power_off(vm, VCPU_ID_TARGET); + return vm; +} - get_reg(vm, VCPU_ID_TARGET, ARM64_SYS_REG(MPIDR_EL1), &target_mpidr); - vcpu_args_set(vm, VCPU_ID_SOURCE, 1, target_mpidr & MPIDR_HWID_BITMASK); - vcpu_run(vm, VCPU_ID_SOURCE); +static void enter_guest(struct kvm_vm *vm, uint32_t vcpuid) +{ + struct ucall uc; - switch (get_ucall(vm, VCPU_ID_SOURCE, &uc)) { - case UCALL_DONE: - break; - case UCALL_ABORT: + vcpu_run(vm, vcpuid); + if (get_ucall(vm, vcpuid, &uc) == UCALL_ABORT) TEST_FAIL("%s at %s:%ld", (const char *)uc.args[0], __FILE__, uc.args[1]); - break; - default: - TEST_FAIL("Unhandled ucall: %lu", uc.cmd); - } +} - get_reg(vm, VCPU_ID_TARGET, ARM64_CORE_REG(regs.pc), &obs_pc); - get_reg(vm, VCPU_ID_TARGET, ARM64_CORE_REG(regs.regs[0]), &obs_x0); +static void assert_vcpu_reset(struct kvm_vm *vm, uint32_t vcpuid) +{ + uint64_t obs_pc, obs_x0; + + get_reg(vm, vcpuid, ARM64_CORE_REG(regs.pc), &obs_pc); + get_reg(vm, vcpuid, ARM64_CORE_REG(regs.regs[0]), &obs_x0); TEST_ASSERT(obs_pc == CPU_ON_ENTRY_ADDR, "unexpected target cpu pc: %lx (expected: %lx)", @@ -115,7 +110,34 @@ int main(void) TEST_ASSERT(obs_x0 == CPU_ON_CONTEXT_ID, "unexpected target context id: %lx (expected: %lx)", obs_x0, CPU_ON_CONTEXT_ID); +} +static void host_test_cpu_on(void) +{ + uint64_t target_mpidr; + struct kvm_vm *vm; + struct ucall uc; + + vm = setup_vm(guest_test_cpu_on); + + /* + * make sure the target is already off when executing the test. + */ + vcpu_power_off(vm, VCPU_ID_TARGET); + + get_reg(vm, VCPU_ID_TARGET, ARM64_SYS_REG(MPIDR_EL1), &target_mpidr); + vcpu_args_set(vm, VCPU_ID_SOURCE, 1, target_mpidr & MPIDR_HWID_BITMASK); + enter_guest(vm, VCPU_ID_SOURCE); + + if (get_ucall(vm, VCPU_ID_SOURCE, &uc) != UCALL_DONE) + TEST_FAIL("Unhandled ucall: %lu", uc.cmd); + + assert_vcpu_reset(vm, VCPU_ID_TARGET); kvm_vm_free(vm); +} + +int main(void) +{ + host_test_cpu_on(); return 0; }
Split up the current test into several helpers that will be useful to subsequent test cases added to the PSCI test suite. Signed-off-by: Oliver Upton <oupton@google.com> --- .../testing/selftests/kvm/aarch64/psci_test.c | 68 ++++++++++++------- 1 file changed, 45 insertions(+), 23 deletions(-)