1 // SPDX-License-Identifier: GPL-2.0-only
3 * svm_nested_shutdown_test
5 * Copyright (C) 2022, Red Hat, Inc.
7 * Nested SVM testing: test that unintercepted shutdown in L2 doesn't crash the host
10 #include "test_util.h"
12 #include "processor.h"
15 static void l2_guest_code(struct svm_test_data
*svm
)
17 __asm__
__volatile__("ud2");
20 static void l1_guest_code(struct svm_test_data
*svm
, struct idt_entry
*idt
)
22 #define L2_GUEST_STACK_SIZE 64
23 unsigned long l2_guest_stack
[L2_GUEST_STACK_SIZE
];
24 struct vmcb
*vmcb
= svm
->vmcb
;
26 generic_svm_setup(svm
, l2_guest_code
,
27 &l2_guest_stack
[L2_GUEST_STACK_SIZE
]);
29 vmcb
->control
.intercept
&= ~(BIT(INTERCEPT_SHUTDOWN
));
31 idt
[6].p
= 0; // #UD is intercepted but its injection will cause #NP
32 idt
[11].p
= 0; // #NP is not intercepted and will cause another
33 // #NP that will be converted to #DF
34 idt
[8].p
= 0; // #DF will cause #NP which will cause SHUTDOWN
36 run_guest(vmcb
, svm
->vmcb_gpa
);
38 /* should not reach here */
42 int main(int argc
, char *argv
[])
44 struct kvm_vcpu
*vcpu
;
48 TEST_REQUIRE(kvm_cpu_has(X86_FEATURE_SVM
));
50 vm
= vm_create_with_one_vcpu(&vcpu
, l1_guest_code
);
51 vcpu_alloc_svm(vm
, &svm_gva
);
53 vcpu_args_set(vcpu
, 2, svm_gva
, vm
->arch
.idt
);
56 TEST_ASSERT_KVM_EXIT_REASON(vcpu
, KVM_EXIT_SHUTDOWN
);