- Timestamp:
- Dec 5, 2008 12:16:07 PM (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMR0/HWVMXR0.cpp
r15031 r15033 3437 3437 DECLASM(int) VMXR0SwitcherStartVM64(RTHCUINT fResume, PCPUMCTX pCtx, PVM pVM, PVMCPU pVCpu) 3438 3438 { 3439 return VMXR0Execute64BitsHandler(pVM, pVCpu, pCtx, pVM->hwaccm.s.pfnVMXGCStartVM64); 3439 int rc, rc2; 3440 RTCCUINTREG uFlags; 3441 PHWACCM_CPUINFO pCpu; 3442 RTHCPHYS pPageCpuPhys; 3443 3444 /* @todo This code is not guest SMP safe (hyper context) */ 3445 AssertReturn(pVM->cCPUs == 1, VERR_ACCESS_DENIED); 3446 AssertReturn(pVM->hwaccm.s.pfnHost32ToGuest64R0, VERR_INTERNAL_ERROR); 3447 3448 pCpu = HWACCMR0GetCurrentCpuEx(pVCpu->idCpu); 3449 pPageCpuPhys = RTR0MemObjGetPagePhysAddr(pCpu->pMemObj, 0); 3450 3451 /* Clear VM Control Structure. Marking it inactive, clearing implementation specific data and writing back VMCS data to memory. */ 3452 VMXClearVMCS(pVCpu->hwaccm.s.vmx.pVMCSPhys); 3453 3454 /* Leave VMX Root Mode. */ 3455 VMXDisable(); 3456 3457 uFlags = ASMIntDisableFlags(); 3458 3459 CPUMSetHyperESP(pVM, VMMGetStackRC(pVM)); 3460 CPUMPushHyper(pVM, (uint32_t)(pVCpu->hwaccm.s.vmx.pVMCSPhys >> 32)); /* Param 2: pVMCBHostPhys - Hi. */ 3461 CPUMPushHyper(pVM, (uint32_t)pVCpu->hwaccm.s.vmx.pVMCSPhys); /* Param 2: pVMCBHostPhys - Lo. */ 3462 CPUMPushHyper(pVM, (uint32_t)(pPageCpuPhys >> 32)); /* Param 1: pVMCBPhys - Hi. */ 3463 CPUMPushHyper(pVM, (uint32_t)pPageCpuPhys); /* Param 1: pVMCBPhys - Lo. */ 3464 CPUMSetHyperEIP(pVM, pVM->hwaccm.s.pfnVMXGCStartVM64); 3465 3466 /* Call switcher. */ 3467 rc = pVM->hwaccm.s.pfnHost32ToGuest64R0(pVM); 3468 3469 ASMSetFlags(uFlags); 3470 3471 /* Make sure the VMX instructions don't cause #UD faults. */ 3472 ASMSetCR4(ASMGetCR4() | X86_CR4_VMXE); 3473 3474 /* Enter VMX Root Mode */ 3475 rc2 = VMXEnable(pPageCpuPhys); 3476 if (RT_FAILURE(rc2)) 3477 { 3478 if (pVM) 3479 VMXR0CheckError(pVM, pVCpu, rc2); 3480 ASMSetCR4(ASMGetCR4() & ~X86_CR4_VMXE); 3481 return VERR_VMX_VMXON_FAILED; 3482 } 3483 3484 VMXActivateVMCS(pVCpu->hwaccm.s.vmx.pVMCSPhys); 3485 return rc; 3440 3486 } 3441 3487
Note:
See TracChangeset
for help on using the changeset viewer.