Lines Matching defs:vmx

62 #include "vmx.h"
110 #define guest_msr_rw(vmx, msr) \
111 msr_bitmap_change_access((vmx)->msr_bitmap, (msr), MSR_BITMAP_ACCESS_RW)
116 MALLOC_DEFINE(M_VMX, "vmx", "vmx");
119 SYSCTL_NODE(_hw_vmm, OID_AUTO, vmx, CTLFLAG_RW, NULL, NULL);
311 #define SETJMP_TRACE(vmx, vcpu, vmxctx, regname) \
312 VMM_CTR1((vmx)->vm, (vcpu), "setjmp trace " #regname " 0x%016lx", \
316 vmx_setjmp_trace(struct vmx *vmx, int vcpu, struct vmxctx *vmxctx, int rc)
320 if (vmxctx != &vmx->ctx[vcpu])
322 vmxctx, &vmx->ctx[vcpu]);
324 VMM_CTR1((vmx)->vm, (vcpu), "vmxctx = %p", vmxctx);
325 VMM_CTR2((vmx)->vm, (vcpu), "setjmp return code %s(%d)",
331 VMM_CTR2((vmx)->vm, (vcpu), "vmcs host_rip 0x%016lx, host_rsp 0x%016lx",
334 SETJMP_TRACE(vmx, vcpu, vmxctx, host_r15);
335 SETJMP_TRACE(vmx, vcpu, vmxctx, host_r14);
336 SETJMP_TRACE(vmx, vcpu, vmxctx, host_r13);
337 SETJMP_TRACE(vmx, vcpu, vmxctx, host_r12);
338 SETJMP_TRACE(vmx, vcpu, vmxctx, host_rbp);
339 SETJMP_TRACE(vmx, vcpu, vmxctx, host_rsp);
340 SETJMP_TRACE(vmx, vcpu, vmxctx, host_rbx);
341 SETJMP_TRACE(vmx, vcpu, vmxctx, host_rip);
343 SETJMP_TRACE(vmx, vcpu, vmxctx, guest_rdi);
344 SETJMP_TRACE(vmx, vcpu, vmxctx, guest_rsi);
345 SETJMP_TRACE(vmx, vcpu, vmxctx, guest_rdx);
346 SETJMP_TRACE(vmx, vcpu, vmxctx, guest_rcx);
347 SETJMP_TRACE(vmx, vcpu, vmxctx, guest_r8);
348 SETJMP_TRACE(vmx, vcpu, vmxctx, guest_r9);
349 SETJMP_TRACE(vmx, vcpu, vmxctx, guest_rax);
350 SETJMP_TRACE(vmx, vcpu, vmxctx, guest_rbx);
351 SETJMP_TRACE(vmx, vcpu, vmxctx, guest_rbp);
352 SETJMP_TRACE(vmx, vcpu, vmxctx, guest_r10);
353 SETJMP_TRACE(vmx, vcpu, vmxctx, guest_r11);
354 SETJMP_TRACE(vmx, vcpu, vmxctx, guest_r12);
355 SETJMP_TRACE(vmx, vcpu, vmxctx, guest_r13);
356 SETJMP_TRACE(vmx, vcpu, vmxctx, guest_r14);
357 SETJMP_TRACE(vmx, vcpu, vmxctx, guest_r15);
358 SETJMP_TRACE(vmx, vcpu, vmxctx, guest_cr2);
363 vmx_setjmp_trace(struct vmx *vmx, int vcpu, struct vmxctx *vmxctx, int rc)
748 struct vmx *vmx;
750 vmx = malloc(sizeof(struct vmx), M_VMX, M_WAITOK | M_ZERO);
751 if ((uintptr_t)vmx & PAGE_MASK) {
752 panic("malloc of struct vmx not aligned on %d byte boundary",
755 vmx->vm = vm;
757 vmx->eptp = eptp(vtophys((vm_offset_t)pmap->pm_pml4));
768 ept_invalidate_mappings(vmx->eptp);
770 msr_bitmap_initialize(vmx->msr_bitmap);
792 if (guest_msr_rw(vmx, MSR_GSBASE) ||
793 guest_msr_rw(vmx, MSR_FSBASE) ||
794 guest_msr_rw(vmx, MSR_SYSENTER_CS_MSR) ||
795 guest_msr_rw(vmx, MSR_SYSENTER_ESP_MSR) ||
796 guest_msr_rw(vmx, MSR_SYSENTER_EIP_MSR) ||
797 guest_msr_rw(vmx, MSR_KGSBASE) ||
798 guest_msr_rw(vmx, MSR_EFER))
808 if (!vmx_no_patmsr && guest_msr_rw(vmx, MSR_PAT))
814 vmx->vmcs[i].identifier = vmx_revision();
815 error = vmclear(&vmx->vmcs[i]);
821 error = vmcs_set_defaults(&vmx->vmcs[i],
823 (u_long)&vmx->ctx[i],
824 vmx->eptp,
829 vtophys(vmx->msr_bitmap),
835 vmx->cap[i].set = 0;
836 vmx->cap[i].proc_ctls = procbased_ctls;
837 vmx->cap[i].proc_ctls2 = procbased_ctls2;
839 vmx->state[i].lastcpu = -1;
840 vmx->state[i].vpid = vpid[i];
842 msr_save_area_init(vmx->guest_msrs[i], &guest_msr_count);
844 error = vmcs_set_msr_save(&vmx->vmcs[i],
845 vtophys(vmx->guest_msrs[i]),
856 error = vmx_setup_cr0_shadow(&vmx->vmcs[i], 0x60000010);
860 error = vmx_setup_cr4_shadow(&vmx->vmcs[i], 0);
864 vmx->ctx[i].pmap = pmap;
865 vmx->ctx[i].eptp = vmx->eptp;
868 return (vmx);
887 vmx_run_trace(struct vmx *vmx, int vcpu)
890 VMM_CTR1(vmx->vm, vcpu, "Resume execution at 0x%0lx", vmcs_guest_rip());
895 vmx_exit_trace(struct vmx *vmx, int vcpu, uint64_t rip, uint32_t exit_reason,
899 VMM_CTR3(vmx->vm, vcpu, "%s %s vmexit at 0x%0lx",
906 vmx_astpending_trace(struct vmx *vmx, int vcpu, uint64_t rip)
909 VMM_CTR1(vmx->vm, vcpu, "astpending vmexit at 0x%0lx", rip);
914 vmx_set_pcpu_defaults(struct vmx *vmx, int vcpu)
920 vmxstate = &vmx->state[vcpu];
929 vmm_stat_incr(vmx->vm, vcpu, VCPU_MIGRATIONS, 1);
982 vmx_set_int_window_exiting(struct vmx *vmx, int vcpu)
986 vmx->cap[vcpu].proc_ctls |= PROCBASED_INT_WINDOW_EXITING;
988 error = vmwrite(VMCS_PRI_PROC_BASED_CTLS, vmx->cap[vcpu].proc_ctls);
994 vmx_clear_int_window_exiting(struct vmx *vmx, int vcpu)
998 vmx->cap[vcpu].proc_ctls &= ~PROCBASED_INT_WINDOW_EXITING;
1000 error = vmwrite(VMCS_PRI_PROC_BASED_CTLS, vmx->cap[vcpu].proc_ctls);
1006 vmx_set_nmi_window_exiting(struct vmx *vmx, int vcpu)
1010 vmx->cap[vcpu].proc_ctls |= PROCBASED_NMI_WINDOW_EXITING;
1012 error = vmwrite(VMCS_PRI_PROC_BASED_CTLS, vmx->cap[vcpu].proc_ctls);
1018 vmx_clear_nmi_window_exiting(struct vmx *vmx, int vcpu)
1022 vmx->cap[vcpu].proc_ctls &= ~PROCBASED_NMI_WINDOW_EXITING;
1024 error = vmwrite(VMCS_PRI_PROC_BASED_CTLS, vmx->cap[vcpu].proc_ctls);
1030 vmx_inject_nmi(struct vmx *vmx, int vcpu)
1036 if (!vm_nmi_pending(vmx->vm, vcpu))
1058 VMM_CTR0(vmx->vm, vcpu, "Injecting vNMI");
1061 vm_nmi_clear(vmx->vm, vcpu);
1069 vmx_set_nmi_window_exiting(vmx, vcpu);
1071 VMM_CTR0(vmx->vm, vcpu, "Enabling NMI window exiting");
1076 vmx_inject_interrupts(struct vmx *vmx, int vcpu)
1100 if (vmx_inject_nmi(vmx, vcpu))
1104 vector = lapic_pending_intr(vmx->vm, vcpu);
1135 lapic_intr_accepted(vmx->vm, vcpu, vector);
1137 VMM_CTR1(vmx->vm, vcpu, "Injecting hwintr at vector %d", vector);
1146 vmx_set_int_window_exiting(vmx, vcpu);
1148 VMM_CTR0(vmx->vm, vcpu, "Enabling interrupt window exiting");
1152 vmx_emulate_cr_access(struct vmx *vmx, int vcpu, uint64_t exitqual)
1166 vmxctx = &vmx->ctx[vcpu];
1349 vmx_exit_process(struct vmx *vmx, int vcpu, struct vm_exit *vmexit)
1358 vmcs = &vmx->vmcs[vcpu];
1359 vmxctx = &vmx->ctx[vcpu];
1360 qual = vmexit->u.vmx.exit_qualification;
1361 reason = vmexit->u.vmx.exit_reason;
1364 vmm_stat_incr(vmx->vm, vcpu, VMEXIT_COUNT, 1);
1396 vmm_stat_incr(vmx->vm, vcpu, VMEXIT_CR_ACCESS, 1);
1397 handled = vmx_emulate_cr_access(vmx, vcpu, qual);
1400 vmm_stat_incr(vmx->vm, vcpu, VMEXIT_RDMSR, 1);
1402 error = emulate_rdmsr(vmx->vm, vcpu, ecx);
1410 vmm_stat_incr(vmx->vm, vcpu, VMEXIT_WRMSR, 1);
1414 error = emulate_wrmsr(vmx->vm, vcpu, ecx,
1424 vmm_stat_incr(vmx->vm, vcpu, VMEXIT_HLT, 1);
1428 vmm_stat_incr(vmx->vm, vcpu, VMEXIT_MTRAP, 1);
1432 vmm_stat_incr(vmx->vm, vcpu, VMEXIT_PAUSE, 1);
1436 vmm_stat_incr(vmx->vm, vcpu, VMEXIT_INTR_WINDOW, 1);
1437 vmx_clear_int_window_exiting(vmx, vcpu);
1438 VMM_CTR0(vmx->vm, vcpu, "Disabling interrupt window exiting");
1455 vmm_stat_incr(vmx->vm, vcpu, VMEXIT_EXTINT, 1);
1459 vmm_stat_incr(vmx->vm, vcpu, VMEXIT_NMI_WINDOW, 1);
1460 vmx_clear_nmi_window_exiting(vmx, vcpu);
1461 VMM_CTR0(vmx->vm, vcpu, "Disabling NMI window exiting");
1464 vmm_stat_incr(vmx->vm, vcpu, VMEXIT_INOUT, 1);
1474 vmm_stat_incr(vmx->vm, vcpu, VMEXIT_CPUID, 1);
1475 handled = vmx_handle_cpuid(vmx->vm, vcpu, vmxctx);
1478 vmm_stat_incr(vmx->vm, vcpu, VMEXIT_EPT_FAULT, 1);
1485 if (vm_mem_allocated(vmx->vm, gpa)) {
1498 vmm_stat_incr(vmx->vm, vcpu, VMEXIT_UNKNOWN, 1);
1523 vmexit->u.vmx.error = 0;
1539 struct vmx *vmx;
1544 vmx = arg;
1545 vmcs = &vmx->vmcs[vcpu];
1546 vmxctx = &vmx->ctx[vcpu];
1550 vmexit = vm_exitinfo(vmx->vm, vcpu);
1554 KASSERT(vmxctx->eptp == vmx->eptp,
1576 if ((error = vmx_set_pcpu_defaults(vmx, vcpu)) != 0)
1580 lapic_timer_tick(vmx->vm, vcpu);
1581 vmx_inject_interrupts(vmx, vcpu);
1582 vmx_run_trace(vmx, vcpu);
1585 vmx_setjmp_trace(vmx, vcpu, vmxctx, rc);
1621 vm_name(vmx->vm), vcpu, vmxctx->launch_error);
1632 vmexit->u.vmx.exit_reason = exit_reason = vmcs_exit_reason();
1633 vmexit->u.vmx.exit_qualification = vmcs_exit_qualification();
1639 vmx_astpending_trace(vmx, vcpu, rip);
1640 vmm_stat_incr(vmx->vm, vcpu, VMEXIT_ASTPENDING, 1);
1644 handled = vmx_exit_process(vmx, vcpu, vmexit);
1645 vmx_exit_trace(vmx, vcpu, rip, exit_reason, handled);
1660 vmm_stat_incr(vmx->vm, vcpu, VMEXIT_USERSPACE, 1);
1662 VMM_CTR1(vmx->vm, vcpu, "goto userland: exitcode %d",vmexit->exitcode);
1677 vmexit->u.vmx.exit_reason = (uint32_t)-1;
1678 vmexit->u.vmx.exit_qualification = (uint32_t)-1;
1679 vmexit->u.vmx.error = vie;
1688 struct vmx *vmx = arg;
1691 vpid_free(vmx->state[i].vpid);
1696 error = vmclear(&vmx->vmcs[0]);
1700 free(vmx, M_VMX);
1795 struct vmx *vmx = arg;
1797 running = vcpu_is_running(vmx->vm, vcpu, &hostcpu);
1799 panic("vmx_getreg: %s%d is running", vm_name(vmx->vm), vcpu);
1801 if (vmxctx_getreg(&vmx->ctx[vcpu], reg, retval) == 0)
1804 return (vmcs_getreg(&vmx->vmcs[vcpu], running, reg, retval));
1812 struct vmx *vmx = arg;
1814 running = vcpu_is_running(vmx->vm, vcpu, &hostcpu);
1816 panic("vmx_setreg: %s%d is running", vm_name(vmx->vm), vcpu);
1818 if (vmxctx_setreg(&vmx->ctx[vcpu], reg, val) == 0)
1821 error = vmcs_setreg(&vmx->vmcs[vcpu], running, reg, val);
1831 vmcs_getreg(&vmx->vmcs[vcpu], running,
1837 vmcs_setreg(&vmx->vmcs[vcpu], running,
1846 error = vmcs_setreg(&vmx->vmcs[vcpu], running,
1857 struct vmx *vmx = arg;
1859 return (vmcs_getdesc(&vmx->vmcs[vcpu], reg, desc));
1865 struct vmx *vmx = arg;
1867 return (vmcs_setdesc(&vmx->vmcs[vcpu], reg, desc));
1876 struct vmx *vmx = arg;
1877 struct vmcs *vmcs = &vmx->vmcs[vcpu];
1917 struct vmx *vmx = arg;
1923 vcap = vmx->cap[vcpu].set;
1959 struct vmx *vmx = arg;
1960 struct vmcs *vmcs = &vmx->vmcs[vcpu];
1975 pptr = &vmx->cap[vcpu].proc_ctls;
1984 pptr = &vmx->cap[vcpu].proc_ctls;
1993 pptr = &vmx->cap[vcpu].proc_ctls;
2002 pptr = &vmx->cap[vcpu].proc_ctls2;
2011 pptr = &vmx->cap[vcpu].proc_ctls2;
2043 vmx->cap[vcpu].set |= (1 << type);
2045 vmx->cap[vcpu].set &= ~(1 << type);