KVM: selftests: Sync stage before VM is freed in hypercalls test

Sync the next stage using the VM before said VM is potentially freed by
the TEST_STAGE_HVC_IFACE_FEAT_DISABLED stage.

Opportunistically take a double pointer in anticipation of also having to
set the new vCPU pointer once the test stops hardcoding '0' everywhere.

Signed-off-by: Sean Christopherson <seanjc@google.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
Sean Christopherson 2022-06-01 17:27:51 -07:00 коммит произвёл Paolo Bonzini
Родитель bfff0f60db
Коммит f05427faed
1 изменённых файлов: 13 добавлений и 14 удалений

Просмотреть файл

@ -246,32 +246,31 @@ static struct kvm_vm *test_vm_create(void)
return vm;
}
static struct kvm_vm *test_guest_stage(struct kvm_vm *vm)
static void test_guest_stage(struct kvm_vm **vm)
{
struct kvm_vm *ret_vm = vm;
int prev_stage = stage;
pr_debug("Stage: %d\n", stage);
pr_debug("Stage: %d\n", prev_stage);
switch (stage) {
/* Sync the stage early, the VM might be freed below. */
stage++;
sync_global_to_guest(*vm, stage);
switch (prev_stage) {
case TEST_STAGE_REG_IFACE:
test_fw_regs_after_vm_start(vm);
test_fw_regs_after_vm_start(*vm);
break;
case TEST_STAGE_HVC_IFACE_FEAT_DISABLED:
/* Start a new VM so that all the features are now enabled by default */
kvm_vm_free(vm);
ret_vm = test_vm_create();
kvm_vm_free(*vm);
*vm = test_vm_create();
break;
case TEST_STAGE_HVC_IFACE_FEAT_ENABLED:
case TEST_STAGE_HVC_IFACE_FALSE_INFO:
break;
default:
TEST_FAIL("Unknown test stage: %d\n", stage);
TEST_FAIL("Unknown test stage: %d\n", prev_stage);
}
stage++;
sync_global_to_guest(vm, stage);
return ret_vm;
}
static void test_run(void)
@ -289,7 +288,7 @@ static void test_run(void)
switch (get_ucall(vm, 0, &uc)) {
case UCALL_SYNC:
vm = test_guest_stage(vm);
test_guest_stage(&vm);
break;
case UCALL_DONE:
guest_done = true;