VirtualBox

Changeset 17489 in vbox


Ignore:
Timestamp:
Mar 6, 2009 4:35:33 PM (16 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
43916
Message:

Don't use a special root for nested paging anymore.

Location:
trunk
Files:
9 edited

Legend:

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

    r17465 r17489  
    288288VMMDECL(RTHCPHYS)   PGMGetHyperCR3(PVM pVM);
    289289VMMDECL(RTHCPHYS)   PGMGetNestedCR3(PVM pVM, PGMMODE enmShadowMode);
    290 VMMDECL(RTHCPHYS)   PGMGetEPTCR3(PVM pVM);
    291290VMMDECL(RTHCPHYS)   PGMGetHyper32BitCR3(PVM pVM);
    292291VMMDECL(RTHCPHYS)   PGMGetHyperPaeCR3(PVM pVM);
  • trunk/src/VBox/VMM/HWACCM.cpp

    r17379 r17489  
    848848                {
    849849                    LogRel(("HWACCM: Enabled nested paging\n"));
    850                     LogRel(("HWACCM: EPT root page                 = %RHp\n", PGMGetEPTCR3(pVM)));
     850                    LogRel(("HWACCM: EPT root page                 = %RHp\n", PGMGetHyperCR3(pVM)));
    851851                }
    852852                if (pVM->hwaccm.s.vmx.fVPID)
  • trunk/src/VBox/VMM/PGM.cpp

    r17371 r17489  
    14921492    pVM->pgm.s.pShwPaePdptR0 = (uintptr_t)pVM->pgm.s.pShwPaePdptR3;
    14931493# endif
     1494    pVM->pgm.s.pShwNestedRootR3 = MMR3PageAllocLow(pVM);
     1495# ifndef VBOX_WITH_2X_4GB_ADDR_SPACE
     1496    pVM->pgm.s.pShwNestedRootR0 = (uintptr_t)pVM->pgm.s.pShwNestedRootR3;
     1497# endif
    14941498#endif /* VBOX_WITH_PGMPOOL_PAGING_ONLY */
    1495     pVM->pgm.s.pShwNestedRootR3 = MMR3PageAllocLow(pVM);
    1496 #ifndef VBOX_WITH_2X_4GB_ADDR_SPACE
    1497     pVM->pgm.s.pShwNestedRootR0 = (uintptr_t)pVM->pgm.s.pShwNestedRootR3;
    1498 #endif
    1499 
    1500 #ifdef VBOX_WITH_PGMPOOL_PAGING_ONLY
    1501     if (!pVM->pgm.s.pShwNestedRootR3)
    1502 #else
     1499
     1500#ifndef VBOX_WITH_PGMPOOL_PAGING_ONLY
    15031501    if (    !pVM->pgm.s.pShw32BitPdR3
    15041502        ||  !pVM->pgm.s.apShwPaePDsR3[0]
     
    15231521    pVM->pgm.s.aHCPhysPaePDs[3] = MMPage2Phys(pVM, pVM->pgm.s.apShwPaePDsR3[3]);
    15241522    pVM->pgm.s.HCPhysShwPaePdpt = MMPage2Phys(pVM, pVM->pgm.s.pShwPaePdptR3);
    1525 #endif
    15261523    pVM->pgm.s.HCPhysShwNestedRoot = MMPage2Phys(pVM, pVM->pgm.s.pShwNestedRootR3);
     1524#endif
    15271525
    15281526    /*
     
    15321530    ASMMemZero32(pVM->pgm.s.pShw32BitPdR3, PAGE_SIZE);
    15331531    ASMMemZero32(pVM->pgm.s.pShwPaePdptR3, PAGE_SIZE);
    1534 #endif
    15351532    ASMMemZero32(pVM->pgm.s.pShwNestedRootR3, PAGE_SIZE);
    1536 #ifndef VBOX_WITH_PGMPOOL_PAGING_ONLY
     1533
    15371534    for (unsigned i = 0; i < RT_ELEMENTS(pVM->pgm.s.apShwPaePDsR3); i++)
    15381535    {
     
    20182015    pVM->pgm.s.GCPtrCR3Mapping += offDelta;
    20192016    /** @todo move this into shadow and guest specific relocation functions. */
    2020 #ifdef VBOX_WITH_PGMPOOL_PAGING_ONLY
    2021     AssertMsg(pVM->pgm.s.pShwNestedRootR3, ("Init order, no relocation before paging is initialized!\n"));
    2022 #else
     2017#ifndef VBOX_WITH_PGMPOOL_PAGING_ONLY
    20232018    AssertMsg(pVM->pgm.s.pShw32BitPdR3, ("Init order, no relocation before paging is initialized!\n"));
    20242019    pVM->pgm.s.pShw32BitPdRC += offDelta;
  • trunk/src/VBox/VMM/PGMInternal.h

    r17486 r17489  
    24202420    RTRCPTR                         alignment5; /**< structure size alignment. */
    24212421# endif
    2422 #endif /* !VBOX_WITH_PGMPOOL_PAGING_ONLY */
    24232422    /** @name Nested Shadow Paging
    24242423     * @{ */
     
    24322431    RTHCPHYS                        HCPhysShwNestedRoot;
    24332432    /** @}  */
     2433#endif /* !VBOX_WITH_PGMPOOL_PAGING_ONLY */
    24342434
    24352435    /** @name Function pointers for Shadow paging.
  • trunk/src/VBox/VMM/PGMMap.cpp

    r17228 r17489  
    6060{
    6161    LogFlow(("PGMR3MapPT: GCPtr=%#x cb=%d pfnRelocate=%p pvUser=%p pszDesc=%s\n", GCPtr, cb, pfnRelocate, pvUser, pszDesc));
    62     AssertMsg(pVM->pgm.s.pInterPD && pVM->pgm.s.pShwNestedRootR3, ("Paging isn't initialized, init order problems!\n"));
     62    AssertMsg(pVM->pgm.s.pInterPD, ("Paging isn't initialized, init order problems!\n"));
    6363
    6464    /*
  • trunk/src/VBox/VMM/PGMPool.cpp

    r17421 r17489  
    309309    pPool->aPages[PGMPOOL_IDX_NESTED_ROOT].Core.Key  = NIL_RTHCPHYS;
    310310    pPool->aPages[PGMPOOL_IDX_NESTED_ROOT].GCPhys    = NIL_RTGCPHYS;
     311#ifdef VBOX_WITH_PGMPOOL_PAGING_ONLY
     312    pPool->aPages[PGMPOOL_IDX_NESTED_ROOT].pvPageR3  = 0;
     313#else
    311314    pPool->aPages[PGMPOOL_IDX_NESTED_ROOT].pvPageR3  = pVM->pgm.s.pShwNestedRootR3;
     315#endif
    312316    pPool->aPages[PGMPOOL_IDX_NESTED_ROOT].enmKind   = PGMPOOLKIND_ROOT_NESTED;
    313317    pPool->aPages[PGMPOOL_IDX_NESTED_ROOT].idx       = PGMPOOL_IDX_NESTED_ROOT;
  • trunk/src/VBox/VMM/PGMShw.h

    r17486 r17489  
    184184PGM_SHW_DECL(int, Enter)(PVM pVM)
    185185{
    186 # if PGM_SHW_TYPE == PGM_TYPE_NESTED
     186#ifdef VBOX_WITH_PGMPOOL_PAGING_ONLY
     187# if PGM_SHW_TYPE == PGM_TYPE_NESTED || PGM_SHW_TYPE == PGM_TYPE_EPT
     188    RTGCPHYS     GCPhysCR3 = RT_BIT_64(63);
     189    PPGMPOOLPAGE pNewShwPageCR3;
     190    PPGMPOOL     pPool     = pVM->pgm.s.CTX_SUFF(pPool);
     191
    187192    Assert(HWACCMIsNestedPagingActive(pVM));
    188193
    189     Log(("Enter nested shadow paging mode: root %RHv phys %RHp\n", pVM->pgm.s.pShwNestedRootR3, pVM->pgm.s.HCPhysShwNestedRoot));
    190     /* In non-nested mode we allocate the PML4 page on-demand; in nested mode we just use our fixed nested paging root. */
    191 # ifdef VBOX_WITH_PGMPOOL_PAGING_ONLY
    192     PPGMPOOL pPool = pVM->pgm.s.CTX_SUFF(pPool);
     194    int rc = pgmPoolAlloc(pVM, GCPhysCR3, PGMPOOLKIND_ROOT_NESTED, PGMPOOL_IDX_NESTED_ROOT, GCPhysCR3 >> PAGE_SHIFT, &pNewShwPageCR3);
     195    AssertFatal(rc == VINF_SUCCESS);
     196
     197    /* Mark the page as locked; disallow flushing. */
     198    pgmPoolLockPage(pPool, pNewShwPageCR3);
    193199
    194200    pVM->pgm.s.iShwUser      = PGMPOOL_IDX_NESTED_ROOT;
    195     pVM->pgm.s.iShwUserTable = 0;
    196     pVM->pgm.s.pShwPageCR3R3 = &pPool->aPages[PGMPOOL_IDX_NESTED_ROOT];
    197     pVM->pgm.s.pShwPageCR3R0 = MMHyperCCToR0(pVM, pVM->pgm.s.CTX_SUFF(pShwPageCR3));
    198 
    199     /* Mark the page as locked; disallow flushing (shouldn't be necessary as it's a special root) */
    200     pgmPoolLockPage(pPool, pVM->pgm.s.pShwPageCR3R3);
     201    pVM->pgm.s.iShwUserTable = GCPhysCR3 >> PAGE_SHIFT;
     202    pVM->pgm.s.pShwPageCR3R3 = pNewShwPageCR3;
     203
     204    pVM->pgm.s.pShwPageCR3RC = MMHyperCCToRC(pVM, pVM->pgm.s.pShwPageCR3R3);
     205    pVM->pgm.s.pShwPageCR3R0 = MMHyperCCToR0(pVM, pVM->pgm.s.pShwPageCR3R3);
     206
     207    Log(("Enter nested shadow paging mode: root %RHv phys %RHp\n", pVM->pgm.s.pShwPageCR3R3, pVM->pgm.s.CTX_SUFF(pShwPageCR3)->Core.Key));
    201208# else
    202 #  ifndef VBOX_WITH_2X_4GB_ADDR_SPACE
     209#  if PGM_SHW_TYPE == PGM_TYPE_NESTED
     210#   ifndef VBOX_WITH_2X_4GB_ADDR_SPACE
    203211    pVM->pgm.s.pShwRootR0 = (R0PTRTYPE(void *))pVM->pgm.s.pShwNestedRootR0;
    204 else
     212 else
    205213    pVM->pgm.s.pShwRootR3 = (R3PTRTYPE(void *))pVM->pgm.s.pShwNestedRootR3;
     214#   endif
     215    pVM->pgm.s.HCPhysShwCR3 = pVM->pgm.s.HCPhysShwNestedRoot;
    206216#  endif
    207     pVM->pgm.s.HCPhysShwCR3 = pVM->pgm.s.HCPhysShwNestedRoot;
     217
     218    CPUMSetHyperCR3(pVM, PGMGetHyperCR3(pVM));
    208219# endif
    209 
    210     CPUMSetHyperCR3(pVM, PGMGetHyperCR3(pVM));
    211220#endif
    212221
  • trunk/src/VBox/VMM/VMMAll/PGMAll.cpp

    r17483 r17489  
    12281228    Assert(HWACCMIsNestedPagingActive(pVM));
    12291229
     1230#ifdef VBOX_WITH_PGMPOOL_PAGING_ONLY
     1231    pPml4 = (PEPTPML4)PGMPOOL_PAGE_2_PTR_BY_PGM(pPGM, pPGM->CTX_SUFF(pShwPageCR3));
     1232#else
    12301233# ifdef VBOX_WITH_2X_4GB_ADDR_SPACE_IN_R0
    12311234    rc = PGM_HCPHYS_2_PTR(pVM, pPGM->HCPhysShwNestedRoot, &pPml4);
     
    12341237    pPml4 = (PEPTPML4)pPGM->CTX_SUFF(pShwNestedRoot);
    12351238# endif
     1239#endif /* VBOX_WITH_PGMPOOL_PAGING_ONLY */
    12361240    Assert(pPml4);
    12371241
     
    14881492    }
    14891493#endif
    1490 }
    1491 
    1492 
    1493 /**
    1494  * Gets the current CR3 register value for the EPT paging memory context.
    1495  * @returns CR3 value.
    1496  * @param   pVM         The VM handle.
    1497  */
    1498 VMMDECL(RTHCPHYS) PGMGetEPTCR3(PVM pVM)
    1499 {
    1500     return pVM->pgm.s.HCPhysShwNestedRoot;
    15011494}
    15021495
  • trunk/src/VBox/VMM/VMMR0/HWVMXR0.cpp

    r17284 r17489  
    14981498        if (pVM->hwaccm.s.fNestedPaging)
    14991499        {
    1500             AssertMsg(   PGMGetEPTCR3(pVM) == PGMGetHyperCR3(pVM)
    1501                       || VM_FF_ISPENDING(pVM, VM_FF_PGM_SYNC_CR3 | VM_FF_PGM_SYNC_CR3_NON_GLOBAL),
    1502                       ("%RHp vs %RHp\n", PGMGetEPTCR3(pVM), PGMGetHyperCR3(pVM)));
    1503             pVCpu->hwaccm.s.vmx.GCPhysEPTP = PGMGetEPTCR3(pVM);
     1500            Assert(PGMGetHyperCR3(pVM));
     1501            pVCpu->hwaccm.s.vmx.GCPhysEPTP = PGMGetHyperCR3(pVM);
    15041502
    15051503            Assert(!(pVCpu->hwaccm.s.vmx.GCPhysEPTP & 0xfff));
Note: See TracChangeset for help on using the changeset viewer.

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