VirtualBox

Changeset 36891 in vbox


Ignore:
Timestamp:
Apr 29, 2011 1:22:57 PM (14 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
71469
Message:

PGM: Put a TLB in front of the RAM ranges to speed up lookup (disabled).

Location:
trunk
Files:
24 edited

Legend:

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

    r36557 r36891  
    465465VMMR3DECL(int)      PGMR3PhysGetRange(PVM pVM, uint32_t iRange, PRTGCPHYS pGCPhysStart, PRTGCPHYS pGCPhysLast,
    466466                                      const char **ppszDesc, bool *pfIsMmio);
    467 VMMR3DECL(int)      PGMR3QueryVMMMemoryStats(PVM pVM, uint64_t *puTotalAllocSize, uint64_t *puTotalFreeSize, uint64_t *puTotalBalloonSize, uint64_t *puTotalSharedSize);
    468 VMMR3DECL(int)      PGMR3QueryMemoryStats(PVM pVM, uint64_t *pulTotalMem, uint64_t *pulPrivateMem, uint64_t *puTotalSharedMem, uint64_t *puTotalZeroMem);
     467VMMR3DECL(int)      PGMR3QueryMemoryStats(PVM pVM, uint64_t *pcbTotalMem, uint64_t *pcbPrivateMem, uint64_t *pcbSharedMem, uint64_t *pcbZeroMem);
     468VMMR3DECL(int)      PGMR3QueryGlobalMemoryStats(PVM pVM, uint64_t *pcbAllocMem, uint64_t *pcbFreeMem, uint64_t *pcbBallonedMem, uint64_t *pcbSharedMem);
     469
    469470VMMR3DECL(int)      PGMR3PhysMMIORegister(PVM pVM, RTGCPHYS GCPhys, RTGCPHYS cb,
    470471                                          R3PTRTYPE(PFNPGMR3PHYSHANDLER) pfnHandlerR3, RTR3PTR pvUserR3,
  • trunk/src/VBox/Main/src-client/GuestImpl.cpp

    r36128 r36891  
    383383        uint64_t uFreeTotal, uAllocTotal, uBalloonedTotal, uSharedTotal;
    384384        *aMemFreeTotal = 0;
    385         int rc = PGMR3QueryVMMMemoryStats(pVM.raw(), &uAllocTotal, &uFreeTotal, &uBalloonedTotal, &uSharedTotal);
     385        int rc = PGMR3QueryGlobalMemoryStats(pVM.raw(), &uAllocTotal, &uFreeTotal, &uBalloonedTotal, &uSharedTotal);
    386386        AssertRC(rc);
    387387        if (rc == VINF_SUCCESS)
  • trunk/src/VBox/VMM/VMMAll/PGMAll.cpp

    r36196 r36891  
    734734     * Check for conflicts and pending CR3 monitoring updates.
    735735     */
    736     if (pgmMapAreMappingsFloating(&pVM->pgm.s))
     736    if (pgmMapAreMappingsFloating(pVM))
    737737    {
    738738        if (    pgmGetMapping(pVM, GCPtrPage)
     
    14441444    RTGCPHYS    GCPhysCR3 = pVCpu->pgm.s.GCPhysCR3 & X86_CR3_PAGE_MASK;
    14451445    PPGMPAGE    pPage;
    1446     int rc = pgmPhysGetPageEx(&pVM->pgm.s, GCPhysCR3, &pPage);
     1446    int rc = pgmPhysGetPageEx(pVM, GCPhysCR3, &pPage);
    14471447    if (RT_SUCCESS(rc))
    14481448    {
     
    14861486    RTGCPHYS    GCPhysCR3 = pVCpu->pgm.s.GCPhysCR3 & X86_CR3_PAE_PAGE_MASK;
    14871487    PPGMPAGE    pPage;
    1488     int rc = pgmPhysGetPageEx(&pVM->pgm.s, GCPhysCR3, &pPage);
     1488    int rc = pgmPhysGetPageEx(pVM, GCPhysCR3, &pPage);
    14891489    if (RT_SUCCESS(rc))
    14901490    {
     
    15341534
    15351535    PPGMPAGE        pPage;
    1536     int rc = pgmPhysGetPageEx(&pVM->pgm.s, GCPhys, &pPage);
     1536    int rc = pgmPhysGetPageEx(pVM, GCPhys, &pPage);
    15371537    if (RT_SUCCESS(rc))
    15381538    {
     
    15961596    RTGCPHYS    GCPhysCR3 = pVCpu->pgm.s.GCPhysCR3 & X86_CR3_AMD64_PAGE_MASK;
    15971597    PPGMPAGE    pPage;
    1598     int rc = pgmPhysGetPageEx(&pVM->pgm.s, GCPhysCR3, &pPage);
     1598    int rc = pgmPhysGetPageEx(pVM, GCPhysCR3, &pPage);
    15991599    if (RT_SUCCESS(rc))
    16001600    {
     
    18141814        if (RT_LIKELY(rc == VINF_SUCCESS))
    18151815        {
    1816             if (pgmMapAreMappingsFloating(&pVM->pgm.s))
     1816            if (pgmMapAreMappingsFloating(pVM))
    18171817                pVCpu->pgm.s.fSyncFlags &= ~PGM_SYNC_MONITOR_CR3;
    18181818        }
     
    18231823            pVCpu->pgm.s.GCPhysCR3 = GCPhysOldCR3;
    18241824            pVCpu->pgm.s.fSyncFlags |= PGM_SYNC_MAP_CR3;
    1825             if (pgmMapAreMappingsFloating(&pVM->pgm.s))
     1825            if (pgmMapAreMappingsFloating(pVM))
    18261826                pVCpu->pgm.s.fSyncFlags |= PGM_SYNC_MONITOR_CR3;
    18271827        }
     
    23622362     */
    23632363    int rc;
    2364     PPGMPAGE pPage = pgmPhysGetPage(&pVM->pgm.s, GCPhys);
     2364    PPGMPAGE pPage = pgmPhysGetPage(pVM, GCPhys);
    23652365    if (RT_LIKELY(pPage))
    23662366    {
  • trunk/src/VBox/VMM/VMMAll/PGMAllBth.h

    r36009 r36891  
    550550        PPGMPAGE pPage;
    551551#   if PGM_WITH_PAGING(PGM_GST_TYPE, PGM_SHW_TYPE)
    552         rc = pgmPhysGetPageEx(&pVM->pgm.s, GstWalk.Core.GCPhys, &pPage);
     552        rc = pgmPhysGetPageEx(pVM, GstWalk.Core.GCPhys, &pPage);
    553553        if (RT_SUCCESS(rc) && PGM_PAGE_HAS_ACTIVE_ALL_HANDLERS(pPage))
    554554            return VBOXSTRICTRC_TODO(PGM_BTH_NAME(Trap0eHandlerDoAccessHandlers)(pVCpu, uErr, pRegFrame, pvFault, pPage,
     
    556556        rc = PGM_BTH_NAME(SyncPage)(pVCpu, GstWalk.Pde, pvFault, 1, uErr);
    557557#   else
    558         rc = pgmPhysGetPageEx(&pVM->pgm.s, (RTGCPHYS)pvFault, &pPage);
     558        rc = pgmPhysGetPageEx(pVM, (RTGCPHYS)pvFault, &pPage);
    559559        if (RT_SUCCESS(rc) && PGM_PAGE_HAS_ACTIVE_ALL_HANDLERS(pPage))
    560560            return VBOXSTRICTRC_TODO(PGM_BTH_NAME(Trap0eHandlerDoAccessHandlers)(pVCpu, uErr, pRegFrame, pvFault, pPage,
     
    675675     * (BTW, it's impossible to have physical access handlers in a mapping.)
    676676     */
    677     if (pgmMapAreMappingsEnabled(&pVM->pgm.s))
     677    if (pgmMapAreMappingsEnabled(pVM))
    678678    {
    679679        PPGMMAPPING pMapping = pVM->pgm.s.CTX_SUFF(pMappings);
     
    687687                 * The first thing we check is if we've got an undetected conflict.
    688688                 */
    689                 if (pgmMapAreMappingsFloating(&pVM->pgm.s))
     689                if (pgmMapAreMappingsFloating(pVM))
    690690                {
    691691                    unsigned iPT = pMapping->cb >> GST_PD_SHIFT;
     
    751751#  endif /* PGM_WITH_PAGING(PGM_GST_TYPE, PGM_SHW_TYPE) */
    752752    PPGMPAGE pPage;
    753     rc = pgmPhysGetPageEx(&pVM->pgm.s, GCPhys, &pPage);
     753    rc = pgmPhysGetPageEx(pVM, GCPhys, &pPage);
    754754    if (RT_FAILURE(rc))
    755755    {
     
    12611261             * Conflict - Let SyncPT deal with it to avoid duplicate code.
    12621262             */
    1263             Assert(pgmMapAreMappingsEnabled(&pVM->pgm.s));
     1263            Assert(pgmMapAreMappingsEnabled(pVM));
    12641264            Assert(PGMGetGuestMode(pVCpu) <= PGMMODE_PAE);
    12651265            rc = PGM_BTH_NAME(SyncPT)(pVCpu, iPDSrc, pPDSrc, GCPtrPage);
     
    13731373        else
    13741374        {
    1375             Assert(pgmMapAreMappingsEnabled(&pVM->pgm.s));
     1375            Assert(pgmMapAreMappingsEnabled(pVM));
    13761376            STAM_COUNTER_INC(&pVCpu->pgm.s.CTX_SUFF(pStats)->CTX_MID_Z(Stat,InvalidatePagePDMappings));
    13771377        }
     
    14131413        pPool->cPresent--;
    14141414
    1415         PPGMPAGE pPhysPage = pgmPhysGetPage(&pVM->pgm.s, GCPhysPage);
     1415        PPGMPAGE pPhysPage = pgmPhysGetPage(pVM, GCPhysPage);
    14161416        AssertRelease(pPhysPage);
    14171417        pgmTrackDerefGCPhys(pPool, pShwPage, pPhysPage, iPte);
     
    14321432     * Find the guest address.
    14331433     */
    1434     for (PPGMRAMRANGE pRam = pVM->pgm.s.CTX_SUFF(pRamRanges);
     1434    for (PPGMRAMRANGE pRam = pVM->pgm.s.CTX_SUFF(pRamRangesX);
    14351435         pRam;
    14361436         pRam = pRam->CTX_SUFF(pNext))
     
    16251625         */
    16261626        PPGMPAGE pPage;
    1627         int rc = pgmPhysGetPageEx(&pVM->pgm.s, GCPhysPage, &pPage);
     1627        int rc = pgmPhysGetPageEx(pVM, GCPhysPage, &pPage);
    16281628        if (RT_SUCCESS(rc))
    16291629        {
     
    19831983                                    ||  iPTDst == ((GCPtrPage >> SHW_PT_SHIFT) & SHW_PT_MASK)   /* always sync GCPtrPage */
    19841984                                    ||  !CSAMDoesPageNeedScanning(pVM, GCPtrCurPage)
    1985                                     ||  (   (pPage = pgmPhysGetPage(&pVM->pgm.s, pPteSrc->u & GST_PTE_PG_MASK))
     1985                                    ||  (   (pPage = pgmPhysGetPage(pVM, pPteSrc->u & GST_PTE_PG_MASK))
    19861986                                         && PGM_PAGE_HAS_ACTIVE_HANDLERS(pPage))
    19871987                                   )
     
    20302030                /* Find ram range. */
    20312031                PPGMPAGE pPage;
    2032                 int rc = pgmPhysGetPageEx(&pVM->pgm.s, GCPhys, &pPage);
     2032                int rc = pgmPhysGetPageEx(pVM, GCPhys, &pPage);
    20332033                if (RT_SUCCESS(rc))
    20342034                {
     
    24422442                if (SHW_PTE_IS_TRACK_DIRTY(*pPteDst))
    24432443                {
    2444                     PPGMPAGE pPage  = pgmPhysGetPage(&pVM->pgm.s, GST_GET_PTE_GCPHYS(*pPteSrc));
     2444                    PPGMPAGE pPage  = pgmPhysGetPage(pVM, GST_GET_PTE_GCPHYS(*pPteSrc));
    24452445                    SHWPTE   PteDst = *pPteDst;
    24462446
     
    26132613    if (PdeDst.u & PGM_PDFLAGS_MAPPING)
    26142614    {
    2615         Assert(pgmMapAreMappingsEnabled(&pVM->pgm.s));
     2615        Assert(pgmMapAreMappingsEnabled(pVM));
    26162616#  ifndef IN_RING3
    26172617        Log(("SyncPT: Conflict at %RGv\n", GCPtrPage));
     
    28172817                        if (    ((PdeSrc.u & pPTSrc->a[iPTSrc].u) & (X86_PTE_RW | X86_PTE_US))
    28182818                            ||  !CSAMDoesPageNeedScanning(pVM, GCPtrCur)
    2819                             ||  (   (pPage = pgmPhysGetPage(&pVM->pgm.s, GST_GET_PTE_GCPHYS(PteSrc)))
     2819                            ||  (   (pPage = pgmPhysGetPage(pVM, GST_GET_PTE_GCPHYS(PteSrc)))
    28202820                                 &&  PGM_PAGE_HAS_ACTIVE_HANDLERS(pPage))
    28212821                           )
     
    28412841             *
    28422842             * We'll walk the ram range list in parallel and optimize lookups.
    2843              * We will only sync on shadow page table at a time.
     2843             * We will only sync one shadow page table at a time.
    28442844             */
    28452845            STAM_COUNTER_INC(&pVCpu->pgm.s.CTX_SUFF(pStats)->CTX_MID_Z(Stat,SyncPT4M));
     
    28882888                  GCPtrPage, PdeSrc.b.u1Present, PdeSrc.b.u1Write, PdeSrc.b.u1User, (uint64_t)PdeSrc.u, GCPtr,
    28892889                  GCPhys, PdeDst.u & PGM_PDFLAGS_TRACK_DIRTY ? " Track-Dirty" : ""));
    2890             PPGMRAMRANGE    pRam   = pVM->pgm.s.CTX_SUFF(pRamRanges);
     2890            PPGMRAMRANGE    pRam   = pgmPhysGetRangeAtOrAbove(pVM, GCPhys);
    28912891            unsigned        iPTDst = 0;
    28922892            while (     iPTDst < RT_ELEMENTS(pPTDst->a)
    28932893                   &&   !VM_FF_ISPENDING(pVM, VM_FF_PGM_NO_MEMORY))
    28942894            {
    2895                 /* Advance ram range list. */
    2896                 while (pRam && GCPhys > pRam->GCPhysLast)
    2897                     pRam = pRam->CTX_SUFF(pNext);
    28982895                if (pRam && GCPhys >= pRam->GCPhys)
    28992896                {
     
    29702967                    } while (   iPTDst < RT_ELEMENTS(pPTDst->a)
    29712968                             && GCPhys <= pRam->GCPhysLast);
     2969
     2970                    /* Advance ram range list. */
     2971                    while (pRam && GCPhys > pRam->GCPhysLast)
     2972                        pRam = pRam->CTX_SUFF(pNext);
    29722973                }
    29732974                else if (pRam)
     
    30763077        /* Check if we allocated a big page before for this 2 MB range. */
    30773078        PPGMPAGE pPage;
    3078         rc = pgmPhysGetPageEx(&pVM->pgm.s, GCPtrPage & X86_PDE2M_PAE_PG_MASK, &pPage);
     3079        rc = pgmPhysGetPageEx(pVM, GCPtrPage & X86_PDE2M_PAE_PG_MASK, &pPage);
    30793080        if (RT_SUCCESS(rc))
    30803081        {
     
    35853586     * Nested / EPT - almost no work.
    35863587     */
    3587     Assert(!pgmMapAreMappingsEnabled(&pVM->pgm.s));
     3588    Assert(!pgmMapAreMappingsEnabled(pVM));
    35883589    return VINF_SUCCESS;
    35893590
     
    35933594     * out the shadow parts when the guest modifies its tables.
    35943595     */
    3595     Assert(!pgmMapAreMappingsEnabled(&pVM->pgm.s));
     3596    Assert(!pgmMapAreMappingsEnabled(pVM));
    35963597    return VINF_SUCCESS;
    35973598
     
    36033604     * are enabled and not fixed.
    36043605     */
    3605     if (pgmMapAreMappingsFloating(&pVM->pgm.s))
     3606    if (pgmMapAreMappingsFloating(pVM))
    36063607    {
    36073608        int rc = pgmMapResolveConflicts(pVM);
     
    36143615    }
    36153616#  else
    3616     Assert(!pgmMapAreMappingsEnabled(&pVM->pgm.s));
     3617    Assert(!pgmMapAreMappingsEnabled(pVM));
    36173618#  endif
    36183619    return VINF_SUCCESS;
     
    36813682    AssertRCReturn(rc, 1);
    36823683    HCPhys = NIL_RTHCPHYS;
    3683     rc = pgmRamGCPhys2HCPhys(&pVM->pgm.s, cr3 & GST_CR3_PAGE_MASK, &HCPhys);
     3684    rc = pgmRamGCPhys2HCPhys(pVM, cr3 & GST_CR3_PAGE_MASK, &HCPhys);
    36843685    AssertMsgReturn(HCPhys == HCPhysShw, ("HCPhys=%RHp HCPhyswShw=%RHp (cr3)\n", HCPhys, HCPhysShw), false);
    36853686#  if PGM_GST_TYPE == PGM_TYPE_32BIT && defined(IN_RING3)
     
    38693870                if (PdeDst.u & PGM_PDFLAGS_MAPPING)
    38703871                {
    3871                     Assert(pgmMapAreMappingsEnabled(&pVM->pgm.s));
     3872                    Assert(pgmMapAreMappingsEnabled(pVM));
    38723873                    if ((PdeDst.u & X86_PDE_AVL_MASK) != PGM_PDFLAGS_MAPPING)
    38733874                    {
     
    39483949                    }
    39493950
    3950                     PPGMPAGE pPhysPage = pgmPhysGetPage(&pVM->pgm.s, GCPhysGst);
     3951                    PPGMPAGE pPhysPage = pgmPhysGetPage(pVM, GCPhysGst);
    39513952                    if (!pPhysPage)
    39523953                    {
     
    40624063# endif
    40634064
    4064                             pPhysPage = pgmPhysGetPage(&pVM->pgm.s, GCPhysGst);
     4065                            pPhysPage = pgmPhysGetPage(pVM, GCPhysGst);
    40654066                            if (!pPhysPage)
    40664067                            {
     
    42944295                            }
    42954296# endif
    4296                             pPhysPage = pgmPhysGetPage(&pVM->pgm.s, GCPhysGst);
     4297                            pPhysPage = pgmPhysGetPage(pVM, GCPhysGst);
    42974298                            if (!pPhysPage)
    42984299                            {
     
    44164417    RTHCPHYS    HCPhysGuestCR3;
    44174418    pgmLock(pVM);
    4418     PPGMPAGE    pPageCR3 = pgmPhysGetPage(&pVM->pgm.s, GCPhysCR3);
     4419    PPGMPAGE    pPageCR3 = pgmPhysGetPage(pVM, GCPhysCR3);
    44194420    AssertReturn(pPageCR3, VERR_INTERNAL_ERROR_2);
    44204421    HCPhysGuestCR3 = PGM_PAGE_GET_HCPHYS(pPageCR3);
     
    44644465                    RTGCPHYS    GCPhys = pGuestPDPT->a[i].u & X86_PDPE_PG_MASK;
    44654466                    pgmLock(pVM);
    4466                     PPGMPAGE    pPage  = pgmPhysGetPage(&pVM->pgm.s, GCPhys);
     4467                    PPGMPAGE    pPage  = pgmPhysGetPage(pVM, GCPhys);
    44674468                    AssertReturn(pPage, VERR_INTERNAL_ERROR_2);
    44684469                    HCPhys = PGM_PAGE_GET_HCPHYS(pPage);
  • trunk/src/VBox/VMM/VMMAll/PGMAllGst.h

    r32036 r36891  
    517517                        {
    518518                            if (pCur->aPhysToVirt[iPage].Core.Key != NIL_RTGCPHYS)
    519                                 pgmHandlerVirtualClearPage(&pVM->pgm.s, pCur, iPage);
     519                                pgmHandlerVirtualClearPage(pVM, pCur, iPage);
    520520#ifdef VBOX_STRICT_PGM_HANDLER_VIRTUAL
    521521                            AssertReleaseMsg(!pCur->aPhysToVirt[iPage].offNextAlias,
     
    540540                        if (pCur->aPhysToVirt[iPage].Core.Key != NIL_RTGCPHYS)
    541541                        {
    542                             pgmHandlerVirtualClearPage(&pVM->pgm.s, pCur, iPage);
     542                            pgmHandlerVirtualClearPage(pVM, pCur, iPage);
    543543#ifdef VBOX_STRICT_PGM_HANDLER_VIRTUAL
    544544                            AssertReleaseMsg(!pCur->aPhysToVirt[iPage].offNextAlias,
     
    567567                    {
    568568                        if (pCur->aPhysToVirt[iPage].Core.Key != NIL_RTGCPHYS)
    569                             pgmHandlerVirtualClearPage(&pVM->pgm.s, pCur, iPage);
     569                            pgmHandlerVirtualClearPage(pVM, pCur, iPage);
    570570#ifdef VBOX_STRICT_PGM_HANDLER_VIRTUAL
    571571                        AssertReleaseMsg(!pCur->aPhysToVirt[iPage].offNextAlias,
     
    590590                if (pCur->aPhysToVirt[iPage].Core.Key != NIL_RTGCPHYS)
    591591                {
    592                     pgmHandlerVirtualClearPage(&pVM->pgm.s, pCur, iPage);
     592                    pgmHandlerVirtualClearPage(pVM, pCur, iPage);
    593593                    pCur->aPhysToVirt[iPage].Core.Key = NIL_RTGCPHYS;
    594594                    pState->fTodo |= PGM_SYNC_UPDATE_PAGE_BIT_VIRTUAL;
  • trunk/src/VBox/VMM/VMMAll/PGMAllHandler.cpp

    r35346 r36891  
    120120     * There is no apparent need to support ranges which cover more than one ram range.
    121121     */
    122     PPGMRAMRANGE    pRam = pVM->pgm.s.CTX_SUFF(pRamRanges);
    123     while (pRam && GCPhys > pRam->GCPhysLast)
    124         pRam = pRam->CTX_SUFF(pNext);
    125     if (    !pRam
    126         ||  GCPhysLast < pRam->GCPhys
    127         ||  GCPhys > pRam->GCPhysLast)
     122    PPGMRAMRANGE pRam = pgmPhysGetRange(pVM, GCPhys);
     123    if (   !pRam
     124        || GCPhysLast < pRam->GCPhys
     125        || GCPhys > pRam->GCPhysLast)
    128126    {
    129127#ifdef IN_RING3
     
    306304        if (GCPhysStart & PAGE_OFFSET_MASK)
    307305        {
    308             PPGMPAGE pPage = pgmPhysGetPage(&pVM->pgm.s, GCPhysStart);
     306            PPGMPAGE pPage = pgmPhysGetPage(pVM, GCPhysStart);
    309307            if (    pPage
    310308                &&  PGM_PAGE_GET_HNDL_PHYS_STATE(pPage) != PGM_PAGE_HNDL_PHYS_STATE_NONE)
     
    323321        if (GCPhysLast & PAGE_OFFSET_MASK)
    324322        {
    325             PPGMPAGE pPage = pgmPhysGetPage(&pVM->pgm.s, GCPhysLast);
     323            PPGMPAGE pPage = pgmPhysGetPage(pVM, GCPhysLast);
    326324            if (    pPage
    327325                &&  PGM_PAGE_GET_HNDL_PHYS_STATE(pPage) != PGM_PAGE_HNDL_PHYS_STATE_NONE)
     
    387385    {
    388386        PPGMPAGE pPage;
    389         int rc = pgmPhysGetPageWithHintEx(&pVM->pgm.s, GCPhys, &pPage, ppRamHint);
     387        int rc = pgmPhysGetPageWithHintEx(pVM, GCPhys, &pPage, ppRamHint);
    390388        if (    RT_SUCCESS(rc)
    391389            &&  PGM_PAGE_GET_HNDL_PHYS_STATE(pPage) < uState)
     
    480478     * Iterate the guest ram pages updating the state.
    481479     */
    482     RTUINT          cPages = pCur->cPages;
    483     RTGCPHYS        GCPhys = pCur->Core.Key;
     480    RTUINT          cPages   = pCur->cPages;
     481    RTGCPHYS        GCPhys   = pCur->Core.Key;
    484482    PPGMRAMRANGE    pRamHint = NULL;
    485     PPGM            pPGM = &pVM->pgm.s;
    486483    for (;;)
    487484    {
    488485        PPGMPAGE pPage;
    489         int rc = pgmPhysGetPageWithHintEx(pPGM, GCPhys, &pPage, &pRamHint);
     486        int rc = pgmPhysGetPageWithHintEx(pVM, GCPhys, &pPage, &pRamHint);
    490487        if (RT_SUCCESS(rc))
    491488        {
     
    562559             * There is no apparent need to support ranges which cover more than one ram range.
    563560             */
    564             PPGMRAMRANGE    pRam = pVM->pgm.s.CTX_SUFF(pRamRanges);
    565             while (pRam && GCPhys > pRam->GCPhysLast)
    566                 pRam = pRam->CTX_SUFF(pNext);
    567             if (    pRam
    568                 &&  GCPhys <= pRam->GCPhysLast
    569                 &&  GCPhysLast >= pRam->GCPhys)
     561            PPGMRAMRANGE pRam = pgmPhysGetRange(pVM, GCPhys);
     562            if (   pRam
     563                && GCPhys <= pRam->GCPhysLast
     564                && GCPhysLast >= pRam->GCPhys)
    570565            {
    571566                pCur->Core.Key      = GCPhys;
     
    865860            {
    866861                STAM_COUNTER_INC(&pVM->pgm.s.CTX_SUFF(pStats)->CTX_MID_Z(Stat,PhysHandlerReset)); /**@Todo move out of switch */
    867                 PPGMRAMRANGE pRam = pgmPhysGetRange(&pVM->pgm.s, GCPhys);
     862                PPGMRAMRANGE pRam = pgmPhysGetRange(pVM, GCPhys);
    868863                Assert(pRam);
    869864                Assert(pRam->GCPhys     <= pCur->Core.Key);
     
    979974             */
    980975            PPGMPAGE pPage;
    981             int rc = pgmPhysGetPageEx(&pVM->pgm.s, GCPhysPage, &pPage);
     976            int rc = pgmPhysGetPageEx(pVM, GCPhysPage, &pPage);
    982977            AssertReturnStmt(RT_SUCCESS_NP(rc), pgmUnlock(pVM), rc);
    983978            if (PGM_PAGE_GET_HNDL_PHYS_STATE(pPage) != PGM_PAGE_HNDL_PHYS_STATE_DISABLED)
     
    10621057             */
    10631058            PPGMPAGE pPageRemap;
    1064             int rc = pgmPhysGetPageEx(&pVM->pgm.s, GCPhysPageRemap, &pPageRemap);
     1059            int rc = pgmPhysGetPageEx(pVM, GCPhysPageRemap, &pPageRemap);
    10651060            AssertReturnStmt(RT_SUCCESS_NP(rc), pgmUnlock(pVM), rc);
    10661061            AssertMsgReturnStmt(PGM_PAGE_GET_TYPE(pPageRemap) == PGMPAGETYPE_MMIO2,
     
    10691064
    10701065            PPGMPAGE pPage;
    1071             rc = pgmPhysGetPageEx(&pVM->pgm.s, GCPhysPage, &pPage);
     1066            rc = pgmPhysGetPageEx(pVM, GCPhysPage, &pPage);
    10721067            AssertReturnStmt(RT_SUCCESS_NP(rc), pgmUnlock(pVM), rc);
    10731068            if (PGM_PAGE_GET_TYPE(pPage) != PGMPAGETYPE_MMIO)
     
    11821177             */
    11831178            PPGMPAGE pPage;
    1184             int rc = pgmPhysGetPageEx(&pVM->pgm.s, GCPhysPage, &pPage);
     1179            int rc = pgmPhysGetPageEx(pVM, GCPhysPage, &pPage);
    11851180            AssertReturnStmt(RT_SUCCESS_NP(rc), pgmUnlock(pVM), rc);
    11861181            if (PGM_PAGE_GET_TYPE(pPage) != PGMPAGETYPE_MMIO)
     
    14341429             */
    14351430            PPGMPAGE pPage;
    1436             int rc = pgmPhysGetPageWithHintEx(&pVM->pgm.s, pPhys2Virt->Core.Key, &pPage, &pRamHint);
     1431            int rc = pgmPhysGetPageWithHintEx(pVM, pPhys2Virt->Core.Key, &pPage, &pRamHint);
    14371432            if (    RT_SUCCESS(rc)
    14381433                &&  PGM_PAGE_GET_HNDL_VIRT_STATE(pPage) < uState)
     
    16431638            }
    16441639
    1645             PPGMPAGE pPage = pgmPhysGetPage(&pVM->pgm.s, GCPhysGst);
     1640            PPGMPAGE pPage = pgmPhysGetPage(pVM, GCPhysGst);
    16461641            if (!pPage)
    16471642            {
     
    16881683     * Check the RAM flags against the handlers.
    16891684     */
    1690     for (PPGMRAMRANGE pRam = pPGM->CTX_SUFF(pRamRanges); pRam; pRam = pRam->CTX_SUFF(pNext))
    1691     {
    1692         const unsigned cPages = pRam->cb >> PAGE_SHIFT;
    1693         for (unsigned iPage = 0; iPage < cPages; iPage++)
     1685    for (PPGMRAMRANGE pRam = pPGM->CTX_SUFF(pRamRangesX); pRam; pRam = pRam->CTX_SUFF(pNext))
     1686    {
     1687        const uint32_t cPages = pRam->cb >> PAGE_SHIFT;
     1688        for (uint32_t iPage = 0; iPage < cPages; iPage++)
    16941689        {
    16951690            PGMPAGE const *pPage = &pRam->aPages[iPage];
  • trunk/src/VBox/VMM/VMMAll/PGMAllMap.cpp

    r35346 r36891  
    270270void pgmMapSetShadowPDEs(PVM pVM, PPGMMAPPING pMap, unsigned iNewPDE)
    271271{
    272     Log4(("pgmMapSetShadowPDEs new pde %x (mappings enabled %d)\n", iNewPDE, pgmMapAreMappingsEnabled(&pVM->pgm.s)));
    273 
    274     if (    !pgmMapAreMappingsEnabled(&pVM->pgm.s)
     272    Log4(("pgmMapSetShadowPDEs new pde %x (mappings enabled %d)\n", iNewPDE, pgmMapAreMappingsEnabled(pVM)));
     273
     274    if (    !pgmMapAreMappingsEnabled(pVM)
    275275        ||  pVM->cCpus > 1)
    276276        return;
     
    354354                PPGMPOOLPAGE    pPoolPagePd = pgmPoolGetPage(pPool, pShwPdpt->a[iPdPt].u & X86_PDPE_PG_MASK);
    355355                AssertFatal(pPoolPagePd);
    356                 if (!pgmPoolIsPageLocked(&pVM->pgm.s, pPoolPagePd))
     356                if (!pgmPoolIsPageLocked(pPoolPagePd))
    357357                    pgmPoolLockPage(pPool, pPoolPagePd);
    358358#ifdef VBOX_STRICT
     
    424424void pgmMapClearShadowPDEs(PVM pVM, PPGMPOOLPAGE pShwPageCR3, PPGMMAPPING pMap, unsigned iOldPDE, bool fDeactivateCR3)
    425425{
    426     Log(("pgmMapClearShadowPDEs: old pde %x (cPTs=%x) (mappings enabled %d) fDeactivateCR3=%RTbool\n", iOldPDE, pMap->cPTs, pgmMapAreMappingsEnabled(&pVM->pgm.s), fDeactivateCR3));
     426    Log(("pgmMapClearShadowPDEs: old pde %x (cPTs=%x) (mappings enabled %d) fDeactivateCR3=%RTbool\n", iOldPDE, pMap->cPTs, pgmMapAreMappingsEnabled(pVM), fDeactivateCR3));
    427427
    428428    /*
    429429     * Skip this if disabled or if it doesn't apply.
    430430     */
    431     if (    !pgmMapAreMappingsEnabled(&pVM->pgm.s)
     431    if (    !pgmMapAreMappingsEnabled(pVM)
    432432        ||  pVM->cCpus > 1)
    433433        return;
     
    526526                    PPGMPOOLPAGE pPoolPagePd = pgmPoolGetPage(pPool, pShwPdpt->a[iPdpt].u & X86_PDPE_PG_MASK);
    527527                    AssertFatal(pPoolPagePd);
    528                     if (pgmPoolIsPageLocked(&pVM->pgm.s, pPoolPagePd))
     528                    if (pgmPoolIsPageLocked(pPoolPagePd))
    529529                        pgmPoolUnlockPage(pPool, pPoolPagePd);
    530530                }
     
    630630     * Can skip this if mappings are disabled.
    631631     */
    632     if (!pgmMapAreMappingsEnabled(&pVM->pgm.s))
     632    if (!pgmMapAreMappingsEnabled(pVM))
    633633        return;
    634634
     
    665665     * Skip this if disabled or if it doesn't apply.
    666666     */
    667     if (    !pgmMapAreMappingsEnabled(&pVM->pgm.s)
     667    if (    !pgmMapAreMappingsEnabled(pVM)
    668668        ||  pVM->cCpus > 1)
    669669        return VINF_SUCCESS;
     
    702702     * Skip this if disabled or if it doesn't apply.
    703703     */
    704     if (    !pgmMapAreMappingsEnabled(&pVM->pgm.s)
     704    if (    !pgmMapAreMappingsEnabled(pVM)
    705705        ||  pVM->cCpus > 1)
    706706        return VINF_SUCCESS;
     
    733733     * Can skip this if mappings are safely fixed.
    734734     */
    735     if (!pgmMapAreMappingsFloating(&pVM->pgm.s))
     735    if (!pgmMapAreMappingsFloating(pVM))
    736736        return false;
    737737
  • trunk/src/VBox/VMM/VMMAll/PGMAllPhys.cpp

    r36639 r36891  
    141141
    142142#endif /* IN_RING3 */
     143#ifdef PGM_USE_RAMRANGE_TLB
     144
     145/**
     146 * Invalidates the RAM range TLBs.
     147 *
     148 * @param   pVM                 The VM handle.
     149 */
     150void pgmPhysInvalidRamRangeTlbs(PVM pVM)
     151{
     152    pgmLock(pVM);
     153    for (uint32_t i = 0; i < PGM_RAMRANGE_TLB_ENTRIES; i++)
     154    {
     155        pVM->pgm.s.apRamRangesTlbR3[i] = NIL_RTR3PTR;
     156        pVM->pgm.s.apRamRangesTlbR0[i] = NIL_RTR0PTR;
     157        pVM->pgm.s.apRamRangesTlbRC[i] = NIL_RTRCPTR;
     158    }
     159    pgmUnlock(pVM);
     160}
     161
     162
     163/**
     164 * Slow worker for pgmPhysGetRange.
     165 *
     166 * @copydoc pgmPhysGetRange
     167 */
     168PPGMRAMRANGE pgmPhysGetRangeSlow(PVM pVM, RTGCPHYS GCPhys)
     169{
     170    STAM_COUNTER_INC(&pVM->pgm.s.CTX_SUFF(pStats)->CTX_MID_Z(Stat,RamRangeTlbMisses));
     171    PPGMRAMRANGE pRam = pVM->pgm.s.CTX_SUFF(pRamRangesX);
     172    while (GCPhys > pRam->GCPhysLast)
     173    {
     174        pRam = pRam->CTX_SUFF(pNext);
     175        if (!pRam)
     176            return NULL;
     177    }
     178    if (GCPhys < pRam->GCPhys)
     179        return NULL;
     180
     181    pVM->pgm.s.CTX_SUFF(apRamRangesTlb)[PGM_RAMRANGE_TLB_IDX(GCPhys)] = pRam;
     182    return pRam;
     183}
     184
     185
     186/**
     187 * Slow worker for pgmPhysGetRangeAtOrAbove.
     188 *
     189 * @copydoc pgmPhysGetRangeAtOrAbove
     190 */
     191PPGMRAMRANGE pgmPhysGetRangeAtOrAboveSlow(PVM pVM, RTGCPHYS GCPhys)
     192{
     193    STAM_COUNTER_INC(&pVM->pgm.s.CTX_SUFF(pStats)->CTX_MID_Z(Stat,RamRangeTlbMisses));
     194    PPGMRAMRANGE pRam = pVM->pgm.s.CTX_SUFF(pRamRangesX);
     195    while (GCPhys > pRam->GCPhysLast)
     196    {
     197        pRam = pRam->CTX_SUFF(pNext);
     198        if (!pRam)
     199            return NULL;
     200    }
     201    pVM->pgm.s.CTX_SUFF(apRamRangesTlb)[PGM_RAMRANGE_TLB_IDX(pRam->GCPhys)] = pRam;
     202    return pRam;
     203}
     204
     205
     206/**
     207 * Slow worker for pgmPhysGetPage.
     208 *
     209 * @copydoc pgmPhysGetPage
     210 */
     211PPGMPAGE pgmPhysGetPageSlow(PVM pVM, RTGCPHYS GCPhys)
     212{
     213    STAM_COUNTER_INC(&pVM->pgm.s.CTX_SUFF(pStats)->CTX_MID_Z(Stat,RamRangeTlbMisses));
     214    for (PPGMRAMRANGE pRam = pVM->pgm.s.CTX_SUFF(pRamRangesX);
     215         pRam;
     216         pRam = pRam->CTX_SUFF(pNext))
     217    {
     218        RTGCPHYS off = GCPhys - pRam->GCPhys;
     219        if (off < pRam->cb)
     220        {
     221            pVM->pgm.s.CTX_SUFF(apRamRangesTlb)[PGM_RAMRANGE_TLB_IDX(GCPhys)] = pRam;
     222            return &pRam->aPages[off >> PAGE_SHIFT];
     223        }
     224    }
     225    return NULL;
     226}
     227
     228
     229/**
     230 * Slow worker for pgmPhysGetPageEx.
     231 *
     232 * @copydoc pgmPhysGetPageEx
     233 */
     234int pgmPhysGetPageExSlow(PVM pVM, RTGCPHYS GCPhys, PPPGMPAGE ppPage)
     235{
     236    STAM_COUNTER_INC(&pVM->pgm.s.CTX_SUFF(pStats)->CTX_MID_Z(Stat,RamRangeTlbMisses));
     237    for (PPGMRAMRANGE pRam = pVM->pgm.s.CTX_SUFF(pRamRangesX);
     238         pRam;
     239         pRam = pRam->CTX_SUFF(pNext))
     240    {
     241        RTGCPHYS off = GCPhys - pRam->GCPhys;
     242        if (off < pRam->cb)
     243        {
     244            pVM->pgm.s.CTX_SUFF(apRamRangesTlb)[PGM_RAMRANGE_TLB_IDX(GCPhys)] = pRam;
     245            *ppPage = &pRam->aPages[off >> PAGE_SHIFT];
     246            return VINF_SUCCESS;
     247        }
     248    }
     249    *ppPage = NULL;
     250    return VERR_PGM_INVALID_GC_PHYSICAL_ADDRESS;
     251}
     252
     253
     254/**
     255 * Slow worker for pgmPhysGetPageAndRangeEx.
     256 *
     257 * @copydoc pgmPhysGetPageAndRangeEx
     258 */
     259int pgmPhysGetPageAndRangeExSlow(PVM pVM, RTGCPHYS GCPhys, PPPGMPAGE ppPage, PPGMRAMRANGE *ppRam)
     260{
     261    STAM_COUNTER_INC(&pVM->pgm.s.CTX_SUFF(pStats)->CTX_MID_Z(Stat,RamRangeTlbMisses));
     262    for (PPGMRAMRANGE pRam = pVM->pgm.s.CTX_SUFF(pRamRangesX);
     263         pRam;
     264         pRam = pRam->CTX_SUFF(pNext))
     265    {
     266        RTGCPHYS off = GCPhys - pRam->GCPhys;
     267        if (off < pRam->cb)
     268        {
     269            pVM->pgm.s.CTX_SUFF(apRamRangesTlb)[PGM_RAMRANGE_TLB_IDX(GCPhys)] = pRam;
     270            *ppRam  = pRam;
     271            *ppPage = &pRam->aPages[off >> PAGE_SHIFT];
     272            return VINF_SUCCESS;
     273        }
     274    }
     275
     276    *ppRam  = NULL;
     277    *ppPage = NULL;
     278    return VERR_PGM_INVALID_GC_PHYSICAL_ADDRESS;
     279}
     280
     281#endif /* PGM_USE_RAMRANGE_TLB */
    143282
    144283/**
     
    166305VMMDECL(bool) PGMPhysIsGCPhysValid(PVM pVM, RTGCPHYS GCPhys)
    167306{
    168     PPGMPAGE pPage = pgmPhysGetPage(&pVM->pgm.s, GCPhys);
     307    PPGMPAGE pPage = pgmPhysGetPage(pVM, GCPhys);
    169308    return pPage != NULL;
    170309}
     
    182321VMMDECL(bool) PGMPhysIsGCPhysNormal(PVM pVM, RTGCPHYS GCPhys)
    183322{
    184     PPGMPAGE pPage = pgmPhysGetPage(&pVM->pgm.s, GCPhys);
     323    PPGMPAGE pPage = pgmPhysGetPage(pVM, GCPhys);
    185324    return pPage
    186325        && PGM_PAGE_GET_TYPE(pPage) == PGMPAGETYPE_RAM;
     
    205344    pgmLock(pVM);
    206345    PPGMPAGE pPage;
    207     int rc = pgmPhysGetPageEx(&pVM->pgm.s, GCPhys, &pPage);
     346    int rc = pgmPhysGetPageEx(pVM, GCPhys, &pPage);
    208347    if (RT_SUCCESS(rc))
    209348        *pHCPhys = PGM_PAGE_GET_HCPHYS(pPage) | (GCPhys & PAGE_OFFSET_MASK);
     
    392531        PPGMPAGE pBasePage;
    393532
    394         int rc = pgmPhysGetPageEx(&pVM->pgm.s, GCPhysBase, &pBasePage);
     533        int rc = pgmPhysGetPageEx(pVM, GCPhysBase, &pBasePage);
    395534        AssertRCReturn(rc, rc);     /* paranoia; can't happen. */
    396535        if (PGM_PAGE_GET_PDE_TYPE(pBasePage) == PGM_PAGE_PDE_TYPE_DONTCARE)
     
    531670
    532671    PPGMPAGE pFirstPage;
    533     int rc = pgmPhysGetPageEx(&pVM->pgm.s, GCPhysBase, &pFirstPage);
     672    int rc = pgmPhysGetPageEx(pVM, GCPhysBase, &pFirstPage);
    534673    if (    RT_SUCCESS(rc)
    535674        &&  PGM_PAGE_GET_TYPE(pFirstPage) == PGMPAGETYPE_RAM)
     
    550689            {
    551690                PPGMPAGE pSubPage;
    552                 rc = pgmPhysGetPageEx(&pVM->pgm.s, GCPhys, &pSubPage);
     691                rc = pgmPhysGetPageEx(pVM, GCPhys, &pSubPage);
    553692                if  (   RT_FAILURE(rc)
    554693                     || PGM_PAGE_GET_TYPE(pSubPage)  != PGMPAGETYPE_RAM      /* Anything other than ram implies monitoring. */
     
    629768    {
    630769        PPGMPAGE pPage;
    631         int rc = pgmPhysGetPageEx(&pVM->pgm.s, GCPhys, &pPage);
     770        int rc = pgmPhysGetPageEx(pVM, GCPhys, &pPage);
    632771        AssertRCBreak(rc);
    633772
     
    845984        {
    846985            /* Lookup the MMIO2 range and use pvR3 to calc the address. */
    847             PPGMRAMRANGE pRam = pgmPhysGetRange(&pVM->pgm.s, GCPhys);
     986            PPGMRAMRANGE pRam = pgmPhysGetRange(pVM, GCPhys);
    848987            AssertMsgReturn(pRam || !pRam->pvR3, ("pRam=%p pPage=%R[pgmpage]\n", pRam, pPage), VERR_INTERNAL_ERROR_2);
    849988            *ppv = (void *)((uintptr_t)pRam->pvR3 + (uintptr_t)((GCPhys & ~(RTGCPHYS)PAGE_OFFSET_MASK) - pRam->GCPhys));
     
    10071146}
    10081147
    1009 
    10101148#if !defined(IN_RC) && !defined(VBOX_WITH_2X_4GB_ADDR_SPACE_IN_R0)
     1149
    10111150/**
    10121151 * Load a guest page into the ring-3 physical TLB.
     
    10181157 * @param   GCPhys      The guest physical address in question.
    10191158 */
    1020 int pgmPhysPageLoadIntoTlb(PPGM pPGM, RTGCPHYS GCPhys)
    1021 {
    1022     Assert(PGMIsLocked(PGM2VM(pPGM)));
     1159int pgmPhysPageLoadIntoTlb(PVM pVM, RTGCPHYS GCPhys)
     1160{
     1161    Assert(PGMIsLocked(pVM));
    10231162
    10241163    /*
     
    10261165     * 99.8% of requests are expected to be in the first range.
    10271166     */
    1028     PPGMRAMRANGE pRam = pPGM->CTX_SUFF(pRamRanges);
    1029     RTGCPHYS off = GCPhys - pRam->GCPhys;
    1030     if (RT_UNLIKELY(off >= pRam->cb))
    1031     {
    1032         do
    1033         {
    1034             pRam = pRam->CTX_SUFF(pNext);
    1035             if (!pRam)
    1036             {
    1037                 STAM_COUNTER_INC(&pPGM->CTX_SUFF(pStats)->CTX_MID_Z(Stat,PageMapTlbMisses));
    1038                 return VERR_PGM_INVALID_GC_PHYSICAL_ADDRESS;
    1039             }
    1040             off = GCPhys - pRam->GCPhys;
    1041         } while (off >= pRam->cb);
    1042     }
    1043 
    1044     return pgmPhysPageLoadIntoTlbWithPage(pPGM, &pRam->aPages[off >> PAGE_SHIFT], GCPhys);
     1167    PPGMPAGE pPage = pgmPhysGetPage(pVM, GCPhys);
     1168    if (!pPage)
     1169    {
     1170        STAM_COUNTER_INC(&pVM->pgm.s.CTX_SUFF(pStats)->CTX_MID_Z(Stat,PageMapTlbMisses));
     1171        return VERR_PGM_INVALID_GC_PHYSICAL_ADDRESS;
     1172    }
     1173
     1174    return pgmPhysPageLoadIntoTlbWithPage(pVM, pPage, GCPhys);
    10451175}
    10461176
     
    10531183 * @retval  VERR_PGM_INVALID_GC_PHYSICAL_ADDRESS if it's not a valid physical address.
    10541184 *
    1055  * @param   pPGM        The PGM instance pointer.
     1185 * @param   pVM         The VM handle.
    10561186 * @param   pPage       Pointer to the PGMPAGE structure corresponding to
    10571187 *                      GCPhys.
    10581188 * @param   GCPhys      The guest physical address in question.
    10591189 */
    1060 int pgmPhysPageLoadIntoTlbWithPage(PPGM pPGM, PPGMPAGE pPage, RTGCPHYS GCPhys)
    1061 {
    1062     Assert(PGMIsLocked(PGM2VM(pPGM)));
    1063     STAM_COUNTER_INC(&pPGM->CTX_SUFF(pStats)->CTX_MID_Z(Stat,PageMapTlbMisses));
     1190int pgmPhysPageLoadIntoTlbWithPage(PVM pVM, PPGMPAGE pPage, RTGCPHYS GCPhys)
     1191{
     1192    Assert(PGMIsLocked(pVM));
     1193    STAM_COUNTER_INC(&pVM->pgm.s.CTX_SUFF(pStats)->CTX_MID_Z(Stat,PageMapTlbMisses));
    10641194
    10651195    /*
     
    10671197     * Make a special case for the zero page as it is kind of special.
    10681198     */
    1069     PPGMPAGEMAPTLBE pTlbe = &pPGM->CTXSUFF(PhysTlb).aEntries[PGM_PAGEMAPTLB_IDX(GCPhys)];
     1199    PPGMPAGEMAPTLBE pTlbe = &pVM->pgm.s.CTXSUFF(PhysTlb).aEntries[PGM_PAGEMAPTLB_IDX(GCPhys)];
    10701200    if (    !PGM_PAGE_IS_ZERO(pPage)
    10711201        &&  !PGM_PAGE_IS_BALLOONED(pPage))
     
    10731203        void *pv;
    10741204        PPGMPAGEMAP pMap;
    1075         int rc = pgmPhysPageMapCommon(PGM2VM(pPGM), pPage, GCPhys, &pMap, &pv);
     1205        int rc = pgmPhysPageMapCommon(pVM, pPage, GCPhys, &pMap, &pv);
    10761206        if (RT_FAILURE(rc))
    10771207            return rc;
     
    10821212    else
    10831213    {
    1084         Assert(PGM_PAGE_GET_HCPHYS(pPage) == pPGM->HCPhysZeroPg);
     1214        Assert(PGM_PAGE_GET_HCPHYS(pPage) == pVM->pgm.s.HCPhysZeroPg);
    10851215        pTlbe->pMap = NULL;
    1086         pTlbe->pv = pPGM->CTXALLSUFF(pvZeroPg);
     1216        pTlbe->pv = pVM->pgm.s.CTXALLSUFF(pvZeroPg);
    10871217    }
    10881218#ifdef PGM_WITH_PHYS_TLB
     
    10981228    return VINF_SUCCESS;
    10991229}
     1230
    11001231#endif /* !IN_RC && !VBOX_WITH_2X_4GB_ADDR_SPACE_IN_R0 */
    1101 
    11021232
    11031233/**
     
    11491279#else
    11501280    PPGMPAGEMAPTLBE pTlbe;
    1151     rc = pgmPhysPageQueryTlbeWithPage(&pVM->pgm.s, pPage, GCPhys, &pTlbe);
     1281    rc = pgmPhysPageQueryTlbeWithPage(pVM, pPage, GCPhys, &pTlbe);
    11521282    if (RT_FAILURE(rc))
    11531283        return rc;
     
    11941324#else
    11951325    PPGMPAGEMAPTLBE pTlbe;
    1196     int rc = pgmPhysPageQueryTlbeWithPage(&pVM->pgm.s, pPage, GCPhys, &pTlbe);
     1326    int rc = pgmPhysPageQueryTlbeWithPage(pVM, pPage, GCPhys, &pTlbe);
    11971327    if (RT_FAILURE(rc))
    11981328        return rc;
     
    12421372     */
    12431373    PPGMPAGE pPage;
    1244     rc = pgmPhysGetPageEx(&pVM->pgm.s, GCPhys, &pPage);
     1374    rc = pgmPhysGetPageEx(pVM, GCPhys, &pPage);
    12451375    if (RT_SUCCESS(rc))
    12461376    {
     
    12781408     */
    12791409    PPGMPAGEMAPTLBE pTlbe;
    1280     rc = pgmPhysPageQueryTlbe(&pVM->pgm.s, GCPhys, &pTlbe);
     1410    rc = pgmPhysPageQueryTlbe(pVM, GCPhys, &pTlbe);
    12811411    if (RT_SUCCESS(rc))
    12821412    {
     
    12921422            {
    12931423                AssertMsg(rc == VINF_SUCCESS || rc == VINF_PGM_SYNC_CR3 /* not returned */, ("%Rrc\n", rc));
    1294                 rc = pgmPhysPageQueryTlbeWithPage(&pVM->pgm.s, pPage, GCPhys, &pTlbe);
     1424                rc = pgmPhysPageQueryTlbeWithPage(pVM, pPage, GCPhys, &pTlbe);
    12951425            }
    12961426        }
     
    13651495     */
    13661496    PPGMPAGE pPage;
    1367     rc = pgmPhysGetPageEx(&pVM->pgm.s, GCPhys, &pPage);
     1497    rc = pgmPhysGetPageEx(pVM, GCPhys, &pPage);
    13681498    if (RT_SUCCESS(rc))
    13691499    {
     
    14001530     */
    14011531    PPGMPAGEMAPTLBE pTlbe;
    1402     rc = pgmPhysPageQueryTlbe(&pVM->pgm.s, GCPhys, &pTlbe);
     1532    rc = pgmPhysPageQueryTlbe(pVM, GCPhys, &pTlbe);
    14031533    if (RT_SUCCESS(rc))
    14041534    {
     
    16241754    PPGMRAMRANGE pRam;
    16251755    PPGMPAGE pPage;
    1626     int rc = pgmPhysGetPageAndRangeEx(&pVM->pgm.s, GCPhys, &pPage, &pRam);
     1756    int rc = pgmPhysGetPageAndRangeEx(pVM, GCPhys, &pPage, &pRam);
    16271757    if (RT_SUCCESS(rc))
    16281758        rc = pgmPhysGCPhys2CCPtrInternal(pVM, pPage, GCPhys, (void **)pR3Ptr);
     
    18832013     * Copy loop on ram ranges.
    18842014     */
    1885     PPGMRAMRANGE pRam = pVM->pgm.s.CTX_SUFF(pRamRanges);
     2015    PPGMRAMRANGE pRam = pgmPhysGetRangeAtOrAbove(pVM, GCPhys);
    18862016    for (;;)
    18872017    {
    1888         /* Find range. */
    1889         while (pRam && GCPhys > pRam->GCPhysLast)
    1890             pRam = pRam->CTX_SUFF(pNext);
    18912018        /* Inside range or not? */
    18922019        if (pRam && GCPhys >= pRam->GCPhys)
     
    19532080             * Unassigned address space.
    19542081             */
    1955             if (!pRam)
    1956                 break;
    1957             size_t cb = pRam->GCPhys - GCPhys;
     2082            size_t cb = pRam ? pRam->GCPhys - GCPhys : ~(size_t)0;
    19582083            if (cb >= cbRead)
    19592084            {
     
    19672092            GCPhys += cb;
    19682093        }
     2094
     2095        /* Advance range if necessary. */
     2096        while (pRam && GCPhys > pRam->GCPhysLast)
     2097            pRam = pRam->CTX_SUFF(pNext);
    19692098    } /* Ram range walk */
    19702099
     
    23982527     * Copy loop on ram ranges.
    23992528     */
    2400     PPGMRAMRANGE    pRam = pVM->pgm.s.CTX_SUFF(pRamRanges);
     2529    PPGMRAMRANGE pRam = pgmPhysGetRangeAtOrAbove(pVM, GCPhys);
    24012530    for (;;)
    24022531    {
    2403         /* Find range. */
    2404         while (pRam && GCPhys > pRam->GCPhysLast)
    2405             pRam = pRam->CTX_SUFF(pNext);
    24062532        /* Inside range or not? */
    24072533        if (pRam && GCPhys >= pRam->GCPhys)
     
    24782604            GCPhys += cb;
    24792605        }
     2606
     2607        /* Advance range if necessary. */
     2608        while (pRam && GCPhys > pRam->GCPhysLast)
     2609            pRam = pRam->CTX_SUFF(pNext);
    24802610    } /* Ram range walk */
    24812611
     
    36183748    PPGMPAGE pPage;
    36193749
    3620     pPage = pgmPhysGetPage(&pVM->pgm.s, GCPhys);
     3750    pPage = pgmPhysGetPage(pVM, GCPhys);
    36213751    if (pPage)
    36223752        return (PGMPAGETYPE)PGM_PAGE_GET_TYPE(pPage);
     
    36243754    return PGMPAGETYPE_INVALID;
    36253755}
     3756
  • trunk/src/VBox/VMM/VMMAll/PGMAllPool.cpp

    r36009 r36891  
    265265                        if ((uShw.pPDPae->a[iShw + i].u & (PGM_PDFLAGS_MAPPING | X86_PDE_P)) == (PGM_PDFLAGS_MAPPING | X86_PDE_P))
    266266                        {
    267                             Assert(pgmMapAreMappingsEnabled(&pVM->pgm.s));
     267                            Assert(pgmMapAreMappingsEnabled(pVM));
    268268                            VMCPU_FF_SET(pVCpu, VMCPU_FF_PGM_SYNC_CR3);
    269269                            LogFlow(("pgmPoolMonitorChainChanging: Detected conflict at iShwPdpt=%#x iShw=%#x!\n", iShwPdpt, iShw+i));
     
    292292                                if ((uShw.pPDPae->a[iShw2].u & (PGM_PDFLAGS_MAPPING | X86_PDE_P)) == (PGM_PDFLAGS_MAPPING | X86_PDE_P))
    293293                                {
    294                                     Assert(pgmMapAreMappingsEnabled(&pVM->pgm.s));
     294                                    Assert(pgmMapAreMappingsEnabled(pVM));
    295295                                    VMCPU_FF_SET(pVCpu, VMCPU_FF_PGM_SYNC_CR3);
    296296                                    LogFlow(("pgmPoolMonitorChainChanging: Detected conflict at iShwPdpt=%#x iShw2=%#x!\n", iShwPdpt, iShw2));
     
    371371                if (uShw.pPD->a[iShw].u & PGM_PDFLAGS_MAPPING)
    372372                {
    373                     Assert(pgmMapAreMappingsEnabled(&pVM->pgm.s));
     373                    Assert(pgmMapAreMappingsEnabled(pVM));
    374374                    VMCPU_FF_SET(pVCpu, VMCPU_FF_PGM_SYNC_CR3);
    375375                    STAM_COUNTER_INC(&(pVCpu->pgm.s.CTX_SUFF(pStats)->StatRZGuestCR3WriteConflict));
     
    403403                        if (uShw.pPD->a[iShw2].u & PGM_PDFLAGS_MAPPING)
    404404                        {
    405                             Assert(pgmMapAreMappingsEnabled(&pVM->pgm.s));
     405                            Assert(pgmMapAreMappingsEnabled(pVM));
    406406                            STAM_COUNTER_INC(&(pVCpu->pgm.s.CTX_SUFF(pStats)->StatRZGuestCR3WriteConflict));
    407407                            VMCPU_FF_SET(pVCpu, VMCPU_FF_PGM_SYNC_CR3);
     
    449449                if (uShw.pPDPae->a[iShw].u & PGM_PDFLAGS_MAPPING)
    450450                {
    451                     Assert(pgmMapAreMappingsEnabled(&pVM->pgm.s));
     451                    Assert(pgmMapAreMappingsEnabled(pVM));
    452452                    VMCPU_FF_SET(pVCpu, VMCPU_FF_PGM_SYNC_CR3);
    453453                    STAM_COUNTER_INC(&(pVCpu->pgm.s.CTX_SUFF(pStats)->StatRZGuestCR3WriteConflict));
     
    486486                        &&  uShw.pPDPae->a[iShw2].u & PGM_PDFLAGS_MAPPING)
    487487                    {
    488                         Assert(pgmMapAreMappingsEnabled(&pVM->pgm.s));
     488                        Assert(pgmMapAreMappingsEnabled(pVM));
    489489                        VMCPU_FF_SET(pVCpu, VMCPU_FF_PGM_SYNC_CR3);
    490490                        STAM_COUNTER_INC(&(pVCpu->pgm.s.CTX_SUFF(pStats)->StatRZGuestCR3WriteConflict));
     
    527527                    if (uShw.pPDPT->a[iShw].u & PGM_PLXFLAGS_MAPPING)
    528528                    {
    529                         Assert(pgmMapAreMappingsEnabled(&pVM->pgm.s));
     529                        Assert(pgmMapAreMappingsEnabled(pVM));
    530530                        STAM_COUNTER_INC(&(pVCpu->pgm.s.CTX_SUFF(pStats)->StatRZGuestCR3WriteConflict));
    531531                        VMCPU_FF_SET(pVCpu, VMCPU_FF_PGM_SYNC_CR3);
     
    558558                            if (uShw.pPDPT->a[iShw2].u & PGM_PLXFLAGS_MAPPING)
    559559                            {
    560                                 Assert(pgmMapAreMappingsEnabled(&pVM->pgm.s));
     560                                Assert(pgmMapAreMappingsEnabled(pVM));
    561561                                STAM_COUNTER_INC(&(pVCpu->pgm.s.CTX_SUFF(pStats)->StatRZGuestCR3WriteConflict));
    562562                                VMCPU_FF_SET(pVCpu, VMCPU_FF_PGM_SYNC_CR3);
     
    11251125        &&  pVCpu->pgm.s.cPoolAccessHandler == (pPage->cLastAccessHandlerCount + 1))
    11261126    {
    1127         Log(("Possible page reuse cMods=%d -> %d (locked=%d type=%s)\n", pPage->cModifications, pPage->cModifications * 2, pgmPoolIsPageLocked(&pVM->pgm.s, pPage), pgmPoolPoolKindToStr(pPage->enmKind)));
     1127        Log(("Possible page reuse cMods=%d -> %d (locked=%d type=%s)\n", pPage->cModifications, pPage->cModifications * 2, pgmPoolIsPageLocked(pPage), pgmPoolPoolKindToStr(pPage->enmKind)));
    11281128        Assert(pPage->cModifications < 32000);
    11291129        pPage->cModifications           = pPage->cModifications * 2;
     
    11381138
    11391139    if (pPage->cModifications >= cMaxModifications)
    1140         Log(("Mod overflow %RGv cMods=%d (locked=%d type=%s)\n", pvFault, pPage->cModifications, pgmPoolIsPageLocked(&pVM->pgm.s, pPage), pgmPoolPoolKindToStr(pPage->enmKind)));
     1140        Log(("Mod overflow %RGv cMods=%d (locked=%d type=%s)\n", pvFault, pPage->cModifications, pgmPoolIsPageLocked(pPage), pgmPoolPoolKindToStr(pPage->enmKind)));
    11411141
    11421142    /*
     
    11461146    bool fNotReusedNotForking = false;
    11471147    if (    (   pPage->cModifications < cMaxModifications   /** @todo #define */ /** @todo need to check that it's not mapping EIP. */ /** @todo adjust this! */
    1148              || pgmPoolIsPageLocked(&pVM->pgm.s, pPage)
     1148             || pgmPoolIsPageLocked(pPage)
    11491149            )
    11501150        &&  !(fReused = pgmPoolMonitorIsReused(pVM, pVCpu, pRegFrame, pDis, pvFault))
     
    12551255       )
    12561256    {
    1257         Assert(!pgmPoolIsPageLocked(&pVM->pgm.s, pPage));
     1257        Assert(!pgmPoolIsPageLocked(pPage));
    12581258        Assert(pPage->fDirty == false);
    12591259
     
    20232023         * Call pgmPoolCacheUsed to move the page to the head of the age list.
    20242024         */
    2025         if (!pgmPoolIsPageLocked(&pPool->CTX_SUFF(pVM)->pgm.s, pPage))
     2025        if (!pgmPoolIsPageLocked(pPage))
    20262026            break;
    20272027        LogFlow(("pgmPoolCacheFreeOne: refuse CR3 mapping\n"));
     
    34513451        if (GCPhysBase != GCPhysPage)
    34523452        {
    3453             pLargePage = pgmPhysGetPage(&pVM->pgm.s, GCPhysBase);
     3453            pLargePage = pgmPhysGetPage(pVM, GCPhysBase);
    34543454            AssertFatal(pLargePage);
    34553455        }
     
    37073707
    37083708    /* Safety precaution in case we change the paging for other modes too in the future. */
    3709     Assert(!pgmPoolIsPageLocked(&pPool->CTX_SUFF(pVM)->pgm.s, pPage));
     3709    Assert(!pgmPoolIsPageLocked(pPage));
    37103710
    37113711#ifdef VBOX_STRICT
     
    41484148 * Clear references to guest physical memory.
    41494149 *
    4150  * This is the same as pgmPoolTracDerefGCPhys except that the guest physical address
    4151  * is assumed to be correct, so the linear search can be skipped and we can assert
    4152  * at an earlier point.
     4150 * This is the same as pgmPoolTracDerefGCPhysHint except that the guest
     4151 * physical address is assumed to be correct, so the linear search can be
     4152 * skipped and we can assert at an earlier point.
    41534153 *
    41544154 * @param   pPool       The pool.
     
    41614161{
    41624162    /*
    4163      * Walk range list.
    4164      */
    4165     PPGMRAMRANGE pRam = pPool->CTX_SUFF(pVM)->pgm.s.CTX_SUFF(pRamRanges);
    4166     while (pRam)
    4167     {
    4168         RTGCPHYS off = GCPhys - pRam->GCPhys;
    4169         if (off < pRam->cb)
    4170         {
    4171             /* does it match? */
    4172             const unsigned iPage = off >> PAGE_SHIFT;
    4173             Assert(PGM_PAGE_GET_HCPHYS(&pRam->aPages[iPage]));
     4163     * Lookup the page and check if it checks out before derefing it.
     4164     */
     4165    PPGMPAGE pPhysPage = pgmPhysGetPage(pPool->CTX_SUFF(pVM), GCPhys);
     4166    if (pPhysPage)
     4167    {
     4168        Assert(PGM_PAGE_GET_HCPHYS(pPhysPage));
    41744169#ifdef LOG_ENABLED
    4175             RTHCPHYS HCPhysPage = PGM_PAGE_GET_HCPHYS(&pRam->aPages[iPage]);
    4176             Log2(("pgmPoolTracDerefGCPhys %RHp vs %RHp\n", HCPhysPage, HCPhys));
     4170        RTHCPHYS HCPhysPage = PGM_PAGE_GET_HCPHYS(pPhysPage);
     4171        Log2(("pgmPoolTracDerefGCPhys %RHp vs %RHp\n", HCPhysPage, HCPhys));
    41774172#endif
    4178             if (PGM_PAGE_GET_HCPHYS(&pRam->aPages[iPage]) == HCPhys)
    4179             {
    4180                 Assert(pPage->cPresent);
    4181                 Assert(pPool->cPresent);
    4182                 pPage->cPresent--;
    4183                 pPool->cPresent--;
    4184                 pgmTrackDerefGCPhys(pPool, pPage, &pRam->aPages[iPage], iPte);
    4185                 return;
    4186             }
    4187             AssertFatalMsgFailed(("HCPhys=%RHp GCPhys=%RGp; found page index %x HCPhys=%RHp\n", HCPhys, GCPhys, iPage, PGM_PAGE_GET_HCPHYS(&pRam->aPages[iPage])));
    4188             break;
    4189         }
    4190         pRam = pRam->CTX_SUFF(pNext);
     4173        if (PGM_PAGE_GET_HCPHYS(pPhysPage) == HCPhys)
     4174        {
     4175            Assert(pPage->cPresent);
     4176            Assert(pPool->cPresent);
     4177            pPage->cPresent--;
     4178            pPool->cPresent--;
     4179            pgmTrackDerefGCPhys(pPool, pPage, pPhysPage, iPte);
     4180            return;
     4181        }
     4182
     4183        AssertFatalMsgFailed(("HCPhys=%RHp GCPhys=%RGp; found page has HCPhys=%RHp\n",
     4184                              HCPhys, GCPhys, PGM_PAGE_GET_HCPHYS(pPhysPage)));
    41914185    }
    41924186    AssertFatalMsgFailed(("HCPhys=%RHp GCPhys=%RGp\n", HCPhys, GCPhys));
     
    42054199void pgmPoolTracDerefGCPhysHint(PPGMPOOL pPool, PPGMPOOLPAGE pPage, RTHCPHYS HCPhys, RTGCPHYS GCPhysHint, uint16_t iPte)
    42064200{
    4207     RTHCPHYS HCPhysExpected = 0xDEADBEEFDEADBEEFULL;
    4208 
    42094201    Log4(("pgmPoolTracDerefGCPhysHint %RHp %RGp\n", HCPhys, GCPhysHint));
    42104202
    42114203    /*
    4212      * Walk range list.
    4213      */
    4214     PPGMRAMRANGE pRam = pPool->CTX_SUFF(pVM)->pgm.s.CTX_SUFF(pRamRanges);
    4215     while (pRam)
    4216     {
    4217         RTGCPHYS off = GCPhysHint - pRam->GCPhys;
    4218         if (off < pRam->cb)
    4219         {
    4220             /* does it match? */
    4221             const unsigned iPage = off >> PAGE_SHIFT;
    4222             Assert(PGM_PAGE_GET_HCPHYS(&pRam->aPages[iPage]));
    4223             if (PGM_PAGE_GET_HCPHYS(&pRam->aPages[iPage]) == HCPhys)
    4224             {
    4225                 Assert(pPage->cPresent);
    4226                 Assert(pPool->cPresent);
    4227                 pPage->cPresent--;
    4228                 pPool->cPresent--;
    4229                 pgmTrackDerefGCPhys(pPool, pPage, &pRam->aPages[iPage], iPte);
    4230                 return;
    4231             }
    4232             HCPhysExpected = PGM_PAGE_GET_HCPHYS(&pRam->aPages[iPage]);
    4233             break;
    4234         }
    4235         pRam = pRam->CTX_SUFF(pNext);
    4236     }
    4237 
    4238     /*
    4239      * Damn, the hint didn't work. We'll have to do an expensive linear search.
     4204     * Try the hint first.
     4205     */
     4206    RTHCPHYS HCPhysHinted;
     4207    PPGMPAGE pPhysPage = pgmPhysGetPage(pPool->CTX_SUFF(pVM), GCPhysHint);
     4208    if (pPhysPage)
     4209    {
     4210        HCPhysHinted = PGM_PAGE_GET_HCPHYS(pPhysPage);
     4211        Assert(HCPhysHinted);
     4212        if (HCPhysHinted == HCPhys)
     4213        {
     4214            Assert(pPage->cPresent);
     4215            Assert(pPool->cPresent);
     4216            pPage->cPresent--;
     4217            pPool->cPresent--;
     4218            pgmTrackDerefGCPhys(pPool, pPage, pPhysPage, iPte);
     4219            return;
     4220        }
     4221    }
     4222    else
     4223        HCPhysHinted = UINT64_C(0xdeadbeefdeadbeef);
     4224
     4225    /*
     4226     * Damn, the hint didn't work.  We'll have to do an expensive linear search.
    42404227     */
    42414228    STAM_COUNTER_INC(&pPool->StatTrackLinearRamSearches);
    4242     pRam = pPool->CTX_SUFF(pVM)->pgm.s.CTX_SUFF(pRamRanges);
     4229    PPGMRAMRANGE pRam = pPool->CTX_SUFF(pVM)->pgm.s.CTX_SUFF(pRamRangesX);
    42434230    while (pRam)
    42444231    {
     
    42614248    }
    42624249
    4263     AssertFatalMsgFailed(("HCPhys=%RHp GCPhysHint=%RGp (Expected HCPhys with hint = %RHp)\n", HCPhys, GCPhysHint, HCPhysExpected));
     4250    AssertFatalMsgFailed(("HCPhys=%RHp GCPhysHint=%RGp (Hinted page has HCPhys = %RHp)\n", HCPhys, GCPhysHint, HCPhysHinted));
    42644251}
    42654252
     
    47784765     * Quietly reject any attempts at flushing the currently active shadow CR3 mapping
    47794766     */
    4780     if (pgmPoolIsPageLocked(&pVM->pgm.s, pPage))
     4767    if (pgmPoolIsPageLocked(pPage))
    47814768    {
    47824769        AssertMsg(   pPage->enmKind == PGMPOOLKIND_64BIT_PML4
     
    51845171#endif
    51855172                        STAM_COUNTER_INC(&pPool->StatForceFlushPage);
    5186                     Assert(!pgmPoolIsPageLocked(&pVM->pgm.s, pPage));
     5173                    Assert(!pgmPoolIsPageLocked(pPage));
    51875174                    pgmPoolMonitorChainFlush(pPool, pPage);
    51885175                    return;
     
    53285315     * Clear all the GCPhys links and rebuild the phys ext free list.
    53295316     */
    5330     for (PPGMRAMRANGE pRam = pVM->pgm.s.CTX_SUFF(pRamRanges);
     5317    for (PPGMRAMRANGE pRam = pVM->pgm.s.CTX_SUFF(pRamRangesX);
    53315318         pRam;
    53325319         pRam = pRam->CTX_SUFF(pNext))
  • trunk/src/VBox/VMM/VMMAll/PGMAllShw.h

    r32036 r36891  
    301301        AssertFailed(); /* can't happen */
    302302# else
    303         Assert(pgmMapAreMappingsEnabled(&pVM->pgm.s));
     303        Assert(pgmMapAreMappingsEnabled(pVM));
    304304
    305305        PPGMMAPPING pMap = pgmGetMapping(pVM, (RTGCPTR)GCPtr);
     
    462462                    {
    463463                        Assert(fGstPte & X86_PTE_RW);
    464                         PPGMPAGE pPage = pgmPhysGetPage(&pVCpu->CTX_SUFF(pVM)->pgm.s, GCPhys);
     464                        PPGMPAGE pPage = pgmPhysGetPage(pVM, GCPhys);
    465465                        Assert(pPage);
    466466                        if (pPage)
  • trunk/src/VBox/VMM/VMMR0/PGMR0.cpp

    r36448 r36891  
    334334        if (RT_SUCCESS(rc))
    335335        {
    336             for (PPGMRAMRANGE pRam = pVM->pgm.s.pRamRangesR0; RT_SUCCESS(rc) && pRam; pRam = pRam->pNextR0)
     336            for (PPGMRAMRANGE pRam = pVM->pgm.s.pRamRangesXR0; RT_SUCCESS(rc) && pRam; pRam = pRam->pNextR0)
    337337            {
    338338                PPGMPAGE    pPage  = &pRam->aPages[0];
     
    526526        if (   (   pHandler->cAliasedPages
    527527                || pHandler->cTmpOffPages)
    528             && (   (pPage = pgmPhysGetPage(&pVM->pgm.s, GCPhysFault)) == NULL
     528            && (   (pPage = pgmPhysGetPage(pVM, GCPhysFault)) == NULL
    529529                || PGM_PAGE_GET_HNDL_PHYS_STATE(pPage) == PGM_PAGE_HNDL_PHYS_STATE_DISABLED)
    530530           )
  • trunk/src/VBox/VMM/VMMR0/PGMR0SharedPage.cpp

    r35346 r36891  
    6161        Assert((pRegions[idxRegion].GCRegionAddr & 0xfff) == 0);
    6262
    63         RTGCPTR  GCRegion  = pRegions[idxRegion].GCRegionAddr;
     63        RTGCPTR  GCRegion = pRegions[idxRegion].GCRegionAddr;
    6464        unsigned cbRegion = pRegions[idxRegion].cbRegion & ~0xfff;
    65         unsigned idxPage = 0;
     65        unsigned idxPage  = 0;
    6666
    6767        while (cbRegion)
     
    7575                &&  !(fFlags & X86_PTE_RW)) /* important as we make assumptions about this below! */
    7676            {
    77                 PPGMPAGE pPage = pgmPhysGetPage(&pVM->pgm.s, GCPhys);
     77                PPGMPAGE pPage = pgmPhysGetPage(pVM, GCPhys);
    7878                Assert(!pPage || !PGM_PAGE_IS_BALLOONED(pPage));
    7979                if (    pPage
  • trunk/src/VBox/VMM/VMMR3/PGM.cpp

    r36627 r36891  
    16951695    PGM_REG_COUNTER(&pStats->StatPageMapTlbFlushes,             "/PGM/R3/Page/MapTlbFlushes",         "TLB flushes (all contexts).");
    16961696    PGM_REG_COUNTER(&pStats->StatPageMapTlbFlushEntry,          "/PGM/R3/Page/MapTlbFlushEntry",      "TLB entry flushes (all contexts).");
     1697
     1698    PGM_REG_COUNTER(&pStats->StatRZRamRangeTlbHits,             "/PGM/RZ/RamRange/TlbHits",           "TLB hits.");
     1699    PGM_REG_COUNTER(&pStats->StatRZRamRangeTlbMisses,           "/PGM/RZ/RamRange/TlbMisses",         "TLB misses.");
     1700    PGM_REG_COUNTER(&pStats->StatR3RamRangeTlbHits,             "/PGM/R3/RamRange/TlbHits",           "TLB hits.");
     1701    PGM_REG_COUNTER(&pStats->StatR3RamRangeTlbMisses,           "/PGM/R3/RamRange/TlbMisses",         "TLB misses.");
    16971702
    16981703    PGM_REG_PROFILE(&pStats->StatRZSyncCR3HandlerVirtualUpdate, "/PGM/RZ/SyncCR3/Handlers/VirtualUpdate", "Profiling of the virtual handler updates.");
     
    22242229     * Ram ranges.
    22252230     */
    2226     if (pVM->pgm.s.pRamRangesR3)
     2231    if (pVM->pgm.s.pRamRangesXR3)
    22272232    {
    22282233        /* Update the pSelfRC pointers and relink them. */
    2229         for (PPGMRAMRANGE pCur = pVM->pgm.s.pRamRangesR3; pCur; pCur = pCur->pNextR3)
     2234        for (PPGMRAMRANGE pCur = pVM->pgm.s.pRamRangesXR3; pCur; pCur = pCur->pNextR3)
    22302235            if (!(pCur->fFlags & PGM_RAM_RANGE_FLAGS_FLOATING))
    22312236                pCur->pSelfRC = MMHyperCCToRC(pVM, pCur);
    22322237        pgmR3PhysRelinkRamRanges(pVM);
     2238
     2239#ifdef PGM_USE_RAMRANGE_TLB
     2240        /* Flush the RC TLB. */
     2241        for (unsigned i = 0; i < PGM_RAMRANGE_TLB_ENTRIES; i++)
     2242            pVM->pgm.s.apRamRangesTlbRC[i] = NIL_RTRCPTR;
     2243#endif
    22332244    }
    22342245
     
    26072618                    sizeof(RTHCPTR) * 2,      "pvHC            ");
    26082619
    2609     for (PPGMRAMRANGE pCur = pVM->pgm.s.pRamRangesR3; pCur; pCur = pCur->pNextR3)
     2620    for (PPGMRAMRANGE pCur = pVM->pgm.s.pRamRangesXR3; pCur; pCur = pCur->pNextR3)
    26102621        pHlp->pfnPrintf(pHlp,
    26112622                        "%RGp-%RGp %RHv %s\n",
     
    26562667                                "%04X - %RGp P=%d U=%d RW=%d G=%d - BIG\n",
    26572668                                iPD,
    2658                                 pgmGstGet4MBPhysPage(&pVM->pgm.s, PdeSrc),
     2669                                pgmGstGet4MBPhysPage(pVM, PdeSrc),
    26592670                                PdeSrc.b.u1Present, PdeSrc.b.u1User, PdeSrc.b.u1Write, PdeSrc.b.u1Global && fPGE);
    26602671            else
     
    35903601    if (!pVM)
    35913602        return pCmdHlp->pfnPrintf(pCmdHlp, NULL, "error: The command requires a VM to be selected.\n");
    3592     if (!pVM->pgm.s.pRamRangesRC)
     3603    if (!pVM->pgm.s.pRamRangesXR3)
    35933604        return pCmdHlp->pfnPrintf(pCmdHlp, NULL, "Sorry, no Ram is registered.\n");
    35943605
     
    35983609    int rc = pCmdHlp->pfnPrintf(pCmdHlp, NULL, "From     - To (incl) pvHC\n");
    35993610    PPGMRAMRANGE pRam;
    3600     for (pRam = pVM->pgm.s.pRamRangesR3; pRam; pRam = pRam->pNextR3)
     3611    for (pRam = pVM->pgm.s.pRamRangesXR3; pRam; pRam = pRam->pNextR3)
    36013612    {
    36023613        rc = pCmdHlp->pfnPrintf(pCmdHlp, NULL,
     
    38143825
    38153826    pgmLock(pVM);
    3816     for (PPGMRAMRANGE pRam = pVM->pgm.s.pRamRangesR3;
    3817           pRam && pRam->GCPhys < GCPhysEnd && RT_SUCCESS(rc);
    3818           pRam = pRam->pNextR3)
     3827    for (PPGMRAMRANGE pRam = pVM->pgm.s.pRamRangesXR3;
     3828         pRam && pRam->GCPhys < GCPhysEnd && RT_SUCCESS(rc);
     3829         pRam = pRam->pNextR3)
    38193830    {
    38203831        /* fill the gap */
  • trunk/src/VBox/VMM/VMMR3/PGMDbg.cpp

    r35346 r36891  
    160160        return VERR_INVALID_POINTER;
    161161
    162     for (PPGMRAMRANGE pRam = pVM->pgm.s.CTX_SUFF(pRamRanges);
     162    for (PPGMRAMRANGE pRam = pVM->pgm.s.CTX_SUFF(pRamRangesX);
    163163         pRam;
    164164         pRam = pRam->CTX_SUFF(pNext))
     
    622622     */
    623623    pgmLock(pVM);
    624     for (PPGMRAMRANGE pRam = pVM->pgm.s.CTX_SUFF(pRamRanges);
     624    for (PPGMRAMRANGE pRam = pVM->pgm.s.CTX_SUFF(pRamRangesX);
    625625         pRam;
    626626         pRam = pRam->CTX_SUFF(pNext))
     
    793793        if (RT_SUCCESS(rc))
    794794        {
    795             PPGMPAGE pPage = pgmPhysGetPage(&pVM->pgm.s, GCPhys);
     795            PPGMPAGE pPage = pgmPhysGetPage(pVM, GCPhys);
    796796            if (    pPage
    797797                &&  (   !PGM_PAGE_IS_ZERO(pPage)
     
    10411041    {
    10421042        pgmLock(pState->pVM);
    1043         PCPGMPAGE pPage = pgmPhysGetPage(&pState->pVM->pgm.s, GCPhys);
     1043        PCPGMPAGE pPage = pgmPhysGetPage(pState->pVM, GCPhys);
    10441044        if (pPage)
    10451045            RTStrPrintf(szPage, sizeof(szPage), "%R[pgmpage]", pPage);
     
    17191719    char szPage[80];
    17201720    pgmLock(pState->pVM);
    1721     PCPGMPAGE pPage = pgmPhysGetPage(&pState->pVM->pgm.s, GCPhys);
     1721    PCPGMPAGE pPage = pgmPhysGetPage(pState->pVM, GCPhys);
    17221722    if (pPage)
    17231723        RTStrPrintf(szPage, sizeof(szPage), " %R[pgmpage]", pPage);
  • trunk/src/VBox/VMM/VMMR3/PGMHandler.cpp

    r35346 r36891  
    160160static DECLCALLBACK(int) pgmR3HandlerPhysicalOneClear(PAVLROGCPHYSNODECORE pNode, void *pvUser)
    161161{
    162     PPGMPHYSHANDLER pCur = (PPGMPHYSHANDLER)pNode;
     162    PPGMPHYSHANDLER pCur     = (PPGMPHYSHANDLER)pNode;
    163163    PPGMRAMRANGE    pRamHint = NULL;
    164     RTGCPHYS        GCPhys = pCur->Core.Key;
    165     RTUINT          cPages = pCur->cPages;
    166     PPGM            pPGM = &((PVM)pvUser)->pgm.s;
     164    RTGCPHYS        GCPhys   = pCur->Core.Key;
     165    RTUINT          cPages   = pCur->cPages;
     166    PVM             pVM      = (PVM)pvUser;
    167167    for (;;)
    168168    {
    169169        PPGMPAGE pPage;
    170         int rc = pgmPhysGetPageWithHintEx(pPGM, GCPhys, &pPage, &pRamHint);
     170        int rc = pgmPhysGetPageWithHintEx(pVM, GCPhys, &pPage, &pRamHint);
    171171        if (RT_SUCCESS(rc))
    172172            PGM_PAGE_SET_HNDL_PHYS_STATE(pPage, PGM_PAGE_HNDL_PHYS_STATE_NONE);
     
    190190static DECLCALLBACK(int) pgmR3HandlerPhysicalOneSet(PAVLROGCPHYSNODECORE pNode, void *pvUser)
    191191{
    192     PPGMPHYSHANDLER pCur = (PPGMPHYSHANDLER)pNode;
    193     unsigned        uState = pgmHandlerPhysicalCalcState(pCur);
     192    PPGMPHYSHANDLER pCur     = (PPGMPHYSHANDLER)pNode;
     193    unsigned        uState   = pgmHandlerPhysicalCalcState(pCur);
    194194    PPGMRAMRANGE    pRamHint = NULL;
    195     RTGCPHYS        GCPhys = pCur->Core.Key;
    196     RTUINT          cPages = pCur->cPages;
    197     PPGM            pPGM = &((PVM)pvUser)->pgm.s;
     195    RTGCPHYS        GCPhys   = pCur->Core.Key;
     196    RTUINT          cPages   = pCur->cPages;
     197    PVM             pVM      = (PVM)pvUser;
    198198    for (;;)
    199199    {
    200200        PPGMPAGE pPage;
    201         int rc = pgmPhysGetPageWithHintEx(pPGM, GCPhys, &pPage, &pRamHint);
     201        int rc = pgmPhysGetPageWithHintEx(pVM, GCPhys, &pPage, &pRamHint);
    202202        if (RT_SUCCESS(rc))
    203203            PGM_PAGE_SET_HNDL_PHYS_STATE(pPage, uState);
     
    471471         * Reset the flags and remove phys2virt nodes.
    472472         */
    473         PPGM pPGM = &pVM->pgm.s;
    474         for (unsigned iPage = 0; iPage < pCur->cPages; iPage++)
     473        for (uint32_t iPage = 0; iPage < pCur->cPages; iPage++)
    475474            if (pCur->aPhysToVirt[iPage].offNextAlias & PGMPHYS2VIRTHANDLER_IN_TREE)
    476                 pgmHandlerVirtualClearPage(pPGM, pCur, iPage);
     475                pgmHandlerVirtualClearPage(pVM, pCur, iPage);
    477476
    478477        /*
  • trunk/src/VBox/VMM/VMMR3/PGMMap.cpp

    r35346 r36891  
    510510     * Ignore the additions mapping fix call if disabled.
    511511     */
    512     if (!pgmMapAreMappingsEnabled(&pVM->pgm.s))
     512    if (!pgmMapAreMappingsEnabled(pVM))
    513513    {
    514514        Assert(HWACCMIsEnabled(pVM));
     
    551551    AssertMsgReturn(cb && !(cb & X86_PAGE_4M_OFFSET_MASK), ("cb (%#x) is 0 or not aligned on a 4MB address!\n", cb),
    552552                    VERR_INVALID_PARAMETER);
    553     AssertReturn(pgmMapAreMappingsEnabled(&pVM->pgm.s), VERR_INTERNAL_ERROR_3);
     553    AssertReturn(pgmMapAreMappingsEnabled(pVM), VERR_INTERNAL_ERROR_3);
    554554    AssertReturn(pVM->cCpus == 1, VERR_INTERNAL_ERROR_4);
    555555
     
    726726{
    727727    Log(("PGMR3MappingsUnfix: fMappingsFixed=%RTbool fMappingsDisabled=%RTbool\n", pVM->pgm.s.fMappingsFixed, pVM->pgm.s.fMappingsDisabled));
    728     if (   pgmMapAreMappingsEnabled(&pVM->pgm.s)
     728    if (   pgmMapAreMappingsEnabled(pVM)
    729729        && (    pVM->pgm.s.fMappingsFixed
    730730            ||  pVM->pgm.s.fMappingsFixedRestored)
     
    10201020    pgmLock(pVM);                           /* to avoid assertions */
    10211021
    1022     Assert(!pgmMapAreMappingsEnabled(&pVM->pgm.s) || PGMGetGuestMode(pVCpu) <= PGMMODE_PAE_NX);
     1022    Assert(!pgmMapAreMappingsEnabled(pVM) || PGMGetGuestMode(pVCpu) <= PGMMODE_PAE_NX);
    10231023
    10241024    pgmMapSetShadowPDEs(pVM, pMap, iNewPDE);
  • trunk/src/VBox/VMM/VMMR3/PGMPhys.cpp

    r36441 r36891  
    119119     * Copy loop on ram ranges.
    120120     */
    121     PPGMRAMRANGE pRam = pVM->pgm.s.CTX_SUFF(pRamRanges);
     121    PPGMRAMRANGE pRam = pgmPhysGetRangeAtOrAbove(pVM, GCPhys);
    122122    for (;;)
    123123    {
    124         /* Find range. */
    125         while (pRam && GCPhys > pRam->GCPhysLast)
    126             pRam = pRam->CTX_SUFF(pNext);
    127124        /* Inside range or not? */
    128125        if (pRam && GCPhys >= pRam->GCPhys)
     
    186183             * Unassigned address space.
    187184             */
    188             if (!pRam)
    189                 break;
    190             size_t cb = pRam->GCPhys - GCPhys;
     185            size_t cb = pRam ? pRam->GCPhys - GCPhys : ~(size_t)0;
    191186            if (cb >= cbRead)
    192187            {
     
    200195            GCPhys += cb;
    201196        }
     197
     198        /* Advance range if necessary. */
     199        while (pRam && GCPhys > pRam->GCPhysLast)
     200            pRam = pRam->CTX_SUFF(pNext);
    202201    } /* Ram range walk */
    203202
     
    250249     * Copy loop on ram ranges, stop when we hit something difficult.
    251250     */
    252     PPGMRAMRANGE    pRam = pVM->pgm.s.CTX_SUFF(pRamRanges);
     251    PPGMRAMRANGE pRam = pgmPhysGetRangeAtOrAbove(pVM, GCPhys);
    253252    for (;;)
    254253    {
    255         /* Find range. */
    256         while (pRam && GCPhys > pRam->GCPhysLast)
    257             pRam = pRam->CTX_SUFF(pNext);
    258254        /* Inside range or not? */
    259255        if (pRam && GCPhys >= pRam->GCPhys)
     
    332328            GCPhys += cb;
    333329        }
     330
     331        /* Advance range if necessary. */
     332        while (pRam && GCPhys > pRam->GCPhysLast)
     333            pRam = pRam->CTX_SUFF(pNext);
    334334    } /* Ram range walk */
    335335
     
    361361    {
    362362        PPGMPAGEMAPTLBE pTlbe;
    363         int rc2 = pgmPhysPageQueryTlbe(&pVM->pgm.s, *pGCPhys, &pTlbe);
     363        int rc2 = pgmPhysPageQueryTlbe(pVM, *pGCPhys, &pTlbe);
    364364        AssertFatalRC(rc2);
    365365        PPGMPAGE pPage = pTlbe->pPage;
     
    431431     */
    432432    PPGMPAGEMAPTLBE pTlbe;
    433     rc = pgmPhysPageQueryTlbe(&pVM->pgm.s, GCPhys, &pTlbe);
     433    rc = pgmPhysPageQueryTlbe(pVM, GCPhys, &pTlbe);
    434434    if (RT_SUCCESS(rc))
    435435    {
     
    532532     */
    533533    PPGMPAGEMAPTLBE pTlbe;
    534     rc = pgmPhysPageQueryTlbe(&pVM->pgm.s, GCPhys, &pTlbe);
     534    rc = pgmPhysPageQueryTlbe(pVM, GCPhys, &pTlbe);
    535535    if (RT_SUCCESS(rc))
    536536    {
     
    591591
    592592#ifdef VBOX_STRICT
    593     for (pCur = pVM->pgm.s.pRamRangesR3; pCur; pCur = pCur->pNextR3)
     593    for (pCur = pVM->pgm.s.pRamRangesXR3; pCur; pCur = pCur->pNextR3)
    594594    {
    595595        Assert((pCur->fFlags & PGM_RAM_RANGE_FLAGS_FLOATING) || pCur->pSelfR0 == MMHyperCCToR0(pVM, pCur));
     
    599599        Assert((pCur->cb         & PAGE_OFFSET_MASK) == 0);
    600600        Assert(pCur->cb == pCur->GCPhysLast - pCur->GCPhys + 1);
    601         for (PPGMRAMRANGE pCur2 = pVM->pgm.s.pRamRangesR3; pCur2; pCur2 = pCur2->pNextR3)
     601        for (PPGMRAMRANGE pCur2 = pVM->pgm.s.pRamRangesXR3; pCur2; pCur2 = pCur2->pNextR3)
    602602            Assert(   pCur2 == pCur
    603603                   || strcmp(pCur2->pszDesc, pCur->pszDesc)); /** @todo fix MMIO ranges!! */
     
    605605#endif
    606606
    607     pCur = pVM->pgm.s.pRamRangesR3;
     607    pCur = pVM->pgm.s.pRamRangesXR3;
    608608    if (pCur)
    609609    {
    610         pVM->pgm.s.pRamRangesR0 = pCur->pSelfR0;
    611         pVM->pgm.s.pRamRangesRC = pCur->pSelfRC;
     610        pVM->pgm.s.pRamRangesXR0 = pCur->pSelfR0;
     611        pVM->pgm.s.pRamRangesXRC = pCur->pSelfRC;
    612612
    613613        for (; pCur->pNextR3; pCur = pCur->pNextR3)
     
    622622    else
    623623    {
    624         Assert(pVM->pgm.s.pRamRangesR0 == NIL_RTR0PTR);
    625         Assert(pVM->pgm.s.pRamRangesRC == NIL_RTRCPTR);
     624        Assert(pVM->pgm.s.pRamRangesXR0 == NIL_RTR0PTR);
     625        Assert(pVM->pgm.s.pRamRangesXRC == NIL_RTRCPTR);
    626626    }
    627627    ASMAtomicIncU32(&pVM->pgm.s.idRamRangesGen);
     
    644644    pgmLock(pVM);
    645645
    646     PPGMRAMRANGE pRam = pPrev ? pPrev->pNextR3 : pVM->pgm.s.pRamRangesR3;
     646    PPGMRAMRANGE pRam = pPrev ? pPrev->pNextR3 : pVM->pgm.s.pRamRangesXR3;
    647647    pNew->pNextR3 = pRam;
    648648    pNew->pNextR0 = pRam ? pRam->pSelfR0 : NIL_RTR0PTR;
     
    657657    else
    658658    {
    659         pVM->pgm.s.pRamRangesR3 = pNew;
    660         pVM->pgm.s.pRamRangesR0 = pNew->pSelfR0;
    661         pVM->pgm.s.pRamRangesRC = pNew->pSelfRC;
     659        pVM->pgm.s.pRamRangesXR3 = pNew;
     660        pVM->pgm.s.pRamRangesXR0 = pNew->pSelfR0;
     661        pVM->pgm.s.pRamRangesXRC = pNew->pSelfRC;
    662662    }
    663663    ASMAtomicIncU32(&pVM->pgm.s.idRamRangesGen);
     
    675675static void pgmR3PhysUnlinkRamRange2(PVM pVM, PPGMRAMRANGE pRam, PPGMRAMRANGE pPrev)
    676676{
    677     Assert(pPrev ? pPrev->pNextR3 == pRam : pVM->pgm.s.pRamRangesR3 == pRam);
     677    Assert(pPrev ? pPrev->pNextR3 == pRam : pVM->pgm.s.pRamRangesXR3 == pRam);
    678678    Assert((pRam->fFlags & PGM_RAM_RANGE_FLAGS_FLOATING) || pRam->pSelfR0 == MMHyperCCToR0(pVM, pRam));
    679679    Assert((pRam->fFlags & PGM_RAM_RANGE_FLAGS_FLOATING) || pRam->pSelfRC == MMHyperCCToRC(pVM, pRam));
     
    690690    else
    691691    {
    692         Assert(pVM->pgm.s.pRamRangesR3 == pRam);
    693         pVM->pgm.s.pRamRangesR3 = pNext;
    694         pVM->pgm.s.pRamRangesR0 = pNext ? pNext->pSelfR0 : NIL_RTR0PTR;
    695         pVM->pgm.s.pRamRangesRC = pNext ? pNext->pSelfRC : NIL_RTRCPTR;
     692        Assert(pVM->pgm.s.pRamRangesXR3 == pRam);
     693        pVM->pgm.s.pRamRangesXR3 = pNext;
     694        pVM->pgm.s.pRamRangesXR0 = pNext ? pNext->pSelfR0 : NIL_RTR0PTR;
     695        pVM->pgm.s.pRamRangesXRC = pNext ? pNext->pSelfRC : NIL_RTRCPTR;
    696696    }
    697697    ASMAtomicIncU32(&pVM->pgm.s.idRamRangesGen);
     
    712712    /* find prev. */
    713713    PPGMRAMRANGE pPrev = NULL;
    714     PPGMRAMRANGE pCur = pVM->pgm.s.pRamRangesR3;
     714    PPGMRAMRANGE pCur = pVM->pgm.s.pRamRangesXR3;
    715715    while (pCur != pRam)
    716716    {
     
    809809        for (unsigned i = 0; i < cPages; i++)
    810810        {
    811             PPGMPAGE pPage = pgmPhysGetPage(&pVM->pgm.s, paPhysPage[i]);
     811            PPGMPAGE pPage = pgmPhysGetPage(pVM, paPhysPage[i]);
    812812            if (    pPage == NULL
    813813                ||  pPage->uTypeY != PGMPAGETYPE_RAM)
     
    850850        for (unsigned i = 0; i < cPages; i++)
    851851        {
    852             PPGMPAGE pPage = pgmPhysGetPage(&pVM->pgm.s, paPhysPage[i]);
     852            PPGMPAGE pPage = pgmPhysGetPage(pVM, paPhysPage[i]);
    853853            AssertBreak(pPage && pPage->uTypeY == PGMPAGETYPE_RAM);
    854854
     
    960960
    961961/**
    962  * Rendezvous callback used by PGMR3WriteProtectRAM that write protects all physical RAM
     962 * Rendezvous callback used by PGMR3WriteProtectRAM that write protects all
     963 * physical RAM.
    963964 *
    964965 * This is only called on one of the EMTs while the other ones are waiting for
     
    968969 * @param   pVM         The VM handle.
    969970 * @param   pVCpu       The VMCPU for the EMT we're being called on. Unused.
    970  * @param   pvUser      User parameter
     971 * @param   pvUser      User parameter, unused.
    971972 */
    972973static DECLCALLBACK(VBOXSTRICTRC) pgmR3PhysWriteProtectRAMRendezvous(PVM pVM, PVMCPU pVCpu, void *pvUser)
    973974{
    974975    int rc = VINF_SUCCESS;
     976    NOREF(pvUser);
    975977
    976978    pgmLock(pVM);
     
    981983    /** @todo pointless to write protect the physical page pointed to by RSP. */
    982984
    983     for (PPGMRAMRANGE pRam = pVM->pgm.s.CTX_SUFF(pRamRanges);
     985    for (PPGMRAMRANGE pRam = pVM->pgm.s.CTX_SUFF(pRamRangesX);
    984986         pRam;
    985987         pRam = pRam->CTX_SUFF(pNext))
    986988    {
    987         unsigned cPages = pRam->cb >> PAGE_SHIFT;
    988         for (unsigned iPage = 0; iPage < cPages; iPage++)
     989        uint32_t cPages = pRam->cb >> PAGE_SHIFT;
     990        for (uint32_t iPage = 0; iPage < cPages; iPage++)
    989991        {
    990992            PPGMPAGE    pPage = &pRam->aPages[iPage];
     
    10481050
    10491051/**
    1050  * Enumerate all dirty FT pages
     1052 * Enumerate all dirty FT pages.
    10511053 *
    10521054 * @returns VBox status code.
    10531055 * @param   pVM         The VM handle.
    1054  * @param   pfnEnum     Enumerate callback handler
    1055  * @param   pvUser      Enumerate callback handler parameter
     1056 * @param   pfnEnum     Enumerate callback handler.
     1057 * @param   pvUser      Enumerate callback handler parameter.
    10561058 */
    10571059VMMR3DECL(int) PGMR3PhysEnumDirtyFTPages(PVM pVM, PFNPGMENUMDIRTYFTPAGES pfnEnum, void *pvUser)
     
    10601062
    10611063    pgmLock(pVM);
    1062     for (PPGMRAMRANGE pRam = pVM->pgm.s.CTX_SUFF(pRamRanges);
     1064    for (PPGMRAMRANGE pRam = pVM->pgm.s.CTX_SUFF(pRamRangesX);
    10631065         pRam;
    10641066         pRam = pRam->CTX_SUFF(pNext))
    10651067    {
    1066         unsigned cPages = pRam->cb >> PAGE_SHIFT;
    1067         for (unsigned iPage = 0; iPage < cPages; iPage++)
    1068         {
    1069             PPGMPAGE    pPage = &pRam->aPages[iPage];
     1068        uint32_t cPages = pRam->cb >> PAGE_SHIFT;
     1069        for (uint32_t iPage = 0; iPage < cPages; iPage++)
     1070        {
     1071            PPGMPAGE    pPage       = &pRam->aPages[iPage];
    10701072            PGMPAGETYPE enmPageType = (PGMPAGETYPE)PGM_PAGE_GET_TYPE(pPage);
    10711073
     
    10741076            {
    10751077                /*
    1076                     * A RAM page.
    1077                     */
     1078                 * A RAM page.
     1079                 */
    10781080                switch (PGM_PAGE_GET_STATE(pPage))
    10791081                {
    1080                 case PGM_PAGE_STATE_ALLOCATED:
    1081                 case PGM_PAGE_STATE_WRITE_MONITORED:
    1082                     if (    !PGM_PAGE_IS_WRITTEN_TO(pPage)  /* not very recently updated? */
    1083                         &&  PGM_PAGE_IS_FT_DIRTY(pPage))
    1084                     {
    1085                         unsigned       cbPageRange = PAGE_SIZE;
    1086                         unsigned       iPageClean  = iPage + 1;
    1087                         RTGCPHYS       GCPhysPage  = pRam->GCPhys + iPage * PAGE_SIZE;
    1088                         uint8_t       *pu8Page     = NULL;
    1089                         PGMPAGEMAPLOCK Lock;
    1090 
    1091                         /* Find the next clean page, so we can merge adjacent dirty pages. */
    1092                         for (; iPageClean < cPages; iPageClean++)
     1082                    case PGM_PAGE_STATE_ALLOCATED:
     1083                    case PGM_PAGE_STATE_WRITE_MONITORED:
     1084                        if (   !PGM_PAGE_IS_WRITTEN_TO(pPage)  /* not very recently updated? */
     1085                            && PGM_PAGE_IS_FT_DIRTY(pPage))
    10931086                        {
    1094                             PPGMPAGE pPageNext = &pRam->aPages[iPageClean];
    1095                             if (    RT_UNLIKELY(PGM_PAGE_GET_TYPE(pPageNext) != PGMPAGETYPE_RAM)
    1096                                 ||  PGM_PAGE_GET_STATE(pPageNext) != PGM_PAGE_STATE_ALLOCATED
    1097                                 ||  PGM_PAGE_IS_WRITTEN_TO(pPageNext)
    1098                                 ||  !PGM_PAGE_IS_FT_DIRTY(pPageNext)
    1099                                 /* Crossing a chunk boundary? */
    1100                                 ||  (GCPhysPage & GMM_PAGEID_IDX_MASK) != ((GCPhysPage + cbPageRange) & GMM_PAGEID_IDX_MASK)
    1101                                 )
    1102                                 break;
    1103 
    1104                             cbPageRange += PAGE_SIZE;
     1087                            unsigned       cbPageRange = PAGE_SIZE;
     1088                            unsigned       iPageClean  = iPage + 1;
     1089                            RTGCPHYS       GCPhysPage  = pRam->GCPhys + iPage * PAGE_SIZE;
     1090                            uint8_t       *pu8Page     = NULL;
     1091                            PGMPAGEMAPLOCK Lock;
     1092
     1093                            /* Find the next clean page, so we can merge adjacent dirty pages. */
     1094                            for (; iPageClean < cPages; iPageClean++)
     1095                            {
     1096                                PPGMPAGE pPageNext = &pRam->aPages[iPageClean];
     1097                                if (    RT_UNLIKELY(PGM_PAGE_GET_TYPE(pPageNext) != PGMPAGETYPE_RAM)
     1098                                    ||  PGM_PAGE_GET_STATE(pPageNext) != PGM_PAGE_STATE_ALLOCATED
     1099                                    ||  PGM_PAGE_IS_WRITTEN_TO(pPageNext)
     1100                                    ||  !PGM_PAGE_IS_FT_DIRTY(pPageNext)
     1101                                    /* Crossing a chunk boundary? */
     1102                                    ||  (GCPhysPage & GMM_PAGEID_IDX_MASK) != ((GCPhysPage + cbPageRange) & GMM_PAGEID_IDX_MASK)
     1103                                    )
     1104                                    break;
     1105
     1106                                cbPageRange += PAGE_SIZE;
     1107                            }
     1108
     1109                            rc = PGMPhysGCPhys2CCPtrReadOnly(pVM, GCPhysPage, (const void **)&pu8Page, &Lock);
     1110                            if (RT_SUCCESS(rc))
     1111                            {
     1112                                /** @todo this is risky; the range might be changed, but little choice as the sync
     1113                                 *  costs a lot of time. */
     1114                                pgmUnlock(pVM);
     1115                                pfnEnum(pVM, GCPhysPage, pu8Page, cbPageRange, pvUser);
     1116                                pgmLock(pVM);
     1117                                PGMPhysReleasePageMappingLock(pVM, &Lock);
     1118                            }
     1119
     1120                            for (iPage; iPage < iPageClean; iPage++)
     1121                                PGM_PAGE_CLEAR_FT_DIRTY(&pRam->aPages[iPage]);
     1122
     1123                            iPage = iPageClean - 1;
    11051124                        }
    1106 
    1107                         rc = PGMPhysGCPhys2CCPtrReadOnly(pVM, GCPhysPage, (const void **)&pu8Page, &Lock);
    1108                         if (RT_SUCCESS(rc))
    1109                         {
    1110                             /** @todo this is risky; the range might be changed, but little choice as the sync costs a lot of time */
    1111                             pgmUnlock(pVM);
    1112                             pfnEnum(pVM, GCPhysPage, pu8Page, cbPageRange, pvUser);
    1113                             pgmLock(pVM);
    1114                             PGMPhysReleasePageMappingLock(pVM, &Lock);
    1115                         }
    1116 
    1117                         for (iPage; iPage < iPageClean; iPage++)
    1118                             PGM_PAGE_CLEAR_FT_DIRTY(&pRam->aPages[iPage]);
    1119 
    1120                         iPage = iPageClean - 1;
    1121                     }
    1122                     break;
     1125                        break;
    11231126                }
    11241127            }
     
    11421145    pgmLock(pVM);
    11431146    uint32_t cRamRanges = 0;
    1144     for (PPGMRAMRANGE pCur = pVM->pgm.s.CTX_SUFF(pRamRanges); pCur; pCur = pCur->CTX_SUFF(pNext))
     1147    for (PPGMRAMRANGE pCur = pVM->pgm.s.CTX_SUFF(pRamRangesX); pCur; pCur = pCur->CTX_SUFF(pNext))
    11451148        cRamRanges++;
    11461149    pgmUnlock(pVM);
     
    11681171    pgmLock(pVM);
    11691172    uint32_t iCurRange = 0;
    1170     for (PPGMRAMRANGE pCur = pVM->pgm.s.CTX_SUFF(pRamRanges); pCur; pCur = pCur->CTX_SUFF(pNext), iCurRange++)
     1173    for (PPGMRAMRANGE pCur = pVM->pgm.s.CTX_SUFF(pRamRangesX); pCur; pCur = pCur->CTX_SUFF(pNext), iCurRange++)
    11711174        if (iCurRange == iRange)
    11721175        {
     
    11911194 * @returns VBox status code.
    11921195 * @param   pVM                 The VM handle.
    1193  * @param   puTotalAllocSize    Pointer to total allocated  memory inside VMMR0 (in bytes)
    1194  * @param   puTotalFreeSize     Pointer to total free (allocated but not used yet) memory inside VMMR0 (in bytes)
    1195  * @param   puTotalBalloonSize  Pointer to total ballooned memory inside VMMR0 (in bytes)
    1196  * @param   puTotalSharedSize   Pointer to total shared memory inside VMMR0 (in bytes)
    1197  */
    1198 VMMR3DECL(int) PGMR3QueryVMMMemoryStats(PVM pVM, uint64_t *puTotalAllocSize, uint64_t *puTotalFreeSize, uint64_t *puTotalBalloonSize, uint64_t *puTotalSharedSize)
    1199 {
    1200     int rc;
    1201 
    1202     uint64_t cAllocPages = 0, cFreePages = 0, cBalloonPages = 0, cSharedPages = 0;
    1203     rc = GMMR3QueryHypervisorMemoryStats(pVM, &cAllocPages, &cFreePages, &cBalloonPages, &cSharedPages);
     1196 * @param   pcbAllocMem         Where to return the amount of memory allocated
     1197 *                              by VMs.
     1198 * @param   pcbFreeMem          Where to return the amount of memory that is
     1199 *                              allocated from the host but not currently used
     1200 *                              by any VMs.
     1201 * @param   pcbBallonedMem      Where to return the sum of memory that is
     1202 *                              currently ballooned by the VMs.
     1203 * @param   pcbSharedMem        Where to return the amount of memory that is
     1204 *                              currently shared.
     1205 */
     1206VMMR3DECL(int) PGMR3QueryGlobalMemoryStats(PVM pVM, uint64_t *pcbAllocMem, uint64_t *pcbFreeMem,
     1207                                           uint64_t *pcbBallonedMem, uint64_t *pcbSharedMem)
     1208{
     1209    uint64_t cAllocPages   = 0;
     1210    uint64_t cFreePages    = 0;
     1211    uint64_t cBalloonPages = 0;
     1212    uint64_t cSharedPages  = 0;
     1213    int rc = GMMR3QueryHypervisorMemoryStats(pVM, &cAllocPages, &cFreePages, &cBalloonPages, &cSharedPages);
    12041214    AssertRCReturn(rc, rc);
    12051215
    1206     if (puTotalAllocSize)
    1207         *puTotalAllocSize = cAllocPages * _4K;
    1208 
    1209     if (puTotalFreeSize)
    1210         *puTotalFreeSize = cFreePages * _4K;
    1211 
    1212     if (puTotalBalloonSize)
    1213         *puTotalBalloonSize = cBalloonPages * _4K;
    1214 
    1215     if (puTotalSharedSize)
    1216         *puTotalSharedSize = cSharedPages * _4K;
    1217 
    1218     Log(("PGMR3QueryVMMMemoryStats: all=%x free=%x ballooned=%x shared=%x\n", cAllocPages, cFreePages, cBalloonPages, cSharedPages));
     1216    if (pcbAllocMem)
     1217        *pcbAllocMem    = cAllocPages * _4K;
     1218
     1219    if (pcbFreeMem)
     1220        *pcbFreeMem     = cFreePages * _4K;
     1221
     1222    if (pcbBallonedMem)
     1223        *pcbBallonedMem = cBalloonPages * _4K;
     1224
     1225    if (pcbSharedMem)
     1226        *pcbSharedMem   = cSharedPages * _4K;
     1227
     1228    Log(("PGMR3QueryVMMMemoryStats: all=%llx free=%llx ballooned=%llx shared=%llx\n",
     1229         cAllocPages, cFreePages, cBalloonPages, cSharedPages));
    12191230    return VINF_SUCCESS;
    12201231}
    12211232
    1222 /**
    1223  * Query memory stats for the VM
     1233
     1234/**
     1235 * Query memory stats for the VM.
    12241236 *
    12251237 * @returns VBox status code.
    12261238 * @param   pVM                 The VM handle.
    1227  * @param   puTotalAllocSize    Pointer to total allocated  memory inside the VM (in bytes)
    1228  * @param   puTotalFreeSize     Pointer to total free (allocated but not used yet) memory inside the VM (in bytes)
    1229  * @param   puTotalBalloonSize  Pointer to total ballooned memory inside the VM (in bytes)
    1230  * @param   puTotalSharedSize   Pointer to total shared memory inside the VM (in bytes)
    1231  */
    1232 VMMR3DECL(int) PGMR3QueryMemoryStats(PVM pVM, uint64_t *pulTotalMem, uint64_t *pulPrivateMem, uint64_t *puTotalSharedMem, uint64_t *puTotalZeroMem)
    1233 {
    1234     if (pulTotalMem)
    1235         *pulTotalMem = (uint64_t)pVM->pgm.s.cAllPages * _4K;
    1236 
    1237     if (pulPrivateMem)
    1238         *pulPrivateMem = (uint64_t)pVM->pgm.s.cPrivatePages * _4K;
    1239 
    1240     if (puTotalSharedMem)
    1241         *puTotalSharedMem = (uint64_t)pVM->pgm.s.cReusedSharedPages * _4K;
    1242 
    1243     if (puTotalZeroMem)
    1244         *puTotalZeroMem = (uint64_t)pVM->pgm.s.cZeroPages * _4K;
     1239 * @param   pcbTotalMem         Where to return total amount memory the VM may
     1240 *                              possibly use.
     1241 * @param   pcbPrivateMem       Where to return the amount of private memory
     1242 *                              currently allocated.
     1243 * @param   pcbSharedMem        Where to return the amount of actually shared
     1244 *                              memory currently used by the VM.
     1245 * @param   pcbZeroMem          Where to return the amount of memory backed by
     1246 *                              zero pages.
     1247 *
     1248 * @remarks The total mem is normally larger than the sum of the three
     1249 *          components.  There are two reasons for this, first the amount of
     1250 *          shared memory is what we're sure is shared instead of what could
     1251 *          possibly be shared with someone.  Secondly, because the total may
     1252 *          include some pure MMIO pages that doesn't go into any of the three
     1253 *          sub-counts.
     1254 *
     1255 * @todo Why do we return reused shared pages instead of anything that could
     1256 *       potentially be shared?  Doesn't this mean the first VM gets a much
     1257 *       lower number of shared pages?
     1258 */
     1259VMMR3DECL(int) PGMR3QueryMemoryStats(PVM pVM, uint64_t *pcbTotalMem, uint64_t *pcbPrivateMem,
     1260                                     uint64_t *pcbSharedMem, uint64_t *pcbZeroMem)
     1261{
     1262    VM_ASSERT_VALID_EXT_RETURN(pVM, VERR_INVALID_VM_HANDLE);
     1263
     1264    if (pcbTotalMem)
     1265        *pcbTotalMem    = (uint64_t)pVM->pgm.s.cAllPages            * PAGE_SIZE;
     1266
     1267    if (pcbPrivateMem)
     1268        *pcbPrivateMem  = (uint64_t)pVM->pgm.s.cPrivatePages        * PAGE_SIZE;
     1269
     1270    if (pcbSharedMem)
     1271        *pcbSharedMem   = (uint64_t)pVM->pgm.s.cReusedSharedPages   * PAGE_SIZE;
     1272
     1273    if (pcbZeroMem)
     1274        *pcbZeroMem     = (uint64_t)pVM->pgm.s.cZeroPages           * PAGE_SIZE;
    12451275
    12461276    Log(("PGMR3QueryMemoryStats: all=%x private=%x reused=%x zero=%x\n", pVM->pgm.s.cAllPages, pVM->pgm.s.cPrivatePages, pVM->pgm.s.cReusedSharedPages, pVM->pgm.s.cZeroPages));
    12471277    return VINF_SUCCESS;
    12481278}
     1279
    12491280
    12501281/**
     
    13081339        case PGMRELOCATECALL_SUGGEST:
    13091340            return true;
     1341
    13101342        case PGMRELOCATECALL_RELOCATE:
    13111343        {
    1312             /* Update myself and then relink all the ranges. */
     1344            /*
     1345             * Update myself, then relink all the ranges and flush the RC TLB.
     1346             */
    13131347            pgmLock(pVM);
     1348
    13141349            pRam->pSelfRC = (RTRCPTR)(GCPtrNew + PAGE_SIZE);
     1350
    13151351            pgmR3PhysRelinkRamRanges(pVM);
     1352#ifdef PGM_USE_RAMRANGE_TLB
     1353            for (unsigned i = 0; i < PGM_RAMRANGE_TLB_ENTRIES; i++)
     1354                pVM->pgm.s.apRamRangesTlbRC[i] = NIL_RTRCPTR;
     1355#endif
     1356
    13161357            pgmUnlock(pVM);
    13171358            return true;
     
    14401481     */
    14411482    PPGMRAMRANGE    pPrev = NULL;
    1442     PPGMRAMRANGE    pRam = pVM->pgm.s.pRamRangesR3;
     1483    PPGMRAMRANGE    pRam = pVM->pgm.s.pRamRangesXR3;
    14431484    while (pRam && GCPhysLast >= pRam->GCPhys)
    14441485    {
     
    15631604    uint64_t NanoTS = RTTimeNanoTS();
    15641605    pgmLock(pVM);
    1565     for (PPGMRAMRANGE pRam = pVM->pgm.s.pRamRangesR3; pRam; pRam = pRam->pNextR3)
     1606    for (PPGMRAMRANGE pRam = pVM->pgm.s.pRamRangesXR3; pRam; pRam = pRam->pNextR3)
    15661607    {
    15671608        PPGMPAGE    pPage  = &pRam->aPages[0];
     
    16471688     * Walk the ram ranges.
    16481689     */
    1649     for (PPGMRAMRANGE pRam = pVM->pgm.s.pRamRangesR3; pRam; pRam = pRam->pNextR3)
     1690    for (PPGMRAMRANGE pRam = pVM->pgm.s.pRamRangesXR3; pRam; pRam = pRam->pNextR3)
    16501691    {
    16511692        uint32_t iPage = pRam->cb >> PAGE_SHIFT;
     
    18001841     * Walk the ram ranges.
    18011842     */
    1802     for (PPGMRAMRANGE pRam = pVM->pgm.s.pRamRangesR3; pRam; pRam = pRam->pNextR3)
     1843    for (PPGMRAMRANGE pRam = pVM->pgm.s.pRamRangesXR3; pRam; pRam = pRam->pNextR3)
    18031844    {
    18041845        uint32_t iPage = pRam->cb >> PAGE_SHIFT;
     
    18861927    bool fRamExists = false;
    18871928    PPGMRAMRANGE pRamPrev = NULL;
    1888     PPGMRAMRANGE pRam = pVM->pgm.s.pRamRangesR3;
     1929    PPGMRAMRANGE pRam = pVM->pgm.s.pRamRangesXR3;
    18891930    while (pRam && GCPhysLast >= pRam->GCPhys)
    18901931    {
     
    20282069    VM_ASSERT_EMT(pVM);
    20292070
     2071/** @todo this needs to own the PGM lock! */
    20302072    /*
    20312073     * First deregister the handler, then check if we should remove the ram range.
     
    20362078        RTGCPHYS        GCPhysLast  = GCPhys + (cb - 1);
    20372079        PPGMRAMRANGE    pRamPrev    = NULL;
    2038         PPGMRAMRANGE    pRam        = pVM->pgm.s.pRamRangesR3;
     2080        PPGMRAMRANGE    pRam        = pVM->pgm.s.pRamRangesXR3;
    20392081        while (pRam && GCPhysLast >= pRam->GCPhys)
    20402082        {
     
    21222164
    21232165    PGMPhysInvalidatePageMapTLB(pVM);
     2166#ifdef PGM_USE_RAMRANGE_TLB
     2167    pgmPhysInvalidRamRangeTlbs(pVM);
     2168#endif
    21242169    return rc;
    21252170}
     
    24282473    bool fRamExists = false;
    24292474    PPGMRAMRANGE pRamPrev = NULL;
    2430     PPGMRAMRANGE pRam = pVM->pgm.s.pRamRangesR3;
     2475    PPGMRAMRANGE pRam = pVM->pgm.s.pRamRangesXR3;
    24312476    while (pRam && GCPhysLast >= pRam->GCPhys)
    24322477    {
     
    25892634    {
    25902635        /* Restore the RAM pages we've replaced. */
    2591         PPGMRAMRANGE pRam = pVM->pgm.s.pRamRangesR3;
     2636        PPGMRAMRANGE pRam = pVM->pgm.s.pRamRangesXR3;
    25922637        while (pRam->GCPhys > pCur->RamRange.GCPhysLast)
    25932638            pRam = pRam->pNextR3;
     
    26302675
    26312676    PGMPhysInvalidatePageMapTLB(pVM);
     2677#ifdef PGM_USE_RAMRANGE_TLB
     2678    pgmPhysInvalidRamRangeTlbs(pVM);
     2679#endif
    26322680    pgmUnlock(pVM);
    26332681
     
    28302878    bool            fRamExists = false;
    28312879    PPGMRAMRANGE    pRamPrev = NULL;
    2832     PPGMRAMRANGE    pRam = pVM->pgm.s.pRamRangesR3;
     2880    PPGMRAMRANGE    pRam = pVM->pgm.s.pRamRangesXR3;
    28332881    while (pRam && GCPhysLast >= pRam->GCPhys)
    28342882    {
     
    32023250                if (!PGMROMPROT_IS_ROM(pRomPage->enmProt))
    32033251                {
    3204                     pShadowPage = pgmPhysGetPage(&pVM->pgm.s, GCPhys);
     3252                    pShadowPage = pgmPhysGetPage(pVM, GCPhys);
    32053253                    AssertLogRelReturn(pShadowPage, VERR_INTERNAL_ERROR);
    32063254                }
     
    34133461
    34143462                    /* flush references to the page. */
    3415                     PPGMPAGE pRamPage = pgmPhysGetPage(&pVM->pgm.s, pRom->GCPhys + (iPage << PAGE_SHIFT));
     3463                    PPGMPAGE pRamPage = pgmPhysGetPage(pVM, pRom->GCPhys + (iPage << PAGE_SHIFT));
    34163464                    int rc2 = pgmPoolTrackUpdateGCPhys(pVM, pRom->GCPhys + (iPage << PAGE_SHIFT), pRamPage,
    34173465                                                       true /*fFlushPTEs*/, &fFlushTLB);
     
    39043952
    39053953                PPGMPAGE pPage;
    3906                 rc = pgmPhysGetPageEx(&pVM->pgm.s, GCPhys, &pPage);
     3954                rc = pgmPhysGetPageEx(pVM, GCPhys, &pPage);
    39073955                AssertRC(rc);
    39083956
     
    40864134                if (idPage != NIL_GMM_PAGEID)
    40874135                {
    4088                     for (PPGMRAMRANGE pRam = pVM->pgm.s.pRamRangesR3;
     4136                    for (PPGMRAMRANGE pRam = pVM->pgm.s.pRamRangesXR3;
    40894137                         pRam;
    40904138                         pRam = pRam->pNextR3)
     
    42514299    PPGMRAMRANGE pRam;
    42524300    PPGMPAGE pPage;
    4253     int rc = pgmPhysGetPageAndRangeEx(&pVM->pgm.s, GCPhys, &pPage, &pRam);
     4301    int rc = pgmPhysGetPageAndRangeEx(pVM, GCPhys, &pPage, &pRam);
    42544302    if (RT_SUCCESS(rc))
    42554303    {
     
    43054353            /* Get a ring-3 mapping of the address. */
    43064354            PPGMPAGER3MAPTLBE pTlbe;
    4307             rc2 = pgmPhysPageQueryTlbe(&pVM->pgm.s, GCPhys, &pTlbe);
     4355            rc2 = pgmPhysPageQueryTlbe(pVM, GCPhys, &pTlbe);
    43084356            AssertLogRelRCReturn(rc2, rc2);
    43094357            *ppv = (void *)((uintptr_t)pTlbe->pv | (uintptr_t)(GCPhys & PAGE_OFFSET_MASK));
  • trunk/src/VBox/VMM/VMMR3/PGMPool.cpp

    r35696 r36891  
    594594    }
    595595    else if (    (   pPage->cModifications < 96 /* it's cheaper here. */
    596                   || pgmPoolIsPageLocked(&pVM->pgm.s, pPage)
     596                  || pgmPoolIsPageLocked(pPage)
    597597                  )
    598598             &&  cbBuf <= 4)
     
    643643    unsigned cModifiedPages = 0; NOREF(cModifiedPages);
    644644    unsigned cLeft = pPool->cUsedPages;
    645     unsigned iPage = pPool->cCurPages;
     645    uint32_t iPage = pPool->cCurPages;
    646646    while (--iPage >= PGMPOOL_IDX_FIRST)
    647647    {
     
    799799     * Clear all the GCPhys links and rebuild the phys ext free list.
    800800     */
    801     for (PPGMRAMRANGE pRam = pPool->CTX_SUFF(pVM)->pgm.s.CTX_SUFF(pRamRanges);
     801    for (PPGMRAMRANGE pRam = pPool->CTX_SUFF(pVM)->pgm.s.CTX_SUFF(pRamRangesX);
    802802         pRam;
    803803         pRam = pRam->CTX_SUFF(pNext))
  • trunk/src/VBox/VMM/VMMR3/PGMSavedState.cpp

    r36042 r36891  
    223223                    RTGCPHYS GCPhys = pRom->GCPhys + ((RTGCPHYS)iPage << PAGE_SHIFT);
    224224                    PPGMPAGE pPage;
    225                     int rc = pgmPhysGetPageWithHintEx(&pVM->pgm.s, GCPhys, &pPage, &pRamHint);
     225                    int rc = pgmPhysGetPageWithHintEx(pVM, GCPhys, &pPage, &pRamHint);
    226226                    AssertLogRelMsgRC(rc, ("%Rrc GCPhys=%RGp\n", rc, GCPhys));
    227227                    if (RT_SUCCESS(rc))
     
    419419            PPGMPAGE pPage;
    420420            if (PGMROMPROT_IS_ROM(enmProt))
    421                 pPage = pgmPhysGetPage(&pVM->pgm.s, GCPhys);
     421                pPage = pgmPhysGetPage(pVM, GCPhys);
    422422            else
    423423                pPage = &pRom->aPages[iPage].Virgin;
     
    513513                    PGMROMPROT  enmProt = pRomPage->enmProt;
    514514                    RTGCPHYS    GCPhys  = pRom->GCPhys + ((RTGCPHYS)iPage << PAGE_SHIFT);
    515                     PPGMPAGE    pPage   = PGMROMPROT_IS_ROM(enmProt) ? &pRomPage->Shadow : pgmPhysGetPage(&pVM->pgm.s, GCPhys);
     515                    PPGMPAGE    pPage   = PGMROMPROT_IS_ROM(enmProt) ? &pRomPage->Shadow : pgmPhysGetPage(pVM, GCPhys);
    516516                    bool        fZero   = PGM_PAGE_IS_ZERO(pPage) || PGM_PAGE_IS_BALLOONED(pPage); Assert(!PGM_PAGE_IS_BALLOONED(pPage)); /* Shouldn't be ballooned. */
    517517                    int         rc      = VINF_SUCCESS;
     
    10481048    do
    10491049    {
    1050         for (pCur = pVM->pgm.s.pRamRangesR3; pCur; pCur = pCur->pNextR3)
     1050        for (pCur = pVM->pgm.s.pRamRangesXR3; pCur; pCur = pCur->pNextR3)
    10511051        {
    10521052            if (   !pCur->paLSPages
     
    13041304    {
    13051305        uint32_t const  idRamRangesGen = pVM->pgm.s.idRamRangesGen;
    1306         for (pCur = pVM->pgm.s.pRamRangesR3; pCur; pCur = pCur->pNextR3)
     1306        for (pCur = pVM->pgm.s.pRamRangesXR3; pCur; pCur = pCur->pNextR3)
    13071307        {
    13081308            if (    pCur->GCPhysLast > GCPhysCur
     
    15311531    {
    15321532        uint32_t const  idRamRangesGen = pVM->pgm.s.idRamRangesGen;
    1533         for (pCur = pVM->pgm.s.pRamRangesR3; pCur; pCur = pCur->pNextR3)
     1533        for (pCur = pVM->pgm.s.pRamRangesXR3; pCur; pCur = pCur->pNextR3)
    15341534        {
    15351535            if (   pCur->GCPhysLast > GCPhysCur
     
    17461746    do
    17471747    {
    1748         for (pCur = pVM->pgm.s.pRamRangesR3; pCur; pCur = pCur->pNextR3)
     1748        for (pCur = pVM->pgm.s.pRamRangesXR3; pCur; pCur = pCur->pNextR3)
    17491749        {
    17501750            if (pCur->paLSPages)
     
    23342334     */
    23352335    uint32_t i = 0;
    2336     for (PPGMRAMRANGE pRam = pPGM->pRamRangesR3; ; pRam = pRam->pNextR3, i++)
     2336    for (PPGMRAMRANGE pRam = pPGM->pRamRangesXR3; ; pRam = pRam->pNextR3, i++)
    23372337    {
    23382338        /* Check the sequence number / separator. */
     
    26412641
    26422642                PPGMPAGE pPage;
    2643                 rc = pgmPhysGetPageWithHintEx(&pVM->pgm.s, GCPhys, &pPage, &pRamHint);
     2643                rc = pgmPhysGetPageWithHintEx(pVM, GCPhys, &pPage, &pRamHint);
    26442644                AssertLogRelMsgRCReturn(rc, ("rc=%Rrc %RGp\n", rc, GCPhys), rc);
    26452645
     
    28582858                if (!pRealPage)
    28592859                {
    2860                     rc = pgmPhysGetPageWithHintEx(&pVM->pgm.s, GCPhys, &pRealPage, &pRamHint);
     2860                    rc = pgmPhysGetPageWithHintEx(pVM, GCPhys, &pRealPage, &pRamHint);
    28612861                    AssertLogRelMsgRCReturn(rc, ("rc=%Rrc %RGp\n", rc, GCPhys), rc);
    28622862                }
     
    31763176            pVM->pgm.s.fMappingsFixedRestored = false;
    31773177            if (   pVM->pgm.s.fMappingsFixed
    3178                 && pgmMapAreMappingsEnabled(&pVM->pgm.s))
     3178                && pgmMapAreMappingsEnabled(pVM))
    31793179            {
    31803180                RTGCPTR     GCPtrFixed    = pVM->pgm.s.GCPtrMappingFixed;
     
    32133213             * when restoring other components like PATM.
    32143214             */
    3215             if (pgmMapAreMappingsFloating(&pVM->pgm.s))
     3215            if (pgmMapAreMappingsFloating(pVM))
    32163216            {
    32173217                PVMCPU pVCpu = &pVM->aCpus[0];
  • trunk/src/VBox/VMM/VMMR3/PGMSharedPage.cpp

    r35696 r36891  
    262262    case VINF_SUCCESS:
    263263    {
    264         PPGMPAGE pPage = pgmPhysGetPage(&pVM->pgm.s, GCPhys);
     264        PPGMPAGE pPage = pgmPhysGetPage(pVM, GCPhys);
    265265        if (pPage)
    266266        {
     
    316316    pgmLock(pVM);
    317317
    318     for (PPGMRAMRANGE pRam = pVM->pgm.s.pRamRangesR3; pRam; pRam = pRam->pNextR3)
     318    for (PPGMRAMRANGE pRam = pVM->pgm.s.pRamRangesXR3; pRam; pRam = pRam->pNextR3)
    319319    {
    320320        PPGMPAGE    pPage  = &pRam->aPages[0];
  • trunk/src/VBox/VMM/include/PGMGstDefs.h

    r35333 r36891  
    140140# define GST_GET_PTE_GCPHYS(Pte)                ((Pte).u & GST_PDE_PG_MASK)
    141141# define GST_GET_PDE_GCPHYS(Pde)                ((Pde).u & GST_PDE_PG_MASK)
    142 # define GST_GET_BIG_PDE_GCPHYS(pVM, Pde)       pgmGstGet4MBPhysPage(&(pVM)->pgm.s, Pde)
     142# define GST_GET_BIG_PDE_GCPHYS(pVM, Pde)       pgmGstGet4MBPhysPage((pVM), Pde)
    143143# define GST_GET_PDE_SHW_FLAGS(pVCpu, Pde)      ((Pde).u & (X86_PDE_P | X86_PDE_RW | X86_PDE_US | X86_PDE_A))
    144144# define GST_GET_BIG_PDE_SHW_FLAGS(pVCpu, Pde) \
  • trunk/src/VBox/VMM/include/PGMInline.h

    r36009 r36891  
    4646 */
    4747
    48 /** @todo Split out all the inline stuff into a separate file.  Then we can
    49  *        include it later when VM and VMCPU are defined and so avoid all that
    50  *        &pVM->pgm.s and &pVCpu->pgm.s stuff.  It also chops ~1600 lines off
    51  *        this file and will make it somewhat easier to navigate... */
    52 
    5348/**
    5449 * Gets the PGMRAMRANGE structure for a guest page.
     
    5752 * @returns NULL on a VERR_PGM_INVALID_GC_PHYSICAL_ADDRESS condition.
    5853 *
    59  * @param   pPGM        PGM handle.
     54 * @param   pVM         The VM handle.
    6055 * @param   GCPhys      The GC physical address.
    6156 */
    62 DECLINLINE(PPGMRAMRANGE) pgmPhysGetRange(PPGM pPGM, RTGCPHYS GCPhys)
    63 {
     57DECLINLINE(PPGMRAMRANGE) pgmPhysGetRange(PVM pVM, RTGCPHYS GCPhys)
     58{
     59#ifdef PGM_USE_RAMRANGE_TLB
     60    PPGMRAMRANGE pRam = pVM->pgm.s.CTX_SUFF(apRamRangesTlb)[PGM_RAMRANGE_TLB_IDX(GCPhys)];
     61    if (!pRam || GCPhys - pRam->GCPhys >= pRam->cb)
     62        pRam = pgmPhysGetRangeSlow(pVM, GCPhys);
     63    STAM_COUNTER_INC(&pVM->pgm.s.CTX_SUFF(pStats)->CTX_MID_Z(Stat,RamRangeTlbHits));
     64    return pRam;
     65
     66#else
    6467    /*
    6568     * Optimize for the first range.
    6669     */
    67     PPGMRAMRANGE pRam = pPGM->CTX_SUFF(pRamRanges);
     70    PPGMRAMRANGE pRam = pVM->pgm.s.CTX_SUFF(pRamRangesX);
    6871    RTGCPHYS off = GCPhys - pRam->GCPhys;
    6972    if (RT_UNLIKELY(off >= pRam->cb))
     
    7881    }
    7982    return pRam;
    80 }
     83#endif
     84}
     85
     86
     87/**
     88 * Gets the PGMRAMRANGE structure for a guest page, if unassigned get the ram
     89 * range above it.
     90 *
     91 * @returns Pointer to the RAM range on success.
     92 * @returns NULL if the address is located after the last range.
     93 *
     94 * @param   pVM         The VM handle.
     95 * @param   GCPhys      The GC physical address.
     96 */
     97DECLINLINE(PPGMRAMRANGE) pgmPhysGetRangeAtOrAbove(PVM pVM, RTGCPHYS GCPhys)
     98{
     99#ifdef PGM_USE_RAMRANGE_TLB
     100    PPGMRAMRANGE pRam = pVM->pgm.s.CTX_SUFF(apRamRangesTlb)[PGM_RAMRANGE_TLB_IDX(GCPhys)];
     101    if (   !pRam
     102        || (GCPhys - pRam->GCPhys) >= pRam->cb)
     103        return pgmPhysGetRangeAtOrAboveSlow(pVM, GCPhys);
     104    STAM_COUNTER_INC(&pVM->pgm.s.CTX_SUFF(pStats)->CTX_MID_Z(Stat,RamRangeTlbHits));
     105    return pRam;
     106
     107#else
     108    PPGMRAMRANGE pRam = pVM->pgm.s.CTX_SUFF(pRamRangesX);
     109    while (pRam && GCPhys > pRam->GCPhysLast)
     110        pRam = pRam->CTX_SUFF(pNext);
     111    return pRam;
     112#endif
     113}
     114
    81115
    82116
     
    87121 * @returns NULL on a VERR_PGM_INVALID_GC_PHYSICAL_ADDRESS condition.
    88122 *
    89  * @param   pPGM        PGM handle.
     123 * @param   pVM         The VM handle.
    90124 * @param   GCPhys      The GC physical address.
    91125 */
    92 DECLINLINE(PPGMPAGE) pgmPhysGetPage(PPGM pPGM, RTGCPHYS GCPhys)
    93 {
     126DECLINLINE(PPGMPAGE) pgmPhysGetPage(PVM pVM, RTGCPHYS GCPhys)
     127{
     128#ifdef PGM_USE_RAMRANGE_TLB
     129    PPGMRAMRANGE pRam = pVM->pgm.s.CTX_SUFF(apRamRangesTlb)[PGM_RAMRANGE_TLB_IDX(GCPhys)];
     130    RTGCPHYS off;
     131    if (   !pRam
     132        || (off = GCPhys - pRam->GCPhys) >= pRam->cb)
     133        return pgmPhysGetPageSlow(pVM, GCPhys);
     134    STAM_COUNTER_INC(&pVM->pgm.s.CTX_SUFF(pStats)->CTX_MID_Z(Stat,RamRangeTlbHits));
     135    return &pRam->aPages[off >> PAGE_SHIFT];
     136
     137#else
    94138    /*
    95139     * Optimize for the first range.
    96140     */
    97     PPGMRAMRANGE pRam = pPGM->CTX_SUFF(pRamRanges);
     141    PPGMRAMRANGE pRam = pVM->pgm.s.CTX_SUFF(pRamRangesX);
    98142    RTGCPHYS off = GCPhys - pRam->GCPhys;
    99143    if (RT_UNLIKELY(off >= pRam->cb))
     
    108152    }
    109153    return &pRam->aPages[off >> PAGE_SHIFT];
     154#endif
    110155}
    111156
     
    120165 * @retval  VERR_PGM_INVALID_GC_PHYSICAL_ADDRESS if the address isn't valid.
    121166 *
    122  * @param   pPGM        PGM handle.
     167 * @param   pVM         The VM handle.
    123168 * @param   GCPhys      The GC physical address.
    124169 * @param   ppPage      Where to store the page pointer on success.
    125170 */
    126 DECLINLINE(int) pgmPhysGetPageEx(PPGM pPGM, RTGCPHYS GCPhys, PPPGMPAGE ppPage)
    127 {
     171DECLINLINE(int) pgmPhysGetPageEx(PVM pVM, RTGCPHYS GCPhys, PPPGMPAGE ppPage)
     172{
     173#ifdef PGM_USE_RAMRANGE_TLB
     174    PPGMRAMRANGE pRam = pVM->pgm.s.CTX_SUFF(apRamRangesTlb)[PGM_RAMRANGE_TLB_IDX(GCPhys)];
     175    RTGCPHYS off;
     176    if (   !pRam
     177        || (off = GCPhys - pRam->GCPhys) >= pRam->cb)
     178        return pgmPhysGetPageExSlow(pVM, GCPhys, ppPage);
     179    *ppPage = &pRam->aPages[(GCPhys - pRam->GCPhys) >> PAGE_SHIFT];
     180    STAM_COUNTER_INC(&pVM->pgm.s.CTX_SUFF(pStats)->CTX_MID_Z(Stat,RamRangeTlbHits));
     181    return VINF_SUCCESS;
     182
     183#else
    128184    /*
    129185     * Optimize for the first range.
    130186     */
    131     PPGMRAMRANGE pRam = pPGM->CTX_SUFF(pRamRanges);
     187    PPGMRAMRANGE pRam = pVM->pgm.s.CTX_SUFF(pRamRangesX);
    132188    RTGCPHYS off = GCPhys - pRam->GCPhys;
    133189    if (RT_UNLIKELY(off >= pRam->cb))
     
    146202    *ppPage = &pRam->aPages[off >> PAGE_SHIFT];
    147203    return VINF_SUCCESS;
     204#endif
    148205}
    149206
     
    160217 * @retval  VERR_PGM_INVALID_GC_PHYSICAL_ADDRESS if the address isn't valid.
    161218 *
    162  * @param   pPGM        PGM handle.
     219 * @param   pVM         The VM handle.
    163220 * @param   GCPhys      The GC physical address.
    164221 * @param   ppPage      Where to store the page pointer on success.
     
    166223 *                      The caller initializes this to NULL before the call.
    167224 */
    168 DECLINLINE(int) pgmPhysGetPageWithHintEx(PPGM pPGM, RTGCPHYS GCPhys, PPPGMPAGE ppPage, PPGMRAMRANGE *ppRamHint)
     225DECLINLINE(int) pgmPhysGetPageWithHintEx(PVM pVM, RTGCPHYS GCPhys, PPPGMPAGE ppPage, PPGMRAMRANGE *ppRamHint)
    169226{
    170227    RTGCPHYS off;
     
    173230        ||  RT_UNLIKELY((off = GCPhys - pRam->GCPhys) >= pRam->cb))
    174231    {
    175         pRam = pPGM->CTX_SUFF(pRamRanges);
     232#ifdef PGM_USE_RAMRANGE_TLB
     233        pRam = pVM->pgm.s.CTX_SUFF(apRamRangesTlb)[PGM_RAMRANGE_TLB_IDX(GCPhys)];
     234        if (   !pRam
     235            || (off = GCPhys - pRam->GCPhys) >= pRam->cb)
     236            return pgmPhysGetPageAndRangeExSlow(pVM, GCPhys, ppPage, ppRamHint);
     237        STAM_COUNTER_INC(&pVM->pgm.s.CTX_SUFF(pStats)->CTX_MID_Z(Stat,RamRangeTlbHits));
     238
     239#else
     240        pRam = pVM->pgm.s.CTX_SUFF(pRamRangesX);
    176241        off = GCPhys - pRam->GCPhys;
    177242        if (RT_UNLIKELY(off >= pRam->cb))
     
    188253            } while (off >= pRam->cb);
    189254        }
     255#endif
    190256        *ppRamHint = pRam;
    191257    }
     
    201267 * @returns NULL on a VERR_PGM_INVALID_GC_PHYSICAL_ADDRESS condition.
    202268 *
    203  * @param   pPGM        PGM handle.
     269 * @param   pVM         The VM handle.
    204270 * @param   GCPhys      The GC physical address.
    205  * @param   ppRam       Where to store the pointer to the PGMRAMRANGE.
    206  */
    207 DECLINLINE(PPGMPAGE) pgmPhysGetPageAndRange(PPGM pPGM, RTGCPHYS GCPhys, PPGMRAMRANGE *ppRam)
    208 {
     271 * @param   ppPage      Where to store the pointer to the PGMPAGE structure.
     272 * @param   ppRam       Where to store the pointer to the PGMRAMRANGE structure.
     273 */
     274DECLINLINE(int) pgmPhysGetPageAndRangeEx(PVM pVM, RTGCPHYS GCPhys, PPPGMPAGE ppPage, PPGMRAMRANGE *ppRam)
     275{
     276#ifdef PGM_USE_RAMRANGE_TLB
     277    PPGMRAMRANGE pRam = pVM->pgm.s.CTX_SUFF(apRamRangesTlb)[PGM_RAMRANGE_TLB_IDX(GCPhys)];
     278    RTGCPHYS off;
     279    if (   !pRam
     280        || (off = GCPhys - pRam->GCPhys) >= pRam->cb)
     281        return pgmPhysGetPageAndRangeExSlow(pVM, GCPhys, ppPage, ppRam);
     282    STAM_COUNTER_INC(&pVM->pgm.s.CTX_SUFF(pStats)->CTX_MID_Z(Stat,RamRangeTlbHits));
     283
     284#else
    209285    /*
    210286     * Optimize for the first range.
    211287     */
    212     PPGMRAMRANGE pRam = pPGM->CTX_SUFF(pRamRanges);
    213     RTGCPHYS off = GCPhys - pRam->GCPhys;
    214     if (RT_UNLIKELY(off >= pRam->cb))
    215     {
    216         do
    217         {
    218             pRam = pRam->CTX_SUFF(pNext);
    219             if (RT_UNLIKELY(!pRam))
    220                 return NULL;
    221             off = GCPhys - pRam->GCPhys;
    222         } while (off >= pRam->cb);
    223     }
    224     *ppRam = pRam;
    225     return &pRam->aPages[off >> PAGE_SHIFT];
    226 }
    227 
    228 
    229 /**
    230  * Gets the PGMPAGE structure for a guest page together with the PGMRAMRANGE.
    231  *
    232  * @returns Pointer to the page on success.
    233  * @returns NULL on a VERR_PGM_INVALID_GC_PHYSICAL_ADDRESS condition.
    234  *
    235  * @param   pPGM        PGM handle.
    236  * @param   GCPhys      The GC physical address.
    237  * @param   ppPage      Where to store the pointer to the PGMPAGE structure.
    238  * @param   ppRam       Where to store the pointer to the PGMRAMRANGE structure.
    239  */
    240 DECLINLINE(int) pgmPhysGetPageAndRangeEx(PPGM pPGM, RTGCPHYS GCPhys, PPPGMPAGE ppPage, PPGMRAMRANGE *ppRam)
    241 {
    242     /*
    243      * Optimize for the first range.
    244      */
    245     PPGMRAMRANGE pRam = pPGM->CTX_SUFF(pRamRanges);
     288    PPGMRAMRANGE pRam = pVM->pgm.s.CTX_SUFF(pRamRangesX);
    246289    RTGCPHYS off = GCPhys - pRam->GCPhys;
    247290    if (RT_UNLIKELY(off >= pRam->cb))
     
    259302        } while (off >= pRam->cb);
    260303    }
     304#endif
    261305    *ppRam = pRam;
    262306    *ppPage = &pRam->aPages[off >> PAGE_SHIFT];
     
    269313 *
    270314 * @returns VBox status.
    271  * @param   pPGM        PGM handle.
     315 * @param   pVM         The VM handle.
    272316 * @param   GCPhys      The GC physical address.
    273317 * @param   pHCPhys     Where to store the corresponding HC physical address.
     
    276320 *              Avoid when writing new code!
    277321 */
    278 DECLINLINE(int) pgmRamGCPhys2HCPhys(PPGM pPGM, RTGCPHYS GCPhys, PRTHCPHYS pHCPhys)
     322DECLINLINE(int) pgmRamGCPhys2HCPhys(PVM pVM, RTGCPHYS GCPhys, PRTHCPHYS pHCPhys)
    279323{
    280324    PPGMPAGE pPage;
    281     int rc = pgmPhysGetPageEx(pPGM, GCPhys, &pPage);
     325    int rc = pgmPhysGetPageEx(pVM, GCPhys, &pPage);
    282326    if (RT_FAILURE(rc))
    283327        return rc;
     
    344388     * Get the ram range.
    345389     */
    346     PPGMRAMRANGE    pRam = pVM->pgm.s.CTX_SUFF(pRamRanges);
     390#ifdef PGM_USE_RAMRANGE_TLB
     391    PPGMRAMRANGE pRam = pVM->pgm.s.CTX_SUFF(apRamRangesTlb)[PGM_RAMRANGE_TLB_IDX(GCPhys)];
     392    RTGCPHYS off;
     393    if (   !pRam
     394        || (off = GCPhys - pRam->GCPhys) >= pRam->cb
     395        /** @todo   || page state stuff */
     396       )
     397#else
     398    PPGMRAMRANGE    pRam = pVM->pgm.s.CTX_SUFF(pRamRangesX);
    347399    RTGCPHYS        off  = GCPhys - pRam->GCPhys;
    348400    if (RT_UNLIKELY(off >= pRam->cb
    349401        /** @todo   || page state stuff */))
     402#endif
    350403    {
    351404        /* This case is not counted into StatRZDynMapGCPageInl. */
     
    418471     */
    419472    PVM             pVM  = pVCpu->CTX_SUFF(pVM);
    420     PPGMRAMRANGE    pRam = pVM->pgm.s.CTX_SUFF(pRamRanges);
     473#ifdef PGM_USE_RAMRANGE_TLB
     474    PPGMRAMRANGE    pRam = pVM->pgm.s.CTX_SUFF(apRamRangesTlb)[PGM_RAMRANGE_TLB_IDX(GCPhys)];
     475    RTGCPHYS        off;
     476    if (   !pRam
     477        || (off = GCPhys - pRam->GCPhys) >= pRam->cb
     478        /** @todo   || page state stuff */
     479       )
     480#else
     481    PPGMRAMRANGE    pRam = pVM->pgm.s.CTX_SUFF(pRamRangesX);
    421482    RTGCPHYS        off  = GCPhys - pRam->GCPhys;
    422483    if (RT_UNLIKELY(off >= pRam->cb
    423484        /** @todo   || page state stuff */))
     485#endif
    424486    {
    425487        /* This case is not counted into StatRZDynMapGCPageInl. */
     
    513575 * @retval  VERR_PGM_INVALID_GC_PHYSICAL_ADDRESS if it's not a valid physical address.
    514576 *
    515  * @param   pPGM        The PGM instance handle.
     577 * @param   pVM         The VM handle.
    516578 * @param   GCPhys      The address of the guest page.
    517579 * @param   ppTlbe      Where to store the pointer to the TLB entry.
    518580 */
    519 DECLINLINE(int) pgmPhysPageQueryTlbe(PPGM pPGM, RTGCPHYS GCPhys, PPPGMPAGEMAPTLBE ppTlbe)
     581DECLINLINE(int) pgmPhysPageQueryTlbe(PVM pVM, RTGCPHYS GCPhys, PPPGMPAGEMAPTLBE ppTlbe)
    520582{
    521583    int rc;
    522     PPGMPAGEMAPTLBE pTlbe = &pPGM->CTXSUFF(PhysTlb).aEntries[PGM_PAGEMAPTLB_IDX(GCPhys)];
     584    PPGMPAGEMAPTLBE pTlbe = &pVM->pgm.s.CTXSUFF(PhysTlb).aEntries[PGM_PAGEMAPTLB_IDX(GCPhys)];
    523585    if (pTlbe->GCPhys == (GCPhys & X86_PTE_PAE_PG_MASK))
    524586    {
    525         STAM_COUNTER_INC(&pPGM->CTX_SUFF(pStats)->CTX_MID_Z(Stat,PageMapTlbHits));
     587        STAM_COUNTER_INC(&pVM->pgm.s.CTX_SUFF(pStats)->CTX_MID_Z(Stat,PageMapTlbHits));
    526588        rc = VINF_SUCCESS;
    527589    }
    528590    else
    529         rc = pgmPhysPageLoadIntoTlb(pPGM, GCPhys);
     591        rc = pgmPhysPageLoadIntoTlb(pVM, GCPhys);
    530592    *ppTlbe = pTlbe;
    531593    return rc;
     
    541603 * @retval  VERR_PGM_INVALID_GC_PHYSICAL_ADDRESS if it's not a valid physical address.
    542604 *
    543  * @param   pPGM        The PGM instance handle.
     605 * @param   pVM         The VM handle.
    544606 * @param   pPage       Pointer to the PGMPAGE structure corresponding to
    545607 *                      GCPhys.
     
    547609 * @param   ppTlbe      Where to store the pointer to the TLB entry.
    548610 */
    549 DECLINLINE(int) pgmPhysPageQueryTlbeWithPage(PPGM pPGM, PPGMPAGE pPage, RTGCPHYS GCPhys, PPPGMPAGEMAPTLBE ppTlbe)
     611DECLINLINE(int) pgmPhysPageQueryTlbeWithPage(PVM pVM, PPGMPAGE pPage, RTGCPHYS GCPhys, PPPGMPAGEMAPTLBE ppTlbe)
    550612{
    551613    int rc;
    552     PPGMPAGEMAPTLBE pTlbe = &pPGM->CTXSUFF(PhysTlb).aEntries[PGM_PAGEMAPTLB_IDX(GCPhys)];
     614    PPGMPAGEMAPTLBE pTlbe = &pVM->pgm.s.CTXSUFF(PhysTlb).aEntries[PGM_PAGEMAPTLB_IDX(GCPhys)];
    553615    if (pTlbe->GCPhys == (GCPhys & X86_PTE_PAE_PG_MASK))
    554616    {
    555         STAM_COUNTER_INC(&pPGM->CTX_SUFF(pStats)->CTX_MID_Z(Stat,PageMapTlbHits));
     617        STAM_COUNTER_INC(&pVM->pgm.s.CTX_SUFF(pStats)->CTX_MID_Z(Stat,PageMapTlbHits));
    556618        rc = VINF_SUCCESS;
    557619    }
    558620    else
    559         rc = pgmPhysPageLoadIntoTlbWithPage(pPGM, pPage, GCPhys);
     621        rc = pgmPhysPageLoadIntoTlbWithPage(pVM, pPage, GCPhys);
    560622    *ppTlbe = pTlbe;
    561623    return rc;
     
    567629/**
    568630 * Enables write monitoring for an allocated page.
    569  * 
    570  * The caller is responsible for updating the shadow page tables. 
    571  * 
     631 *
     632 * The caller is responsible for updating the shadow page tables.
     633 *
    572634 * @param   pVM         The VM handle.
    573  * @param   pPage       The page to write monitor. 
     635 * @param   pPage       The page to write monitor.
    574636 * @param   GCPhysPage  The address of the page.
    575637 */
     
    585647    if (PGM_PAGE_GET_PDE_TYPE(pPage) == PGM_PAGE_PDE_TYPE_PDE)
    586648    {
    587         PPGMPAGE pFirstPage = pgmPhysGetPage(&pVM->pgm.s, GCPhysPage & X86_PDE2M_PAE_PG_MASK);
     649        PPGMPAGE pFirstPage = pgmPhysGetPage(pVM, GCPhysPage & X86_PDE2M_PAE_PG_MASK);
    588650        AssertFatal(pFirstPage);
    589651        if (PGM_PAGE_GET_PDE_TYPE(pFirstPage) == PGM_PAGE_PDE_TYPE_PDE)
     
    638700 *
    639701 * @returns guest physical address
    640  * @param   pPGM        Pointer to the PGM instance data.
     702 * @param   pVM         The VM handle.
    641703 * @param   Pde         Guest Pde
    642704 */
    643 DECLINLINE(RTGCPHYS) pgmGstGet4MBPhysPage(PPGM pPGM, X86PDE Pde)
     705DECLINLINE(RTGCPHYS) pgmGstGet4MBPhysPage(PVM pVM, X86PDE Pde)
    644706{
    645707    RTGCPHYS GCPhys = Pde.u & X86_PDE4M_PG_MASK;
    646708    GCPhys |= (RTGCPHYS)Pde.b.u8PageNoHigh << 32;
    647709
    648     return GCPhys & pPGM->GCPhys4MBPSEMask;
     710    return GCPhys & pVM->pgm.s.GCPhys4MBPSEMask;
    649711}
    650712
     
    13071369
    13081370/**
    1309  * Clears one physical page of a virtual handler
    1310  *
    1311  * @param   pPGM    Pointer to the PGM instance.
    1312  * @param   pCur    Virtual handler structure
    1313  * @param   iPage   Physical page index
     1371 * Clears one physical page of a virtual handler.
     1372 *
     1373 * @param   pVM         The VM handle.
     1374 * @param   pCur        Virtual handler structure.
     1375 * @param   iPage       Physical page index.
    13141376 *
    13151377 * @remark  Only used when PGM_SYNC_UPDATE_PAGE_BIT_VIRTUAL is being set, so no
    13161378 *          need to care about other handlers in the same page.
    13171379 */
    1318 DECLINLINE(void) pgmHandlerVirtualClearPage(PPGM pPGM, PPGMVIRTHANDLER pCur, unsigned iPage)
     1380DECLINLINE(void) pgmHandlerVirtualClearPage(PVM pVM, PPGMVIRTHANDLER pCur, unsigned iPage)
    13191381{
    13201382    const PPGMPHYS2VIRTHANDLER pPhys2Virt = &pCur->aPhysToVirt[iPage];
     
    13311393    {
    13321394        /* We're the head of the alias chain. */
    1333         PPGMPHYS2VIRTHANDLER pRemove = (PPGMPHYS2VIRTHANDLER)RTAvlroGCPhysRemove(&pPGM->CTX_SUFF(pTrees)->PhysToVirtHandlers, pPhys2Virt->Core.Key); NOREF(pRemove);
     1395        PPGMPHYS2VIRTHANDLER pRemove = (PPGMPHYS2VIRTHANDLER)RTAvlroGCPhysRemove(&pVM->pgm.s.CTX_SUFF(pTrees)->PhysToVirtHandlers, pPhys2Virt->Core.Key); NOREF(pRemove);
    13341396#ifdef VBOX_STRICT_PGM_HANDLER_VIRTUAL
    13351397        AssertReleaseMsg(pRemove != NULL,
     
    13521414#endif
    13531415            pNext->offNextAlias |= PGMPHYS2VIRTHANDLER_IS_HEAD;
    1354             bool fRc = RTAvlroGCPhysInsert(&pPGM->CTX_SUFF(pTrees)->PhysToVirtHandlers, &pNext->Core);
     1416            bool fRc = RTAvlroGCPhysInsert(&pVM->pgm.s.CTX_SUFF(pTrees)->PhysToVirtHandlers, &pNext->Core);
    13551417            AssertRelease(fRc);
    13561418        }
     
    13591421    {
    13601422        /* Locate the previous node in the alias chain. */
    1361         PPGMPHYS2VIRTHANDLER pPrev = (PPGMPHYS2VIRTHANDLER)RTAvlroGCPhysGet(&pPGM->CTX_SUFF(pTrees)->PhysToVirtHandlers, pPhys2Virt->Core.Key);
     1423        PPGMPHYS2VIRTHANDLER pPrev = (PPGMPHYS2VIRTHANDLER)RTAvlroGCPhysGet(&pVM->pgm.s.CTX_SUFF(pTrees)->PhysToVirtHandlers, pPhys2Virt->Core.Key);
    13621424#ifdef VBOX_STRICT_PGM_HANDLER_VIRTUAL
    13631425        AssertReleaseMsg(pPrev != pPhys2Virt,
     
    14051467     * Clear the ram flags for this page.
    14061468     */
    1407     PPGMPAGE pPage = pgmPhysGetPage(pPGM, pPhys2Virt->Core.Key);
     1469    PPGMPAGE pPage = pgmPhysGetPage(pVM, pPhys2Virt->Core.Key);
    14081470    AssertReturnVoid(pPage);
    14091471    PGM_PAGE_SET_HNDL_VIRT_STATE(pPage, PGM_PAGE_HNDL_VIRT_STATE_NONE);
     
    15211583 * @param   pPage       PGM pool page
    15221584 */
    1523 DECLINLINE(bool) pgmPoolIsPageLocked(PPGM pPGM, PPGMPOOLPAGE pPage)
     1585DECLINLINE(bool) pgmPoolIsPageLocked(PPGMPOOLPAGE pPage)
    15241586{
    15251587    if (pPage->cLocked)
     
    15401602 * @param   pVM         VM handle.
    15411603 */
    1542 DECL_FORCE_INLINE(bool) pgmMapAreMappingsEnabled(PPGM pPGM)
     1604DECL_FORCE_INLINE(bool) pgmMapAreMappingsEnabled(PVM pVM)
    15431605{
    15441606#ifdef PGM_WITHOUT_MAPPINGS
    15451607    /* There are no mappings in VT-x and AMD-V mode. */
    1546     Assert(pPGM->fMappingsDisabled);
     1608    Assert(pVM->pgm.s.fMappingsDisabled);
    15471609    return false;
    15481610#else
    1549     return !pPGM->fMappingsDisabled;
     1611    return !pVM->pgm.s.fMappingsDisabled;
    15501612#endif
    15511613}
     
    15581620 * @param   pVM         The VM handle.
    15591621 */
    1560 DECL_FORCE_INLINE(bool) pgmMapAreMappingsFloating(PPGM pPGM)
     1622DECL_FORCE_INLINE(bool) pgmMapAreMappingsFloating(PVM pVM)
    15611623{
    15621624#ifdef PGM_WITHOUT_MAPPINGS
    15631625    /* There are no mappings in VT-x and AMD-V mode. */
    1564     Assert(pPGM->fMappingsDisabled);
     1626    Assert(pVM->pgm.s.fMappingsDisabled);
    15651627    return false;
    15661628#else
    1567     return !pPGM->fMappingsDisabled
    1568         && !pPGM->fMappingsFixed;
     1629    return !pVM->pgm.s.fMappingsDisabled
     1630        && !pVM->pgm.s.fMappingsFixed;
    15691631#endif
    15701632}
  • trunk/src/VBox/VMM/include/PGMInternal.h

    r36629 r36891  
    13261326#define PGM_RAM_RANGE_IS_AD_HOC(pRam) \
    13271327    (!!( (pRam)->fFlags & (PGM_RAM_RANGE_FLAGS_AD_HOC_ROM | PGM_RAM_RANGE_FLAGS_AD_HOC_MMIO | PGM_RAM_RANGE_FLAGS_AD_HOC_MMIO2) ) )
     1328
     1329/* enable the tlbs. */
     1330//#define PGM_USE_RAMRANGE_TLB
     1331/** The number of entries in the RAM range TLBs (there is one for each
     1332 *  context).  Must be a power of two. */
     1333#define PGM_RAMRANGE_TLB_ENTRIES            8
     1334
     1335/**
     1336 * Calculates the RAM range TLB index for the physical address.
     1337 *
     1338 * @returns RAM range TLB index.
     1339 * @param   GCPhys      The guest physical address.
     1340 */
     1341#define PGM_RAMRANGE_TLB_IDX(a_GCPhys)      ( ((a_GCPhys) >> 20) & (PGM_RAMRANGE_TLB_ENTRIES - 1) )
     1342
    13281343
    13291344
     
    27922807    STAMCOUNTER StatR3PageMapTlbHits;               /**< R3: Ring-3/0 page mapper TLB hits. */
    27932808    STAMCOUNTER StatR3PageMapTlbMisses;             /**< R3: Ring-3/0 page mapper TLB misses. */
     2809    STAMCOUNTER StatRZRamRangeTlbHits;              /**< RC/R0: RAM range TLB hits. */
     2810    STAMCOUNTER StatRZRamRangeTlbMisses;            /**< RC/R0: RAM range TLB misses. */
     2811    STAMCOUNTER StatR3RamRangeTlbHits;              /**< R3: RAM range TLB hits. */
     2812    STAMCOUNTER StatR3RamRangeTlbMisses;            /**< R3: RAM range TLB misses. */
    27942813    STAMPROFILE StatRZSyncCR3HandlerVirtualReset;   /**< RC/R0: Profiling of the virtual handler resets. */
    27952814    STAMPROFILE StatRZSyncCR3HandlerVirtualUpdate;  /**< RC/R0: Profiling of the virtual handler updates. */
     
    29462965    /** Pointer to the list of RAM ranges (Phys GC -> Phys HC conversion) - for R3.
    29472966     * This is sorted by physical address and contains no overlapping ranges. */
    2948     R3PTRTYPE(PPGMRAMRANGE)         pRamRangesR3;
     2967    R3PTRTYPE(PPGMRAMRANGE)         pRamRangesXR3;
     2968#ifdef PGM_USE_RAMRANGE_TLB
     2969    /** Ram range TLB for R3. */
     2970    R3PTRTYPE(PPGMRAMRANGE)         apRamRangesTlbR3[PGM_RAMRANGE_TLB_ENTRIES];
     2971#endif
    29492972    /** PGM offset based trees - R3 Ptr. */
    29502973    R3PTRTYPE(PPGMTREES)            pTreesR3;
     
    29672990    /*RTR3PTR                         R3PtrAlignment0;*/
    29682991
    2969 
    2970     /** R0 pointer corresponding to PGM::pRamRangesR3. */
    2971     R0PTRTYPE(PPGMRAMRANGE)         pRamRangesR0;
     2992    /** R0 pointer corresponding to PGM::pRamRangesXR3. */
     2993    R0PTRTYPE(PPGMRAMRANGE)         pRamRangesXR0;
     2994#ifdef PGM_USE_RAMRANGE_TLB
     2995    /** Ram range TLB for R0. */
     2996    R0PTRTYPE(PPGMRAMRANGE)         apRamRangesTlbR0[PGM_RAMRANGE_TLB_ENTRIES];
     2997#endif
    29722998    /** PGM offset based trees - R0 Ptr. */
    29732999    R0PTRTYPE(PPGMTREES)            pTreesR0;
     
    29843010
    29853011
    2986     /** RC pointer corresponding to PGM::pRamRangesR3. */
    2987     RCPTRTYPE(PPGMRAMRANGE)         pRamRangesRC;
     3012    /** RC pointer corresponding to PGM::pRamRangesXR3. */
     3013    RCPTRTYPE(PPGMRAMRANGE)         pRamRangesXRC;
     3014#ifdef PGM_USE_RAMRANGE_TLB
     3015    /** Ram range TLB for RC. */
     3016    RCPTRTYPE(PPGMRAMRANGE)         apRamRangesTlbRC[PGM_RAMRANGE_TLB_ENTRIES];
     3017#endif
    29883018    /** PGM offset based trees - RC Ptr. */
    29893019    RCPTRTYPE(PPGMTREES)            pTreesRC;
     
    37713801int             pgmPhysAllocLargePage(PVM pVM, RTGCPHYS GCPhys);
    37723802int             pgmPhysRecheckLargePage(PVM pVM, RTGCPHYS GCPhys, PPGMPAGE pLargePage);
    3773 int             pgmPhysPageLoadIntoTlb(PPGM pPGM, RTGCPHYS GCPhys);
    3774 int             pgmPhysPageLoadIntoTlbWithPage(PPGM pPGM, PPGMPAGE pPage, RTGCPHYS GCPhys);
     3803int             pgmPhysPageLoadIntoTlb(PVM pVM, RTGCPHYS GCPhys);
     3804int             pgmPhysPageLoadIntoTlbWithPage(PVM pVM, PPGMPAGE pPage, RTGCPHYS GCPhys);
    37753805void            pgmPhysPageMakeWriteMonitoredWritable(PVM pVM, PPGMPAGE pPage);
    37763806int             pgmPhysPageMakeWritable(PVM pVM, PPGMPAGE pPage, RTGCPHYS GCPhys);
     
    37843814VMMDECL(int)    pgmPhysRomWriteHandler(PVM pVM, RTGCUINT uErrorCode, PCPUMCTXCORE pRegFrame, RTGCPTR pvFault, RTGCPHYS GCPhysFault, void *pvUser);
    37853815int             pgmPhysFreePage(PVM pVM, PGMMFREEPAGESREQ pReq, uint32_t *pcPendingPages, PPGMPAGE pPage, RTGCPHYS GCPhys);
     3816void            pgmPhysInvalidRamRangeTlbs(PVM pVM);
     3817PPGMRAMRANGE    pgmPhysGetRangeSlow(PVM pVM, RTGCPHYS GCPhys);
     3818PPGMRAMRANGE    pgmPhysGetRangeAtOrAboveSlow(PVM pVM, RTGCPHYS GCPhys);
     3819PPGMPAGE        pgmPhysGetPageSlow(PVM pVM, RTGCPHYS GCPhys);
     3820int             pgmPhysGetPageExSlow(PVM pVM, RTGCPHYS GCPhys, PPPGMPAGE ppPage);
     3821int             pgmPhysGetPageAndRangeExSlow(PVM pVM, RTGCPHYS GCPhys, PPPGMPAGE ppPage, PPGMRAMRANGE *ppRam);
    37863822
    37873823#ifdef IN_RING3
  • trunk/src/VBox/VMM/testcase/tstVMStructRC.cpp

    r36768 r36891  
    564564    GEN_CHECK_OFF(PGM, enmHostMode);
    565565    GEN_CHECK_OFF(PGM, GCPhys4MBPSEMask);
    566     GEN_CHECK_OFF(PGM, pRamRangesR3);
    567     GEN_CHECK_OFF(PGM, pRamRangesR0);
    568     GEN_CHECK_OFF(PGM, pRamRangesRC);
     566    GEN_CHECK_OFF(PGM, pRamRangesXR3);
     567    GEN_CHECK_OFF(PGM, pRamRangesXR0);
     568    GEN_CHECK_OFF(PGM, pRamRangesXRC);
    569569    GEN_CHECK_OFF(PGM, pRomRangesR3);
    570570    GEN_CHECK_OFF(PGM, pRomRangesR0);
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