KVM: selftests: set CPUID before setting sregs in vcpu creation
Recent kernels have checks to ensure the GPA values in special-purpose registers like CR3 are within the maximum physical address range and don't overlap with anything in the upper/reserved range. In the case of SEV kselftest guests booting directly into 64-bit mode, CR3 needs to be initialized to the GPA of the page table root, with the encryption bit set. The kernel accounts for this encryption bit by removing it from reserved bit range when the guest advertises the bit position via KVM_SET_CPUID*, but kselftests currently call KVM_SET_SREGS as part of vm_vcpu_add_default(), before KVM_SET_CPUID*. As a result, KVM_SET_SREGS will return an error in these cases. Address this by moving vcpu_set_cpuid() (which calls KVM_SET_CPUID*) ahead of vcpu_setup() (which calls KVM_SET_SREGS). While there, address a typo in the assertion that triggers when KVM_SET_SREGS fails. Suggested-by: Sean Christopherson <seanjc@google.com> Signed-off-by: Michael Roth <michael.roth@amd.com> Message-Id: <20211006203617.13045-1-michael.roth@amd.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> Reviewed-by: Nathan Tempelman <natet@google.com>
This commit is contained in:
parent
9ae7f6c9b5
commit
413eaa4ecd
|
@ -1792,7 +1792,7 @@ void vcpu_sregs_get(struct kvm_vm *vm, uint32_t vcpuid, struct kvm_sregs *sregs)
|
|||
void vcpu_sregs_set(struct kvm_vm *vm, uint32_t vcpuid, struct kvm_sregs *sregs)
|
||||
{
|
||||
int ret = _vcpu_sregs_set(vm, vcpuid, sregs);
|
||||
TEST_ASSERT(ret == 0, "KVM_RUN IOCTL failed, "
|
||||
TEST_ASSERT(ret == 0, "KVM_SET_SREGS IOCTL failed, "
|
||||
"rc: %i errno: %i", ret, errno);
|
||||
}
|
||||
|
||||
|
|
|
@ -660,6 +660,7 @@ void vm_vcpu_add_default(struct kvm_vm *vm, uint32_t vcpuid, void *guest_code)
|
|||
|
||||
/* Create VCPU */
|
||||
vm_vcpu_add(vm, vcpuid);
|
||||
vcpu_set_cpuid(vm, vcpuid, kvm_get_supported_cpuid());
|
||||
vcpu_setup(vm, vcpuid);
|
||||
|
||||
/* Setup guest general purpose registers */
|
||||
|
@ -672,9 +673,6 @@ 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());
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
Loading…
Reference in New Issue