mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-04-15 03:41:32 -04:00
KVM: selftests: Add SEV-ES shutdown test
Regression test for ae20eef5 ("KVM: SVM: Update SEV-ES shutdown intercepts
with more metadata"). Test confirms userspace is correctly indicated of
a guest shutdown not previous behavior of an EINVAL from KVM_RUN.
Cc: Paolo Bonzini <pbonzini@redhat.com>
Cc: Sean Christopherson <seanjc@google.com>
Cc: Alper Gun <alpergun@google.com>
Cc: Tom Lendacky <thomas.lendacky@amd.com>
Cc: Michael Roth <michael.roth@amd.com>
Cc: kvm@vger.kernel.org
Cc: linux-kselftest@vger.kernel.org
Signed-off-by: Peter Gonda <pgonda@google.com>
Tested-by: Pratik R. Sampat <pratikrajesh.sampat@amd.com>
Link: https://lore.kernel.org/r/20240709182936.146487-1-pgonda@google.com
[sean: clobber IDT to ensure #UD leads to SHUTDOWN]
Signed-off-by: Sean Christopherson <seanjc@google.com>
This commit is contained in:
committed by
Sean Christopherson
parent
c0d1a39d1d
commit
2f6fcfa1f4
@@ -160,6 +160,36 @@ static void test_sev(void *guest_code, uint64_t policy)
|
||||
kvm_vm_free(vm);
|
||||
}
|
||||
|
||||
static void guest_shutdown_code(void)
|
||||
{
|
||||
struct desc_ptr idt;
|
||||
|
||||
/* Clobber the IDT so that #UD is guaranteed to trigger SHUTDOWN. */
|
||||
memset(&idt, 0, sizeof(idt));
|
||||
__asm__ __volatile__("lidt %0" :: "m"(idt));
|
||||
|
||||
__asm__ __volatile__("ud2");
|
||||
}
|
||||
|
||||
static void test_sev_es_shutdown(void)
|
||||
{
|
||||
struct kvm_vcpu *vcpu;
|
||||
struct kvm_vm *vm;
|
||||
|
||||
uint32_t type = KVM_X86_SEV_ES_VM;
|
||||
|
||||
vm = vm_sev_create_with_one_vcpu(type, guest_shutdown_code, &vcpu);
|
||||
|
||||
vm_sev_launch(vm, SEV_POLICY_ES, NULL);
|
||||
|
||||
vcpu_run(vcpu);
|
||||
TEST_ASSERT(vcpu->run->exit_reason == KVM_EXIT_SHUTDOWN,
|
||||
"Wanted SHUTDOWN, got %s",
|
||||
exit_reason_str(vcpu->run->exit_reason));
|
||||
|
||||
kvm_vm_free(vm);
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
TEST_REQUIRE(kvm_cpu_has(X86_FEATURE_SEV));
|
||||
@@ -171,6 +201,8 @@ int main(int argc, char *argv[])
|
||||
test_sev(guest_sev_es_code, SEV_POLICY_ES | SEV_POLICY_NO_DBG);
|
||||
test_sev(guest_sev_es_code, SEV_POLICY_ES);
|
||||
|
||||
test_sev_es_shutdown();
|
||||
|
||||
if (kvm_has_cap(KVM_CAP_XCRS) &&
|
||||
(xgetbv(0) & XFEATURE_MASK_X87_AVX) == XFEATURE_MASK_X87_AVX) {
|
||||
test_sync_vmsa(0);
|
||||
|
||||
Reference in New Issue
Block a user