Lines Matching defs:vmx

73 #include "vmx.h"
125 static MALLOC_DEFINE(M_VMX, "vmx", "vmx");
131 SYSCTL_NODE(_hw_vmm, OID_AUTO, vmx, CTLFLAG_RW | CTLFLAG_MPSAFE, NULL,
232 SDT_PROBE_DEFINE3(vmm, vmx, exit, entry,
233 "struct vmx *", "int", "struct vm_exit *");
235 SDT_PROBE_DEFINE4(vmm, vmx, exit, taskswitch,
236 "struct vmx *", "int", "struct vm_exit *", "struct vm_task_switch *");
238 SDT_PROBE_DEFINE4(vmm, vmx, exit, craccess,
239 "struct vmx *", "int", "struct vm_exit *", "uint64_t");
241 SDT_PROBE_DEFINE4(vmm, vmx, exit, rdmsr,
242 "struct vmx *", "int", "struct vm_exit *", "uint32_t");
244 SDT_PROBE_DEFINE5(vmm, vmx, exit, wrmsr,
245 "struct vmx *", "int", "struct vm_exit *", "uint32_t", "uint64_t");
247 SDT_PROBE_DEFINE3(vmm, vmx, exit, halt,
248 "struct vmx *", "int", "struct vm_exit *");
250 SDT_PROBE_DEFINE3(vmm, vmx, exit, mtrap,
251 "struct vmx *", "int", "struct vm_exit *");
253 SDT_PROBE_DEFINE3(vmm, vmx, exit, pause,
254 "struct vmx *", "int", "struct vm_exit *");
256 SDT_PROBE_DEFINE3(vmm, vmx, exit, intrwindow,
257 "struct vmx *", "int", "struct vm_exit *");
259 SDT_PROBE_DEFINE4(vmm, vmx, exit, interrupt,
260 "struct vmx *", "int", "struct vm_exit *", "uint32_t");
262 SDT_PROBE_DEFINE3(vmm, vmx, exit, nmiwindow,
263 "struct vmx *", "int", "struct vm_exit *");
265 SDT_PROBE_DEFINE3(vmm, vmx, exit, inout,
266 "struct vmx *", "int", "struct vm_exit *");
268 SDT_PROBE_DEFINE3(vmm, vmx, exit, cpuid,
269 "struct vmx *", "int", "struct vm_exit *");
271 SDT_PROBE_DEFINE5(vmm, vmx, exit, exception,
272 "struct vmx *", "int", "struct vm_exit *", "uint32_t", "int");
274 SDT_PROBE_DEFINE5(vmm, vmx, exit, nestedfault,
275 "struct vmx *", "int", "struct vm_exit *", "uint64_t", "uint64_t");
277 SDT_PROBE_DEFINE4(vmm, vmx, exit, mmiofault,
278 "struct vmx *", "int", "struct vm_exit *", "uint64_t");
280 SDT_PROBE_DEFINE3(vmm, vmx, exit, eoi,
281 "struct vmx *", "int", "struct vm_exit *");
283 SDT_PROBE_DEFINE3(vmm, vmx, exit, apicaccess,
284 "struct vmx *", "int", "struct vm_exit *");
286 SDT_PROBE_DEFINE4(vmm, vmx, exit, apicwrite,
287 "struct vmx *", "int", "struct vm_exit *", "struct vlapic *");
289 SDT_PROBE_DEFINE3(vmm, vmx, exit, xsetbv,
290 "struct vmx *", "int", "struct vm_exit *");
292 SDT_PROBE_DEFINE3(vmm, vmx, exit, monitor,
293 "struct vmx *", "int", "struct vm_exit *");
295 SDT_PROBE_DEFINE3(vmm, vmx, exit, mwait,
296 "struct vmx *", "int", "struct vm_exit *");
298 SDT_PROBE_DEFINE3(vmm, vmx, exit, vminsn,
299 "struct vmx *", "int", "struct vm_exit *");
301 SDT_PROBE_DEFINE4(vmm, vmx, exit, unknown,
302 "struct vmx *", "int", "struct vm_exit *", "uint32_t");
304 SDT_PROBE_DEFINE4(vmm, vmx, exit, return,
305 "struct vmx *", "int", "struct vm_exit *", "int");
455 vmx_allow_x2apic_msrs(struct vmx *vmx)
464 error += guest_msr_ro(vmx, MSR_APIC_ID);
465 error += guest_msr_ro(vmx, MSR_APIC_VERSION);
466 error += guest_msr_ro(vmx, MSR_APIC_LDR);
467 error += guest_msr_ro(vmx, MSR_APIC_SVR);
470 error += guest_msr_ro(vmx, MSR_APIC_ISR0 + i);
473 error += guest_msr_ro(vmx, MSR_APIC_TMR0 + i);
476 error += guest_msr_ro(vmx, MSR_APIC_IRR0 + i);
478 error += guest_msr_ro(vmx, MSR_APIC_ESR);
479 error += guest_msr_ro(vmx, MSR_APIC_LVT_TIMER);
480 error += guest_msr_ro(vmx, MSR_APIC_LVT_THERMAL);
481 error += guest_msr_ro(vmx, MSR_APIC_LVT_PCINT);
482 error += guest_msr_ro(vmx, MSR_APIC_LVT_LINT0);
483 error += guest_msr_ro(vmx, MSR_APIC_LVT_LINT1);
484 error += guest_msr_ro(vmx, MSR_APIC_LVT_ERROR);
485 error += guest_msr_ro(vmx, MSR_APIC_ICR_TIMER);
486 error += guest_msr_ro(vmx, MSR_APIC_DCR_TIMER);
487 error += guest_msr_ro(vmx, MSR_APIC_ICR);
495 error += guest_msr_rw(vmx, MSR_APIC_TPR);
496 error += guest_msr_rw(vmx, MSR_APIC_EOI);
497 error += guest_msr_rw(vmx, MSR_APIC_SELF_IPI);
848 TUNABLE_INT_FETCH("hw.vmm.vmx.use_tpr_shadowing",
851 TUNABLE_INT_FETCH("hw.vmm.vmx.cap.tpr_shadowing",
874 TUNABLE_INT_FETCH("hw.vmm.vmx.use_apic_vid",
877 TUNABLE_INT_FETCH("hw.vmm.vmx.cap.virtual_interrupt_delivery",
905 TUNABLE_INT_FETCH("hw.vmm.vmx.use_apic_pir",
908 TUNABLE_INT_FETCH("hw.vmm.vmx.cap.posted_interrupts",
929 TUNABLE_INT_FETCH("hw.vmm.vmx.l1d_flush", &guest_l1d_flush);
945 TUNABLE_INT_FETCH("hw.vmm.vmx.l1d_flush_sw",
1057 struct vmx *vmx;
1059 vmx = malloc(sizeof(struct vmx), M_VMX, M_WAITOK | M_ZERO);
1060 vmx->vm = vm;
1062 vmx->eptp = eptp(vtophys((vm_offset_t)pmap->pm_pmltop));
1073 ept_invalidate_mappings(vmx->eptp);
1075 vmx->msr_bitmap = malloc_aligned(PAGE_SIZE, PAGE_SIZE, M_VMX,
1077 msr_bitmap_initialize(vmx->msr_bitmap);
1108 if (guest_msr_rw(vmx, MSR_GSBASE) ||
1109 guest_msr_rw(vmx, MSR_FSBASE) ||
1110 guest_msr_rw(vmx, MSR_SYSENTER_CS_MSR) ||
1111 guest_msr_rw(vmx, MSR_SYSENTER_ESP_MSR) ||
1112 guest_msr_rw(vmx, MSR_SYSENTER_EIP_MSR) ||
1113 guest_msr_rw(vmx, MSR_EFER) ||
1114 guest_msr_ro(vmx, MSR_TSC) ||
1115 ((cap_rdpid || cap_rdtscp) && guest_msr_ro(vmx, MSR_TSC_AUX)))
1125 vmx->pmap = pmap;
1126 return (vmx);
1132 struct vmx *vmx = vmi;
1142 vcpu->vmx = vmx;
1160 vmx_msr_guest_init(vmx, vcpu);
1168 error += vmwrite(VMCS_EPTP, vmx->eptp);
1178 error += vmwrite(VMCS_MSR_BITMAP, vtophys(vmx->msr_bitmap));
1243 vcpu->ctx.pmap = vmx->pmap;
1287 vmx_invvpid(struct vmx *vmx, struct vmx_vcpu *vcpu, pmap_t pmap, int running)
1325 if (atomic_load_long(&pmap->pm_eptgen) == vmx->eptgen[curcpu]) {
1337 * 'vmx->eptp' for all vpids.
1344 vmx_set_pcpu_defaults(struct vmx *vmx, struct vmx_vcpu *vcpu, pmap_t pmap)
1359 vmx_invvpid(vmx, vcpu, pmap, 1);
1574 vatpic_pending_intr(vcpu->vmx->vm, &vector);
1625 vatpic_intr_accepted(vcpu->vmx->vm, vector);
1695 vmx_emulate_xsetbv(struct vmx *vmx, struct vmx_vcpu *vcpu,
1812 panic("invalid vmx register %d", ident);
1873 panic("invalid vmx register %d", ident);
1936 vmx_emulate_cr8_access(struct vmx *vmx, struct vmx_vcpu *vcpu,
2262 qual = vmexit->u.vmx.exit_qualification;
2380 vmx_exit_process(struct vmx *vmx, struct vmx_vcpu *vcpu, struct vm_exit *vmexit)
2404 qual = vmexit->u.vmx.exit_qualification;
2405 reason = vmexit->u.vmx.exit_reason;
2409 SDT_PROBE3(vmm, vmx, exit, entry, vmx, vcpuid, vmexit);
2512 SDT_PROBE4(vmm, vmx, exit, taskswitch, vmx, vcpuid, vmexit, ts);
2520 SDT_PROBE4(vmm, vmx, exit, craccess, vmx, vcpuid, vmexit, qual);
2529 handled = vmx_emulate_cr8_access(vmx, vcpu, qual);
2538 SDT_PROBE4(vmm, vmx, exit, rdmsr, vmx, vcpuid, vmexit, ecx);
2559 SDT_PROBE5(vmm, vmx, exit, wrmsr, vmx, vmexit, vcpuid, ecx,
2577 SDT_PROBE3(vmm, vmx, exit, halt, vmx, vcpuid, vmexit);
2588 SDT_PROBE3(vmm, vmx, exit, mtrap, vmx, vcpuid, vmexit);
2594 SDT_PROBE3(vmm, vmx, exit, pause, vmx, vcpuid, vmexit);
2599 SDT_PROBE3(vmm, vmx, exit, intrwindow, vmx, vcpuid, vmexit);
2613 SDT_PROBE4(vmm, vmx, exit, interrupt,
2614 vmx, vcpuid, vmexit, intr_info);
2634 SDT_PROBE3(vmm, vmx, exit, nmiwindow, vmx, vcpuid, vmexit);
2662 SDT_PROBE3(vmm, vmx, exit, inout, vmx, vcpuid, vmexit);
2666 SDT_PROBE3(vmm, vmx, exit, cpuid, vmx, vcpuid, vmexit);
2743 SDT_PROBE5(vmm, vmx, exit, exception,
2744 vmx, vcpuid, vmexit, intr_vec, errcode);
2765 SDT_PROBE5(vmm, vmx, exit, nestedfault,
2766 vmx, vcpuid, vmexit, gpa, qual);
2770 SDT_PROBE4(vmm, vmx, exit, mmiofault,
2771 vmx, vcpuid, vmexit, gpa);
2788 SDT_PROBE3(vmm, vmx, exit, eoi, vmx, vcpuid, vmexit);
2792 SDT_PROBE3(vmm, vmx, exit, apicaccess, vmx, vcpuid, vmexit);
2802 SDT_PROBE4(vmm, vmx, exit, apicwrite,
2803 vmx, vcpuid, vmexit, vlapic);
2807 SDT_PROBE3(vmm, vmx, exit, xsetbv, vmx, vcpuid, vmexit);
2808 handled = vmx_emulate_xsetbv(vmx, vcpu, vmexit);
2811 SDT_PROBE3(vmm, vmx, exit, monitor, vmx, vcpuid, vmexit);
2815 SDT_PROBE3(vmm, vmx, exit, mwait, vmx, vcpuid, vmexit);
2834 SDT_PROBE3(vmm, vmx, exit, vminsn, vmx, vcpuid, vmexit);
2843 SDT_PROBE4(vmm, vmx, exit, unknown,
2844 vmx, vcpuid, vmexit, reason);
2870 vmexit->u.vmx.status = VM_SUCCESS;
2871 vmexit->u.vmx.inst_type = 0;
2872 vmexit->u.vmx.inst_error = 0;
2881 SDT_PROBE4(vmm, vmx, exit, return,
2882 vmx, vcpuid, vmexit, handled);
2896 vmexit->u.vmx.status = vmxctx->inst_fail_status;
2897 vmexit->u.vmx.inst_error = vmcs_instruction_error();
2898 vmexit->u.vmx.exit_reason = ~0;
2899 vmexit->u.vmx.exit_qualification = ~0;
2904 vmexit->u.vmx.inst_type = rc;
2926 if (vmexit->u.vmx.exit_reason != EXIT_REASON_EXCEPTION)
3009 vmx_pmap_activate(struct vmx *vmx, pmap_t pmap)
3019 if (eptgen != vmx->eptgen[cpu]) {
3020 vmx->eptgen[cpu] = eptgen;
3022 (struct invept_desc){ .eptp = vmx->eptp, ._res = 0 });
3027 vmx_pmap_deactivate(struct vmx *vmx, pmap_t pmap)
3037 struct vmx *vmx;
3048 vmx = vcpu->vmx;
3073 vmx_set_pcpu_defaults(vmx, vcpu, pmap);
3178 vmx_msr_guest_enter_tsc_aux(vmx, vcpu);
3186 vmx_pmap_activate(vmx, pmap);
3189 rc = vmx_enter_guest(vmxctx, vmx, launched);
3191 vmx_pmap_deactivate(vmx, pmap);
3193 vmx_msr_guest_exit_tsc_aux(vmx, vcpu);
3202 vmexit->u.vmx.exit_reason = exit_reason = vmcs_exit_reason();
3203 vmexit->u.vmx.exit_qualification = vmcs_exit_qualification();
3211 handled = vmx_exit_process(vmx, vcpu, vmexit);
3255 struct vmx *vmx = vmi;
3258 vm_unmap_mmio(vmx->vm, DEFAULT_APIC_BASE, PAGE_SIZE);
3260 free(vmx->msr_bitmap, M_VMX);
3261 free(vmx, M_VMX);
3409 struct vmx *vmx = vcpu->vmx;
3413 panic("vmx_getreg: %s%d is running", vm_name(vmx->vm),
3440 struct vmx *vmx = vcpu->vmx;
3444 panic("vmx_setreg: %s%d is running", vm_name(vmx->vm),
3495 vmx_invvpid(vmx, vcpu, pmap, running);
3507 struct vmx *vmx = vcpu->vmx;
3511 panic("vmx_getdesc: %s%d is running", vm_name(vmx->vm),
3522 struct vmx *vmx = vcpu->vmx;
3526 panic("vmx_setdesc: %s%d is running", vm_name(vmx->vm),
3945 struct vmx *vmx;
3953 vmx = vcpu->vmx;
3973 error = vm_unmap_mmio(vmx->vm, DEFAULT_APIC_BASE, PAGE_SIZE);
3981 error = vmx_allow_x2apic_msrs(vmx);
4091 struct vmx *vmx;
4097 vmx = vcpu->vmx;
4100 vlapic->vm = vmx->vm;
4142 struct vmx *vmx;
4149 vmx = vcpu->vmx;
4154 printf("%s: %s%d is running", __func__, vm_name(vmx->vm),
4255 struct vmx *vmx;
4258 vmx = vcpu->vmx;
4263 printf("%s: %s%d is running", __func__, vm_name(vmx->vm),