aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSean Christopherson <sean.j.christopherson@intel.com>2020-04-24 10:40:25 -0700
committerPaolo Bonzini <pbonzini@redhat.com>2020-05-04 12:33:56 -0400
commit149c2513efc820a4d4a8dd1a3827f8310e95d5be (patch)
tree4a6685b0aefc29cb26dc41d68149e52e3bcd9d27
parentdd3974c00f423165d9022a10f5769e1b9a213f3a (diff)
downloadkvm-unit-tests-149c2513efc820a4d4a8dd1a3827f8310e95d5be.tar.gz
nVMX: Check EXIT_QUALIFICATION on VM-Enter failures due to bad guest state
Assert that vmcs.EXIT_QUALIFICATION contains the correct failure code on failed VM-Enter due to invalid guest state. Hardcode the expected code to the default code, '0', rather than passing in the expected code to minimize churn and boilerplate code, which works for all existing tests. Signed-off-by: Sean Christopherson <sean.j.christopherson@intel.com> Message-Id: <20200424174025.1379-1-sean.j.christopherson@intel.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
-rw-r--r--x86/vmx.h7
-rw-r--r--x86/vmx_tests.c3
2 files changed, 9 insertions, 1 deletions
diff --git a/x86/vmx.h b/x86/vmx.h
index 2e28ecb..08b354d 100644
--- a/x86/vmx.h
+++ b/x86/vmx.h
@@ -521,6 +521,13 @@ enum vm_instruction_error_number {
VMXERR_INVALID_OPERAND_TO_INVEPT_INVVPID = 28,
};
+enum vm_entry_failure_code {
+ ENTRY_FAIL_DEFAULT = 0,
+ ENTRY_FAIL_PDPTE = 2,
+ ENTRY_FAIL_NMI = 3,
+ ENTRY_FAIL_VMCS_LINK_PTR = 4,
+};
+
#define SAVE_GPR \
"xchg %rax, regs\n\t" \
"xchg %rcx, regs+0x8\n\t" \
diff --git a/x86/vmx_tests.c b/x86/vmx_tests.c
index a7ec331..0909adb 100644
--- a/x86/vmx_tests.c
+++ b/x86/vmx_tests.c
@@ -5259,7 +5259,8 @@ static void test_guest_state(const char *test, bool xfail, u64 field,
report(result.exit_reason.failed_vmentry == xfail &&
((xfail && result.exit_reason.basic == VMX_FAIL_STATE) ||
- (!xfail && result.exit_reason.basic == VMX_VMCALL)),
+ (!xfail && result.exit_reason.basic == VMX_VMCALL)) &&
+ (!xfail || vmcs_read(EXI_QUALIFICATION) == ENTRY_FAIL_DEFAULT),
"%s, %s %lx", test, field_name, field);
if (!result.exit_reason.failed_vmentry)