Skip to content

Commit

Permalink
KVM: selftests: fix triple fault if ept=0 in dirty_log_test
Browse files Browse the repository at this point in the history
[ Upstream commit e5830fb ]

Commit 22f232d ("KVM: selftests: x86: Set supported CPUIDs on
default VM") moved vcpu_set_cpuid into vm_create_with_vcpus, but
dirty_log_test doesn't use it to create vm. So vcpu's CPUIDs is
not set, the guest's pa_bits in kvm would be smaller than the
value queried by userspace.

However, the dirty track memory slot is in the highest GPA, the
reserved bits in gpte would be set with wrong pa_bits.
For shadow paging, page fault would fail in permission_fault and
be injected into guest. Since guest doesn't have idt, it finally
leads to vm_exit for triple fault.

Move vcpu_set_cpuid into vm_vcpu_add_default to set supported
CPUIDs on default vcpu, since almost all tests need it.

Fixes: 22f232d ("KVM: selftests: x86: Set supported CPUIDs on default VM")
Signed-off-by: Hou Wenlong <houwenlong93@linux.alibaba.com>
Message-Id: <411ea2173f89abce56fc1fca5af913ed9c5a89c9.1624351343.git.houwenlong93@linux.alibaba.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
  • Loading branch information
Hou Wenlong authored and gregkh committed Jul 14, 2021
1 parent 979965c commit aa138d4
Show file tree
Hide file tree
Showing 4 changed files with 3 additions and 8 deletions.
4 changes: 0 additions & 4 deletions tools/testing/selftests/kvm/lib/kvm_util.c
Original file line number Diff line number Diff line change
Expand Up @@ -375,10 +375,6 @@ struct kvm_vm *vm_create_with_vcpus(enum vm_guest_mode mode, uint32_t nr_vcpus,
uint32_t vcpuid = vcpuids ? vcpuids[i] : i;

vm_vcpu_add_default(vm, vcpuid, guest_code);

#ifdef __x86_64__
vcpu_set_cpuid(vm, vcpuid, kvm_get_supported_cpuid());
#endif
}

return vm;
Expand Down
3 changes: 3 additions & 0 deletions tools/testing/selftests/kvm/lib/x86_64/processor.c
Original file line number Diff line number Diff line change
Expand Up @@ -600,6 +600,9 @@ void vm_vcpu_add_default(struct kvm_vm *vm, uint32_t vcpuid, void *guest_code)
/* Setup the MP state */
mp_state.mp_state = 0;
vcpu_set_mp_state(vm, vcpuid, &mp_state);

/* Setup supported CPUIDs */
vcpu_set_cpuid(vm, vcpuid, kvm_get_supported_cpuid());
}

/*
Expand Down
2 changes: 0 additions & 2 deletions tools/testing/selftests/kvm/steal_time.c
Original file line number Diff line number Diff line change
Expand Up @@ -73,8 +73,6 @@ static void steal_time_init(struct kvm_vm *vm)
for (i = 0; i < NR_VCPUS; ++i) {
int ret;

vcpu_set_cpuid(vm, i, kvm_get_supported_cpuid());

/* ST_GPA_BASE is identity mapped */
st_gva[i] = (void *)(ST_GPA_BASE + i * STEAL_TIME_SIZE);
sync_global_to_guest(vm, st_gva[i]);
Expand Down
2 changes: 0 additions & 2 deletions tools/testing/selftests/kvm/x86_64/set_boot_cpu_id.c
Original file line number Diff line number Diff line change
Expand Up @@ -106,8 +106,6 @@ static void add_x86_vcpu(struct kvm_vm *vm, uint32_t vcpuid, bool bsp_code)
vm_vcpu_add_default(vm, vcpuid, guest_bsp_vcpu);
else
vm_vcpu_add_default(vm, vcpuid, guest_not_bsp_vcpu);

vcpu_set_cpuid(vm, vcpuid, kvm_get_supported_cpuid());
}

static void run_vm_bsp(uint32_t bsp_vcpu)
Expand Down

0 comments on commit aa138d4

Please sign in to comment.