VirtualBox

Ignore:
Timestamp:
Feb 25, 2009 4:18:51 PM (16 years ago)
Author:
vboxsync
Message:

VBOX_WITH_PGMPOOL_PAGING_ONLY: explicit locking of root CR3 pages

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMAll/PGMAllPool.cpp

    r17135 r17137  
    910910#ifdef VBOX_WITH_PGMPOOL_PAGING_ONLY
    911911/**
    912  * Checks if the page is the active CR3 or is one of the four PDs of a PAE PDPT
    913  *
    914  * @returns VBox status code (appropriate for GC return).
     912 * Checks if the page is locked (e.g. the active CR3 or one of the four PDs of a PAE PDPT)
     913 *
     914 * @returns VBox status code.
    915915 * @param   pVM         VM Handle.
    916916 * @param   pPage       PGM pool page
    917917 */
    918 bool pgmPoolIsActiveRootPage(PVM pVM, PPGMPOOLPAGE pPage)
    919 {
    920     /* First check the simple case. */
    921     if (pPage == pVM->pgm.s.CTX_SUFF(pShwPageCR3))
    922     {
    923         LogFlow(("pgmPoolIsActiveRootPage found CR3 root\n"));
     918bool pgmPoolIsPageLocked(PVM pVM, PPGMPOOLPAGE pPage)
     919{
     920    if (pPage->fLocked)
     921    {
     922        LogFlow(("pgmPoolIsPageLocked found root page %s\n", pgmPoolPoolKindToStr(pPage->enmKind)));
    924923        if (pPage->cModifications)
    925924            pPage->cModifications = 1; /* reset counter (can't use 0, or else it will be reinserted in the modified list) */
    926925        return true;
    927926    }
     927
     928#ifdef VBOX_STRICT
     929    Assert(pPage != pVM->pgm.s.CTX_SUFF(pShwPageCR3));
    928930
    929931# ifndef IN_RING0
     
    946948                    for (unsigned i=0;i<X86_PG_PAE_PDPE_ENTRIES;i++)
    947949                    {
    948                         if (   (pPdpt->a[i].u & PGM_PLXFLAGS_MAPPING)
    949                             &&  pPage->Core.Key == (pPdpt->a[i].u & X86_PDPE_PG_MASK))
    950                         {
    951                             Assert(pPdpt->a[i].n.u1Present);
    952                             LogFlow(("pgmPoolIsActiveRootPage found PAE PDPE root\n"));
    953                             if (pPage->cModifications)
    954                                 pPage->cModifications = 1; /* reset counter (can't use 0, or else it will be reinserted in the modified list) */
    955                             return true;
    956                         }
     950                        Assert(   !(pPdpt->a[i].u & PGM_PLXFLAGS_MAPPING)
     951                               || (pPage->Core.Key != (pPdpt->a[i].u & X86_PDPE_PG_MASK)));
    957952                    }
    958953                    break;
     
    964959    }
    965960# endif
     961#endif /* VBOX_STRICT */
    966962    return false;
    967963}
     
    13151311    if (    (   pPage->cModifications < 48   /** @todo #define */ /** @todo need to check that it's not mapping EIP. */ /** @todo adjust this! */
    13161312#ifdef VBOX_WITH_PGMPOOL_PAGING_ONLY
    1317              || pgmPoolIsActiveRootPage(pVM, pPage)
     1313             || pgmPoolIsPageLocked(pVM, pPage)
    13181314#else
    13191315             || pPage->fCR3Mix
     
    14781474     */
    14791475#ifdef VBOX_WITH_PGMPOOL_PAGING_ONLY
    1480     if (pgmPoolIsActiveRootPage(pPool->CTX_SUFF(pVM), pPage))
     1476    if (pgmPoolIsPageLocked(pPool->CTX_SUFF(pVM), pPage))
    14811477#else
    14821478    if (PGMGetHyperCR3(pPool->CTX_SUFF(pVM)) == pPage->Core.Key)
     
    31573153    /* Safety precaution in case we change the paging for other modes too in the future. */
    31583154#ifdef VBOX_WITH_PGMPOOL_PAGING_ONLY
    3159     Assert(!pgmPoolIsActiveRootPage(pPool->CTX_SUFF(pVM), pPage));
     3155    Assert(!pgmPoolIsPageLocked(pPool->CTX_SUFF(pVM), pPage));
    31603156#else
    31613157    Assert(PGMGetHyperCR3(pPool->CTX_SUFF(pVM)) != pPage->Core.Key);
     
    43604356     */
    43614357#ifdef VBOX_WITH_PGMPOOL_PAGING_ONLY
    4362     if (pgmPoolIsActiveRootPage(pPool->CTX_SUFF(pVM), pPage))
     4358    if (pgmPoolIsPageLocked(pPool->CTX_SUFF(pVM), pPage))
    43634359    {
    43644360        AssertMsg(   pPage->enmKind == PGMPOOLKIND_64BIT_PML4
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