VirtualBox

Changeset 15033 in vbox for trunk


Ignore:
Timestamp:
Dec 5, 2008 12:16:07 PM (16 years ago)
Author:
vboxsync
Message:

Push VMCS addresses

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMR0/HWVMXR0.cpp

    r15031 r15033  
    34373437DECLASM(int) VMXR0SwitcherStartVM64(RTHCUINT fResume, PCPUMCTX pCtx, PVM pVM, PVMCPU pVCpu)
    34383438{
    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;
    34403486}
    34413487
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette