VirtualBox

Ignore:
Timestamp:
May 6, 2009 7:20:18 PM (16 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
46985
Message:

VMM++: More on poking. Fixed broken R0 stats (wrong way of calling into VMMR0), use NIL_VMCPUID instead of 0 to VMMR0EntryEx when it is supposed to be irrellevant. Use VMCPUID. Allow for and check NIL_VMCPUID. Fixed a few missing/wrong idCpu checks (paranoia mostly).

File:
1 edited

Legend:

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

    r19381 r19454  
    10481048 * @thread  The creator thread / EMT.
    10491049 */
    1050 GMMR0DECL(int) GMMR0InitialReservation(PVM pVM, unsigned idCpu, uint64_t cBasePages, uint32_t cShadowPages, uint32_t cFixedPages,
     1050GMMR0DECL(int) GMMR0InitialReservation(PVM pVM, VMCPUID idCpu, uint64_t cBasePages, uint32_t cShadowPages, uint32_t cFixedPages,
    10511051                                       GMMOCPOLICY enmPolicy, GMMPRIORITY enmPriority)
    10521052{
     
    10591059    PGMM pGMM;
    10601060    GMM_GET_VALID_INSTANCE(pGMM, VERR_INTERNAL_ERROR);
    1061     PGVM pGVM = GVMMR0ByVM(pVM);
    1062     if (RT_UNLIKELY(!pGVM))
    1063         return VERR_INVALID_PARAMETER;
    1064     if (RT_UNLIKELY(pGVM->aCpus[idCpu].hEMT != RTThreadNativeSelf()))
    1065         return VERR_NOT_OWNER;
     1061    PGVM pGVM;
     1062    int rc = GVMMR0ByVMAndEMT(pVM, idCpu, &pGVM);
     1063    if (RT_FAILURE(rc))
     1064        return rc;
    10661065
    10671066    AssertReturn(cBasePages, VERR_INVALID_PARAMETER);
     
    10711070    AssertReturn(enmPriority > GMMPRIORITY_INVALID && enmPriority < GMMPRIORITY_END, VERR_INVALID_PARAMETER);
    10721071
    1073     int rc = RTSemFastMutexRequest(pGMM->Mtx);
     1072    rc = RTSemFastMutexRequest(pGMM->Mtx);
    10741073    AssertRC(rc);
    10751074
     
    11151114 * @param   pReq            The request packet.
    11161115 */
    1117 GMMR0DECL(int) GMMR0InitialReservationReq(PVM pVM, unsigned idCpu, PGMMINITIALRESERVATIONREQ pReq)
     1116GMMR0DECL(int) GMMR0InitialReservationReq(PVM pVM, VMCPUID idCpu, PGMMINITIALRESERVATIONREQ pReq)
    11181117{
    11191118    /*
     
    11441143 * @thread  EMT.
    11451144 */
    1146 GMMR0DECL(int) GMMR0UpdateReservation(PVM pVM, unsigned idCpu, uint64_t cBasePages, uint32_t cShadowPages, uint32_t cFixedPages)
     1145GMMR0DECL(int) GMMR0UpdateReservation(PVM pVM, VMCPUID idCpu, uint64_t cBasePages, uint32_t cShadowPages, uint32_t cFixedPages)
    11471146{
    11481147    LogFlow(("GMMR0UpdateReservation: pVM=%p cBasePages=%#llx cShadowPages=%#x cFixedPages=%#x\n",
     
    11541153    PGMM pGMM;
    11551154    GMM_GET_VALID_INSTANCE(pGMM, VERR_INTERNAL_ERROR);
    1156     PGVM pGVM = GVMMR0ByVM(pVM);
    1157     if (RT_UNLIKELY(!pGVM))
    1158         return VERR_INVALID_PARAMETER;
    1159     if (RT_UNLIKELY(pGVM->aCpus[idCpu].hEMT != RTThreadNativeSelf()))
    1160         return VERR_NOT_OWNER;
     1155    PGVM pGVM;
     1156    int rc = GVMMR0ByVMAndEMT(pVM, idCpu, &pGVM);
     1157    if (RT_FAILURE(rc))
     1158        return rc;
    11611159
    11621160    AssertReturn(cBasePages, VERR_INVALID_PARAMETER);
     
    11641162    AssertReturn(cFixedPages, VERR_INVALID_PARAMETER);
    11651163
    1166     int rc = RTSemFastMutexRequest(pGMM->Mtx);
     1164    rc = RTSemFastMutexRequest(pGMM->Mtx);
    11671165    AssertRC(rc);
    11681166
     
    12071205 * @param   pReq            The request packet.
    12081206 */
    1209 GMMR0DECL(int) GMMR0UpdateReservationReq(PVM pVM, unsigned idCpu, PGMMUPDATERESERVATIONREQ pReq)
     1207GMMR0DECL(int) GMMR0UpdateReservationReq(PVM pVM, VMCPUID idCpu, PGMMUPDATERESERVATIONREQ pReq)
    12101208{
    12111209    /*
     
    18511849 * @thread  EMT.
    18521850 */
    1853 GMMR0DECL(int) GMMR0AllocateHandyPages(PVM pVM, unsigned idCpu, uint32_t cPagesToUpdate, uint32_t cPagesToAlloc, PGMMPAGEDESC paPages)
     1851GMMR0DECL(int) GMMR0AllocateHandyPages(PVM pVM, VMCPUID idCpu, uint32_t cPagesToUpdate, uint32_t cPagesToAlloc, PGMMPAGEDESC paPages)
    18541852{
    18551853    LogFlow(("GMMR0AllocateHandyPages: pVM=%p cPagesToUpdate=%#x cPagesToAlloc=%#x paPages=%p\n",
     
    18621860    PGMM pGMM;
    18631861    GMM_GET_VALID_INSTANCE(pGMM, VERR_INTERNAL_ERROR);
    1864     PGVM pGVM = GVMMR0ByVM(pVM);
    1865     if (RT_UNLIKELY(!pGVM))
    1866         return VERR_INVALID_PARAMETER;
    1867     if (RT_UNLIKELY(pGVM->aCpus[idCpu].hEMT != RTThreadNativeSelf()))
    1868         return VERR_NOT_OWNER;
     1862    PGVM pGVM;
     1863    int rc = GVMMR0ByVMAndEMT(pVM, idCpu, &pGVM);
     1864    if (RT_FAILURE(rc))
     1865        return rc;
    18691866
    18701867    AssertPtrReturn(paPages, VERR_INVALID_PARAMETER);
     
    18981895    }
    18991896
    1900     int rc = RTSemFastMutexRequest(pGMM->Mtx);
     1897    rc = RTSemFastMutexRequest(pGMM->Mtx);
    19011898    AssertRC(rc);
    19021899
     
    20342031 * @thread  EMT.
    20352032 */
    2036 GMMR0DECL(int) GMMR0AllocatePages(PVM pVM, unsigned idCpu, uint32_t cPages, PGMMPAGEDESC paPages, GMMACCOUNT enmAccount)
     2033GMMR0DECL(int) GMMR0AllocatePages(PVM pVM, VMCPUID idCpu, uint32_t cPages, PGMMPAGEDESC paPages, GMMACCOUNT enmAccount)
    20372034{
    20382035    LogFlow(("GMMR0AllocatePages: pVM=%p cPages=%#x paPages=%p enmAccount=%d\n", pVM, cPages, paPages, enmAccount));
     
    20432040    PGMM pGMM;
    20442041    GMM_GET_VALID_INSTANCE(pGMM, VERR_INTERNAL_ERROR);
    2045     PGVM pGVM = GVMMR0ByVM(pVM);
    2046     if (RT_UNLIKELY(!pGVM))
    2047         return VERR_INVALID_PARAMETER;
    2048     if (RT_UNLIKELY(pGVM->aCpus[idCpu].hEMT != RTThreadNativeSelf()))
    2049         return VERR_NOT_OWNER;
     2042    PGVM pGVM;
     2043    int rc = GVMMR0ByVMAndEMT(pVM, idCpu, &pGVM);
     2044    if (RT_FAILURE(rc))
     2045        return rc;
    20502046
    20512047    AssertPtrReturn(paPages, VERR_INVALID_PARAMETER);
     
    20662062    }
    20672063
    2068     int rc = RTSemFastMutexRequest(pGMM->Mtx);
     2064    rc = RTSemFastMutexRequest(pGMM->Mtx);
    20692065    AssertRC(rc);
    20702066
     
    21042100 * @param   pReq            The request packet.
    21052101 */
    2106 GMMR0DECL(int) GMMR0AllocatePagesReq(PVM pVM, unsigned idCpu, PGMMALLOCATEPAGESREQ pReq)
     2102GMMR0DECL(int) GMMR0AllocatePagesReq(PVM pVM, VMCPUID idCpu, PGMMALLOCATEPAGESREQ pReq)
    21072103{
    21082104    /*
     
    24302426 * @thread  EMT.
    24312427 */
    2432 GMMR0DECL(int) GMMR0FreePages(PVM pVM, unsigned idCpu, uint32_t cPages, PGMMFREEPAGEDESC paPages, GMMACCOUNT enmAccount)
     2428GMMR0DECL(int) GMMR0FreePages(PVM pVM, VMCPUID idCpu, uint32_t cPages, PGMMFREEPAGEDESC paPages, GMMACCOUNT enmAccount)
    24332429{
    24342430    LogFlow(("GMMR0FreePages: pVM=%p cPages=%#x paPages=%p enmAccount=%d\n", pVM, cPages, paPages, enmAccount));
     
    24392435    PGMM pGMM;
    24402436    GMM_GET_VALID_INSTANCE(pGMM, VERR_INTERNAL_ERROR);
    2441     PGVM pGVM = GVMMR0ByVM(pVM);
    2442     if (RT_UNLIKELY(!pGVM))
    2443         return VERR_INVALID_PARAMETER;
    2444     if (RT_UNLIKELY(pGVM->aCpus[idCpu].hEMT != RTThreadNativeSelf()))
    2445         return VERR_NOT_OWNER;
     2437    PGVM pGVM;
     2438    int rc = GVMMR0ByVMAndEMT(pVM, idCpu, &pGVM);
     2439    if (RT_FAILURE(rc))
     2440        return rc;
    24462441
    24472442    AssertPtrReturn(paPages, VERR_INVALID_PARAMETER);
     
    24572452     * Take the semaphore and call the worker function.
    24582453     */
    2459     int rc = RTSemFastMutexRequest(pGMM->Mtx);
     2454    rc = RTSemFastMutexRequest(pGMM->Mtx);
    24602455    AssertRC(rc);
    24612456
     
    24762471 * @param   pReq            The request packet.
    24772472 */
    2478 GMMR0DECL(int) GMMR0FreePagesReq(PVM pVM, unsigned idCpu, PGMMFREEPAGESREQ pReq)
     2473GMMR0DECL(int) GMMR0FreePagesReq(PVM pVM, VMCPUID idCpu, PGMMFREEPAGESREQ pReq)
    24792474{
    24802475    /*
     
    25182513 * @thread  EMT.
    25192514 */
    2520 GMMR0DECL(int) GMMR0BalloonedPages(PVM pVM, unsigned idCpu, uint32_t cBalloonedPages, uint32_t cPagesToFree, PGMMFREEPAGEDESC paPages, bool fCompleted)
     2515GMMR0DECL(int) GMMR0BalloonedPages(PVM pVM, VMCPUID idCpu, uint32_t cBalloonedPages, uint32_t cPagesToFree, PGMMFREEPAGEDESC paPages, bool fCompleted)
    25212516{
    25222517    LogFlow(("GMMR0BalloonedPages: pVM=%p cBalloonedPages=%#x cPagestoFree=%#x paPages=%p enmAccount=%d fCompleted=%RTbool\n",
     
    25282523    PGMM pGMM;
    25292524    GMM_GET_VALID_INSTANCE(pGMM, VERR_INTERNAL_ERROR);
    2530     PGVM pGVM = GVMMR0ByVM(pVM);
    2531     if (RT_UNLIKELY(!pGVM))
    2532         return VERR_INVALID_PARAMETER;
    2533     if (RT_UNLIKELY(pGVM->aCpus[idCpu].hEMT != RTThreadNativeSelf()))
    2534         return VERR_NOT_OWNER;
     2525    PGVM pGVM;
     2526    int rc = GVMMR0ByVMAndEMT(pVM, idCpu, &pGVM);
     2527    if (RT_FAILURE(rc))
     2528        return rc;
    25352529
    25362530    AssertPtrReturn(paPages, VERR_INVALID_PARAMETER);
     
    25462540     * Take the sempahore and do some more validations.
    25472541     */
    2548     int rc = RTSemFastMutexRequest(pGMM->Mtx);
     2542    rc = RTSemFastMutexRequest(pGMM->Mtx);
    25492543    AssertRC(rc);
    25502544    if (pGVM->gmm.s.Allocated.cBasePages >= cPagesToFree)
     
    26042598 * @param   pReq            The request packet.
    26052599 */
    2606 GMMR0DECL(int) GMMR0BalloonedPagesReq(PVM pVM, unsigned idCpu, PGMMBALLOONEDPAGESREQ pReq)
     2600GMMR0DECL(int) GMMR0BalloonedPagesReq(PVM pVM, VMCPUID idCpu, PGMMBALLOONEDPAGESREQ pReq)
    26072601{
    26082602    /*
     
    26332627 * @thread  EMT.
    26342628 */
    2635 GMMR0DECL(int) GMMR0DeflatedBalloon(PVM pVM, unsigned idCpu, uint32_t cPages)
     2629GMMR0DECL(int) GMMR0DeflatedBalloon(PVM pVM, VMCPUID idCpu, uint32_t cPages)
    26362630{
    26372631    LogFlow(("GMMR0DeflatedBalloon: pVM=%p cPages=%#x\n", pVM, cPages));
     
    26422636    PGMM pGMM;
    26432637    GMM_GET_VALID_INSTANCE(pGMM, VERR_INTERNAL_ERROR);
    2644     PGVM pGVM = GVMMR0ByVM(pVM);
    2645     if (RT_UNLIKELY(!pGVM))
    2646         return VERR_INVALID_PARAMETER;
    2647     if (RT_UNLIKELY(pGVM->aCpus[idCpu].hEMT != RTThreadNativeSelf()))
    2648         return VERR_NOT_OWNER;
     2638    PGVM pGVM;
     2639    int rc = GVMMR0ByVMAndEMT(pVM, idCpu, &pGVM);
     2640    if (RT_FAILURE(rc))
     2641        return rc;
    26492642
    26502643    AssertMsgReturn(cPages < RT_BIT(32 - PAGE_SHIFT), ("%#x\n", cPages), VERR_INVALID_PARAMETER);
     
    26532646     * Take the sempahore and do some more validations.
    26542647     */
    2655     int rc = RTSemFastMutexRequest(pGMM->Mtx);
     2648    rc = RTSemFastMutexRequest(pGMM->Mtx);
    26562649    AssertRC(rc);
    26572650
     
    28242817 * @thread  EMT
    28252818 */
    2826 GMMR0DECL(int) GMMR0MapUnmapChunk(PVM pVM, unsigned idCpu, uint32_t idChunkMap, uint32_t idChunkUnmap, PRTR3PTR ppvR3)
     2819GMMR0DECL(int) GMMR0MapUnmapChunk(PVM pVM, VMCPUID idCpu, uint32_t idChunkMap, uint32_t idChunkUnmap, PRTR3PTR ppvR3)
    28272820{
    28282821    LogFlow(("GMMR0MapUnmapChunk: pVM=%p idChunkMap=%#x idChunkUnmap=%#x ppvR3=%p\n",
     
    28342827    PGMM pGMM;
    28352828    GMM_GET_VALID_INSTANCE(pGMM, VERR_INTERNAL_ERROR);
    2836     PGVM pGVM = GVMMR0ByVM(pVM);
    2837     if (RT_UNLIKELY(!pGVM))
    2838         return VERR_INVALID_PARAMETER;
    2839     if (RT_UNLIKELY(pGVM->aCpus[idCpu].hEMT != RTThreadNativeSelf()))
    2840         return VERR_NOT_OWNER;
     2829    PGVM pGVM;
     2830    int rc = GVMMR0ByVMAndEMT(pVM, idCpu, &pGVM);
     2831    if (RT_FAILURE(rc))
     2832        return rc;
    28412833
    28422834    AssertCompile(NIL_GMM_CHUNKID == 0);
     
    28622854     * it it's limits, so, no problem here.
    28632855     */
    2864     int rc = RTSemFastMutexRequest(pGMM->Mtx);
     2856    rc = RTSemFastMutexRequest(pGMM->Mtx);
    28652857    AssertRC(rc);
    28662858
     
    29092901 * @param   pReq            The request packet.
    29102902 */
    2911 GMMR0DECL(int)  GMMR0MapUnmapChunkReq(PVM pVM, unsigned idCpu, PGMMMAPUNMAPCHUNKREQ pReq)
     2903GMMR0DECL(int)  GMMR0MapUnmapChunkReq(PVM pVM, VMCPUID idCpu, PGMMMAPUNMAPCHUNKREQ pReq)
    29122904{
    29132905    /*
     
    29332925 * @param   pvR3            Pointer to the chunk size memory block to lock down.
    29342926 */
    2935 GMMR0DECL(int) GMMR0SeedChunk(PVM pVM, unsigned idCpu, RTR3PTR pvR3)
     2927GMMR0DECL(int) GMMR0SeedChunk(PVM pVM, VMCPUID idCpu, RTR3PTR pvR3)
    29362928{
    29372929    /*
     
    29402932    PGMM pGMM;
    29412933    GMM_GET_VALID_INSTANCE(pGMM, VERR_INTERNAL_ERROR);
    2942     PGVM pGVM = GVMMR0ByVM(pVM);
    2943     if (RT_UNLIKELY(!pGVM))
    2944         return VERR_INVALID_PARAMETER;
    2945     if (RT_UNLIKELY(pGVM->aCpus[idCpu].hEMT != RTThreadNativeSelf()))
    2946         return VERR_NOT_OWNER;
     2934    PGVM pGVM;
     2935    int rc = GVMMR0ByVMAndEMT(pVM, idCpu, &pGVM);
     2936    if (RT_FAILURE(rc))
     2937        return rc;
    29472938
    29482939    AssertPtrReturn(pvR3, VERR_INVALID_POINTER);
     
    29592950     */
    29602951    RTR0MEMOBJ MemObj;
    2961     int rc = RTR0MemObjLockUser(&MemObj, pvR3, GMM_CHUNK_SIZE, NIL_RTR0PROCESS);
     2952    rc = RTR0MemObjLockUser(&MemObj, pvR3, GMM_CHUNK_SIZE, NIL_RTR0PROCESS);
    29622953    if (RT_SUCCESS(rc))
    29632954    {
Note: See TracChangeset for help on using the changeset viewer.

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