From: Jon Kohler <jon@nutanix.com>
To: seanjc@google.com, pbonzini@redhat.com, kvm@vger.kernel.org
Cc: Jon Kohler <jon@nutanix.com>
Subject: [kvm-unit-tests PATCH 17/17] x86/vmx: align exit reasons with Linux uapi
Date: Tue, 16 Sep 2025 10:22:46 -0700 [thread overview]
Message-ID: <20250916172247.610021-18-jon@nutanix.com> (raw)
In-Reply-To: <20250916172247.610021-1-jon@nutanix.com>
Align x86/vmx.h' enum Reasons with Linux's arch/x86/include/uapi/asm/vmx.h
EXIT_REASON_* definitions. Given how exit codes are wired up already in
KUT, it doesn't make a whole lot of sense to switch to the uapi header
itself; however, aligning the definitions makes it easier to grok from
one code base to another.
Note: this change picks up several previously undefined exit reasons, such
as UMWAIT, TPAUSE, BUS_LOCK, NOTIFY, TDCALL but does not add test cases
for them.
Note: Fixed misc indentation issues picked up by checkpatch along the way.
No functional change intended.
Signed-off-by: Jon Kohler <jon@nutanix.com>
---
x86/vmx.c | 134 ++++++++++++-----------
x86/vmx.h | 125 +++++++++++----------
x86/vmx_tests.c | 283 +++++++++++++++++++++++++-----------------------
3 files changed, 280 insertions(+), 262 deletions(-)
diff --git a/x86/vmx.c b/x86/vmx.c
index 7be93a72..98b05754 100644
--- a/x86/vmx.c
+++ b/x86/vmx.c
@@ -582,67 +582,71 @@ static void __attribute__((__used__)) syscall_handler(u64 syscall_no)
current->syscall_handler(syscall_no);
}
+/* Naming scheme aligns with Linux's arch/x86/include/uapi/asm/vmx.h */
static const char * const exit_reason_descriptions[] = {
- [VMX_EXC_NMI] = "VMX_EXC_NMI",
- [VMX_EXTINT] = "VMX_EXTINT",
- [VMX_TRIPLE_FAULT] = "VMX_TRIPLE_FAULT",
- [VMX_INIT] = "VMX_INIT",
- [VMX_SIPI] = "VMX_SIPI",
- [VMX_SMI_IO] = "VMX_SMI_IO",
- [VMX_SMI_OTHER] = "VMX_SMI_OTHER",
- [VMX_INTR_WINDOW] = "VMX_INTR_WINDOW",
- [VMX_NMI_WINDOW] = "VMX_NMI_WINDOW",
- [VMX_TASK_SWITCH] = "VMX_TASK_SWITCH",
- [VMX_CPUID] = "VMX_CPUID",
- [VMX_GETSEC] = "VMX_GETSEC",
- [VMX_HLT] = "VMX_HLT",
- [VMX_INVD] = "VMX_INVD",
- [VMX_INVLPG] = "VMX_INVLPG",
- [VMX_RDPMC] = "VMX_RDPMC",
- [VMX_RDTSC] = "VMX_RDTSC",
- [VMX_RSM] = "VMX_RSM",
- [VMX_VMCALL] = "VMX_VMCALL",
- [VMX_VMCLEAR] = "VMX_VMCLEAR",
- [VMX_VMLAUNCH] = "VMX_VMLAUNCH",
- [VMX_VMPTRLD] = "VMX_VMPTRLD",
- [VMX_VMPTRST] = "VMX_VMPTRST",
- [VMX_VMREAD] = "VMX_VMREAD",
- [VMX_VMRESUME] = "VMX_VMRESUME",
- [VMX_VMWRITE] = "VMX_VMWRITE",
- [VMX_VMXOFF] = "VMX_VMXOFF",
- [VMX_VMXON] = "VMX_VMXON",
- [VMX_CR] = "VMX_CR",
- [VMX_DR] = "VMX_DR",
- [VMX_IO] = "VMX_IO",
- [VMX_RDMSR] = "VMX_RDMSR",
- [VMX_WRMSR] = "VMX_WRMSR",
- [VMX_FAIL_STATE] = "VMX_FAIL_STATE",
- [VMX_FAIL_MSR] = "VMX_FAIL_MSR",
- [VMX_MWAIT] = "VMX_MWAIT",
- [VMX_MTF] = "VMX_MTF",
- [VMX_MONITOR] = "VMX_MONITOR",
- [VMX_PAUSE] = "VMX_PAUSE",
- [VMX_FAIL_MCHECK] = "VMX_FAIL_MCHECK",
- [VMX_TPR_THRESHOLD] = "VMX_TPR_THRESHOLD",
- [VMX_APIC_ACCESS] = "VMX_APIC_ACCESS",
- [VMX_EOI_INDUCED] = "VMX_EOI_INDUCED",
- [VMX_GDTR_IDTR] = "VMX_GDTR_IDTR",
- [VMX_LDTR_TR] = "VMX_LDTR_TR",
- [VMX_EPT_VIOLATION] = "VMX_EPT_VIOLATION",
- [VMX_EPT_MISCONFIG] = "VMX_EPT_MISCONFIG",
- [VMX_INVEPT] = "VMX_INVEPT",
- [VMX_PREEMPT] = "VMX_PREEMPT",
- [VMX_INVVPID] = "VMX_INVVPID",
- [VMX_WBINVD] = "VMX_WBINVD",
- [VMX_XSETBV] = "VMX_XSETBV",
- [VMX_APIC_WRITE] = "VMX_APIC_WRITE",
- [VMX_RDRAND] = "VMX_RDRAND",
- [VMX_INVPCID] = "VMX_INVPCID",
- [VMX_VMFUNC] = "VMX_VMFUNC",
- [VMX_RDSEED] = "VMX_RDSEED",
- [VMX_PML_FULL] = "VMX_PML_FULL",
- [VMX_XSAVES] = "VMX_XSAVES",
- [VMX_XRSTORS] = "VMX_XRSTORS",
+ [EXIT_REASON_EXCEPTION_NMI] = "EXCEPTION_NMI",
+ [EXIT_REASON_EXTERNAL_INTERRUPT] = "EXTERNAL_INTERRUPT",
+ [EXIT_REASON_TRIPLE_FAULT] = "TRIPLE_FAULT",
+ [EXIT_REASON_INIT_SIGNAL] = "INIT_SIGNAL",
+ [EXIT_REASON_SIPI_SIGNAL] = "SIPI_SIGNAL",
+ [EXIT_REASON_INTERRUPT_WINDOW] = "INTERRUPT_WINDOW",
+ [EXIT_REASON_NMI_WINDOW] = "NMI_WINDOW",
+ [EXIT_REASON_TASK_SWITCH] = "TASK_SWITCH",
+ [EXIT_REASON_CPUID] = "CPUID",
+ [EXIT_REASON_HLT] = "HLT",
+ [EXIT_REASON_INVD] = "INVD",
+ [EXIT_REASON_INVLPG] = "INVLPG",
+ [EXIT_REASON_RDPMC] = "RDPMC",
+ [EXIT_REASON_RDTSC] = "RDTSC",
+ [EXIT_REASON_VMCALL] = "VMCALL",
+ [EXIT_REASON_VMCLEAR] = "VMCLEAR",
+ [EXIT_REASON_VMLAUNCH] = "VMLAUNCH",
+ [EXIT_REASON_VMPTRLD] = "VMPTRLD",
+ [EXIT_REASON_VMPTRST] = "VMPTRST",
+ [EXIT_REASON_VMREAD] = "VMREAD",
+ [EXIT_REASON_VMRESUME] = "VMRESUME",
+ [EXIT_REASON_VMWRITE] = "VMWRITE",
+ [EXIT_REASON_VMOFF] = "VMOFF",
+ [EXIT_REASON_VMON] = "VMON",
+ [EXIT_REASON_CR_ACCESS] = "CR_ACCESS",
+ [EXIT_REASON_DR_ACCESS] = "DR_ACCESS",
+ [EXIT_REASON_IO_INSTRUCTION] = "IO_INSTRUCTION",
+ [EXIT_REASON_MSR_READ] = "MSR_READ",
+ [EXIT_REASON_MSR_WRITE] = "MSR_WRITE",
+ [EXIT_REASON_INVALID_STATE] = "INVALID_STATE",
+ [EXIT_REASON_MSR_LOAD_FAIL] = "MSR_LOAD_FAIL",
+ [EXIT_REASON_MWAIT_INSTRUCTION] = "MWAIT_INSTRUCTION",
+ [EXIT_REASON_MONITOR_TRAP_FLAG] = "MONITOR_TRAP_FLAG",
+ [EXIT_REASON_MONITOR_INSTRUCTION] = "MONITOR_INSTRUCTION",
+ [EXIT_REASON_PAUSE_INSTRUCTION] = "PAUSE_INSTRUCTION",
+ [EXIT_REASON_MCE_DURING_VMENTRY] = "MCE_DURING_VMENTRY",
+ [EXIT_REASON_TPR_BELOW_THRESHOLD] = "TPR_BELOW_THRESHOLD",
+ [EXIT_REASON_APIC_ACCESS] = "APIC_ACCESS",
+ [EXIT_REASON_EOI_INDUCED] = "EOI_INDUCED",
+ [EXIT_REASON_GDTR_IDTR] = "GDTR_IDTR",
+ [EXIT_REASON_LDTR_TR] = "LDTR_TR",
+ [EXIT_REASON_EPT_VIOLATION] = "EPT_VIOLATION",
+ [EXIT_REASON_EPT_MISCONFIG] = "EPT_MISCONFIG",
+ [EXIT_REASON_INVEPT] = "INVEPT",
+ [EXIT_REASON_RDTSCP] = "RDTSCP",
+ [EXIT_REASON_PREEMPTION_TIMER] = "PREEMPTION_TIMER",
+ [EXIT_REASON_INVVPID] = "INVVPID",
+ [EXIT_REASON_WBINVD] = "WBINVD",
+ [EXIT_REASON_XSETBV] = "XSETBV",
+ [EXIT_REASON_APIC_WRITE] = "APIC_WRITE",
+ [EXIT_REASON_RDRAND] = "RDRAND",
+ [EXIT_REASON_INVPCID] = "INVPCID",
+ [EXIT_REASON_VMFUNC] = "VMFUNC",
+ [EXIT_REASON_ENCLS] = "ENCLS",
+ [EXIT_REASON_RDSEED] = "RDSEED",
+ [EXIT_REASON_PML_FULL] = "PML_FULL",
+ [EXIT_REASON_XSAVES] = "XSAVES",
+ [EXIT_REASON_XRSTORS] = "XRSTORS",
+ [EXIT_REASON_UMWAIT] = "UMWAIT",
+ [EXIT_REASON_TPAUSE] = "TPAUSE",
+ [EXIT_REASON_BUS_LOCK] = "BUS_LOCK",
+ [EXIT_REASON_NOTIFY] = "NOTIFY",
+ [EXIT_REASON_TDCALL] = "TDCALL",
};
const char *exit_reason_description(u64 reason)
@@ -698,13 +702,13 @@ void print_vmentry_failure_info(struct vmentry_result *result)
result->instr, result->exit_reason.full, qual);
switch (result->exit_reason.basic) {
- case VMX_FAIL_STATE:
+ case EXIT_REASON_INVALID_STATE:
printf("invalid guest state\n");
break;
- case VMX_FAIL_MSR:
+ case EXIT_REASON_MSR_LOAD_FAIL:
printf("MSR loading\n");
break;
- case VMX_FAIL_MCHECK:
+ case EXIT_REASON_MCE_DURING_VMENTRY:
printf("machine-check event\n");
break;
default:
@@ -1681,7 +1685,7 @@ void __attribute__((__used__)) hypercall(u32 hypercall_no)
static bool is_hypercall(union exit_reason exit_reason)
{
- return exit_reason.basic == VMX_VMCALL &&
+ return exit_reason.basic == EXIT_REASON_VMCALL &&
(hypercall_field & HYPERCALL_BIT);
}
@@ -2002,7 +2006,7 @@ void __enter_guest(u8 abort_flag, struct vmentry_result *result)
}
if (result->exit_reason.failed_vmentry) {
if ((abort_flag & ABORT_ON_INVALID_GUEST_STATE) ||
- result->exit_reason.basic != VMX_FAIL_STATE)
+ result->exit_reason.basic != EXIT_REASON_INVALID_STATE)
goto do_abort;
return;
}
diff --git a/x86/vmx.h b/x86/vmx.h
index 99ba7e52..5001886b 100644
--- a/x86/vmx.h
+++ b/x86/vmx.h
@@ -343,67 +343,72 @@ enum Encoding {
#define VMX_ENTRY_FLAGS (X86_EFLAGS_CF | X86_EFLAGS_PF | X86_EFLAGS_AF | \
X86_EFLAGS_ZF | X86_EFLAGS_SF | X86_EFLAGS_OF)
+/* Naming scheme aligns with Linux's arch/x86/include/uapi/asm/vmx.h */
enum Reason {
- VMX_EXC_NMI = 0,
- VMX_EXTINT = 1,
- VMX_TRIPLE_FAULT = 2,
- VMX_INIT = 3,
- VMX_SIPI = 4,
- VMX_SMI_IO = 5,
- VMX_SMI_OTHER = 6,
- VMX_INTR_WINDOW = 7,
- VMX_NMI_WINDOW = 8,
- VMX_TASK_SWITCH = 9,
- VMX_CPUID = 10,
- VMX_GETSEC = 11,
- VMX_HLT = 12,
- VMX_INVD = 13,
- VMX_INVLPG = 14,
- VMX_RDPMC = 15,
- VMX_RDTSC = 16,
- VMX_RSM = 17,
- VMX_VMCALL = 18,
- VMX_VMCLEAR = 19,
- VMX_VMLAUNCH = 20,
- VMX_VMPTRLD = 21,
- VMX_VMPTRST = 22,
- VMX_VMREAD = 23,
- VMX_VMRESUME = 24,
- VMX_VMWRITE = 25,
- VMX_VMXOFF = 26,
- VMX_VMXON = 27,
- VMX_CR = 28,
- VMX_DR = 29,
- VMX_IO = 30,
- VMX_RDMSR = 31,
- VMX_WRMSR = 32,
- VMX_FAIL_STATE = 33,
- VMX_FAIL_MSR = 34,
- VMX_MWAIT = 36,
- VMX_MTF = 37,
- VMX_MONITOR = 39,
- VMX_PAUSE = 40,
- VMX_FAIL_MCHECK = 41,
- VMX_TPR_THRESHOLD = 43,
- VMX_APIC_ACCESS = 44,
- VMX_EOI_INDUCED = 45,
- VMX_GDTR_IDTR = 46,
- VMX_LDTR_TR = 47,
- VMX_EPT_VIOLATION = 48,
- VMX_EPT_MISCONFIG = 49,
- VMX_INVEPT = 50,
- VMX_PREEMPT = 52,
- VMX_INVVPID = 53,
- VMX_WBINVD = 54,
- VMX_XSETBV = 55,
- VMX_APIC_WRITE = 56,
- VMX_RDRAND = 57,
- VMX_INVPCID = 58,
- VMX_VMFUNC = 59,
- VMX_RDSEED = 61,
- VMX_PML_FULL = 62,
- VMX_XSAVES = 63,
- VMX_XRSTORS = 64,
+ EXIT_REASON_EXCEPTION_NMI = 0,
+ EXIT_REASON_EXTERNAL_INTERRUPT = 1,
+ EXIT_REASON_TRIPLE_FAULT = 2,
+ EXIT_REASON_INIT_SIGNAL = 3,
+ EXIT_REASON_SIPI_SIGNAL = 4,
+ EXIT_REASON_OTHER_SMI = 6,
+ EXIT_REASON_INTERRUPT_WINDOW = 7,
+ EXIT_REASON_NMI_WINDOW = 8,
+ EXIT_REASON_TASK_SWITCH = 9,
+ EXIT_REASON_CPUID = 10,
+ EXIT_REASON_HLT = 12,
+ EXIT_REASON_INVD = 13,
+ EXIT_REASON_INVLPG = 14,
+ EXIT_REASON_RDPMC = 15,
+ EXIT_REASON_RDTSC = 16,
+ EXIT_REASON_VMCALL = 18,
+ EXIT_REASON_VMCLEAR = 19,
+ EXIT_REASON_VMLAUNCH = 20,
+ EXIT_REASON_VMPTRLD = 21,
+ EXIT_REASON_VMPTRST = 22,
+ EXIT_REASON_VMREAD = 23,
+ EXIT_REASON_VMRESUME = 24,
+ EXIT_REASON_VMWRITE = 25,
+ EXIT_REASON_VMOFF = 26,
+ EXIT_REASON_VMON = 27,
+ EXIT_REASON_CR_ACCESS = 28,
+ EXIT_REASON_DR_ACCESS = 29,
+ EXIT_REASON_IO_INSTRUCTION = 30,
+ EXIT_REASON_MSR_READ = 31,
+ EXIT_REASON_MSR_WRITE = 32,
+ EXIT_REASON_INVALID_STATE = 33,
+ EXIT_REASON_MSR_LOAD_FAIL = 34,
+ EXIT_REASON_MWAIT_INSTRUCTION = 36,
+ EXIT_REASON_MONITOR_TRAP_FLAG = 37,
+ EXIT_REASON_MONITOR_INSTRUCTION = 39,
+ EXIT_REASON_PAUSE_INSTRUCTION = 40,
+ EXIT_REASON_MCE_DURING_VMENTRY = 41,
+ EXIT_REASON_TPR_BELOW_THRESHOLD = 43,
+ EXIT_REASON_APIC_ACCESS = 44,
+ EXIT_REASON_EOI_INDUCED = 45,
+ EXIT_REASON_GDTR_IDTR = 46,
+ EXIT_REASON_LDTR_TR = 47,
+ EXIT_REASON_EPT_VIOLATION = 48,
+ EXIT_REASON_EPT_MISCONFIG = 49,
+ EXIT_REASON_INVEPT = 50,
+ EXIT_REASON_RDTSCP = 51,
+ EXIT_REASON_PREEMPTION_TIMER = 52,
+ EXIT_REASON_INVVPID = 53,
+ EXIT_REASON_WBINVD = 54,
+ EXIT_REASON_XSETBV = 55,
+ EXIT_REASON_APIC_WRITE = 56,
+ EXIT_REASON_RDRAND = 57,
+ EXIT_REASON_INVPCID = 58,
+ EXIT_REASON_VMFUNC = 59,
+ EXIT_REASON_ENCLS = 60,
+ EXIT_REASON_RDSEED = 61,
+ EXIT_REASON_PML_FULL = 62,
+ EXIT_REASON_XSAVES = 63,
+ EXIT_REASON_XRSTORS = 64,
+ EXIT_REASON_UMWAIT = 67,
+ EXIT_REASON_TPAUSE = 68,
+ EXIT_REASON_BUS_LOCK = 74,
+ EXIT_REASON_NOTIFY = 75,
+ EXIT_REASON_TDCALL = 77,
};
diff --git a/x86/vmx_tests.c b/x86/vmx_tests.c
index 338e39b0..dd4bd43c 100644
--- a/x86/vmx_tests.c
+++ b/x86/vmx_tests.c
@@ -106,7 +106,7 @@ static int vmenter_exit_handler(union exit_reason exit_reason)
u64 guest_rip = vmcs_read(GUEST_RIP);
switch (exit_reason.basic) {
- case VMX_VMCALL:
+ case EXIT_REASON_VMCALL:
if (regs.rax != 0xABCD) {
report_fail("test vmresume");
return VMX_TEST_VMEXIT;
@@ -178,7 +178,7 @@ static int preemption_timer_exit_handler(union exit_reason exit_reason)
guest_rip = vmcs_read(GUEST_RIP);
insn_len = vmcs_read(EXI_INST_LEN);
switch (exit_reason.basic) {
- case VMX_PREEMPT:
+ case EXIT_REASON_PREEMPTION_TIMER:
switch (vmx_get_test_stage()) {
case 1:
case 2:
@@ -212,7 +212,7 @@ static int preemption_timer_exit_handler(union exit_reason exit_reason)
break;
}
break;
- case VMX_VMCALL:
+ case EXIT_REASON_VMCALL:
vmcs_write(GUEST_RIP, guest_rip + insn_len);
switch (vmx_get_test_stage()) {
case 0:
@@ -361,7 +361,7 @@ static int test_ctrl_pat_exit_handler(union exit_reason exit_reason)
guest_rip = vmcs_read(GUEST_RIP);
switch (exit_reason.basic) {
- case VMX_VMCALL:
+ case EXIT_REASON_VMCALL:
guest_pat = vmcs_read(GUEST_PAT);
if (!(ctrl_exit_rev.clr & VM_EXIT_SAVE_IA32_PAT)) {
printf("\tEXI_SAVE_PAT is not supported\n");
@@ -429,7 +429,7 @@ static int test_ctrl_efer_exit_handler(union exit_reason exit_reason)
guest_rip = vmcs_read(GUEST_RIP);
switch (exit_reason.basic) {
- case VMX_VMCALL:
+ case EXIT_REASON_VMCALL:
guest_efer = vmcs_read(GUEST_EFER);
if (!(ctrl_exit_rev.clr & VM_EXIT_SAVE_IA32_EFER)) {
printf("\tEXI_SAVE_EFER is not supported\n");
@@ -556,7 +556,7 @@ static int cr_shadowing_exit_handler(union exit_reason exit_reason)
insn_len = vmcs_read(EXI_INST_LEN);
exit_qual = vmcs_read(EXI_QUALIFICATION);
switch (exit_reason.basic) {
- case VMX_VMCALL:
+ case EXIT_REASON_VMCALL:
switch (vmx_get_test_stage()) {
case 0:
report(guest_cr0 == vmcs_read(GUEST_CR0),
@@ -599,7 +599,7 @@ static int cr_shadowing_exit_handler(union exit_reason exit_reason)
}
vmcs_write(GUEST_RIP, guest_rip + insn_len);
return VMX_TEST_RESUME;
- case VMX_CR:
+ case EXIT_REASON_CR_ACCESS:
switch (vmx_get_test_stage()) {
case 4:
report_fail("Read shadowing CR0");
@@ -719,7 +719,7 @@ static int iobmp_exit_handler(union exit_reason exit_reason)
exit_qual = vmcs_read(EXI_QUALIFICATION);
insn_len = vmcs_read(EXI_INST_LEN);
switch (exit_reason.basic) {
- case VMX_IO:
+ case EXIT_REASON_IO_INSTRUCTION:
switch (vmx_get_test_stage()) {
case 0:
case 1:
@@ -776,7 +776,7 @@ static int iobmp_exit_handler(union exit_reason exit_reason)
}
vmcs_write(GUEST_RIP, guest_rip + insn_len);
return VMX_TEST_RESUME;
- case VMX_VMCALL:
+ case EXIT_REASON_VMCALL:
switch (vmx_get_test_stage()) {
case 9:
ctrl_cpu0 = vmcs_read(CPU_EXEC_CTRL0);
@@ -936,9 +936,9 @@ static struct insn_table insn_table[] = {
0, 0, 0},
/* LTR causes a #GP if done with a busy selector, so it is not tested. */
{"RDRAND", SECONDARY_EXEC_RDRAND_EXITING, insn_rdrand, INSN_CPU1,
- VMX_RDRAND, 0, 0, 0},
+ EXIT_REASON_RDRAND, 0, 0, 0},
{"RDSEED", SECONDARY_EXEC_RDSEED_EXITING, insn_rdseed, INSN_CPU1,
- VMX_RDSEED, 0, 0, 0},
+ EXIT_REASON_RDSEED, 0, 0, 0},
// Instructions always trap
{"CPUID", 0, insn_cpuid, INSN_ALWAYS_TRAP, 10, 0, 0, 0},
{"INVD", 0, insn_invd, INSN_ALWAYS_TRAP, 13, 0, 0, 0},
@@ -1024,7 +1024,7 @@ static int insn_intercept_exit_handler(union exit_reason exit_reason)
insn_len = vmcs_read(EXI_INST_LEN);
insn_info = vmcs_read(EXI_INST_INFO);
- if (exit_reason.basic == VMX_VMCALL) {
+ if (exit_reason.basic == EXIT_REASON_VMCALL) {
u32 val = 0;
if (insn_table[cur_insn].type == INSN_CPU0)
@@ -1323,7 +1323,7 @@ static int pml_exit_handler(union exit_reason exit_reason)
u32 insn_len = vmcs_read(EXI_INST_LEN);
switch (exit_reason.basic) {
- case VMX_VMCALL:
+ case EXIT_REASON_VMCALL:
switch (vmx_get_test_stage()) {
case 0:
index = vmcs_read(GUEST_PML_INDEX);
@@ -1348,7 +1348,7 @@ static int pml_exit_handler(union exit_reason exit_reason)
}
vmcs_write(GUEST_RIP, guest_rip + insn_len);
return VMX_TEST_RESUME;
- case VMX_PML_FULL:
+ case EXIT_REASON_PML_FULL:
vmx_inc_test_stage();
vmcs_write(GUEST_PML_INDEX, PML_INDEX - 1);
return VMX_TEST_RESUME;
@@ -1374,7 +1374,7 @@ static int ept_exit_handler_common(union exit_reason exit_reason, bool have_ad)
exit_qual = vmcs_read(EXI_QUALIFICATION);
pteval_t *ptep;
switch (exit_reason.basic) {
- case VMX_VMCALL:
+ case EXIT_REASON_VMCALL:
switch (vmx_get_test_stage()) {
case 0:
check_ept_ad(pml4, guest_cr3,
@@ -1452,7 +1452,7 @@ static int ept_exit_handler_common(union exit_reason exit_reason, bool have_ad)
}
vmcs_write(GUEST_RIP, guest_rip + insn_len);
return VMX_TEST_RESUME;
- case VMX_EPT_MISCONFIG:
+ case EXIT_REASON_EPT_MISCONFIG:
switch (vmx_get_test_stage()) {
case 1:
case 2:
@@ -1472,7 +1472,7 @@ static int ept_exit_handler_common(union exit_reason exit_reason, bool have_ad)
return VMX_TEST_VMEXIT;
}
return VMX_TEST_RESUME;
- case VMX_EPT_VIOLATION:
+ case EXIT_REASON_EPT_VIOLATION:
/*
* Exit-qualifications are masked not to account for advanced
* VM-exit information. Once KVM supports this feature, this
@@ -1731,7 +1731,7 @@ static int interrupt_exit_handler(union exit_reason exit_reason)
u32 insn_len = vmcs_read(EXI_INST_LEN);
switch (exit_reason.basic) {
- case VMX_VMCALL:
+ case EXIT_REASON_VMCALL:
switch (vmx_get_test_stage()) {
case 0:
case 2:
@@ -1770,7 +1770,7 @@ static int interrupt_exit_handler(union exit_reason exit_reason)
vmx_inc_test_stage();
vmcs_write(GUEST_RIP, guest_rip + insn_len);
return VMX_TEST_RESUME;
- case VMX_EXTINT:
+ case EXIT_REASON_EXTERNAL_INTERRUPT:
if (vmcs_read(EXI_CONTROLS) & VM_EXIT_ACK_INTR_ON_EXIT) {
int vector = vmcs_read(EXI_INTR_INFO) & 0xff;
handle_external_interrupt(vector);
@@ -1867,11 +1867,11 @@ static int nmi_hlt_exit_handler(union exit_reason exit_reason)
switch (vmx_get_test_stage()) {
case 1:
- if (exit_reason.basic != VMX_VMCALL) {
- report_fail("VMEXIT not due to vmcall. Exit reason 0x%x",
- exit_reason.full);
- print_vmexit_info(exit_reason);
- return VMX_TEST_VMEXIT;
+ if (exit_reason.basic != EXIT_REASON_VMCALL) {
+ report_fail("VMEXIT not due to vmcall. Exit reason 0x%x",
+ exit_reason.full);
+ print_vmexit_info(exit_reason);
+ return VMX_TEST_VMEXIT;
}
vmcs_write(PIN_CONTROLS,
@@ -1882,15 +1882,15 @@ static int nmi_hlt_exit_handler(union exit_reason exit_reason)
break;
case 2:
- if (exit_reason.basic != VMX_EXC_NMI) {
- report_fail("VMEXIT not due to NMI intercept. Exit reason 0x%x",
- exit_reason.full);
- print_vmexit_info(exit_reason);
- return VMX_TEST_VMEXIT;
- }
- report_pass("NMI intercept while running guest");
- vmcs_write(GUEST_ACTV_STATE, ACTV_ACTIVE);
- break;
+ if (exit_reason.basic != EXIT_REASON_EXCEPTION_NMI) {
+ report_fail("VMEXIT not due to NMI intercept. Exit reason 0x%x",
+ exit_reason.full);
+ print_vmexit_info(exit_reason);
+ return VMX_TEST_VMEXIT;
+ }
+ report_pass("NMI intercept while running guest");
+ vmcs_write(GUEST_ACTV_STATE, ACTV_ACTIVE);
+ break;
case 3:
break;
@@ -1982,7 +1982,7 @@ static int dbgctls_exit_handler(union exit_reason exit_reason)
debugctl = rdmsr(MSR_IA32_DEBUGCTLMSR);
switch (exit_reason.basic) {
- case VMX_VMCALL:
+ case EXIT_REASON_VMCALL:
switch (vmx_get_test_stage()) {
case 0:
if (dr7 == 0x400 && debugctl == 0 &&
@@ -2061,7 +2061,8 @@ static void msr_switch_main(void)
static int msr_switch_exit_handler(union exit_reason exit_reason)
{
- if (exit_reason.basic == VMX_VMCALL && vmx_get_test_stage() == 2) {
+ if (exit_reason.basic == EXIT_REASON_VMCALL &&
+ vmx_get_test_stage() == 2) {
report(exit_msr_store[0].value == MSR_MAGIC + 1,
"VM exit MSR store");
report(rdmsr(MSR_KERNEL_GS_BASE) == MSR_MAGIC + 2,
@@ -2083,7 +2084,7 @@ static int msr_switch_entry_failure(struct vmentry_result *result)
}
if (result->exit_reason.failed_vmentry &&
- result->exit_reason.basic == VMX_FAIL_MSR &&
+ result->exit_reason.basic == EXIT_REASON_MSR_LOAD_FAIL &&
vmx_get_test_stage() == 3) {
report(vmcs_read(EXI_QUALIFICATION) == 1,
"VM entry MSR load: try to load FS_BASE");
@@ -2113,11 +2114,11 @@ static void vmmcall_main(void)
static int vmmcall_exit_handler(union exit_reason exit_reason)
{
switch (exit_reason.basic) {
- case VMX_VMCALL:
+ case EXIT_REASON_VMCALL:
printf("here\n");
report_fail("VMMCALL triggers #UD");
break;
- case VMX_EXC_NMI:
+ case EXIT_REASON_EXCEPTION_NMI:
report((vmcs_read(EXI_INTR_INFO) & 0xff) == UD_VECTOR,
"VMMCALL triggers #UD");
break;
@@ -2177,7 +2178,7 @@ static void disable_rdtscp_main(void)
static int disable_rdtscp_exit_handler(union exit_reason exit_reason)
{
switch (exit_reason.basic) {
- case VMX_VMCALL:
+ case EXIT_REASON_VMCALL:
switch (vmx_get_test_stage()) {
case 0:
report_fail("RDTSCP triggers #UD");
@@ -2230,7 +2231,7 @@ static void skip_exit_insn(void)
static void skip_exit_vmcall(void)
{
- assert_exit_reason(VMX_VMCALL);
+ assert_exit_reason(EXIT_REASON_VMCALL);
skip_exit_insn();
}
@@ -2410,7 +2411,7 @@ static void do_ept_violation(bool leaf, enum ept_access_op op,
/* Try the access and observe the violation. */
do_ept_access_op(op);
- assert_exit_reason(VMX_EPT_VIOLATION);
+ assert_exit_reason(EXIT_REASON_EPT_VIOLATION);
qual = vmcs_read(EXI_QUALIFICATION);
@@ -2661,7 +2662,7 @@ static void ept_misconfig_at_level_mkhuge_op(bool mkhuge, int level,
orig_pte = ept_twiddle(data->gpa, mkhuge, level, clear, set);
do_ept_access_op(op);
- assert_exit_reason(VMX_EPT_MISCONFIG);
+ assert_exit_reason(EXIT_REASON_EPT_MISCONFIG);
/* Intel 27.2.1, "For all other VM exits, this field is cleared." */
#if 0
@@ -3522,8 +3523,8 @@ static bool vmlaunch(void)
return false;
success:
exit_reason = vmcs_read(EXI_REASON);
- TEST_ASSERT(exit_reason == (VMX_FAIL_STATE | VMX_ENTRY_FAILURE) ||
- exit_reason == (VMX_FAIL_MSR | VMX_ENTRY_FAILURE));
+ TEST_ASSERT(exit_reason == (EXIT_REASON_INVALID_STATE | VMX_ENTRY_FAILURE) ||
+ exit_reason == (EXIT_REASON_MSR_LOAD_FAIL | VMX_ENTRY_FAILURE));
return true;
}
@@ -5239,7 +5240,7 @@ static void report_mtf(const char *insn_name, unsigned long exp_rip)
{
unsigned long rip = vmcs_read(GUEST_RIP);
- assert_exit_reason(VMX_MTF);
+ assert_exit_reason(EXIT_REASON_MONITOR_TRAP_FLAG);
report(rip == exp_rip, "MTF VM-exit after %s. RIP: 0x%lx (expected 0x%lx)",
insn_name, rip, exp_rip);
}
@@ -5464,7 +5465,7 @@ static void vmx_mtf_pdpte_test(void)
enable_mtf();
enter_guest();
- assert_exit_reason(VMX_MTF);
+ assert_exit_reason(EXIT_REASON_MONITOR_TRAP_FLAG);
disable_mtf();
/*
@@ -5626,10 +5627,10 @@ static void test_guest_state(const char *test, bool xfail, u64 field,
__enter_guest(abort_flags, &result);
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 == EXIT_REASON_INVALID_STATE) ||
+ (!xfail && result.exit_reason.basic == EXIT_REASON_VMCALL)) &&
(!xfail || vmcs_read(EXI_QUALIFICATION) == ENTRY_FAIL_DEFAULT),
- "%s, %s = %lx", test, field_name, field);
+ "%s, %s = %lx", test, field_name, field);
if (!result.exit_reason.failed_vmentry)
skip_exit_insn();
@@ -5810,21 +5811,21 @@ static bool apic_reg_virt_exit_expectation(
config->virtualize_apic_accesses &&
config->activate_secondary_controls;
if (virtualize_apic_accesses_only) {
- expectation->rd_exit_reason = VMX_APIC_ACCESS;
- expectation->wr_exit_reason = VMX_APIC_ACCESS;
+ expectation->rd_exit_reason = EXIT_REASON_APIC_ACCESS;
+ expectation->wr_exit_reason = EXIT_REASON_APIC_ACCESS;
} else if (virtualize_apic_accesses_and_use_tpr_shadow) {
switch (reg) {
case APIC_TASKPRI:
- expectation->rd_exit_reason = VMX_VMCALL;
- expectation->wr_exit_reason = VMX_VMCALL;
+ expectation->rd_exit_reason = EXIT_REASON_VMCALL;
+ expectation->wr_exit_reason = EXIT_REASON_VMCALL;
expectation->virt_fn = apic_virt_nibble1;
break;
default:
- expectation->rd_exit_reason = VMX_APIC_ACCESS;
- expectation->wr_exit_reason = VMX_APIC_ACCESS;
+ expectation->rd_exit_reason = EXIT_REASON_APIC_ACCESS;
+ expectation->wr_exit_reason = EXIT_REASON_APIC_ACCESS;
}
} else if (apic_register_virtualization) {
- expectation->rd_exit_reason = VMX_VMCALL;
+ expectation->rd_exit_reason = EXIT_REASON_VMCALL;
switch (reg) {
case APIC_ID:
@@ -5842,25 +5843,25 @@ static bool apic_reg_virt_exit_expectation(
case APIC_LVTERR:
case APIC_TMICT:
case APIC_TDCR:
- expectation->wr_exit_reason = VMX_APIC_WRITE;
+ expectation->wr_exit_reason = EXIT_REASON_APIC_WRITE;
break;
case APIC_LVR:
case APIC_ISR ... APIC_ISR + 0x70:
case APIC_TMR ... APIC_TMR + 0x70:
case APIC_IRR ... APIC_IRR + 0x70:
- expectation->wr_exit_reason = VMX_APIC_ACCESS;
+ expectation->wr_exit_reason = EXIT_REASON_APIC_ACCESS;
break;
case APIC_TASKPRI:
- expectation->wr_exit_reason = VMX_VMCALL;
+ expectation->wr_exit_reason = EXIT_REASON_VMCALL;
expectation->virt_fn = apic_virt_nibble1;
break;
case APIC_ICR2:
- expectation->wr_exit_reason = VMX_VMCALL;
+ expectation->wr_exit_reason = EXIT_REASON_VMCALL;
expectation->virt_fn = apic_virt_byte3;
break;
default:
- expectation->rd_exit_reason = VMX_APIC_ACCESS;
- expectation->wr_exit_reason = VMX_APIC_ACCESS;
+ expectation->rd_exit_reason = EXIT_REASON_APIC_ACCESS;
+ expectation->wr_exit_reason = EXIT_REASON_APIC_ACCESS;
}
} else if (!expectation->virtualize_apic_accesses) {
/*
@@ -5869,8 +5870,8 @@ static bool apic_reg_virt_exit_expectation(
* the use TPR shadow control, but not through directly
* accessing VTPR.
*/
- expectation->rd_exit_reason = VMX_VMCALL;
- expectation->wr_exit_reason = VMX_VMCALL;
+ expectation->rd_exit_reason = EXIT_REASON_VMCALL;
+ expectation->wr_exit_reason = EXIT_REASON_VMCALL;
} else {
printf("Cannot parse APIC register virtualization config:\n"
"\tvirtualize_apic_accesses: %d\n"
@@ -6111,14 +6112,14 @@ static void test_xapic_rd(
args->apic_access_address = apic_access_address;
args->reg = reg;
args->val = val;
- args->check_rd = exit_reason_want == VMX_VMCALL;
+ args->check_rd = exit_reason_want == EXIT_REASON_VMCALL;
args->virt_fn = expectation->virt_fn;
/* Setup virtual APIC page */
if (!expectation->virtualize_apic_accesses) {
apic_access_address[apic_reg_index(reg)] = val;
virtual_apic_page[apic_reg_index(reg)] = 0;
- } else if (exit_reason_want == VMX_VMCALL) {
+ } else if (exit_reason_want == EXIT_REASON_VMCALL) {
apic_access_address[apic_reg_index(reg)] = 0;
virtual_apic_page[apic_reg_index(reg)] = val;
}
@@ -6130,7 +6131,7 @@ static void test_xapic_rd(
* Validate the behavior and
* pass a magic value back to the guest.
*/
- if (exit_reason_want == VMX_APIC_ACCESS) {
+ if (exit_reason_want == EXIT_REASON_APIC_ACCESS) {
u32 apic_page_offset = vmcs_read(EXI_QUALIFICATION) & 0xfff;
assert_exit_reason(exit_reason_want);
@@ -6141,7 +6142,7 @@ static void test_xapic_rd(
/* Reenter guest so it can consume/check rcx and exit again. */
enter_guest();
- } else if (exit_reason_want != VMX_VMCALL) {
+ } else if (exit_reason_want != EXIT_REASON_VMCALL) {
report_fail("Oops, bad exit expectation: %u.", exit_reason_want);
}
@@ -6158,8 +6159,8 @@ static void test_xapic_wr(
struct apic_reg_virt_guest_args *args = &apic_reg_virt_guest_args;
bool virtualized =
expectation->virtualize_apic_accesses &&
- (exit_reason_want == VMX_APIC_WRITE ||
- exit_reason_want == VMX_VMCALL);
+ (exit_reason_want == EXIT_REASON_APIC_WRITE ||
+ exit_reason_want == EXIT_REASON_VMCALL);
bool checked = false;
report_prefix_pushf("xapic - writing 0x%x to 0x%03x", val, reg);
@@ -6183,7 +6184,7 @@ static void test_xapic_wr(
* Validate the behavior and
* pass a magic value back to the guest.
*/
- if (exit_reason_want == VMX_APIC_ACCESS) {
+ if (exit_reason_want == EXIT_REASON_APIC_ACCESS) {
u32 apic_page_offset = vmcs_read(EXI_QUALIFICATION) & 0xfff;
assert_exit_reason(exit_reason_want);
@@ -6194,7 +6195,7 @@ static void test_xapic_wr(
/* Reenter guest so it can consume/check rcx and exit again. */
enter_guest();
- } else if (exit_reason_want == VMX_APIC_WRITE) {
+ } else if (exit_reason_want == EXIT_REASON_APIC_WRITE) {
assert_exit_reason(exit_reason_want);
report(virtual_apic_page[apic_reg_index(reg)] == val,
"got APIC write exit @ page offset 0x%03x; val is 0x%x, want 0x%x",
@@ -6204,11 +6205,11 @@ static void test_xapic_wr(
/* Reenter guest so it can consume/check rcx and exit again. */
enter_guest();
- } else if (exit_reason_want != VMX_VMCALL) {
+ } else if (exit_reason_want != EXIT_REASON_VMCALL) {
report_fail("Oops, bad exit expectation: %u.", exit_reason_want);
}
- assert_exit_reason(VMX_VMCALL);
+ assert_exit_reason(EXIT_REASON_VMCALL);
if (virtualized && !checked) {
u32 want = expectation->virt_fn(val);
u32 got = virtual_apic_page[apic_reg_index(reg)];
@@ -6398,7 +6399,7 @@ static void apic_reg_virt_test(void)
vmcs_write(CPU_EXEC_CTRL1, cpu_exec_ctrl1);
args->op = TERMINATE;
enter_guest();
- assert_exit_reason(VMX_VMCALL);
+ assert_exit_reason(EXIT_REASON_VMCALL);
}
struct virt_x2apic_mode_config {
@@ -6461,7 +6462,7 @@ static void virt_x2apic_mode_rd_expectation(
{
enum x2apic_reg_semantics semantics = get_x2apic_reg_semantics(reg);
- expectation->rd_exit_reason = VMX_VMCALL;
+ expectation->rd_exit_reason = EXIT_REASON_VMCALL;
expectation->virt_fn = virt_x2apic_mode_identity;
if (virt_x2apic_mode_on && apic_register_virtualization) {
expectation->rd_val = MAGIC_VAL_1;
@@ -6569,7 +6570,7 @@ static void virt_x2apic_mode_wr_expectation(
bool virt_int_delivery,
struct virt_x2apic_mode_expectation *expectation)
{
- expectation->wr_exit_reason = VMX_VMCALL;
+ expectation->wr_exit_reason = EXIT_REASON_VMCALL;
expectation->wr_val = MAGIC_VAL_1;
expectation->wr_only = false;
@@ -6578,14 +6579,14 @@ static void virt_x2apic_mode_wr_expectation(
virt_int_delivery)) {
expectation->wr_behavior = X2APIC_ACCESS_VIRTUALIZED;
if (reg == APIC_SELF_IPI)
- expectation->wr_exit_reason = VMX_APIC_WRITE;
+ expectation->wr_exit_reason = EXIT_REASON_APIC_WRITE;
} else if (!disable_x2apic &&
get_x2apic_wr_val(reg, &expectation->wr_val)) {
expectation->wr_behavior = X2APIC_ACCESS_PASSED_THROUGH;
if (reg == APIC_EOI || reg == APIC_SELF_IPI)
expectation->wr_only = true;
if (reg == APIC_ICR)
- expectation->wr_exit_reason = VMX_EXTINT;
+ expectation->wr_exit_reason = EXIT_REASON_EXTERNAL_INTERRUPT;
} else {
expectation->wr_behavior = X2APIC_ACCESS_TRIGGERS_GP;
/*
@@ -6928,9 +6929,8 @@ static void test_x2apic_rd(
/* Enter guest */
enter_guest();
- if (exit_reason_want != VMX_VMCALL) {
+ if (exit_reason_want != EXIT_REASON_VMCALL)
report_fail("Oops, bad exit expectation: %u.", exit_reason_want);
- }
skip_exit_vmcall();
report_prefix_pop();
@@ -6978,7 +6978,7 @@ static void test_x2apic_wr(
* Validate the behavior and
* pass a magic value back to the guest.
*/
- if (exit_reason_want == VMX_EXTINT) {
+ if (exit_reason_want == EXIT_REASON_EXTERNAL_INTERRUPT) {
assert_exit_reason(exit_reason_want);
/* Clear the external interrupt. */
@@ -6987,7 +6987,7 @@ static void test_x2apic_wr(
"Got pending interrupt after IRQ enabled.");
enter_guest();
- } else if (exit_reason_want == VMX_APIC_WRITE) {
+ } else if (exit_reason_want == EXIT_REASON_APIC_WRITE) {
assert_exit_reason(exit_reason_want);
report(virtual_apic_page[apic_reg_index(reg)] == val,
"got APIC write exit @ page offset 0x%03x; val is 0x%x, want 0x%lx",
@@ -6996,11 +6996,11 @@ static void test_x2apic_wr(
/* Reenter guest so it can consume/check rcx and exit again. */
enter_guest();
- } else if (exit_reason_want != VMX_VMCALL) {
+ } else if (exit_reason_want != EXIT_REASON_VMCALL) {
report_fail("Oops, bad exit expectation: %u.", exit_reason_want);
}
- assert_exit_reason(VMX_VMCALL);
+ assert_exit_reason(EXIT_REASON_VMCALL);
if (expectation->wr_behavior == X2APIC_ACCESS_VIRTUALIZED) {
u64 want = val;
u32 got = virtual_apic_page[apic_reg_index(reg)];
@@ -7180,7 +7180,7 @@ static void virt_x2apic_mode_test(void)
vmcs_write(CPU_EXEC_CTRL1, cpu_exec_ctrl1);
args->op = X2APIC_TERMINATE;
enter_guest();
- assert_exit_reason(VMX_VMCALL);
+ assert_exit_reason(EXIT_REASON_VMCALL);
}
static void test_ctl_reg(const char *cr_name, u64 cr, u64 fixed0, u64 fixed1)
@@ -7663,7 +7663,7 @@ static void test_perf_global_ctrl(u32 nr, const char *name, u32 ctrl_nr,
val = 1ull << i;
vmcs_write(nr, val);
report_prefix_pushf("%s = 0x%lx", name, val);
- test_pgc_vmlaunch(0, VMX_VMCALL, false, host);
+ test_pgc_vmlaunch(0, EXIT_REASON_VMCALL, false, host);
report_prefix_pop();
}
report_prefix_pop();
@@ -7678,7 +7678,7 @@ static void test_perf_global_ctrl(u32 nr, const char *name, u32 ctrl_nr,
vmcs_write(nr, val);
report_prefix_pushf("%s = 0x%lx", name, val);
if (valid_pgc(val)) {
- test_pgc_vmlaunch(0, VMX_VMCALL, false, host);
+ test_pgc_vmlaunch(0, EXIT_REASON_VMCALL, false, host);
} else {
if (host)
test_pgc_vmlaunch(
@@ -7689,7 +7689,8 @@ static void test_perf_global_ctrl(u32 nr, const char *name, u32 ctrl_nr,
else
test_pgc_vmlaunch(
0,
- VMX_ENTRY_FAILURE | VMX_FAIL_STATE,
+ VMX_ENTRY_FAILURE |
+ EXIT_REASON_INVALID_STATE,
true,
host);
}
@@ -8709,7 +8710,7 @@ static void vmx_pending_event_test_core(bool guest_hlt)
enter_guest();
- assert_exit_reason(VMX_EXTINT);
+ assert_exit_reason(EXIT_REASON_EXTERNAL_INTERRUPT);
report(!vmx_pending_event_guest_run,
"Guest did not run before host received IPI");
@@ -8756,7 +8757,7 @@ static void verify_nmi_window_exit(u64 rip)
{
u32 exit_reason = vmcs_read(EXI_REASON);
- report(exit_reason == VMX_NMI_WINDOW,
+ report(exit_reason == EXIT_REASON_NMI_WINDOW,
"Exit reason (%d) is 'NMI window'", exit_reason);
report(vmcs_read(GUEST_RIP) == rip, "RIP (%#lx) is %#lx",
vmcs_read(GUEST_RIP), rip);
@@ -8890,7 +8891,7 @@ static void verify_intr_window_exit(u64 rip)
{
u32 exit_reason = vmcs_read(EXI_REASON);
- report(exit_reason == VMX_INTR_WINDOW,
+ report(exit_reason == EXIT_REASON_INTERRUPT_WINDOW,
"Exit reason (%d) is 'interrupt window'", exit_reason);
report(vmcs_read(GUEST_RIP) == rip, "RIP (%#lx) is %#lx",
vmcs_read(GUEST_RIP), rip);
@@ -8920,7 +8921,7 @@ static void vmx_intr_window_test(void)
report_prefix_push("interrupt-window");
test_set_guest(vmx_intr_window_test_guest);
enter_guest();
- assert_exit_reason(VMX_VMCALL);
+ assert_exit_reason(EXIT_REASON_VMCALL);
vmcall_addr = vmcs_read(GUEST_RIP);
/*
@@ -9126,9 +9127,9 @@ static void vmx_preemption_timer_zero_expect_preempt_at_rip(u64 expected_rip)
u32 reason = (u32)vmcs_read(EXI_REASON);
u64 guest_rip = vmcs_read(GUEST_RIP);
- report(reason == VMX_PREEMPT && guest_rip == expected_rip,
+ report(reason == EXIT_REASON_PREEMPTION_TIMER && guest_rip == expected_rip,
"Exit reason is 0x%x (expected 0x%x) and guest RIP is %lx (0x%lx expected).",
- reason, VMX_PREEMPT, guest_rip, expected_rip);
+ reason, EXIT_REASON_PREEMPTION_TIMER, guest_rip, expected_rip);
}
/*
@@ -9191,8 +9192,9 @@ static void vmx_preemption_timer_zero_test(void)
vmx_set_test_stage(3);
vmx_preemption_timer_zero_set_pending_dbg(1 << DB_VECTOR);
reason = (u32)vmcs_read(EXI_REASON);
- report(reason == VMX_EXC_NMI, "Exit reason is 0x%x (expected 0x%x)",
- reason, VMX_EXC_NMI);
+ report(reason == EXIT_REASON_EXCEPTION_NMI,
+ "Exit reason is 0x%x (expected 0x%x)",
+ reason, EXIT_REASON_EXCEPTION_NMI);
vmcs_clear_bits(PIN_CONTROLS, PIN_BASED_VMX_PREEMPTION_TIMER);
enter_guest();
@@ -9287,14 +9289,14 @@ static void vmx_preemption_timer_tf_test(void)
for (i = 0; i < 10000; i++) {
enter_guest();
reason = (u32)vmcs_read(EXI_REASON);
- if (reason == VMX_PREEMPT)
+ if (reason == EXIT_REASON_PREEMPTION_TIMER)
continue;
- TEST_ASSERT(reason == VMX_VMCALL);
+ TEST_ASSERT(reason == EXIT_REASON_VMCALL);
skip_exit_insn();
break;
}
- report(reason == VMX_PREEMPT, "No single-step traps skipped");
+ report(reason == EXIT_REASON_PREEMPTION_TIMER, "No single-step traps skipped");
vmx_set_test_stage(2);
vmcs_clear_bits(PIN_CONTROLS, PIN_BASED_VMX_PREEMPTION_TIMER);
@@ -9369,7 +9371,7 @@ static void vmx_preemption_timer_expiry_test(void)
enter_guest();
reason = (u32)vmcs_read(EXI_REASON);
- TEST_ASSERT(reason == VMX_PREEMPT);
+ TEST_ASSERT(reason == EXIT_REASON_PREEMPTION_TIMER);
tsc_deadline = ((vmx_preemption_timer_expiry_start >> misc.pt_bit) <<
misc.pt_bit) + (preemption_timer_value << misc.pt_bit);
@@ -9448,7 +9450,7 @@ static void check_db_exit(bool xfail_qual, bool xfail_dr6, bool xfail_pdbg,
const u32 expected_intr_info = INTR_INFO_VALID_MASK |
INTR_TYPE_HARD_EXCEPTION | DB_VECTOR;
- report(reason == VMX_EXC_NMI && intr_info == expected_intr_info,
+ report(reason == EXIT_REASON_EXCEPTION_NMI && intr_info == expected_intr_info,
"Expected #DB VM-exit");
report((u64)expected_rip == guest_rip, "Expected RIP %p (actual %lx)",
expected_rip, guest_rip);
@@ -9640,7 +9642,9 @@ static void irq_79_handler_guest(isr_regs_t *regs)
{
eoi();
- /* L1 expects vmexit on VMX_VMCALL and not VMX_EOI_INDUCED */
+ /* L1 expects vmexit on EXIT_REASON_VMCALL
+ * and not EXIT_REASON_EOI_INDUCED.
+ */
vmcall();
}
@@ -9685,9 +9689,10 @@ static void vmx_eoi_bitmap_ioapic_scan_test(void)
/*
* Launch L2.
- * We expect the exit reason to be VMX_VMCALL (and not EOI INDUCED).
- * In case the reason isn't VMX_VMCALL, the assertion inside
- * skip_exit_vmcall() will fail.
+ * We expect the exit reason to be EXIT_REASON_VMCALL
+ * (and not EXIT_REASON_EOI_INDUCED). In case the reason isn't
+ * EXIT_REASON_VMCALL, the assertion inside skip_exit_vmcall()
+ * will fail.
*/
enter_guest();
skip_exit_vmcall();
@@ -9928,7 +9933,8 @@ static void init_signal_test_thread(void *data)
/*
* Signal to BSP CPU that we continue as usual as INIT signal
- * should have been consumed by VMX_INIT exit from guest
+ * should have been consumed by EXIT_REASON_INIT_SIGNAL exit from
+ * guest
*/
vmx_set_test_stage(7);
@@ -10011,10 +10017,10 @@ static void vmx_init_signal_test(void)
report_fail("Pending INIT signal didn't result in VMX exit");
return;
}
- report(init_signal_test_exit_reason == VMX_INIT,
- "INIT signal during VMX non-root mode result in exit-reason %s (%lu)",
- exit_reason_description(init_signal_test_exit_reason),
- init_signal_test_exit_reason);
+ report(init_signal_test_exit_reason == EXIT_REASON_INIT_SIGNAL,
+ "INIT signal during VMX non-root mode result in exit-reason %s (%lu)",
+ exit_reason_description(init_signal_test_exit_reason),
+ init_signal_test_exit_reason);
/* Run guest to completion */
make_vmcs_current(test_vmcs);
@@ -10027,7 +10033,7 @@ static void vmx_init_signal_test(void)
/* Wait reasonable amount of time for other CPU to exit VMX operation */
delay(INIT_SIGNAL_TEST_DELAY);
report(vmx_get_test_stage() == 7,
- "INIT signal consumed on VMX_INIT exit");
+ "INIT signal consumed on EXIT_REASON_INIT_SIGNAL exit");
/* No point to continue if we failed at this point */
if (vmx_get_test_stage() != 7)
return;
@@ -10138,7 +10144,7 @@ static void sipi_test_ap_thread(void *data)
/* AP enter guest */
enter_guest();
- if (vmcs_read(EXI_REASON) == VMX_SIPI) {
+ if (vmcs_read(EXI_REASON) == EXIT_REASON_SIPI_SIGNAL) {
report_pass("AP: Handle SIPI VMExit");
vmcs_write(GUEST_ACTV_STATE, ACTV_ACTIVE);
vmx_set_test_stage(2);
@@ -10151,7 +10157,7 @@ static void sipi_test_ap_thread(void *data)
/* AP enter guest */
enter_guest();
- report(vmcs_read(EXI_REASON) != VMX_SIPI,
+ report(vmcs_read(EXI_REASON) != EXIT_REASON_SIPI_SIGNAL,
"AP: should no SIPI VMExit since activity is not in WAIT_SIPI state");
/* notify BSP that AP is already exit from non-root mode */
@@ -10290,7 +10296,7 @@ static void vmcs_shadow_test_access(u8 *bitmap[2], enum vmcs_access access)
vmcs_write(VMX_INST_ERROR, 0);
enter_guest();
c->reason = vmcs_read(EXI_REASON) & 0xffff;
- if (c->reason != VMX_VMCALL) {
+ if (c->reason != EXIT_REASON_VMCALL) {
skip_exit_insn();
enter_guest();
}
@@ -10332,9 +10338,9 @@ static void vmcs_shadow_test_field(u8 *bitmap[2], u64 field)
set_bit(field, bitmap[ACCESS_VMWRITE]);
}
vmcs_shadow_test_access(bitmap, ACCESS_VMWRITE);
- report(c->reason == VMX_VMWRITE, "not shadowed for VMWRITE");
+ report(c->reason == EXIT_REASON_VMWRITE, "not shadowed for VMWRITE");
vmcs_shadow_test_access(bitmap, ACCESS_VMREAD);
- report(c->reason == VMX_VMREAD, "not shadowed for VMREAD");
+ report(c->reason == EXIT_REASON_VMREAD, "not shadowed for VMREAD");
report_prefix_pop();
if (field >> VMCS_FIELD_RESERVED_SHIFT)
@@ -10347,10 +10353,11 @@ static void vmcs_shadow_test_field(u8 *bitmap[2], u64 field)
if (good_shadow)
value = vmwrite_to_shadow(field, MAGIC_VAL_1 + field);
vmcs_shadow_test_access(bitmap, ACCESS_VMWRITE);
- report(c->reason == VMX_VMWRITE, "not shadowed for VMWRITE");
+ report(c->reason == EXIT_REASON_VMWRITE, "not shadowed for VMWRITE");
vmcs_shadow_test_access(bitmap, ACCESS_VMREAD);
vmx_inst_error = vmcs_read(VMX_INST_ERROR);
- report(c->reason == VMX_VMCALL, "shadowed for VMREAD (in %ld cycles)",
+ report(c->reason == EXIT_REASON_VMCALL,
+ "shadowed for VMREAD (in %ld cycles)",
c->time);
report(c->flags == flags[ACCESS_VMREAD],
"ALU flags after VMREAD (%lx) are as expected (%lx)",
@@ -10373,7 +10380,7 @@ static void vmcs_shadow_test_field(u8 *bitmap[2], u64 field)
vmwrite_to_shadow(field, MAGIC_VAL_1 + field);
vmcs_shadow_test_access(bitmap, ACCESS_VMWRITE);
vmx_inst_error = vmcs_read(VMX_INST_ERROR);
- report(c->reason == VMX_VMCALL,
+ report(c->reason == EXIT_REASON_VMCALL,
"shadowed for VMWRITE (in %ld cycles)",
c->time);
report(c->flags == flags[ACCESS_VMREAD],
@@ -10390,7 +10397,7 @@ static void vmcs_shadow_test_field(u8 *bitmap[2], u64 field)
vmx_inst_error, VMXERR_UNSUPPORTED_VMCS_COMPONENT);
}
vmcs_shadow_test_access(bitmap, ACCESS_VMREAD);
- report(c->reason == VMX_VMREAD, "not shadowed for VMREAD");
+ report(c->reason == EXIT_REASON_VMREAD, "not shadowed for VMREAD");
report_prefix_pop();
/* Permit shadowed VMREAD and VMWRITE. */
@@ -10401,7 +10408,7 @@ static void vmcs_shadow_test_field(u8 *bitmap[2], u64 field)
vmwrite_to_shadow(field, MAGIC_VAL_1 + field);
vmcs_shadow_test_access(bitmap, ACCESS_VMWRITE);
vmx_inst_error = vmcs_read(VMX_INST_ERROR);
- report(c->reason == VMX_VMCALL,
+ report(c->reason == EXIT_REASON_VMCALL,
"shadowed for VMWRITE (in %ld cycles)",
c->time);
report(c->flags == flags[ACCESS_VMREAD],
@@ -10419,7 +10426,8 @@ static void vmcs_shadow_test_field(u8 *bitmap[2], u64 field)
}
vmcs_shadow_test_access(bitmap, ACCESS_VMREAD);
vmx_inst_error = vmcs_read(VMX_INST_ERROR);
- report(c->reason == VMX_VMCALL, "shadowed for VMREAD (in %ld cycles)",
+ report(c->reason == EXIT_REASON_VMCALL,
+ "shadowed for VMREAD (in %ld cycles)",
c->time);
report(c->flags == flags[ACCESS_VMREAD],
"ALU flags after VMREAD (%lx) are as expected (%lx)",
@@ -10645,7 +10653,8 @@ static int invalid_msr_exit_handler(union exit_reason exit_reason)
static int invalid_msr_entry_failure(struct vmentry_result *result)
{
report(result->exit_reason.failed_vmentry &&
- result->exit_reason.basic == VMX_FAIL_MSR, "Invalid MSR load");
+ result->exit_reason.basic == EXIT_REASON_MSR_LOAD_FAIL,
+ "Invalid MSR load");
return VMX_TEST_VMEXIT;
}
@@ -10735,7 +10744,7 @@ static void atomic_switch_msrs_test(int count)
if (count <= max_allowed) {
enter_guest();
- assert_exit_reason(VMX_VMCALL);
+ assert_exit_reason(EXIT_REASON_VMCALL);
skip_exit_vmcall();
} else {
u32 exit_qual;
@@ -10804,20 +10813,20 @@ static void __vmx_pf_exception_test(invalidate_tlb_t inv_fn, void *data,
enter_guest();
- while (vmcs_read(EXI_REASON) != VMX_VMCALL) {
+ while (vmcs_read(EXI_REASON) != EXIT_REASON_VMCALL) {
switch (vmcs_read(EXI_REASON)) {
- case VMX_RDMSR:
+ case EXIT_REASON_MSR_READ:
assert(regs.rcx == MSR_EFER);
efer = vmcs_read(GUEST_EFER);
regs.rdx = efer >> 32;
regs.rax = efer & 0xffffffff;
break;
- case VMX_WRMSR:
+ case EXIT_REASON_MSR_WRITE:
assert(regs.rcx == MSR_EFER);
efer = regs.rdx << 32 | (regs.rax & 0xffffffff);
vmcs_write(GUEST_EFER, efer);
break;
- case VMX_CPUID:
+ case EXIT_REASON_CPUID:
cpuid = (struct cpuid) {0, 0, 0, 0};
cpuid = raw_cpuid(regs.rax, regs.rcx);
regs.rax = cpuid.a;
@@ -10825,7 +10834,7 @@ static void __vmx_pf_exception_test(invalidate_tlb_t inv_fn, void *data,
regs.rcx = cpuid.c;
regs.rdx = cpuid.d;
break;
- case VMX_INVLPG:
+ case EXIT_REASON_INVLPG:
inv_fn(data);
break;
default:
@@ -10838,7 +10847,7 @@ static void __vmx_pf_exception_test(invalidate_tlb_t inv_fn, void *data,
enter_guest();
}
- assert_exit_reason(VMX_VMCALL);
+ assert_exit_reason(EXIT_REASON_VMCALL);
}
static void vmx_pf_exception_test(void)
@@ -10965,7 +10974,7 @@ static void handle_exception_in_l2(u8 vector)
vmx_exception_test_vector = vector;
enter_guest();
- report(vmcs_read(EXI_REASON) == VMX_VMCALL,
+ report(vmcs_read(EXI_REASON) == EXIT_REASON_VMCALL,
"%s handled by L2", exception_mnemonic(vector));
handle_exception(vector, old_handler);
@@ -10987,7 +10996,7 @@ static void handle_exception_in_l1(u32 vector)
intr_type = EVENT_TYPE_HWEXC;
intr_info = vmcs_read(EXI_INTR_INFO);
- report((vmcs_read(EXI_REASON) == VMX_EXC_NMI) &&
+ report((vmcs_read(EXI_REASON) == EXIT_REASON_EXCEPTION_NMI) &&
(intr_info & INTR_INFO_VALID_MASK) &&
(intr_info & INTR_INFO_VECTOR_MASK) == vector &&
((intr_info & INTR_INFO_INTR_TYPE_MASK) >> INTR_INFO_INTR_TYPE_SHIFT) == intr_type,
@@ -11396,10 +11405,10 @@ static void test_basic_vid(u8 nr, u8 tpr, enum Vid_op op, u32 isr_exec_cnt_want,
if (eoi_exit_induced) {
u32 exit_cnt;
- assert_exit_reason(VMX_EOI_INDUCED);
+ assert_exit_reason(EXIT_REASON_EOI_INDUCED);
for (exit_cnt = 1; exit_cnt < isr_exec_cnt_want; exit_cnt++) {
enter_guest();
- assert_exit_reason(VMX_EOI_INDUCED);
+ assert_exit_reason(EXIT_REASON_EOI_INDUCED);
}
enter_guest();
}
@@ -11468,7 +11477,7 @@ static void vmx_basic_vid_test(void)
/* Terminate the guest */
args->op = VID_OP_TERMINATE;
enter_guest();
- assert_exit_reason(VMX_VMCALL);
+ assert_exit_reason(EXIT_REASON_VMCALL);
}
static void test_eoi_virt(u8 nr, u8 lo_pri_nr, bool eoi_exit_induced)
@@ -11526,7 +11535,7 @@ static void vmx_eoi_virt_test(void)
/* Terminate the guest */
args->op = VID_OP_TERMINATE;
enter_guest();
- assert_exit_reason(VMX_VMCALL);
+ assert_exit_reason(EXIT_REASON_VMCALL);
}
static void vmx_posted_interrupts_test(void)
--
2.43.0
next prev parent reply other threads:[~2025-09-16 16:45 UTC|newest]
Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-09-16 17:22 [kvm-unit-tests PATCH 00/17] x86/vmx: align with Linux kernel VMX definitions Jon Kohler
2025-09-16 17:22 ` [kvm-unit-tests PATCH 01/17] lib: add linux vmx.h clone from 6.16 Jon Kohler
2025-09-16 17:22 ` [kvm-unit-tests PATCH 02/17] lib: add linux trapnr.h " Jon Kohler
2025-09-16 17:22 ` [kvm-unit-tests PATCH 03/17] lib: add vmxfeatures.h " Jon Kohler
2025-09-16 17:22 ` [kvm-unit-tests PATCH 04/17] lib: define __aligned() in compiler.h Jon Kohler
2025-09-16 17:22 ` [kvm-unit-tests PATCH 05/17] x86/vmx: basic integration for new vmx.h Jon Kohler
2025-09-16 17:22 ` [kvm-unit-tests PATCH 06/17] x86/vmx: switch to new vmx.h EPT violation defs Jon Kohler
2025-09-16 17:22 ` [kvm-unit-tests PATCH 07/17] x86/vmx: switch to new vmx.h EPT RWX defs Jon Kohler
2025-09-16 17:22 ` [kvm-unit-tests PATCH 08/17] x86/vmx: switch to new vmx.h EPT access and dirty defs Jon Kohler
2025-09-16 17:22 ` [kvm-unit-tests PATCH 09/17] x86/vmx: switch to new vmx.h EPT capability and memory type defs Jon Kohler
2025-09-16 17:22 ` [kvm-unit-tests PATCH 10/17] x86/vmx: switch to new vmx.h primary processor-based VM-execution controls Jon Kohler
2025-09-16 17:22 ` [kvm-unit-tests PATCH 11/17] x86/vmx: switch to new vmx.h secondary execution control bit Jon Kohler
2025-09-16 17:22 ` [kvm-unit-tests PATCH 12/17] x86/vmx: switch to new vmx.h secondary execution controls Jon Kohler
2025-09-16 17:22 ` [kvm-unit-tests PATCH 13/17] x86/vmx: switch to new vmx.h pin based VM-execution controls Jon Kohler
2025-09-16 17:22 ` [kvm-unit-tests PATCH 14/17] x86/vmx: switch to new vmx.h exit controls Jon Kohler
2025-09-16 17:22 ` [kvm-unit-tests PATCH 15/17] x86/vmx: switch to new vmx.h entry controls Jon Kohler
2025-09-16 17:22 ` [kvm-unit-tests PATCH 16/17] x86/vmx: switch to new vmx.h interrupt defs Jon Kohler
2025-09-16 17:22 ` Jon Kohler [this message]
2025-11-12 19:02 ` [kvm-unit-tests PATCH 00/17] x86/vmx: align with Linux kernel VMX definitions Sean Christopherson
2025-11-14 14:52 ` Jon Kohler
2025-11-17 17:41 ` Sean Christopherson
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20250916172247.610021-18-jon@nutanix.com \
--to=jon@nutanix.com \
--cc=kvm@vger.kernel.org \
--cc=pbonzini@redhat.com \
--cc=seanjc@google.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox