Skip to content

Commit 2f6fcfa

Browse files
pgondasean-jc
authored andcommitted
KVM: selftests: Add SEV-ES shutdown test
Regression test for ae20eef ("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 <[email protected]> Cc: Sean Christopherson <[email protected]> Cc: Alper Gun <[email protected]> Cc: Tom Lendacky <[email protected]> Cc: Michael Roth <[email protected]> Cc: [email protected] Cc: [email protected] Signed-off-by: Peter Gonda <[email protected]> Tested-by: Pratik R. Sampat <[email protected]> Link: https://lore.kernel.org/r/[email protected] [sean: clobber IDT to ensure #UD leads to SHUTDOWN] Signed-off-by: Sean Christopherson <[email protected]>
1 parent c0d1a39 commit 2f6fcfa

File tree

1 file changed

+32
-0
lines changed

1 file changed

+32
-0
lines changed

tools/testing/selftests/kvm/x86_64/sev_smoke_test.c

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,36 @@ static void test_sev(void *guest_code, uint64_t policy)
160160
kvm_vm_free(vm);
161161
}
162162

163+
static void guest_shutdown_code(void)
164+
{
165+
struct desc_ptr idt;
166+
167+
/* Clobber the IDT so that #UD is guaranteed to trigger SHUTDOWN. */
168+
memset(&idt, 0, sizeof(idt));
169+
__asm__ __volatile__("lidt %0" :: "m"(idt));
170+
171+
__asm__ __volatile__("ud2");
172+
}
173+
174+
static void test_sev_es_shutdown(void)
175+
{
176+
struct kvm_vcpu *vcpu;
177+
struct kvm_vm *vm;
178+
179+
uint32_t type = KVM_X86_SEV_ES_VM;
180+
181+
vm = vm_sev_create_with_one_vcpu(type, guest_shutdown_code, &vcpu);
182+
183+
vm_sev_launch(vm, SEV_POLICY_ES, NULL);
184+
185+
vcpu_run(vcpu);
186+
TEST_ASSERT(vcpu->run->exit_reason == KVM_EXIT_SHUTDOWN,
187+
"Wanted SHUTDOWN, got %s",
188+
exit_reason_str(vcpu->run->exit_reason));
189+
190+
kvm_vm_free(vm);
191+
}
192+
163193
int main(int argc, char *argv[])
164194
{
165195
TEST_REQUIRE(kvm_cpu_has(X86_FEATURE_SEV));
@@ -171,6 +201,8 @@ int main(int argc, char *argv[])
171201
test_sev(guest_sev_es_code, SEV_POLICY_ES | SEV_POLICY_NO_DBG);
172202
test_sev(guest_sev_es_code, SEV_POLICY_ES);
173203

204+
test_sev_es_shutdown();
205+
174206
if (kvm_has_cap(KVM_CAP_XCRS) &&
175207
(xgetbv(0) & XFEATURE_MASK_X87_AVX) == XFEATURE_MASK_X87_AVX) {
176208
test_sync_vmsa(0);

0 commit comments

Comments
 (0)