VirtualBox

Changeset 86487 in vbox for trunk/src/VBox/VMM/VMMAll


Ignore:
Timestamp:
Oct 8, 2020 8:17:31 AM (4 years ago)
Author:
vboxsync
Message:

VMM/PGM: Working on eliminating page table bitfield use (PAE PTEs). bugref:9841 bugref:9746

Location:
trunk/src/VBox/VMM/VMMAll
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMAll/PGMAllBth.h

    r86478 r86487  
    15761576
    15771577# if PGM_WITH_PAGING(PGM_GST_TYPE, PGM_SHW_TYPE)
    1578     if (   PteSrc.n.u1Present
     1578    if (   (PteSrc.u & X86_PTE_P)
    15791579        && GST_IS_PTE_VALID(pVCpu, PteSrc))
    15801580# endif
     
    16061606                &&  (   PGM_PAGE_IS_ZERO(pPage)
    16071607#  if PGM_WITH_PAGING(PGM_GST_TYPE, PGM_SHW_TYPE)
    1608                      || (   PteSrc.n.u1Write
     1608                     || (   (PteSrc.u & X86_PTE_RW)
    16091609#  else
    16101610                     || (   1
     
    17131713             */
    17141714# if PGM_WITH_PAGING(PGM_GST_TYPE, PGM_SHW_TYPE)
    1715             if (!PteSrc.n.u1Global)
     1715            if (!(PteSrc.u & X86_PTE_G))
    17161716                pShwPage->fSeenNonGlobal = true;
    17171717# endif
     
    17241724    }
    17251725# if PGM_WITH_PAGING(PGM_GST_TYPE, PGM_SHW_TYPE)
    1726     else if (!PteSrc.n.u1Present)
     1726    else if (!(PteSrc.u & X86_PTE_P))
    17271727        Log2(("SyncPageWorker: page not present in Pte\n"));
    17281728    else
     
    19271927                            const PGSTPTE pPteSrc = &pPTSrc->a[offPTSrc + iPTDst];
    19281928
    1929                             if (   pPteSrc->n.u1Present
     1929                            if (   (pPteSrc->u & X86_PTE_P)
    19301930                                && !SHW_PTE_IS_P(pPTDst->a[iPTDst]))
    19311931                            {
     
    23822382                    STAM_COUNTER_INC(&pVCpu->pgm.s.CTX_SUFF(pStats)->CTX_MID_Z(Stat,DirtyPageTrap));
    23832383
    2384                     Assert(PteSrc.n.u1Write);
     2384                    Assert(PteSrc.u & X86_PTE_RW);
    23852385
    23862386                    /* Note: No need to invalidate this entry on other VCPUs as a stale TLB
     
    27342734                    const unsigned iPTSrc = iPTDst + offPTSrc;
    27352735                    const GSTPTE   PteSrc = pPTSrc->a[iPTSrc];
    2736 
    2737                     if (PteSrc.n.u1Present)
     2736                    if (PteSrc.u & X86_PTE_P)
    27382737                    {
    27392738                        PGM_BTH_NAME(SyncPageWorker)(pVCpu, &pPTDst->a[iPTDst], PdeSrc, PteSrc, pShwPage, iPTDst);
     
    39183917
    39193918                            const GSTPTE PteSrc = pPTSrc->a[iPT + offPTSrc];
    3920                             if (!PteSrc.n.u1Present)
     3919                            if (!(PteSrc.u & X86_PTE_P))
    39213920                            {
    39223921#  ifdef IN_RING3
     
    40234022                            else
    40244023                            {
    4025                                 if (!PteSrc.n.u1Dirty && PteSrc.n.u1Write)
     4024                                if ((PteSrc.u & (X86_PTE_RW | X86_PTE_D)) == X86_PTE_RW)
    40264025                                {
    40274026                                    if (SHW_PTE_IS_RW(PteDst))
     
    40604059                                {
    40614060                                    /* access bit emulation (not implemented). */
    4062                                     if (PteSrc.n.u1Accessed || SHW_PTE_IS_P(PteDst))
     4061                                    if ((PteSrc.u & X86_PTE_A) || SHW_PTE_IS_P(PteDst))
    40634062                                    {
    40644063                                        AssertMsgFailed(("PGM_PTFLAGS_TRACK_DIRTY set at %RGv but no accessed bit emulation! PteSrc=%#RX64 PteDst=%#RX64\n",
  • trunk/src/VBox/VMM/VMMAll/PGMAllGst.h

    r86476 r86487  
    266266        pWalk->Pte.u = Pte.u = pPte->u;
    267267
    268         if (Pte.n.u1Present) { /* probable */ }
     268        if (Pte.u & X86_PTE_P) { /* probable */ }
    269269        else return PGM_GST_NAME(WalkReturnNotPresent)(pVCpu, pWalk, 1);
    270270
  • trunk/src/VBox/VMM/VMMAll/PGMAllPool.cpp

    r86475 r86487  
    15321532         * it's fairly safe to assume the guest is reusing the PT.
    15331533         */
    1534         if (    fAllowRemoval
    1535             &&  pGstPT->a[i].n.u1Present)
     1534        if (   fAllowRemoval
     1535            && (pGstPT->a[i].u & X86_PTE_P))
    15361536        {
    15371537            if (!PGMPhysIsGCPhysValid(pPool->CTX_SUFF(pVM), pGstPT->a[i].u & X86_PTE_PAE_PG_MASK))
     
    32893289            if ((PGMSHWPTEPAE_GET_U(pPT->a[iPte]) & (X86_PTE_PAE_PG_MASK | X86_PTE_P | X86_PTE_PAE_MBZ_MASK_NX)) == u64)
    32903290            {
     3291                Log4(("pgmPoolTrackFlushGCPhysPTs: i=%d pte=%RX64\n", iPte, PGMSHWPTEPAE_GET_LOG(pPT->a[iPte])));
    32913292                X86PTEPAE Pte;
    3292 
    3293                 Log4(("pgmPoolTrackFlushGCPhysPTs: i=%d pte=%RX64\n", iPte, PGMSHWPTEPAE_GET_LOG(pPT->a[iPte])));
    32943293                Pte.u = (PGMSHWPTEPAE_GET_U(pPT->a[iPte]) & u64AndMask) | u64OrMask;
    32953294                if (Pte.u & PGM_PTFLAGS_TRACK_DIRTY)
    3296                     Pte.n.u1Write = 0;    /* need to disallow writes when dirty bit tracking is still active. */
     3295                    Pte.u &= ~(X86PGPAEUINT)X86_PTE_RW;    /* need to disallow writes when dirty bit tracking is still active. */
    32973296
    32983297                PGMSHWPTEPAE_ATOMIC_SET(pPT->a[iPte], Pte.u);
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