VirtualBox

Changeset 68011 in vbox


Ignore:
Timestamp:
Jul 17, 2017 5:34:33 PM (8 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
117023
Message:

GVMMR0,VMMR0: More cleanups.

Location:
trunk
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/include/VBox/vmm/gvmm.h

    r68009 r68011  
    160160
    161161GVMMR0DECL(int)     GVMMR0CreateVM(PSUPDRVSESSION pSession, uint32_t cCpus, PVM *ppVM);
    162 GVMMR0DECL(int)     GVMMR0InitVM(PVM pVM);
    163 GVMMR0DECL(void)    GVMMR0DoneInitVM(PVM pVM);
    164 GVMMR0DECL(bool)    GVMMR0DoingTermVM(PVM pVM, PGVM pGVM);
     162GVMMR0DECL(int)     GVMMR0InitVM(PGVM pGVM);
     163GVMMR0DECL(void)    GVMMR0DoneInitVM(PGVM pGVM);
     164GVMMR0DECL(bool)    GVMMR0DoingTermVM(PGVM pGVM);
    165165GVMMR0DECL(int)     GVMMR0DestroyVM(PGVM pGVM, PVM pVM);
    166166GVMMR0DECL(int)     GVMMR0RegisterVCpu(PGVM pGVM, PVM pVM, VMCPUID idCpu);
  • trunk/include/VBox/vmm/vmm.h

    r67983 r68011  
    523523VMMR0DECL(int)       VMMR0EntryEx(PGVM pGVM, PVM pVM, VMCPUID idCpu, VMMR0OPERATION enmOperation,
    524524                                  PSUPVMMR0REQHDR pReq, uint64_t u64Arg, PSUPDRVSESSION);
    525 VMMR0_INT_DECL(int)  VMMR0TermVM(PVM pVM, PGVM pGVM);
     525VMMR0_INT_DECL(int)  VMMR0TermVM(PGVM pGVM, PVM pVM, VMCPUID idCpu);
    526526VMMR0_INT_DECL(bool) VMMR0IsLongJumpArmed(PVMCPU pVCpu);
    527527VMMR0_INT_DECL(bool) VMMR0IsInRing3LongJump(PVMCPU pVCpu);
  • trunk/src/VBox/VMM/VMMR0/GVMMR0.cpp

    r68009 r68011  
    359359static void gvmmR0InitPerVMData(PGVM pGVM);
    360360static DECLCALLBACK(void) gvmmR0HandleObjDestructor(void *pvObj, void *pvGVMM, void *pvHandle);
    361 static int gvmmR0ByVM(PVM pVM, PGVM *ppGVM, PGVMM *ppGVMM, bool fTakeUsedLock);
    362 static int gvmmR0ByVMAndEMT(PVM pVM, VMCPUID idCpu, PGVM *ppGVM, PGVMM *ppGVMM);
    363361static int gvmmR0ByGVMandVM(PGVM pGVM, PVM pVM, PGVMM *ppGVMM, bool fTakeUsedLock);
    364362static int gvmmR0ByGVMandVMandEMT(PGVM pGVM, PVM pVM, VMCPUID idCpu, PGVMM *ppGVMM);
     
    10701068 *
    10711069 * @returns VBox status code.
    1072  * @param   pVM         The cross context VM structure.
    1073  */
    1074 GVMMR0DECL(int) GVMMR0InitVM(PVM pVM)
    1075 {
    1076     LogFlow(("GVMMR0InitVM: pVM=%p\n", pVM));
    1077 
    1078     /*
    1079      * Validate the VM structure, state and handle.
    1080      */
    1081     PGVM pGVM;
    1082     PGVMM pGVMM;
    1083     int rc = gvmmR0ByVMAndEMT(pVM, 0 /* idCpu */, &pGVM, &pGVMM);
    1084     if (RT_SUCCESS(rc))
    1085     {
    1086         if (   !pGVM->gvmm.s.fDoneVMMR0Init
    1087             && pGVM->aCpus[0].gvmm.s.HaltEventMulti == NIL_RTSEMEVENTMULTI)
    1088         {
    1089             for (VMCPUID i = 0; i < pGVM->cCpus; i++)
     1070 * @param   pGVM        The global (ring-0) VM structure.
     1071 */
     1072GVMMR0DECL(int) GVMMR0InitVM(PGVM pGVM)
     1073{
     1074    LogFlow(("GVMMR0InitVM: pGVM=%p\n", pGVM));
     1075
     1076    int rc = VERR_INTERNAL_ERROR_3;
     1077    if (   !pGVM->gvmm.s.fDoneVMMR0Init
     1078        && pGVM->aCpus[0].gvmm.s.HaltEventMulti == NIL_RTSEMEVENTMULTI)
     1079    {
     1080        for (VMCPUID i = 0; i < pGVM->cCpus; i++)
     1081        {
     1082            rc = RTSemEventMultiCreate(&pGVM->aCpus[i].gvmm.s.HaltEventMulti);
     1083            if (RT_FAILURE(rc))
    10901084            {
    1091                 rc = RTSemEventMultiCreate(&pGVM->aCpus[i].gvmm.s.HaltEventMulti);
    1092                 if (RT_FAILURE(rc))
    1093                 {
    1094                     pGVM->aCpus[i].gvmm.s.HaltEventMulti = NIL_RTSEMEVENTMULTI;
    1095                     break;
    1096                 }
     1085                pGVM->aCpus[i].gvmm.s.HaltEventMulti = NIL_RTSEMEVENTMULTI;
     1086                break;
    10971087            }
    10981088        }
    1099         else
    1100             rc = VERR_WRONG_ORDER;
    1101     }
     1089    }
     1090    else
     1091        rc = VERR_WRONG_ORDER;
    11021092
    11031093    LogFlow(("GVMMR0InitVM: returns %Rrc\n", rc));
     
    11101100 * of the VM.
    11111101 *
    1112  * @param   pVM         The cross context VM structure.
     1102 * @param   pGVM        The global (ring-0) VM structure.
    11131103 * @thread  EMT(0)
    11141104 */
    1115 GVMMR0DECL(void) GVMMR0DoneInitVM(PVM pVM)
    1116 {
    1117     /* Validate the VM structure, state and handle. */
    1118     PGVM pGVM;
    1119     PGVMM pGVMM;
    1120     int rc = gvmmR0ByVMAndEMT(pVM, 0 /* idCpu */, &pGVM, &pGVMM);
    1121     AssertRCReturnVoid(rc);
    1122 
     1105GVMMR0DECL(void) GVMMR0DoneInitVM(PGVM pGVM)
     1106{
    11231107    /* Set the indicator. */
    11241108    pGVM->gvmm.s.fDoneVMMR0Init = true;
     
    11301114 *
    11311115 * @returns true if termination hasn't been done already, false if it has.
    1132  * @param   pVM         The cross context VM structure.
    11331116 * @param   pGVM        Pointer to the global VM structure. Optional.
    1134  * @thread  EMT(0)
    1135  */
    1136 GVMMR0DECL(bool) GVMMR0DoingTermVM(PVM pVM, PGVM pGVM)
     1117 * @thread  EMT(0) or session cleanup thread.
     1118 */
     1119GVMMR0DECL(bool) GVMMR0DoingTermVM(PGVM pGVM)
    11371120{
    11381121    /* Validate the VM structure, state and handle. */
    1139     AssertPtrNullReturn(pGVM, false);
    1140     AssertReturn(!pGVM || pGVM->u32Magic == GVM_MAGIC, false);
    1141     if (!pGVM)
    1142     {
    1143         PGVMM pGVMM;
    1144         int rc = gvmmR0ByVMAndEMT(pVM, 0 /* idCpu */, &pGVM, &pGVMM);
    1145         AssertRCReturn(rc, false);
    1146     }
     1122    AssertPtrReturn(pGVM, false);
    11471123
    11481124    /* Set the indicator. */
     
    12601236        {
    12611237            LogFlow(("gvmmR0CleanupVM: Calling VMMR0TermVM\n"));
    1262             VMMR0TermVM(pGVM->pVM, pGVM);
     1238            VMMR0TermVM(pGVM, pGVM->pVM, NIL_RTCPUID);
    12631239        }
    12641240        else
     
    17631739    PGVMM pGVMM;
    17641740    return gvmmR0ByVM(pVM, ppGVM, &pGVMM, false /* fTakeUsedLock */);
    1765 }
    1766 
    1767 
    1768 /**
    1769  * Lookup a GVM structure by the shared VM structure and ensuring that the
    1770  * caller is an EMT thread.
    1771  *
    1772  * @returns VBox status code.
    1773  * @param   pVM         The cross context VM structure.
    1774  * @param   idCpu       The Virtual CPU ID of the calling EMT.
    1775  * @param   ppGVM       Where to store the GVM pointer.
    1776  * @param   ppGVMM      Where to store the pointer to the GVMM instance data.
    1777  * @thread  EMT
    1778  *
    1779  * @remarks This will assert in all failure paths.
    1780  */
    1781 static int gvmmR0ByVMAndEMT(PVM pVM, VMCPUID idCpu, PGVM *ppGVM, PGVMM *ppGVMM)
    1782 {
    1783     PGVMM pGVMM;
    1784     GVMM_GET_VALID_INSTANCE(pGVMM, VERR_GVMM_INSTANCE);
    1785 
    1786     /*
    1787      * Validate.
    1788      */
    1789     AssertPtrReturn(pVM, VERR_INVALID_POINTER);
    1790     AssertReturn(!((uintptr_t)pVM & PAGE_OFFSET_MASK), VERR_INVALID_POINTER);
    1791 
    1792     uint16_t hGVM = pVM->hSelf;
    1793     AssertReturn(hGVM != NIL_GVM_HANDLE, VERR_INVALID_HANDLE);
    1794     AssertReturn(hGVM < RT_ELEMENTS(pGVMM->aHandles), VERR_INVALID_HANDLE);
    1795 
    1796     /*
    1797      * Look it up.
    1798      */
    1799     PGVMHANDLE pHandle = &pGVMM->aHandles[hGVM];
    1800     AssertReturn(pHandle->pVM == pVM, VERR_NOT_OWNER);
    1801     RTPROCESS ProcId = RTProcSelf();
    1802     AssertReturn(pHandle->ProcId == ProcId, VERR_NOT_OWNER);
    1803     AssertPtrReturn(pHandle->pvObj, VERR_NOT_OWNER);
    1804 
    1805     PGVM pGVM = pHandle->pGVM;
    1806     AssertPtrReturn(pGVM, VERR_NOT_OWNER);
    1807     AssertReturn(pGVM->pVM == pVM, VERR_NOT_OWNER);
    1808     RTNATIVETHREAD hAllegedEMT = RTThreadNativeSelf();
    1809     AssertReturn(idCpu < pGVM->cCpus, VERR_INVALID_CPU_ID);
    1810     AssertReturn(pGVM->aCpus[idCpu].hEMT == hAllegedEMT, VERR_NOT_OWNER);
    1811 
    1812     *ppGVM = pGVM;
    1813     *ppGVMM = pGVMM;
    1814     return VINF_SUCCESS;
    18151741}
    18161742
  • trunk/src/VBox/VMM/VMMR0/VMMR0.cpp

    r68009 r68011  
    349349 * @returns VBox status code.
    350350 *
     351 * @param   pGVM        The global (ring-0) VM structure.
    351352 * @param   pVM         The cross context VM structure.
    352353 * @param   uSvnRev     The SVN revision of the ring-3 part.
    353354 * @param   uBuildType  Build type indicator.
    354  * @thread  EMT.
    355  */
    356 static int vmmR0InitVM(PVM pVM, uint32_t uSvnRev, uint32_t uBuildType)
     355 * @thread  EMT(0)
     356 */
     357static int vmmR0InitVM(PGVM pGVM, PVM pVM, uint32_t uSvnRev, uint32_t uBuildType)
    357358{
    358359    VMM_CHECK_SMAP_SETUP();
     
    374375        return VERR_VMM_R0_VERSION_MISMATCH;
    375376    }
    376     if (    !VALID_PTR(pVM)
    377         ||  pVM->pVMR0 != pVM)
    378         return VERR_INVALID_PARAMETER;
     377
     378    int rc = GVMMR0ValidateGVMandVMandEMT(pGVM, pVM, 0 /*idCpu*/);
     379    if (RT_FAILURE(rc))
     380        return rc;
    379381
    380382
     
    435437     */
    436438    VMM_CHECK_SMAP_CHECK2(pVM, RT_NOTHING);
    437     int rc = GVMMR0InitVM(pVM);
     439    rc = GVMMR0InitVM(pGVM);
    438440//    if (RT_SUCCESS(rc))
    439441//        rc = GMMR0InitPerVMData(pVM);
     
    471473                            if (RT_SUCCESS(rc))
    472474                            {
    473                                 GVMMR0DoneInitVM(pVM);
     475                                GVMMR0DoneInitVM(pGVM);
    474476                                VMM_CHECK_SMAP_CHECK2(pVM, RT_NOTHING);
    475477                                return rc;
     
    503505 * @returns VBox status code.
    504506 *
     507 * @param   pGVM        The global (ring-0) VM structure.
    505508 * @param   pVM         The cross context VM structure.
    506  * @param   pGVM        Pointer to the global VM structure. Optional.
    507  * @thread  EMT or session clean up thread.
    508  */
    509 VMMR0_INT_DECL(int) VMMR0TermVM(PVM pVM, PGVM pGVM)
    510 {
     509 * @param   idCpu       Set to 0 if EMT(0) or NIL_VMCPUID if session cleanup
     510 *                      thread.
     511 * @thread  EMT(0) or session clean up thread.
     512 */
     513VMMR0_INT_DECL(int) VMMR0TermVM(PGVM pGVM, PVM pVM, VMCPUID idCpu)
     514{
     515    /*
     516     * Check EMT(0) claim if we're called from userland.
     517     */
     518    if (idCpu != NIL_VMCPUID)
     519    {
     520        AssertReturn(idCpu == 0, VERR_INVALID_CPU_ID);
     521        int rc = GVMMR0ValidateGVMandVMandEMT(pGVM, pVM, idCpu);
     522        if (RT_FAILURE(rc))
     523            return rc;
     524    }
     525
    511526#ifdef VBOX_WITH_PCI_PASSTHROUGH
    512527    PciRawR0TermVM(pVM);
     
    516531     * Tell GVMM what we're up to and check that we only do this once.
    517532     */
    518     if (GVMMR0DoingTermVM(pVM, pGVM))
     533    if (GVMMR0DoingTermVM(pGVM))
    519534    {
    520535        GIMR0TermVM(pVM);
     
    15071522         */
    15081523        case VMMR0_DO_VMMR0_INIT:
    1509             rc = vmmR0InitVM(pVM, RT_LODWORD(u64Arg), RT_HIDWORD(u64Arg));
     1524            rc = vmmR0InitVM(pGVM, pVM, RT_LODWORD(u64Arg), RT_HIDWORD(u64Arg));
    15101525            VMM_CHECK_SMAP_CHECK2(pVM, RT_NOTHING);
    15111526            break;
     
    15151530         */
    15161531        case VMMR0_DO_VMMR0_TERM:
    1517             rc = VMMR0TermVM(pVM, NULL);
     1532            rc = VMMR0TermVM(pGVM, pVM, 0 /*idCpu*/);
    15181533            VMM_CHECK_SMAP_CHECK2(pVM, RT_NOTHING);
    15191534            break;
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