VirtualBox

Changeset 16203 in vbox


Ignore:
Timestamp:
Jan 23, 2009 4:36:23 PM (16 years ago)
Author:
vboxsync
Message:

Updates in preparation for PGM pool based paging everywhere.

Location:
trunk/src/VBox/VMM
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/PGM.cpp

    r16172 r16203  
    19631963    pVM->pgm.s.GCPtrCR3Mapping += offDelta;
    19641964    /** @todo move this into shadow and guest specific relocation functions. */
     1965#ifdef VBOX_WITH_PGMPOOL_PAGING_ONLY
     1966    AssertMsg(pVM->pgm.s.pShwNestedRootR3, ("Init order, no relocation before paging is initialized!\n"));
     1967#else
    19651968    AssertMsg(pVM->pgm.s.pShw32BitPdR3, ("Init order, no relocation before paging is initialized!\n"));
     1969    pVM->pgm.s.pShw32BitPdRC += offDelta;
     1970#endif
     1971    pVM->pgm.s.pGst32BitPdRC += offDelta;
     1972    for (unsigned i = 0; i < RT_ELEMENTS(pVM->pgm.s.apGstPaePDsRC); i++)
     1973    {
    19661974#ifndef VBOX_WITH_PGMPOOL_PAGING_ONLY
    1967     pVM->pgm.s.pShw32BitPdRC += offDelta;
    1968 #endif
    1969     pVM->pgm.s.pGst32BitPdRC += offDelta;
    1970     AssertCompile(RT_ELEMENTS(pVM->pgm.s.apShwPaePDsRC) == RT_ELEMENTS(pVM->pgm.s.apGstPaePDsRC));
    1971     for (unsigned i = 0; i < RT_ELEMENTS(pVM->pgm.s.apShwPaePDsRC); i++)
    1972     {
    1973 #ifndef VBOX_WITH_PGMPOOL_PAGING_ONLY
     1975        AssertCompile(RT_ELEMENTS(pVM->pgm.s.apShwPaePDsRC) == RT_ELEMENTS(pVM->pgm.s.apGstPaePDsRC));
    19741976        pVM->pgm.s.apShwPaePDsRC[i] += offDelta;
    19751977#endif
  • trunk/src/VBox/VMM/PGMInternal.h

    r16182 r16203  
    5353 * @{
    5454 */
     55
     56/*
     57 * Enable to use the PGM pool for all levels in the paging chain in all paging modes.
     58 */
     59//#define VBOX_WITH_PGMPOOL_PAGING_ONLY
    5560
    5661/**
     
    14051410/** The first normal index. */
    14061411#define PGMPOOL_IDX_FIRST_SPECIAL       1
    1407 /** Page directory (32-bit root). */
    1408 #define PGMPOOL_IDX_PD                  1
    14091412#ifdef VBOX_WITH_PGMPOOL_PAGING_ONLY
    14101413/** Page directory (32-bit root). */
     
    14191422#define PGMPOOL_IDX_FIRST               5
    14201423#else
     1424/** Page directory (32-bit root). */
     1425#define PGMPOOL_IDX_PD                  1
    14211426/** The extended PAE page directory (2048 entries, works as root currently). */
    14221427#define PGMPOOL_IDX_PAE_PD              2
     
    18221827
    18231828
    1824 #if defined(IN_RC) || defined(VBOX_WITH_2X_4GB_ADDR_SPACE_IN_R0)
    1825 DECLINLINE(void *) pgmPoolMapPageInlined(PVM pVM, PPGMPOOLPAGE pPage);
    1826 #endif
    1827 
    18281829/** @def PGMPOOL_PAGE_2_PTR
    18291830 * Maps a pool page pool into the current context.
     
    22342235    R0PTRTYPE(void *)               pShwRootR0;
    22352236# endif
     2237    /** The root page table - RC Ptr. */
     2238    RCPTRTYPE(void *)               pShwRootRC;
     2239# if HC_ARCH_BITS == 64
     2240    uint32_t                        u32Padding1; /**< alignment padding. */
     2241# endif
    22362242    /** The Physical Address (HC) of the current active shadow CR3. */
    22372243    RTHCPHYS                        HCPhysShwCR3;
     
    22562262    RCPTRTYPE(PX86PD)               pShw32BitPdRC;
    22572263# if HC_ARCH_BITS == 64
    2258     uint32_t                        u32Padding1; /**< alignment padding. */
     2264    uint32_t                        u32Padding10; /**< alignment padding. */
    22592265# endif
    22602266    /** The Physical Address (HC) of the 32-Bit PD. */
     
    22912297    RTRCPTR                         alignment5; /**< structure size alignment. */
    22922298# endif
    2293 
     2299#endif /* !VBOX_WITH_PGMPOOL_PAGING_ONLY */
    22942300    /** @name Nested Shadow Paging
    22952301     * @{ */
     
    23022308    /** The Physical Address (HC) of the nested paging root. */
    23032309    RTHCPHYS                        HCPhysShwNestedRoot;
    2304 #endif
    23052310    /** @}  */
    23062311
     
    29662971
    29672972
     2973#if defined(IN_RC) || defined(VBOX_WITH_2X_4GB_ADDR_SPACE_IN_R0)
     2974/**
     2975 * Maps the page into current context (RC and maybe R0).
     2976 *
     2977 * @returns pointer to the mapping.
     2978 * @param   pVM         Pointer to the PGM instance data.
     2979 * @param   pPage       The page.
     2980 */
     2981DECLINLINE(void *) pgmPoolMapPageInlined(PPGM pPGM, PPGMPOOLPAGE pPage)
     2982{
     2983    if (pPage->idx >= PGMPOOL_IDX_FIRST)
     2984    {
     2985        Assert(pPage->idx < pPGM->CTX_SUFF(pPool)->cCurPages);
     2986        void *pv;
     2987# ifdef VBOX_WITH_2X_4GB_ADDR_SPACE_IN_R0
     2988        pgmR0DynMapHCPageInlined(pPGM, pPage->Core.Key, &pv);
     2989# else
     2990        PGMDynMapHCPage(PGM2VM(pPGM), pPage->Core.Key, &pv);
     2991# endif
     2992        return pv;
     2993    }
     2994    return pgmPoolMapPageFallback(pPGM, pPage);
     2995}
     2996#endif
     2997
    29682998/**
    29692999 * Gets the PGMRAMRANGE structure for a guest page.
     
    42834313
    42844314#ifndef IN_RC
    4285 
    42864315/**
    42874316 * Gets the shadow page map level-4 pointer.
     
    46424671#endif /* PGMPOOL_WITH_CACHE */
    46434672
    4644 
    4645 #if defined(IN_RC) || defined(VBOX_WITH_2X_4GB_ADDR_SPACE_IN_R0)
    4646 /**
    4647  * Maps the page into current context (RC and maybe R0).
    4648  *
    4649  * @returns pointer to the mapping.
    4650  * @param   pVM         Pointer to the PGM instance data.
    4651  * @param   pPage       The page.
    4652  */
    4653 DECLINLINE(void *) pgmPoolMapPageInlined(PPGM pPGM, PPGMPOOLPAGE pPage)
    4654 {
    4655     if (pPage->idx >= PGMPOOL_IDX_FIRST)
    4656     {
    4657         Assert(pPage->idx < pPGM->CTX_SUFF(pPool)->cCurPages);
    4658         void *pv;
    4659 # ifdef VBOX_WITH_2X_4GB_ADDR_SPACE_IN_R0
    4660         pgmR0DynMapHCPageInlined(pPGM, pPage->Core.Key, &pv);
    4661 # else
    4662         PGMDynMapHCPage(PGM2VM(pPGM), pPage->Core.Key, &pv);
    4663 # endif
    4664         return pv;
    4665     }
    4666     return pgmPoolMapPageFallback(pPGM, pPage);
    4667 }
    4668 #endif
    4669 
    4670 
    46714673/**
    46724674 * Tells if mappings are to be put into the shadow page table or not
  • trunk/src/VBox/VMM/PGMMap.cpp

    r16182 r16203  
    6161{
    6262    LogFlow(("PGMR3MapPT: GCPtr=%#x cb=%d pfnRelocate=%p pvUser=%p pszDesc=%s\n", GCPtr, cb, pfnRelocate, pvUser, pszDesc));
    63     AssertMsg(pVM->pgm.s.pInterPD && pVM->pgm.s.pShw32BitPdR3, ("Paging isn't initialized, init order problems!\n"));
     63    AssertMsg(pVM->pgm.s.pInterPD && pVM->pgm.s.pShwNestedRootR3, ("Paging isn't initialized, init order problems!\n"));
    6464
    6565    /*
  • trunk/src/VBox/VMM/VMMAll/PGMAll.cpp

    r16194 r16203  
    7474DECLINLINE(int) pgmShwSyncPAEPDPtr(PVM pVM, RTGCPTR GCPtr, PX86PDPE pGstPdpe, PX86PDPAE *ppPD);
    7575DECLINLINE(int) pgmShwGetPAEPDPtr(PVM pVM, RTGCPTR GCPtr, PX86PDPT *ppPdpt, PX86PDPAE *ppPD);
    76 
     76#ifdef VBOX_WITH_PGMPOOL_PAGING_ONLY
     77DECLINLINE(int) pgmShwGetPaePoolPagePD(PPGM pPGM, RTGCPTR GCPtr, PPGMPOOLPAGE *ppShwPde);
     78#endif
    7779
    7880/*
     
    703705        Assert(!pVM->pgm.s.fMappingsFixed);
    704706        Assert(pVM->pgm.s.GCPhysCR3 == pVM->pgm.s.GCPhysGstCR3Monitored);
     707#ifndef VBOX_WITH_PGMPOOL_PAGING_ONLY
    705708        rc = PGM_GST_PFN(MonitorCR3, pVM)(pVM, pVM->pgm.s.GCPhysCR3);
     709#endif
    706710    }
    707711
     
    893897}
    894898
     899#ifdef VBOX_WITH_PGMPOOL_PAGING_ONLY
     900/**
     901 * Gets the pointer to the shadow page directory entry for an address, PAE.
     902 *
     903 * @returns Pointer to the PDE.
     904 * @param   pPGM        Pointer to the PGM instance data.
     905 * @param   GCPtr       The address.
     906 * @param   ppShwPde    Receives the address of the pgm pool page for the shadow page directory
     907 */
     908DECLINLINE(int) pgmShwGetPaePoolPagePD(PPGM pPGM, RTGCPTR GCPtr, PPGMPOOLPAGE *ppShwPde)
     909{
     910    const unsigned  iPdPt = (GCPtr >> X86_PDPT_SHIFT) & X86_PDPT_MASK_PAE;
     911    PX86PDPT        pPdpt = pgmShwGetPaePDPTPtr(pPGM);
     912    AssertReturn(pPdpt, VERR_PAGE_DIRECTORY_PTR_NOT_PRESENT);    /* can't happen */
     913    if (!pPdpt->a[iPdPt].n.u1Present)
     914        return VERR_PAGE_DIRECTORY_PTR_NOT_PRESENT;
     915
     916    /* Fetch the pgm pool shadow descriptor. */
     917    PPGMPOOLPAGE pShwPde = pgmPoolGetPageByHCPhys(PGM2VM(pPGM), pPdpt->a[iPdPt].u & X86_PDPE_PG_MASK);
     918    AssertReturn(pShwPde, VERR_INTERNAL_ERROR);
     919
     920    *ppShwPde = pShwPde;
     921    return VINF_SUCCESS;
     922}
     923#endif
     924
    895925#ifndef IN_RC
    896926
     
    12551285VMMDECL(RTHCPHYS) PGMGetHyperCR3(PVM pVM)
    12561286{
     1287#ifdef VBOX_WITH_PGMPOOL_PAGING_ONLY
     1288    return pVM->pgm.s.HCPhysShwCR3;
     1289#else
    12571290    PGMMODE enmShadowMode = pVM->pgm.s.enmShadowMode;
    12581291    switch (enmShadowMode)
     
    12791312            return ~0;
    12801313    }
     1314#endif
    12811315}
    12821316
     
    12891323VMMDECL(RTHCPHYS) PGMGetNestedCR3(PVM pVM, PGMMODE enmShadowMode)
    12901324{
     1325#ifdef VBOX_WITH_PGMPOOL_PAGING_ONLY
     1326    return pVM->pgm.s.HCPhysShwCR3;
     1327#else
    12911328    switch (enmShadowMode)
    12921329    {
     
    13061343            return ~0;
    13071344    }
     1345#endif
    13081346}
    13091347
     
    13271365VMMDECL(RTHCPHYS) PGMGetHyper32BitCR3(PVM pVM)
    13281366{
     1367#ifdef VBOX_WITH_PGMPOOL_PAGING_ONLY
     1368    return pVM->pgm.s.HCPhysShwCR3;
     1369#else
    13291370    return pVM->pgm.s.HCPhysShw32BitPD;
     1371#endif
    13301372}
    13311373
     
    13381380VMMDECL(RTHCPHYS) PGMGetHyperPaeCR3(PVM pVM)
    13391381{
     1382#ifdef VBOX_WITH_PGMPOOL_PAGING_ONLY
     1383    return pVM->pgm.s.HCPhysShwCR3;
     1384#else
    13401385    return pVM->pgm.s.HCPhysShwPaePdpt;
     1386#endif
    13411387}
    13421388
     
    13491395VMMDECL(RTHCPHYS) PGMGetHyperAmd64CR3(PVM pVM)
    13501396{
     1397#ifdef VBOX_WITH_PGMPOOL_PAGING_ONLY
    13511398    return pVM->pgm.s.HCPhysShwCR3;
    1352 }
    1353 
     1399#else
     1400    return pVM->pgm.s.HCPhysShwCR3;
     1401#endif
     1402}
    13541403
    13551404/**
     
    14961545            {
    14971546                pVM->pgm.s.fSyncFlags &= ~PGM_SYNC_MONITOR_CR3;
     1547#ifndef VBOX_WITH_PGMPOOL_PAGING_ONLY
    14981548                rc = PGM_GST_PFN(MonitorCR3, pVM)(pVM, GCPhysCR3);
     1549#endif
    14991550            }
    15001551        }
     
    15231574            pVM->pgm.s.fSyncFlags &= ~PGM_SYNC_MONITOR_CR3;
    15241575            Assert(!pVM->pgm.s.fMappingsFixed);
     1576#ifndef VBOX_WITH_PGMPOOL_PAGING_ONLY
    15251577            rc = PGM_GST_PFN(MonitorCR3, pVM)(pVM, GCPhysCR3);
     1578#endif
    15261579        }
    15271580        if (fGlobal)
     
    16901743            Assert(!pVM->pgm.s.fMappingsFixed);
    16911744            Assert(pVM->pgm.s.GCPhysCR3 == pVM->pgm.s.GCPhysGstCR3Monitored);
     1745#ifndef VBOX_WITH_PGMPOOL_PAGING_ONLY
    16921746            rc = PGM_GST_PFN(MonitorCR3, pVM)(pVM, pVM->pgm.s.GCPhysCR3);
     1747#endif
    16931748        }
    16941749    }
  • trunk/src/VBox/VMM/VMMAll/PGMAllBth.h

    r16177 r16203  
    893893    PX86PDE         pPdeDst   = pgmShwGet32BitPDEPtr(&pVM->pgm.s, GCPtrPage);
    894894
     895#  ifdef VBOX_WITH_PGMPOOL_PAGING_ONLY
     896    /* Fetch the pgm pool shadow descriptor. */
     897    PPGMPOOLPAGE    pShwPde = pVM->pgm.s.CTX_SUFF(pShwPageCR3);
     898    Assert(pShwPde);
     899#  endif
     900
    895901# elif PGM_SHW_TYPE == PGM_TYPE_PAE
    896902    const unsigned  iPdpt     = (GCPtrPage >> X86_PDPT_SHIFT);
     
    905911    }
    906912
     913#  ifdef VBOX_WITH_PGMPOOL_PAGING_ONLY
     914    const unsigned  iPDDst  = (GCPtrPage >> SHW_PD_SHIFT) & SHW_PD_MASK;
     915    PPGMPOOLPAGE    pShwPde;
     916    PX86PDPAE       pPDDst;
     917   
     918    /* Fetch the pgm pool shadow descriptor. */
     919    rc = pgmShwGetPaePoolPagePD(&pVM->pgm.s, GCPtrPage, &pShwPde);
     920    AssertRCSuccessReturn(rc, rc);
     921    Assert(pShwPde);
     922
     923    pPDDst             = (PX86PDPAE)PGMPOOL_PAGE_2_PTR_BY_PGM(&pVM->pgm.s, pShwPde);
     924    PX86PDEPAE pPdeDst = &pPDDst->a[iPDDst];
     925#  else
    907926    const unsigned  iPDDst    = (GCPtrPage >> SHW_PD_SHIFT) /*& SHW_PD_MASK - pool index only atm! */;
    908927    PX86PDEPAE      pPdeDst   = pgmShwGetPaePDEPtr(&pVM->pgm.s, GCPtrPage);
     928#  endif
    909929
    910930# else /* PGM_SHW_TYPE == PGM_TYPE_AMD64 */
     
    10941114# endif /* PGM_GST_TYPE == PGM_TYPE_AMD64 */
    10951115
    1096 # if PGM_GST_TYPE == PGM_TYPE_PAE
     1116# if PGM_GST_TYPE == PGM_TYPE_PAE && !defined(VBOX_WITH_PGMPOOL_PAGING_ONLY)
    10971117    /*
    10981118     * Update the shadow PDPE and free all the shadow PD entries if the PDPE is marked not present.
     
    11491169            LogFlow(("InvalidatePage: Out-of-sync at %RGp PdeSrc=%RX64 PdeDst=%RX64\n",
    11501170                     GCPtrPage, (uint64_t)PdeSrc.u, (uint64_t)PdeDst.u));
    1151 # if PGM_GST_TYPE == PGM_TYPE_AMD64
     1171# if PGM_GST_TYPE == PGM_TYPE_AMD64 || defined(VBOX_WITH_PGMPOOL_PAGING_ONLY)
    11521172            pgmPoolFree(pVM, PdeDst.u & SHW_PDE_PG_MASK, pShwPde->idx, iPDDst);
    11531173# else
     
    11651185            LogFlow(("InvalidatePage: Out-of-sync (A) at %RGp PdeSrc=%RX64 PdeDst=%RX64\n",
    11661186                     GCPtrPage, (uint64_t)PdeSrc.u, (uint64_t)PdeDst.u));
    1167 # if PGM_GST_TYPE == PGM_TYPE_AMD64
     1187# if PGM_GST_TYPE == PGM_TYPE_AMD64 || defined(VBOX_WITH_PGMPOOL_PAGING_ONLY)
    11681188            pgmPoolFree(pVM, PdeDst.u & SHW_PDE_PG_MASK, pShwPde->idx, iPDDst);
    11691189# else
     
    12131233                LogFlow(("InvalidatePage: Out-of-sync at %RGp PdeSrc=%RX64 PdeDst=%RX64 ShwGCPhys=%RGp iPDDst=%#x\n",
    12141234                         GCPtrPage, (uint64_t)PdeSrc.u, (uint64_t)PdeDst.u, pShwPage->GCPhys, iPDDst));
    1215 # if PGM_GST_TYPE == PGM_TYPE_AMD64
     1235# if PGM_GST_TYPE == PGM_TYPE_AMD64 || defined(VBOX_WITH_PGMPOOL_PAGING_ONLY)
    12161236                pgmPoolFree(pVM, PdeDst.u & SHW_PDE_PG_MASK, pShwPde->idx, iPDDst);
    12171237# else
     
    12591279            LogFlow(("InvalidatePage: Out-of-sync PD at %RGp PdeSrc=%RX64 PdeDst=%RX64\n",
    12601280                     GCPtrPage, (uint64_t)PdeSrc.u, (uint64_t)PdeDst.u));
    1261 # if PGM_GST_TYPE == PGM_TYPE_AMD64
     1281# if PGM_GST_TYPE == PGM_TYPE_AMD64 || defined(VBOX_WITH_PGMPOOL_PAGING_ONLY)
    12621282            pgmPoolFree(pVM, PdeDst.u & SHW_PDE_PG_MASK, pShwPde->idx, iPDDst);
    12631283# else
     
    12761296        if (!(PdeDst.u & PGM_PDFLAGS_MAPPING))
    12771297        {
    1278 # if PGM_GST_TYPE == PGM_TYPE_AMD64
     1298# if PGM_GST_TYPE == PGM_TYPE_AMD64 || defined(VBOX_WITH_PGMPOOL_PAGING_ONLY)
    12791299            pgmPoolFree(pVM, PdeDst.u & SHW_PDE_PG_MASK, pShwPde->idx, iPDDst);
    12801300# else
     
    15901610    PX86PDE         pPdeDst  = pgmShwGet32BitPDEPtr(&pVM->pgm.s, GCPtrPage);
    15911611
     1612#  ifdef VBOX_WITH_PGMPOOL_PAGING_ONLY
     1613    /* Fetch the pgm pool shadow descriptor. */
     1614    PPGMPOOLPAGE    pShwPde = pVM->pgm.s.CTX_SUFF(pShwPageCR3);
     1615    Assert(pShwPde);
     1616#  endif
     1617
    15921618# elif PGM_SHW_TYPE == PGM_TYPE_PAE
     1619
     1620#  ifdef VBOX_WITH_PGMPOOL_PAGING_ONLY
     1621    const unsigned  iPDDst  = (GCPtrPage >> SHW_PD_SHIFT) & SHW_PD_MASK;
     1622    PPGMPOOLPAGE    pShwPde;
     1623    PX86PDPAE       pPDDst;
     1624   
     1625    /* Fetch the pgm pool shadow descriptor. */
     1626    int rc = pgmShwGetPaePoolPagePD(&pVM->pgm.s, GCPtrPage, &pShwPde);
     1627    AssertRCSuccessReturn(rc, rc);
     1628    Assert(pShwPde);
     1629
     1630    pPDDst             = (PX86PDPAE)PGMPOOL_PAGE_2_PTR_BY_PGM(&pVM->pgm.s, pShwPde);
     1631    PX86PDEPAE pPdeDst = &pPDDst->a[iPDDst];
     1632#  else
    15931633    const unsigned  iPDDst   = (GCPtrPage >> SHW_PD_SHIFT) /*& SHW_PD_MASK - only pool index atm! */;
    15941634    const unsigned  iPdpt    = (GCPtrPage >> X86_PDPT_SHIFT);
     
    15961636    PX86PDEPAE      pPdeDst  = pgmShwGetPaePDEPtr(&pVM->pgm.s, GCPtrPage);
    15971637    AssertReturn(pPdeDst, VERR_INTERNAL_ERROR);
    1598 
     1638#  endif
    15991639# elif PGM_SHW_TYPE == PGM_TYPE_AMD64
    16001640    const unsigned  iPDDst   = (GCPtrPage >> SHW_PD_SHIFT) & SHW_PD_MASK;
     
    18271867     */
    18281868    PPGMPOOL pPool = pVM->pgm.s.CTX_SUFF(pPool);
    1829 # if PGM_GST_TYPE == PGM_TYPE_AMD64
     1869# if PGM_GST_TYPE == PGM_TYPE_AMD64 || defined(VBOX_WITH_PGMPOOL_PAGING_ONLY)
    18301870    pgmPoolFreeByPage(pPool, pShwPage, pShwPde->idx, iPDDst);
    18311871# else
     
    23052345    PSHWPDE         pPdeDst  = pgmShwGet32BitPDEPtr(&pVM->pgm.s, GCPtrPage);
    23062346
     2347#  ifdef VBOX_WITH_PGMPOOL_PAGING_ONLY
     2348    /* Fetch the pgm pool shadow descriptor. */
     2349    PPGMPOOLPAGE    pShwPde  = pVM->pgm.s.CTX_SUFF(pShwPageCR3);
     2350    Assert(pShwPde);
     2351#  endif
     2352
    23072353# elif PGM_SHW_TYPE == PGM_TYPE_PAE
     2354#  ifdef VBOX_WITH_PGMPOOL_PAGING_ONLY
     2355    const unsigned  iPDDst  = (GCPtrPage >> SHW_PD_SHIFT) & SHW_PD_MASK;
     2356    PPGMPOOLPAGE    pShwPde;
     2357    PX86PDPAE       pPDDst;
     2358    PSHWPDE         pPdeDst;
     2359   
     2360    /* Fetch the pgm pool shadow descriptor. */
     2361    rc = pgmShwGetPaePoolPagePD(&pVM->pgm.s, GCPtrPage, &pShwPde);
     2362    AssertRCSuccessReturn(rc, rc);
     2363    Assert(pShwPde);
     2364
     2365    pPDDst  = (PX86PDPAE)PGMPOOL_PAGE_2_PTR_BY_PGM(&pVM->pgm.s, pShwPde);
     2366    pPdeDst = &pPDDst->a[iPDDst];
     2367#  else
    23082368    const unsigned  iPDDst   = (GCPtrPage >> SHW_PD_SHIFT) /*& SHW_PD_MASK - only pool index atm! */;
    23092369    const unsigned  iPdpt    = (GCPtrPage >> X86_PDPT_SHIFT); NOREF(iPdpt);
    23102370    PX86PDPT        pPdptDst = pgmShwGetPaePDPTPtr(&pVM->pgm.s); NOREF(pPdptDst);
    23112371    PSHWPDE         pPdeDst  = pgmShwGetPaePDEPtr(&pVM->pgm.s, GCPtrPage);
    2312 
     2372#  endif
    23132373# elif PGM_SHW_TYPE == PGM_TYPE_AMD64
    23142374    const unsigned  iPdpt    = (GCPtrPage >> X86_PDPT_SHIFT) & X86_PDPT_MASK_AMD64;
     
    23892449            GCPhys |= (iPDDst & 1) * (PAGE_SIZE / 2);
    23902450# endif
    2391 # if PGM_GST_TYPE == PGM_TYPE_AMD64
     2451# if PGM_GST_TYPE == PGM_TYPE_AMD64 || defined(VBOX_WITH_PGMPOOL_PAGING_ONLY)
    23922452            rc = pgmPoolAlloc(pVM, GCPhys, BTH_PGMPOOLKIND_PT_FOR_PT, pShwPde->idx,      iPDDst, &pShwPage);
    23932453# else
     
    24022462            GCPhys |= GCPtrPage & (1 << X86_PD_PAE_SHIFT);
    24032463# endif
    2404 # if PGM_GST_TYPE == PGM_TYPE_AMD64
     2464# if PGM_GST_TYPE == PGM_TYPE_AMD64 || defined(VBOX_WITH_PGMPOOL_PAGING_ONLY)
    24052465            rc = pgmPoolAlloc(pVM, GCPhys, BTH_PGMPOOLKIND_PT_FOR_BIG, pShwPde->idx,      iPDDst, &pShwPage);
    24062466# else
     
    26932753    PSHWPDE         pPdeDst = pgmShwGet32BitPDEPtr(&pVM->pgm.s, GCPtrPage);
    26942754
     2755#  ifdef VBOX_WITH_PGMPOOL_PAGING_ONLY
     2756    /* Fetch the pgm pool shadow descriptor. */
     2757    PPGMPOOLPAGE    pShwPde = pVM->pgm.s.CTX_SUFF(pShwPageCR3);
     2758    Assert(pShwPde);
     2759#  endif
     2760
    26952761# elif PGM_SHW_TYPE == PGM_TYPE_PAE
     2762#  ifdef VBOX_WITH_PGMPOOL_PAGING_ONLY
     2763    const unsigned  iPDDst  = (GCPtrPage >> SHW_PD_SHIFT) & SHW_PD_MASK;
     2764    PPGMPOOLPAGE    pShwPde;
     2765    PX86PDPAE       pPDDst;
     2766    PSHWPDE         pPdeDst;
     2767   
     2768    /* Fetch the pgm pool shadow descriptor. */
     2769    rc = pgmShwGetPaePoolPagePD(&pVM->pgm.s, GCPtrPage, &pShwPde);
     2770    AssertRCSuccessReturn(rc, rc);
     2771    Assert(pShwPde);
     2772
     2773    pPDDst  = (PX86PDPAE)PGMPOOL_PAGE_2_PTR_BY_PGM(&pVM->pgm.s, pShwPde);
     2774    pPdeDst = &pPDDst->a[iPDDst];
     2775#  else
    26962776    const unsigned  iPDDst  = (GCPtrPage >> SHW_PD_SHIFT) /*& SHW_PD_MASK - only pool index atm!*/;
    26972777    PX86PDEPAE      pPdeDst = pgmShwGetPaePDEPtr(&pVM->pgm.s, GCPtrPage);
     2778#  endif
    26982779
    26992780# elif PGM_SHW_TYPE == PGM_TYPE_AMD64
     
    27512832    /* Virtual address = physical address */
    27522833    GCPhys = GCPtrPage & X86_PAGE_4K_BASE_MASK;
    2753 # if PGM_SHW_TYPE == PGM_TYPE_AMD64 || PGM_SHW_TYPE == PGM_TYPE_EPT
     2834# if PGM_SHW_TYPE == PGM_TYPE_AMD64 || PGM_SHW_TYPE == PGM_TYPE_EPT || defined(VBOX_WITH_PGMPOOL_PAGING_ONLY)
    27542835    rc = pgmPoolAlloc(pVM, GCPhys & ~(RT_BIT_64(SHW_PD_SHIFT) - 1), BTH_PGMPOOLKIND_PT_FOR_PT, pShwPde->idx, iPDDst, &pShwPage);
    27552836# else
  • trunk/src/VBox/VMM/VMMAll/PGMAllPool.cpp

    r15432 r16203  
    106106    switch (pPage->idx)
    107107    {
     108#  ifdef VBOX_WITH_PGMPOOL_PAGING_ONLY
     109        case PGMPOOL_IDX_PD:
     110        case PGMPOOL_IDX_PDPT:
     111        case PGMPOOL_IDX_AMD64_CR3:
     112            return pPGM->pShwRootRC;
     113#  else
    108114        case PGMPOOL_IDX_PD:
    109115            return pPGM->pShw32BitPdRC;
     
    119125        case PGMPOOL_IDX_PDPT:
    120126            return pPGM->pShwPaePdptRC;
     127#  endif
    121128        default:
    122129            AssertReleaseMsgFailed(("Invalid index %d\n", pPage->idx));
     
    128135    switch (pPage->idx)
    129136    {
     137#  ifdef VBOX_WITH_PGMPOOL_PAGING_ONLY
     138        case PGMPOOL_IDX_PD:
     139        case PGMPOOL_IDX_PDPT:
     140        case PGMPOOL_IDX_AMD64_CR3:
     141            HCPhys = pPGM->HCPhysShwCR3;
     142            break;
     143
     144        case PGMPOOL_IDX_NESTED_ROOT:
     145            HCPhys = pPGM->HCPhysShwNestedRoot;
     146            break;
     147#  else
    130148        case PGMPOOL_IDX_PD:
    131149            HCPhys = pPGM->HCPhysShw32BitPD;
     
    152170            AssertReleaseMsgFailed(("PGMPOOL_IDX_PAE_PD is not usable in VBOX_WITH_2X_4GB_ADDR_SPACE_IN_R0 context\n"));
    153171            return NULL;
     172#  endif
    154173        default:
    155174            AssertReleaseMsgFailed(("Invalid index %d\n", pPage->idx));
     
    388407            }
    389408
     409#  ifdef VBOX_WITH_PGMPOOL_PAGING_ONLY
     410            case PGMPOOLKIND_32BIT_PD:
     411#  else
    390412            case PGMPOOLKIND_ROOT_32BIT_PD:
     413#  endif
    391414            {
    392415                uShw.pv = PGMPOOL_PAGE_2_PTR(pPool->CTX_SUFF(pVM), pPage);
     
    428451            }
    429452
     453#  ifndef VBOX_WITH_PGMPOOL_PAGING_ONLY
    430454            case PGMPOOLKIND_ROOT_PAE_PD:
    431455            {
     
    474498                break;
    475499            }
     500#  endif /* !VBOX_WITH_PGMPOOL_PAGING_ONLY */
    476501
    477502            case PGMPOOLKIND_PAE_PD_FOR_PAE_PD:
     
    536561            }
    537562
     563#  ifdef VBOX_WITH_PGMPOOL_PAGING_ONLY
     564            case PGMPOOLKIND_PAE_PDPT:
     565#  else
    538566            case PGMPOOLKIND_ROOT_PDPT:
     567#  endif
    539568            {
    540569                /*
     
    13041333         * These cannot be flushed, and it's common to reuse the PDs as PTs.
    13051334         */
     1335#ifndef VBOX_WITH_PGMPOOL_PAGING_ONLY
    13061336        case PGMPOOLKIND_ROOT_32BIT_PD:
    13071337        case PGMPOOLKIND_ROOT_PAE_PD:
    13081338        case PGMPOOLKIND_ROOT_PDPT:
     1339#endif
    13091340        case PGMPOOLKIND_ROOT_NESTED:
    13101341            return false;
     
    14991530                case PGMPOOLKIND_64BIT_PDPT_FOR_64BIT_PDPT:
    15001531                case PGMPOOLKIND_64BIT_PML4_FOR_64BIT_PML4:
     1532#ifdef VBOX_WITH_PGMPOOL_PAGING_ONLY
     1533                case PGMPOOLKIND_32BIT_PD:
     1534                case PGMPOOLKIND_PAE_PDPT:
     1535#else
    15011536                case PGMPOOLKIND_ROOT_32BIT_PD:
    15021537                case PGMPOOLKIND_ROOT_PAE_PD:
    15031538                case PGMPOOLKIND_ROOT_PDPT:
     1539#endif
    15041540                {
    15051541                    /* find the head */
     
    15631599        case PGMPOOLKIND_64BIT_PDPT_FOR_64BIT_PDPT:
    15641600        case PGMPOOLKIND_64BIT_PML4_FOR_64BIT_PML4:
     1601#ifdef VBOX_WITH_PGMPOOL_PAGING_ONLY
     1602        case PGMPOOLKIND_32BIT_PD:
     1603        case PGMPOOLKIND_PAE_PDPT:
     1604#else
    15651605        case PGMPOOLKIND_ROOT_PDPT:
     1606#endif
    15661607            break;
    15671608
     
    15801621            return VINF_SUCCESS;
    15811622
     1623#ifndef VBOX_WITH_PGMPOOL_PAGING_ONLY
    15821624        case PGMPOOLKIND_ROOT_32BIT_PD:
    15831625        case PGMPOOLKIND_ROOT_PAE_PD:
     1626#endif
    15841627#ifdef PGMPOOL_WITH_MIXED_PT_CR3
    15851628            break;
     
    16511694        case PGMPOOLKIND_64BIT_PDPT_FOR_64BIT_PDPT:
    16521695        case PGMPOOLKIND_64BIT_PML4_FOR_64BIT_PML4:
     1696#ifdef VBOX_WITH_PGMPOOL_PAGING_ONLY
     1697        case PGMPOOLKIND_32BIT_PD:
     1698        case PGMPOOLKIND_PAE_PDPT:
     1699#else
    16531700        case PGMPOOLKIND_ROOT_PDPT:
     1701#endif
    16541702            break;
    16551703
     
    16681716            return VINF_SUCCESS;
    16691717
     1718#ifndef VBOX_WITH_PGMPOOL_PAGING_ONLY
    16701719        case PGMPOOLKIND_ROOT_32BIT_PD:
    16711720        case PGMPOOLKIND_ROOT_PAE_PD:
     1721#endif
    16721722#ifdef PGMPOOL_WITH_MIXED_PT_CR3
    16731723            break;
     
    23772427        case PGMPOOLKIND_32BIT_PT_FOR_PHYS:
    23782428        case PGMPOOLKIND_32BIT_PT_FOR_32BIT_4MB:
     2429#ifdef VBOX_WITH_PGMPOOL_PAGING_ONLY
     2430        case PGMPOOLKIND_32BIT_PD:
     2431#else
    23792432        case PGMPOOLKIND_ROOT_32BIT_PD:
     2433#endif
    23802434            return 4;
    23812435
     
    23902444        case PGMPOOLKIND_64BIT_PDPT_FOR_64BIT_PDPT:
    23912445        case PGMPOOLKIND_64BIT_PML4_FOR_64BIT_PML4:
     2446#ifndef VBOX_WITH_PGMPOOL_PAGING_ONLY
    23922447        case PGMPOOLKIND_ROOT_PAE_PD:
    23932448        case PGMPOOLKIND_ROOT_PDPT:
     2449#endif
     2450        case PGMPOOLKIND_PAE_PDPT:
    23942451        case PGMPOOLKIND_ROOT_NESTED:
    23952452        case PGMPOOLKIND_64BIT_PDPT_FOR_PHYS:
     
    24212478        case PGMPOOLKIND_32BIT_PT_FOR_32BIT_PT:
    24222479        case PGMPOOLKIND_32BIT_PT_FOR_32BIT_4MB:
     2480#ifdef VBOX_WITH_PGMPOOL_PAGING_ONLY
     2481        case PGMPOOLKIND_32BIT_PD:
     2482#else
    24232483        case PGMPOOLKIND_ROOT_32BIT_PD:
     2484#endif
    24242485        case PGMPOOLKIND_PAE_PT_FOR_32BIT_PT:
    24252486        case PGMPOOLKIND_PAE_PT_FOR_32BIT_4MB:
     
    24332494        case PGMPOOLKIND_64BIT_PDPT_FOR_64BIT_PDPT:
    24342495        case PGMPOOLKIND_64BIT_PML4_FOR_64BIT_PML4:
     2496#ifdef VBOX_WITH_PGMPOOL_PAGING_ONLY
     2497        case PGMPOOLKIND_PAE_PDPT:
     2498#else
    24352499        case PGMPOOLKIND_ROOT_PAE_PD:
    24362500        case PGMPOOLKIND_ROOT_PDPT:
     2501#endif
    24372502            return 8;
    24382503
     
    27762841    switch (pUserPage->enmKind)
    27772842    {
     2843# ifdef VBOX_WITH_PGMPOOL_PAGING_ONLY
     2844        case PGMPOOLKIND_32BIT_PD:
     2845# else
    27782846        case PGMPOOLKIND_ROOT_32BIT_PD:
     2847# endif
    27792848            Assert(iUserTable < X86_PG_ENTRIES);
    27802849            Assert(!(u.pau32[iUserTable] & PGM_PDFLAGS_MAPPING));
    27812850            break;
    2782 # ifndef VBOX_WITH_2X_4GB_ADDR_SPACE_IN_R0
     2851# if !defined(VBOX_WITH_2X_4GB_ADDR_SPACE_IN_R0) && !defined(VBOX_WITH_PGMPOOL_PAGING_ONLY)
    27832852        case PGMPOOLKIND_ROOT_PAE_PD:
    27842853            Assert(iUserTable < 2048 && pUser->iUser == PGMPOOL_IDX_PAE_PD);
     
    27862855            break;
    27872856# endif
     2857# ifdef VBOX_WITH_PGMPOOL_PAGING_ONLY
     2858        case PGMPOOLKIND_PAE_PDPT:
     2859# else
    27882860        case PGMPOOLKIND_ROOT_PDPT:
     2861# endif
    27892862            Assert(iUserTable < 4);
    27902863            Assert(!(u.pau64[iUserTable] & PGM_PLXFLAGS_PERMANENT));
     
    28322905    {
    28332906        /* 32-bit entries */
     2907#ifdef VBOX_WITH_PGMPOOL_PAGING_ONLY
     2908        case PGMPOOLKIND_32BIT_PD:
     2909#else
    28342910        case PGMPOOLKIND_ROOT_32BIT_PD:
     2911#endif
    28352912            u.pau32[iUserTable] = 0;
    28362913            break;
     
    28442921        case PGMPOOLKIND_64BIT_PDPT_FOR_PHYS:
    28452922        case PGMPOOLKIND_64BIT_PD_FOR_PHYS:
    2846 #ifndef VBOX_WITH_2X_4GB_ADDR_SPACE_IN_R0
     2923# if !defined(VBOX_WITH_2X_4GB_ADDR_SPACE_IN_R0) && !defined(VBOX_WITH_PGMPOOL_PAGING_ONLY)
    28472924        case PGMPOOLKIND_ROOT_PAE_PD:
    28482925#endif
     2926#ifdef VBOX_WITH_PGMPOOL_PAGING_ONLY
     2927        case PGMPOOLKIND_PAE_PDPT:
     2928#else
    28492929        case PGMPOOLKIND_ROOT_PDPT:
     2930#endif
    28502931        case PGMPOOLKIND_ROOT_NESTED:
    28512932        case PGMPOOLKIND_EPT_PDPT_FOR_PHYS:
     
    36413722        switch (pPage->enmKind)
    36423723        {
     3724#ifndef VBOX_WITH_PGMPOOL_PAGING_ONLY
    36433725            case PGMPOOLKIND_ROOT_32BIT_PD:
    36443726                u.pau64 = (uint64_t *)PGMPOOL_PAGE_2_PTR(pPool->CTX_SUFF(pVM), pPage);
     
    36583740                /* Not root of shadowed pages currently, ignore it. */
    36593741                break;
     3742#endif
    36603743
    36613744            case PGMPOOLKIND_ROOT_NESTED:
  • trunk/src/VBox/VMM/testcase/tstVMStructGC.cpp

    r16182 r16203  
    431431    GEN_CHECK_OFF(PGM, aGCPhysGstPaePDs);
    432432    GEN_CHECK_OFF(PGM, aGCPhysGstPaePDsMonitored);
     433#ifndef VBOX_WITH_PGMPOOL_PAGING_ONLY
    433434    GEN_CHECK_OFF(PGM, pShw32BitPdR3);
    434 #ifndef VBOX_WITH_2X_4GB_ADDR_SPACE
     435# ifndef VBOX_WITH_2X_4GB_ADDR_SPACE
    435436    GEN_CHECK_OFF(PGM, pShw32BitPdR0);
    436 #endif
     437# endif
    437438    GEN_CHECK_OFF(PGM, pShw32BitPdRC);
    438439    GEN_CHECK_OFF(PGM, HCPhysShw32BitPD);
    439440    GEN_CHECK_OFF(PGM, apShwPaePDsR3);
    440 #ifndef VBOX_WITH_2X_4GB_ADDR_SPACE
     441# ifndef VBOX_WITH_2X_4GB_ADDR_SPACE
    441442    GEN_CHECK_OFF(PGM, apShwPaePDsR0);
    442 #endif
     443# endif
    443444    GEN_CHECK_OFF(PGM, apShwPaePDsRC);
    444445    GEN_CHECK_OFF(PGM, aHCPhysPaePDs);
     
    447448    GEN_CHECK_OFF(PGM, pShwPaePdptRC);
    448449    GEN_CHECK_OFF(PGM, HCPhysShwPaePdpt);
     450#endif
    449451    GEN_CHECK_OFF(PGM, pShwRootR3);
    450452#ifndef VBOX_WITH_2X_4GB_ADDR_SPACE
     
    463465    GEN_CHECK_OFF(PGM, pfnR3GstRelocate);
    464466    GEN_CHECK_OFF(PGM, pfnR3GstExit);
     467#ifndef VBOX_WITH_PGMPOOL_PAGING_ONLY
    465468    GEN_CHECK_OFF(PGM, pfnR3GstMonitorCR3);
    466469    GEN_CHECK_OFF(PGM, pfnR3GstUnmonitorCR3);
     470#endif
    467471    GEN_CHECK_OFF(PGM, pfnR3GstMapCR3);
    468472    GEN_CHECK_OFF(PGM, pfnR3GstUnmapCR3);
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