Migrate to new vmx.h's exit controls, which makes it easier to grok from one code base to another. No functional change intended. Signed-off-by: Jon Kohler --- x86/vmx.c | 6 ++-- x86/vmx.h | 12 ------- x86/vmx_tests.c | 86 +++++++++++++++++++++++++++---------------------- 3 files changed, 52 insertions(+), 52 deletions(-) diff --git a/x86/vmx.c b/x86/vmx.c index 25a8d9f8..bd16e833 100644 --- a/x86/vmx.c +++ b/x86/vmx.c @@ -1132,7 +1132,7 @@ static void init_vmcs_host(void) vmcs_write(HOST_CR4, read_cr4()); vmcs_write(HOST_SYSENTER_EIP, (u64)(&entry_sysenter)); vmcs_write(HOST_SYSENTER_CS, KERNEL_CS); - if (ctrl_exit_rev.clr & EXI_LOAD_PAT) + if (ctrl_exit_rev.clr & VM_EXIT_LOAD_IA32_PAT) vmcs_write(HOST_PAT, rdmsr(MSR_IA32_CR_PAT)); /* 26.2.3 */ @@ -1257,7 +1257,9 @@ int init_vmcs(struct vmcs **vmcs) ctrl_pin |= PIN_BASED_EXT_INTR_MASK | PIN_BASED_NMI_EXITING | PIN_BASED_VIRTUAL_NMIS; - ctrl_exit = EXI_LOAD_EFER | EXI_HOST_64 | EXI_LOAD_PAT; + ctrl_exit = VM_EXIT_LOAD_IA32_EFER | + VM_EXIT_HOST_ADDR_SPACE_SIZE | + VM_EXIT_LOAD_IA32_PAT; ctrl_enter = (ENT_LOAD_EFER | ENT_GUEST_64); /* DIsable IO instruction VMEXIT now */ ctrl_cpu[0] &= (~(CPU_BASED_UNCOND_IO_EXITING | CPU_BASED_USE_IO_BITMAPS)); diff --git a/x86/vmx.h b/x86/vmx.h index e0e23ab6..30503ff4 100644 --- a/x86/vmx.h +++ b/x86/vmx.h @@ -406,18 +406,6 @@ enum Reason { VMX_XRSTORS = 64, }; -enum Ctrl_exi { - EXI_SAVE_DBGCTLS = 1UL << 2, - EXI_HOST_64 = 1UL << 9, - EXI_LOAD_PERF = 1UL << 12, - EXI_INTA = 1UL << 15, - EXI_SAVE_PAT = 1UL << 18, - EXI_LOAD_PAT = 1UL << 19, - EXI_SAVE_EFER = 1UL << 20, - EXI_LOAD_EFER = 1UL << 21, - EXI_SAVE_PREEMPT = 1UL << 22, -}; - enum Ctrl_ent { ENT_LOAD_DBGCTLS = 1UL << 2, ENT_GUEST_64 = 1UL << 9, diff --git a/x86/vmx_tests.c b/x86/vmx_tests.c index 1ea5d35b..77a63a3e 100644 --- a/x86/vmx_tests.c +++ b/x86/vmx_tests.c @@ -138,7 +138,7 @@ static int preemption_timer_init(struct vmcs *vmcs) vmcs_write(PREEMPT_TIMER_VALUE, preempt_val); preempt_scale = rdmsr(MSR_IA32_VMX_MISC) & 0x1F; - if (!(ctrl_exit_rev.clr & EXI_SAVE_PREEMPT)) + if (!(ctrl_exit_rev.clr & VM_EXIT_SAVE_VMX_PREEMPTION_TIMER)) printf("\tSave preemption value is not supported\n"); return VMX_TEST_START; @@ -147,7 +147,7 @@ static int preemption_timer_init(struct vmcs *vmcs) static void preemption_timer_main(void) { tsc_val = rdtsc(); - if (ctrl_exit_rev.clr & EXI_SAVE_PREEMPT) { + if (ctrl_exit_rev.clr & VM_EXIT_SAVE_VMX_PREEMPTION_TIMER) { vmx_set_test_stage(0); vmcall(); if (vmx_get_test_stage() == 1) @@ -198,7 +198,8 @@ static int preemption_timer_exit_handler(union exit_reason exit_reason) vmcs_read(PIN_CONTROLS) & ~PIN_BASED_VMX_PREEMPTION_TIMER); vmcs_write(EXI_CONTROLS, - vmcs_read(EXI_CONTROLS) & ~EXI_SAVE_PREEMPT); + vmcs_read(EXI_CONTROLS) & + ~VM_EXIT_SAVE_VMX_PREEMPTION_TIMER); vmcs_write(GUEST_ACTV_STATE, ACTV_ACTIVE); return VMX_TEST_RESUME; case 4: @@ -220,7 +221,8 @@ static int preemption_timer_exit_handler(union exit_reason exit_reason) vmx_set_test_stage(1); vmcs_write(PREEMPT_TIMER_VALUE, preempt_val); ctrl_exit = (vmcs_read(EXI_CONTROLS) | - EXI_SAVE_PREEMPT) & ctrl_exit_rev.clr; + VM_EXIT_SAVE_VMX_PREEMPTION_TIMER) & + ctrl_exit_rev.clr; vmcs_write(EXI_CONTROLS, ctrl_exit); return VMX_TEST_RESUME; case 1: @@ -312,8 +314,8 @@ static int test_ctrl_pat_init(struct vmcs *vmcs) u64 ctrl_exi; msr_bmp_init(); - if (!(ctrl_exit_rev.clr & EXI_SAVE_PAT) && - !(ctrl_exit_rev.clr & EXI_LOAD_PAT) && + if (!(ctrl_exit_rev.clr & VM_EXIT_SAVE_IA32_PAT) && + !(ctrl_exit_rev.clr & VM_EXIT_LOAD_IA32_PAT) && !(ctrl_enter_rev.clr & ENT_LOAD_PAT)) { printf("\tSave/load PAT is not supported\n"); return 1; @@ -322,7 +324,8 @@ static int test_ctrl_pat_init(struct vmcs *vmcs) ctrl_ent = vmcs_read(ENT_CONTROLS); ctrl_exi = vmcs_read(EXI_CONTROLS); ctrl_ent |= ctrl_enter_rev.clr & ENT_LOAD_PAT; - ctrl_exi |= ctrl_exit_rev.clr & (EXI_SAVE_PAT | EXI_LOAD_PAT); + ctrl_exi |= ctrl_exit_rev.clr & (VM_EXIT_SAVE_IA32_PAT | + VM_EXIT_LOAD_IA32_PAT); vmcs_write(ENT_CONTROLS, ctrl_ent); vmcs_write(EXI_CONTROLS, ctrl_exi); ia32_pat = rdmsr(MSR_IA32_CR_PAT); @@ -360,13 +363,13 @@ static int test_ctrl_pat_exit_handler(union exit_reason exit_reason) switch (exit_reason.basic) { case VMX_VMCALL: guest_pat = vmcs_read(GUEST_PAT); - if (!(ctrl_exit_rev.clr & EXI_SAVE_PAT)) { + if (!(ctrl_exit_rev.clr & VM_EXIT_SAVE_IA32_PAT)) { printf("\tEXI_SAVE_PAT is not supported\n"); vmcs_write(GUEST_PAT, 0x6); } else { report(guest_pat == 0x6, "Exit save PAT"); } - if (!(ctrl_exit_rev.clr & EXI_LOAD_PAT)) + if (!(ctrl_exit_rev.clr & VM_EXIT_LOAD_IA32_PAT)) printf("\tEXI_LOAD_PAT is not supported\n"); else report(rdmsr(MSR_IA32_CR_PAT) == ia32_pat, @@ -388,7 +391,9 @@ static int test_ctrl_efer_init(struct vmcs *vmcs) msr_bmp_init(); ctrl_ent = vmcs_read(ENT_CONTROLS) | ENT_LOAD_EFER; - ctrl_exi = vmcs_read(EXI_CONTROLS) | EXI_SAVE_EFER | EXI_LOAD_EFER; + ctrl_exi = vmcs_read(EXI_CONTROLS) | + VM_EXIT_SAVE_IA32_EFER | + VM_EXIT_LOAD_IA32_EFER; vmcs_write(ENT_CONTROLS, ctrl_ent & ctrl_enter_rev.clr); vmcs_write(EXI_CONTROLS, ctrl_exi & ctrl_exit_rev.clr); ia32_efer = rdmsr(MSR_EFER); @@ -426,13 +431,13 @@ static int test_ctrl_efer_exit_handler(union exit_reason exit_reason) switch (exit_reason.basic) { case VMX_VMCALL: guest_efer = vmcs_read(GUEST_EFER); - if (!(ctrl_exit_rev.clr & EXI_SAVE_EFER)) { + if (!(ctrl_exit_rev.clr & VM_EXIT_SAVE_IA32_EFER)) { printf("\tEXI_SAVE_EFER is not supported\n"); vmcs_write(GUEST_EFER, ia32_efer); } else { report(guest_efer == ia32_efer, "Exit save EFER"); } - if (!(ctrl_exit_rev.clr & EXI_LOAD_EFER)) { + if (!(ctrl_exit_rev.clr & VM_EXIT_LOAD_IA32_EFER)) { printf("\tEXI_LOAD_EFER is not supported\n"); wrmsr(MSR_EFER, ia32_efer ^ EFER_NX); } else { @@ -1736,7 +1741,9 @@ static int interrupt_exit_handler(union exit_reason exit_reason) PIN_BASED_EXT_INTR_MASK); break; case 7: - vmcs_write(EXI_CONTROLS, vmcs_read(EXI_CONTROLS) | EXI_INTA); + vmcs_write(EXI_CONTROLS, + vmcs_read(EXI_CONTROLS) | + VM_EXIT_ACK_INTR_ON_EXIT); vmcs_write(PIN_CONTROLS, vmcs_read(PIN_CONTROLS) | PIN_BASED_EXT_INTR_MASK); @@ -1764,7 +1771,7 @@ static int interrupt_exit_handler(union exit_reason exit_reason) vmcs_write(GUEST_RIP, guest_rip + insn_len); return VMX_TEST_RESUME; case VMX_EXTINT: - if (vmcs_read(EXI_CONTROLS) & EXI_INTA) { + if (vmcs_read(EXI_CONTROLS) & VM_EXIT_ACK_INTR_ON_EXIT) { int vector = vmcs_read(EXI_INTR_INFO) & 0xff; handle_external_interrupt(vector); } else { @@ -1916,7 +1923,8 @@ static int dbgctls_init(struct vmcs *vmcs) vmcs_write(GUEST_DEBUGCTL, 0x2); vmcs_write(ENT_CONTROLS, vmcs_read(ENT_CONTROLS) | ENT_LOAD_DBGCTLS); - vmcs_write(EXI_CONTROLS, vmcs_read(EXI_CONTROLS) | EXI_SAVE_DBGCTLS); + vmcs_write(EXI_CONTROLS, + vmcs_read(EXI_CONTROLS) | VM_EXIT_SAVE_DEBUG_CONTROLS); return VMX_TEST_START; } @@ -1940,7 +1948,7 @@ static void dbgctls_main(void) report(vmx_get_test_stage() == 1, "Save debug controls"); if (ctrl_enter_rev.set & ENT_LOAD_DBGCTLS || - ctrl_exit_rev.set & EXI_SAVE_DBGCTLS) { + ctrl_exit_rev.set & VM_EXIT_SAVE_DEBUG_CONTROLS) { printf("\tDebug controls are always loaded/saved\n"); return; } @@ -1992,7 +2000,8 @@ static int dbgctls_exit_handler(union exit_reason exit_reason) vmcs_write(ENT_CONTROLS, vmcs_read(ENT_CONTROLS) & ~ENT_LOAD_DBGCTLS); vmcs_write(EXI_CONTROLS, - vmcs_read(EXI_CONTROLS) & ~EXI_SAVE_DBGCTLS); + vmcs_read(EXI_CONTROLS) & + ~VM_EXIT_SAVE_DEBUG_CONTROLS); break; case 3: if (dr7 == 0x400 && debugctl == 0 && @@ -4134,7 +4143,7 @@ static void test_posted_intr(void) if (!((ctrl_pin_rev.clr & PIN_BASED_POSTED_INTR) && (ctrl_cpu_rev[1].clr & SECONDARY_EXEC_VIRTUAL_INTR_DELIVERY) && - (ctrl_exit_rev.clr & EXI_INTA))) + (ctrl_exit_rev.clr & VM_EXIT_ACK_INTR_ON_EXIT))) return; vmcs_write(CPU_EXEC_CTRL0, @@ -4158,13 +4167,13 @@ static void test_posted_intr(void) test_vmx_invalid_controls(); report_prefix_pop(); - exit_ctl &= ~EXI_INTA; + exit_ctl &= ~VM_EXIT_ACK_INTR_ON_EXIT; vmcs_write(EXI_CONTROLS, exit_ctl); report_prefix_pushf("Process-posted-interrupts enabled; virtual-interrupt-delivery enabled; acknowledge-interrupt-on-exit disabled"); test_vmx_invalid_controls(); report_prefix_pop(); - exit_ctl |= EXI_INTA; + exit_ctl |= VM_EXIT_ACK_INTR_ON_EXIT; vmcs_write(EXI_CONTROLS, exit_ctl); report_prefix_pushf("Process-posted-interrupts enabled; virtual-interrupt-delivery enabled; acknowledge-interrupt-on-exit enabled"); test_vmx_valid_controls(); @@ -5113,7 +5122,7 @@ static void test_vmx_preemption_timer(void) u32 pin = saved_pin; u32 exit = saved_exit; - if (!((ctrl_exit_rev.clr & EXI_SAVE_PREEMPT) || + if (!((ctrl_exit_rev.clr & VM_EXIT_SAVE_VMX_PREEMPTION_TIMER) || (ctrl_pin_rev.clr & PIN_BASED_VMX_PREEMPTION_TIMER))) { report_skip("%s : \"Save-VMX-preemption-timer\" and/or \"Enable-VMX-preemption-timer\" control not supported", __func__); return; @@ -5121,13 +5130,13 @@ static void test_vmx_preemption_timer(void) pin |= PIN_BASED_VMX_PREEMPTION_TIMER; vmcs_write(PIN_CONTROLS, pin); - exit &= ~EXI_SAVE_PREEMPT; + exit &= ~VM_EXIT_SAVE_VMX_PREEMPTION_TIMER; vmcs_write(EXI_CONTROLS, exit); report_prefix_pushf("enable-VMX-preemption-timer enabled, save-VMX-preemption-timer disabled"); test_vmx_valid_controls(); report_prefix_pop(); - exit |= EXI_SAVE_PREEMPT; + exit |= VM_EXIT_SAVE_VMX_PREEMPTION_TIMER; vmcs_write(EXI_CONTROLS, exit); report_prefix_pushf("enable-VMX-preemption-timer enabled, save-VMX-preemption-timer enabled"); test_vmx_valid_controls(); @@ -5139,7 +5148,7 @@ static void test_vmx_preemption_timer(void) test_vmx_invalid_controls(); report_prefix_pop(); - exit &= ~EXI_SAVE_PREEMPT; + exit &= ~VM_EXIT_SAVE_VMX_PREEMPTION_TIMER; vmcs_write(EXI_CONTROLS, exit); report_prefix_pushf("enable-VMX-preemption-timer disabled, save-VMX-preemption-timer disabled"); test_vmx_valid_controls(); @@ -7284,10 +7293,10 @@ static void test_efer_one(u32 fld, const char * fld_name, u64 efer, bool ok; ok = true; - if (ctrl_fld == EXI_CONTROLS && (ctrl & EXI_LOAD_EFER)) { - if (!!(efer & EFER_LMA) != !!(ctrl & EXI_HOST_64)) + if (ctrl_fld == EXI_CONTROLS && (ctrl & VM_EXIT_LOAD_IA32_EFER)) { + if (!!(efer & EFER_LMA) != !!(ctrl & VM_EXIT_HOST_ADDR_SPACE_SIZE)) ok = false; - if (!!(efer & EFER_LME) != !!(ctrl & EXI_HOST_64)) + if (!!(efer & EFER_LME) != !!(ctrl & VM_EXIT_HOST_ADDR_SPACE_SIZE)) ok = false; } if (ctrl_fld == ENT_CONTROLS && (ctrl & ENT_LOAD_EFER)) { @@ -7425,8 +7434,8 @@ test_entry_exit_mode: static void test_host_efer(void) { test_efer(HOST_EFER, "HOST_EFER", EXI_CONTROLS, - ctrl_exit_rev.clr & EXI_LOAD_EFER, - EXI_HOST_64); + ctrl_exit_rev.clr & VM_EXIT_LOAD_IA32_EFER, + VM_EXIT_HOST_ADDR_SPACE_SIZE); } /* @@ -7514,7 +7523,7 @@ static void test_pat(u32 field, const char * field_name, u32 ctrl_field, test_guest_state("ENT_LOAD_PAT enabled", !!error, val, "GUEST_PAT"); - if (!(ctrl_exit_rev.clr & EXI_LOAD_PAT)) + if (!(ctrl_exit_rev.clr & VM_EXIT_LOAD_IA32_PAT)) wrmsr(MSR_IA32_CR_PAT, pat_msr_saved); } @@ -7539,12 +7548,12 @@ static void test_load_host_pat(void) /* * "load IA32_PAT" VM-exit control */ - if (!(ctrl_exit_rev.clr & EXI_LOAD_PAT)) { + if (!(ctrl_exit_rev.clr & VM_EXIT_LOAD_IA32_PAT)) { report_skip("%s : \"Load-IA32-PAT\" exit control not supported", __func__); return; } - test_pat(HOST_PAT, "HOST_PAT", EXI_CONTROLS, EXI_LOAD_PAT); + test_pat(HOST_PAT, "HOST_PAT", EXI_CONTROLS, VM_EXIT_LOAD_IA32_PAT); } union cpuidA_eax { @@ -7698,13 +7707,14 @@ static void test_load_host_perf_global_ctrl(void) return; } - if (!(ctrl_exit_rev.clr & EXI_LOAD_PERF)) { + if (!(ctrl_exit_rev.clr & VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL)) { report_skip("%s : \"Load IA32_PERF_GLOBAL_CTRL\" exit control not supported", __func__); return; } test_perf_global_ctrl(HOST_PERF_GLOBAL_CTRL, "HOST_PERF_GLOBAL_CTRL", - EXI_CONTROLS, "EXI_CONTROLS", EXI_LOAD_PERF); + EXI_CONTROLS, "EXI_CONTROLS", + VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL); } @@ -7853,7 +7863,7 @@ static void test_host_segment_regs(void) selector_saved = vmcs_read(HOST_SEL_SS); vmcs_write(HOST_SEL_SS, 0); report_prefix_pushf("HOST_SEL_SS 0"); - if (vmcs_read(EXI_CONTROLS) & EXI_HOST_64) { + if (vmcs_read(EXI_CONTROLS) & VM_EXIT_HOST_ADDR_SPACE_SIZE) { test_vmx_vmlaunch(0); } else { test_vmx_vmlaunch(VMXERR_ENTRY_INVALID_HOST_STATE_FIELD); @@ -7899,7 +7909,7 @@ static void test_host_addr_size(void) u64 rip_saved = vmcs_read(HOST_RIP); u64 entry_ctrl_saved = vmcs_read(ENT_CONTROLS); - assert(vmcs_read(EXI_CONTROLS) & EXI_HOST_64); + assert(vmcs_read(EXI_CONTROLS) & VM_EXIT_HOST_ADDR_SPACE_SIZE); assert(cr4_saved & X86_CR4_PAE); vmcs_write(ENT_CONTROLS, entry_ctrl_saved | ENT_GUEST_64); @@ -9603,7 +9613,7 @@ static void enable_posted_interrupts(void) void *pi_desc = alloc_page(); vmcs_set_bits(PIN_CONTROLS, PIN_BASED_POSTED_INTR); - vmcs_set_bits(EXI_CONTROLS, EXI_INTA); + vmcs_set_bits(EXI_CONTROLS, VM_EXIT_ACK_INTR_ON_EXIT); vmcs_write(PINV, PI_VECTOR); vmcs_write(POSTED_INTR_DESC_ADDR, (u64)pi_desc); } @@ -10603,7 +10613,7 @@ static int invalid_msr_init(struct vmcs *vmcs) vmcs_write(PREEMPT_TIMER_VALUE, preempt_val); preempt_scale = rdmsr(MSR_IA32_VMX_MISC) & 0x1F; - if (!(ctrl_exit_rev.clr & EXI_SAVE_PREEMPT)) + if (!(ctrl_exit_rev.clr & VM_EXIT_SAVE_VMX_PREEMPTION_TIMER)) printf("\tSave preemption value is not supported\n"); vmcs_write(ENT_MSR_LD_CNT, 1); -- 2.43.0