VirtualBox

Changeset 28639 in vbox


Ignore:
Timestamp:
Apr 23, 2010 12:46:38 PM (15 years ago)
Author:
vboxsync
Message:

Keep track of page table entry indices and deal with multiple physical page references in one page table.

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

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/PGMInline.h

    r26150 r28639  
    15111511    {
    15121512        Assert(pPoolPage->idx == PGM_PAGE_GET_TD_IDX(pPhysPage));
     1513        /* Invalidate the tracking data. */
    15131514        PGM_PAGE_SET_TRACKING(pPhysPage, 0);
    15141515    }
  • trunk/src/VBox/VMM/PGMInternal.h

    r27584 r28639  
    635635    /** The page state.
    636636     * Only 3 bits are really needed for this. */
    637     uint8_t     uStateY;
     637    uint16_t    uStateY   : 3;
    638638    /** The page type (PGMPAGETYPE).
    639639     * Only 3 bits are really needed for this. */
    640     uint8_t     uTypeY;
     640    uint16_t    uTypeY    : 3;
     641    /** PTE index for usage tracking (page pool). */
     642    uint16_t    uPteIdx   : 10;
    641643    /** Usage tracking (page pool). */
    642644    uint16_t    u16TrackingY;
     
    664666        (pPage)->uStateY             = 0; \
    665667        (pPage)->uTypeY              = 0; \
     668        (pPage)->uPteIdx             = 0; \
    666669        (pPage)->u16MiscY.u          = 0; \
    667670        (pPage)->u16TrackingY        = 0; \
     
    681684        (pPage)->uStateY             = (_uState); \
    682685        (pPage)->uTypeY              = (_uType); \
     686        (pPage)->uPteIdx             = 0; \
    683687        (pPage)->u16MiscY.u          = 0; \
    684688        (pPage)->u16TrackingY        = 0; \
     
    799803 */
    800804#define PGM_PAGE_SET_TYPE(pPage, _enmType)  do { (pPage)->uTypeY = (_enmType); } while (0)
     805
     806/**
     807 * Gets the page table index
     808 * @returns The page table index.
     809 * @param   pPage       Pointer to the physical guest page tracking structure.
     810 */
     811#define PGM_PAGE_GET_PTE_INDEX(pPage)            (pPage)->uPteIdx
     812
     813/**
     814 * Sets the page table index
     815 * @param   pPage       Pointer to the physical guest page tracking structure.
     816 * @param   iPte        New page table index.
     817 */
     818#define PGM_PAGE_SET_PTE_INDEX(pPage, _iPte)  do { (pPage)->uPteIdx = (_iPte); } while (0)
    801819
    802820/**
     
    16981716/** The NIL index for the phys ext chain. */
    16991717#define NIL_PGMPOOL_PHYSEXT_INDEX       ((uint16_t)0xffff)
     1718/** The NIL pte index for a phys ext chain slot. */
     1719#define NIL_PGMPOOL_PHYSEXT_IDX_PTE     ((uint16_t)0xffff)
    17001720
    17011721/**
    17021722 * Node in the chain of physical cross reference extents.
    17031723 * @todo Calling this an 'extent' is not quite right, find a better name.
     1724 * @todo find out the optimal size of the aidx array
    17041725 */
    17051726#pragma pack(1)
     
    17081729    /** The index to the next item in the chain. NIL_PGMPOOL_PHYSEXT_INDEX is no next. */
    17091730    uint16_t            iNext;
     1731    /** Alignment. */
     1732    uint16_t            u16Align;
    17101733    /** The user page index. */
    17111734    uint16_t            aidx[3];
     1735    /** The page table index or NIL_PGMPOOL_PHYSEXT_IDX_PTE if unknown. */
     1736    uint16_t            apte[3];
    17121737} PGMPOOLPHYSEXT, *PPGMPOOLPHYSEXT;
    17131738typedef const PGMPOOLPHYSEXT *PCPGMPOOLPHYSEXT;
     
    34083433}
    34093434
    3410 uint16_t        pgmPoolTrackPhysExtAddref(PVM pVM, uint16_t u16, uint16_t iShwPT);
     3435uint16_t        pgmPoolTrackPhysExtAddref(PVM pVM, PPGMPAGE pPhysPage, uint16_t u16, uint16_t iShwPT, uint16_t iPte);
    34113436void            pgmPoolTrackPhysExtDerefGCPhys(PPGMPOOL pPool, PPGMPOOLPAGE pPoolPage, PPGMPAGE pPhysPage);
    34123437void            pgmPoolMonitorChainChanging(PVMCPU pVCpu, PPGMPOOL pPool, PPGMPOOLPAGE pPage, RTGCPHYS GCPhysFault, CTXTYPE(RTGCPTR, RTHCPTR, RTGCPTR) pvAddress, unsigned cbWrite);
  • trunk/src/VBox/VMM/PGMPool.cpp

    r28260 r28639  
    238238        paPhysExts[i].iNext = i + 1;
    239239        paPhysExts[i].aidx[0] = NIL_PGMPOOL_IDX;
     240        paPhysExts[i].apte[0] = NIL_PGMPOOL_PHYSEXT_IDX_PTE;
    240241        paPhysExts[i].aidx[1] = NIL_PGMPOOL_IDX;
     242        paPhysExts[i].apte[1] = NIL_PGMPOOL_PHYSEXT_IDX_PTE;
    241243        paPhysExts[i].aidx[2] = NIL_PGMPOOL_IDX;
     244        paPhysExts[i].apte[2] = NIL_PGMPOOL_PHYSEXT_IDX_PTE;
    242245    }
    243246    paPhysExts[cMaxPhysExts - 1].iNext = NIL_PGMPOOL_PHYSEXT_INDEX;
     
    751754        paPhysExts[i].iNext = i + 1;
    752755        paPhysExts[i].aidx[0] = NIL_PGMPOOL_IDX;
     756        paPhysExts[i].apte[0] = NIL_PGMPOOL_PHYSEXT_IDX_PTE;
    753757        paPhysExts[i].aidx[1] = NIL_PGMPOOL_IDX;
     758        paPhysExts[i].apte[1] = NIL_PGMPOOL_PHYSEXT_IDX_PTE;
    754759        paPhysExts[i].aidx[2] = NIL_PGMPOOL_IDX;
     760        paPhysExts[i].apte[2] = NIL_PGMPOOL_PHYSEXT_IDX_PTE;
    755761    }
    756762    paPhysExts[cMaxPhysExts - 1].iNext = NIL_PGMPOOL_PHYSEXT_INDEX;
  • trunk/src/VBox/VMM/VMMAll/PGMAllBth.h

    r28458 r28639  
    13691369        STAM_COUNTER_INC(&pVM->pgm.s.StatTrackVirgin);
    13701370        u16 = PGMPOOL_TD_MAKE(1, pShwPage->idx);
     1371        /* Save the page table index. */
     1372        PGM_PAGE_SET_PTE_INDEX(pPage, iPTDst);
    13711373    }
    13721374    else
    1373         u16 = pgmPoolTrackPhysExtAddref(pVM, u16, pShwPage->idx);
     1375        u16 = pgmPoolTrackPhysExtAddref(pVM, pPage, u16, pShwPage->idx, iPTDst);
    13741376
    13751377    /* write back */
  • trunk/src/VBox/VMM/VMMAll/PGMAllPool.cpp

    r28261 r28639  
    29532953 * @param   fFlushPTEs  Flush PTEs or allow them to be updated (e.g. in case of an RW bit change)
    29542954 * @param   iShw        The shadow page table.
     2955 * @param   iPte        Page table entry or NIL_PGMPOOL_PHYSEXT_IDX_PTE if unknown
    29552956 * @param   cRefs       The number of references made in that PT.
    29562957 */
    2957 static bool pgmPoolTrackFlushGCPhysPTInt(PVM pVM, PCPGMPAGE pPhysPage, bool fFlushPTEs, uint16_t iShw, uint16_t cRefs)
    2958 {
    2959     LogFlow(("pgmPoolTrackFlushGCPhysPT: pPhysPage=%RHp iShw=%d cRefs=%d\n", PGM_PAGE_GET_HCPHYS(pPhysPage), iShw, cRefs));
     2958static bool pgmPoolTrackFlushGCPhysPTInt(PVM pVM, PCPGMPAGE pPhysPage, bool fFlushPTEs, uint16_t iShw, uint16_t iPte, uint16_t cRefs)
     2959{
     2960    LogFlow(("pgmPoolTrackFlushGCPhysPT: pPhysPage=%RHp iShw=%d iPte=%d cRefs=%d\n", PGM_PAGE_GET_HCPHYS(pPhysPage), iShw, iPte, cRefs));
    29602961    PPGMPOOL pPool = pVM->pgm.s.CTX_SUFF(pPool);
    29612962    bool bRet = false;
     
    29652966     */
    29662967    Assert(cRefs == 1);
     2968    Assert(iPte != NIL_PGMPOOL_PHYSEXT_IDX_PTE);
    29672969    AssertFatalMsg(iShw < pPool->cCurPages && iShw != NIL_PGMPOOL_IDX, ("iShw=%d\n", iShw));
    29682970    PPGMPOOLPAGE pPage = &pPool->aPages[iShw];
     
    30193021            }
    30203022
    3021             for (unsigned i = pPage->iFirstPresent; i < RT_ELEMENTS(pPT->a); i++)
    3022                 if ((pPT->a[i].u & (X86_PTE_PG_MASK | X86_PTE_P)) == u32)
    3023                 {
    3024                     X86PTE Pte;
    3025 
    3026                     Log4(("pgmPoolTrackFlushGCPhysPTs: i=%d pte=%RX32 cRefs=%#x\n", i, pPT->a[i], cRefs));
    3027                     Pte.u = (pPT->a[i].u & u32AndMask) | u32OrMask;
    3028                     if (Pte.u & PGM_PTFLAGS_TRACK_DIRTY)
    3029                         Pte.n.u1Write = 0;    /* need to disallow writes when dirty bit tracking is still active. */
    3030 
    3031                     ASMAtomicWriteSize(&pPT->a[i].u, Pte.u);
    3032                     cRefs--;
    3033                     if (!cRefs)
    3034                         return bRet;
    3035                 }
     3023            if ((pPT->a[iPte].u & (X86_PTE_PG_MASK | X86_PTE_P)) == u32)
     3024            {
     3025                X86PTE Pte;
     3026
     3027                Log4(("pgmPoolTrackFlushGCPhysPTs: i=%d pte=%RX32 cRefs=%#x\n", iPte, pPT->a[iPte], cRefs));
     3028                Pte.u = (pPT->a[iPte].u & u32AndMask) | u32OrMask;
     3029                if (Pte.u & PGM_PTFLAGS_TRACK_DIRTY)
     3030                    Pte.n.u1Write = 0;    /* need to disallow writes when dirty bit tracking is still active. */
     3031
     3032                ASMAtomicWriteSize(&pPT->a[iPte].u, Pte.u);
     3033                return bRet;
     3034            }
    30363035#ifdef LOG_ENABLED
    30373036            Log(("cRefs=%d iFirstPresent=%d cPresent=%d\n", cRefs, pPage->iFirstPresent, pPage->cPresent));
     
    30943093            }
    30953094
    3096             for (unsigned i = pPage->iFirstPresent; i < RT_ELEMENTS(pPT->a); i++)
    3097                 if ((pPT->a[i].u & (X86_PTE_PAE_PG_MASK | X86_PTE_P)) == u64)
    3098                 {
    3099                     X86PTEPAE Pte;
    3100 
    3101                     Log4(("pgmPoolTrackFlushGCPhysPTs: i=%d pte=%RX64 cRefs=%#x\n", i, pPT->a[i], cRefs));
    3102                     Pte.u = (pPT->a[i].u & u64AndMask) | u64OrMask;
    3103                     if (Pte.u & PGM_PTFLAGS_TRACK_DIRTY)
    3104                         Pte.n.u1Write = 0;    /* need to disallow writes when dirty bit tracking is still active. */
    3105 
    3106                     ASMAtomicWriteSize(&pPT->a[i].u, Pte.u);
    3107                     cRefs--;
    3108                     if (!cRefs)
    3109                         return bRet;
    3110                 }
     3095            if ((pPT->a[iPte].u & (X86_PTE_PAE_PG_MASK | X86_PTE_P)) == u64)
     3096            {
     3097                X86PTEPAE Pte;
     3098
     3099                Log4(("pgmPoolTrackFlushGCPhysPTs: i=%d pte=%RX64 cRefs=%#x\n", iPte, pPT->a[iPte], cRefs));
     3100                Pte.u = (pPT->a[iPte].u & u64AndMask) | u64OrMask;
     3101                if (Pte.u & PGM_PTFLAGS_TRACK_DIRTY)
     3102                    Pte.n.u1Write = 0;    /* need to disallow writes when dirty bit tracking is still active. */
     3103
     3104                ASMAtomicWriteSize(&pPT->a[iPte].u, Pte.u);
     3105                return bRet;
     3106            }
    31113107#ifdef LOG_ENABLED
    31123108            Log(("cRefs=%d iFirstPresent=%d cPresent=%d\n", cRefs, pPage->iFirstPresent, pPage->cPresent));
     
    31253121            const uint64_t  u64 = PGM_PAGE_GET_HCPHYS(pPhysPage) | X86_PTE_P;
    31263122            PEPTPT          pPT = (PEPTPT)PGMPOOL_PAGE_2_PTR(pVM, pPage);
    3127             for (unsigned i = pPage->iFirstPresent; i < RT_ELEMENTS(pPT->a); i++)
    3128                 if ((pPT->a[i].u & (EPT_PTE_PG_MASK | X86_PTE_P)) == u64)
    3129                 {
    3130                     Log4(("pgmPoolTrackFlushGCPhysPTs: i=%d pte=%RX64 cRefs=%#x\n", i, pPT->a[i], cRefs));
    3131                     STAM_COUNTER_INC(&pPool->StatTrackFlushEntry);
    3132                     pPT->a[i].u = 0;
    3133                     cRefs--;
    3134 
    3135                     /* Update the counter as we're removing references. */
    3136                     Assert(pPage->cPresent);
    3137                     Assert(pPool->cPresent);
    3138                     pPage->cPresent--;
    3139                     pPool->cPresent--;
    3140 
    3141                     if (!cRefs)
    3142                         return bRet;
    3143                 }
     3123
     3124            if ((pPT->a[iPte].u & (EPT_PTE_PG_MASK | X86_PTE_P)) == u64)
     3125            {
     3126                Log4(("pgmPoolTrackFlushGCPhysPTs: i=%d pte=%RX64 cRefs=%#x\n", iPte, pPT->a[iPte], cRefs));
     3127                STAM_COUNTER_INC(&pPool->StatTrackFlushEntry);
     3128                pPT->a[iPte].u = 0;
     3129                cRefs--;
     3130
     3131                /* Update the counter as we're removing references. */
     3132                Assert(pPage->cPresent);
     3133                Assert(pPool->cPresent);
     3134                pPage->cPresent--;
     3135                pPool->cPresent--;
     3136                return bRet;
     3137            }
    31443138#ifdef LOG_ENABLED
    31453139            Log(("cRefs=%d iFirstPresent=%d cPresent=%d\n", cRefs, pPage->iFirstPresent, pPage->cPresent));
     
    31633157            const uint64_t  u64 = PGM_PAGE_GET_HCPHYS(pPhysPage) | X86_PDE4M_P | X86_PDE4M_PS;
    31643158            PEPTPD          pPD = (PEPTPD)PGMPOOL_PAGE_2_PTR(pVM, pPage);
    3165             for (unsigned i = pPage->iFirstPresent; i < RT_ELEMENTS(pPD->a); i++)
    3166                 if ((pPD->a[i].u & (EPT_PDE2M_PG_MASK | X86_PDE4M_P | X86_PDE4M_PS)) == u64)
    3167                 {
    3168                     Log4(("pgmPoolTrackFlushGCPhysPTs: i=%d pde=%RX64 cRefs=%#x\n", i, pPD->a[i], cRefs));
    3169                     STAM_COUNTER_INC(&pPool->StatTrackFlushEntry);
    3170                     pPD->a[i].u = 0;
    3171                     cRefs--;
    3172 
    3173                     /* Update the counter as we're removing references. */
    3174                     Assert(pPage->cPresent);
    3175                     Assert(pPool->cPresent);
    3176                     pPage->cPresent--;
    3177                     pPool->cPresent--;
    3178 
    3179                     if (!cRefs)
    3180                         return bRet;
    3181                 }
     3159
     3160            if ((pPD->a[iPte].u & (EPT_PDE2M_PG_MASK | X86_PDE4M_P | X86_PDE4M_PS)) == u64)
     3161            {
     3162                Log4(("pgmPoolTrackFlushGCPhysPTs: i=%d pde=%RX64 cRefs=%#x\n", iPte, pPD->a[iPte], cRefs));
     3163                STAM_COUNTER_INC(&pPool->StatTrackFlushEntry);
     3164                pPD->a[iPte].u = 0;
     3165                cRefs--;
     3166
     3167                /* Update the counter as we're removing references. */
     3168                Assert(pPage->cPresent);
     3169                Assert(pPool->cPresent);
     3170                pPage->cPresent--;
     3171                pPool->cPresent--;
     3172
     3173                return bRet;
     3174            }
    31823175# ifdef LOG_ENABLED
    31833176            Log(("cRefs=%d iFirstPresent=%d cPresent=%d\n", cRefs, pPage->iFirstPresent, pPage->cPresent));
     
    32003193            const uint64_t  u64 = PGM_PAGE_GET_HCPHYS(pPhysPage) | X86_PDE4M_P | X86_PDE4M_PS;
    32013194            PX86PD          pPD = (PX86PD)PGMPOOL_PAGE_2_PTR(pVM, pPage);
    3202             for (unsigned i = pPage->iFirstPresent; i < RT_ELEMENTS(pPD->a); i++)
    3203                 if ((pPD->a[i].u & (X86_PDE2M_PAE_PG_MASK | X86_PDE4M_P | X86_PDE4M_PS)) == u64)
    3204                 {
    3205                     Log4(("pgmPoolTrackFlushGCPhysPTs: i=%d pde=%RX64 cRefs=%#x\n", i, pPD->a[i], cRefs));
    3206                     STAM_COUNTER_INC(&pPool->StatTrackFlushEntry);
    3207                     pPD->a[i].u = 0;
    3208                     cRefs--;
    3209 
    3210                     /* Update the counter as we're removing references. */
    3211                     Assert(pPage->cPresent);
    3212                     Assert(pPool->cPresent);
    3213                     pPage->cPresent--;
    3214                     pPool->cPresent--;
    3215 
    3216                     if (!cRefs)
    3217                         return bRet;
    3218                 }
     3195
     3196            if ((pPD->a[iPte].u & (X86_PDE2M_PAE_PG_MASK | X86_PDE4M_P | X86_PDE4M_PS)) == u64)
     3197            {
     3198                Log4(("pgmPoolTrackFlushGCPhysPTs: i=%d pde=%RX64 cRefs=%#x\n", iPte, pPD->a[iPte], cRefs));
     3199                STAM_COUNTER_INC(&pPool->StatTrackFlushEntry);
     3200                pPD->a[iPte].u = 0;
     3201                cRefs--;
     3202
     3203                /* Update the counter as we're removing references. */
     3204                Assert(pPage->cPresent);
     3205                Assert(pPool->cPresent);
     3206                pPage->cPresent--;
     3207                pPool->cPresent--;
     3208                return bRet;
     3209            }
    32193210# ifdef LOG_ENABLED
    32203211            Log(("cRefs=%d iFirstPresent=%d cPresent=%d\n", cRefs, pPage->iFirstPresent, pPage->cPresent));
     
    32563247    Log2(("pgmPoolTrackFlushGCPhysPT: pPhysPage=%RHp iShw=%d cRefs=%d\n", PGM_PAGE_GET_HCPHYS(pPhysPage), iShw, cRefs));
    32573248    STAM_PROFILE_START(&pPool->StatTrackFlushGCPhysPT, f);
    3258     bool fKeptPTEs = pgmPoolTrackFlushGCPhysPTInt(pVM, pPhysPage, fFlushPTEs, iShw, cRefs);
     3249    bool fKeptPTEs = pgmPoolTrackFlushGCPhysPTInt(pVM, pPhysPage, fFlushPTEs, iShw, PGM_PAGE_GET_PTE_INDEX(pPhysPage), cRefs);
    32593250    if (!fKeptPTEs)
    32603251        PGM_PAGE_SET_TRACKING(pPhysPage, 0);
     
    32903281            if (pPhysExt->aidx[i] != NIL_PGMPOOL_IDX)
    32913282            {
    3292                 bool fKeptPTEs = pgmPoolTrackFlushGCPhysPTInt(pVM, pPhysPage, fFlushPTEs, pPhysExt->aidx[i], 1);
     3283                bool fKeptPTEs = pgmPoolTrackFlushGCPhysPTInt(pVM, pPhysPage, fFlushPTEs, pPhysExt->aidx[i], pPhysExt->apte[i], 1);
    32933284                if (!fKeptPTEs)
     3285                {
    32943286                    pPhysExt->aidx[i] = NIL_PGMPOOL_IDX;
     3287                    pPhysExt->apte[i] = NIL_PGMPOOL_PHYSEXT_IDX_PTE;
     3288                }
    32953289                else
    32963290                    fKeepList = true;
     
    33063300        pPhysExt->iNext = pPool->iPhysExtFreeHead;
    33073301        pPool->iPhysExtFreeHead = iPhysExtStart;
     3302        /* Invalidate the tracking data. */
    33083303        PGM_PAGE_SET_TRACKING(pPhysPage, 0);
    33093304    }
     
    37623757    PPGMPOOLPHYSEXT pPhysExt = &pPool->CTX_SUFF(paPhysExts)[iPhysExt];
    37633758    for (unsigned i = 0; i < RT_ELEMENTS(pPhysExt->aidx); i++)
     3759    {
    37643760        pPhysExt->aidx[i] = NIL_PGMPOOL_IDX;
     3761        pPhysExt->apte[i] = NIL_PGMPOOL_PHYSEXT_IDX_PTE;
     3762    }
    37653763    pPhysExt->iNext = pPool->iPhysExtFreeHead;
    37663764    pPool->iPhysExtFreeHead = iPhysExt;
     
    37863784        pPhysExt = &pPool->CTX_SUFF(paPhysExts)[iPhysExt];
    37873785        for (unsigned i = 0; i < RT_ELEMENTS(pPhysExt->aidx); i++)
     3786        {
    37883787            pPhysExt->aidx[i] = NIL_PGMPOOL_IDX;
     3788            pPhysExt->apte[i] = NIL_PGMPOOL_PHYSEXT_IDX_PTE;
     3789        }
    37893790
    37903791        /* next */
     
    38053806 * @param   iPhysExt    The physical extent index of the list head.
    38063807 * @param   iShwPT      The shadow page table index.
    3807  *
    3808  */
    3809 static uint16_t pgmPoolTrackPhysExtInsert(PVM pVM, uint16_t iPhysExt, uint16_t iShwPT)
     3808 * @param   iPte        Page table entry
     3809 *
     3810 */
     3811static uint16_t pgmPoolTrackPhysExtInsert(PVM pVM, uint16_t iPhysExt, uint16_t iShwPT, uint16_t iPte)
    38103812{
    38113813    Assert(PGMIsLockOwner(pVM));
     
    38173819    {
    38183820        paPhysExts[iPhysExt].aidx[2] = iShwPT;
     3821        paPhysExts[iPhysExt].apte[2] = iPte;
    38193822        STAM_COUNTER_INC(&pVM->pgm.s.StatTrackAliasedMany);
    3820         LogFlow(("pgmPoolTrackPhysExtInsert: %d:{,,%d}\n", iPhysExt, iShwPT));
     3823        LogFlow(("pgmPoolTrackPhysExtInsert: %d:{,,%d pte %d}\n", iPhysExt, iShwPT, iPte));
    38213824        return PGMPOOL_TD_MAKE(PGMPOOL_TD_CREFS_PHYSEXT, iPhysExt);
    38223825    }
     
    38323835            {
    38333836                paPhysExts[iPhysExt].aidx[i] = iShwPT;
     3837                paPhysExts[iPhysExt].apte[i] = iPte;
    38343838                STAM_COUNTER_INC(&pVM->pgm.s.StatTrackAliasedMany);
    3835                 LogFlow(("pgmPoolTrackPhysExtInsert: %d:{%d} i=%d cMax=%d\n", iPhysExt, iShwPT, i, cMax));
     3839                LogFlow(("pgmPoolTrackPhysExtInsert: %d:{%d pte %d} i=%d cMax=%d\n", iPhysExt, iShwPT, iPte, i, cMax));
    38363840                return PGMPOOL_TD_MAKE(PGMPOOL_TD_CREFS_PHYSEXT, iPhysExtStart);
    38373841            }
     
    38563860    pNew->iNext = iPhysExtStart;
    38573861    pNew->aidx[0] = iShwPT;
    3858     LogFlow(("pgmPoolTrackPhysExtInsert: added new extent %d:{%d}->%d\n", iPhysExt, iShwPT, iPhysExtStart));
     3862    pNew->apte[1] = iPte;
     3863    LogFlow(("pgmPoolTrackPhysExtInsert: added new extent %d:{%d pte %d}->%d\n", iPhysExt, iShwPT, iPte, iPhysExtStart));
    38593864    return PGMPOOL_TD_MAKE(PGMPOOL_TD_CREFS_PHYSEXT, iPhysExt);
    38603865}
     
    38673872 *
    38683873 * @param   pVM         The VM handle.
     3874 * @param   pPhysPage   Pointer to the aPages entry in the ram range.
    38693875 * @param   u16         The ram range flags (top 16-bits).
    38703876 * @param   iShwPT      The shadow page table index.
    3871  */
    3872 uint16_t pgmPoolTrackPhysExtAddref(PVM pVM, uint16_t u16, uint16_t iShwPT)
     3877 * @param   iPte        Page table entry
     3878 */
     3879uint16_t pgmPoolTrackPhysExtAddref(PVM pVM, PPGMPAGE pPhysPage, uint16_t u16, uint16_t iShwPT, uint16_t iPte)
    38733880{
    38743881    pgmLock(pVM);
     
    38863893            STAM_COUNTER_INC(&pVM->pgm.s.StatTrackAliased);
    38873894            pPhysExt->aidx[0] = PGMPOOL_TD_GET_IDX(u16);
     3895            pPhysExt->apte[0] = PGM_PAGE_GET_PTE_INDEX(pPhysPage);
    38883896            pPhysExt->aidx[1] = iShwPT;
     3897            pPhysExt->apte[1] = iPte;
    38893898            u16 = PGMPOOL_TD_MAKE(PGMPOOL_TD_CREFS_PHYSEXT, iPhysExt);
    38903899        }
     
    38973906         * Insert into the extent list.
    38983907         */
    3899         u16 = pgmPoolTrackPhysExtInsert(pVM, PGMPOOL_TD_GET_IDX(u16), iShwPT);
     3908        u16 = pgmPoolTrackPhysExtInsert(pVM, PGMPOOL_TD_GET_IDX(u16), iShwPT, iPte);
    39003909    }
    39013910    else
     
    39053914}
    39063915
    3907 
    39083916/**
    39093917 * Clear references to guest physical memory.
     
    39383946                {
    39393947                    paPhysExts[iPhysExt].aidx[i] = NIL_PGMPOOL_IDX;
     3948                    paPhysExts[iPhysExt].apte[i] = NIL_PGMPOOL_PHYSEXT_IDX_PTE;
    39403949
    39413950                    for (i = 0; i < RT_ELEMENTS(paPhysExts[iPhysExt].aidx); i++)
     
    39893998}
    39903999
    3991 
    39924000/**
    39934001 * Clear references to guest physical memory.
     
    51375145        paPhysExts[i].iNext = i + 1;
    51385146        paPhysExts[i].aidx[0] = NIL_PGMPOOL_IDX;
     5147        paPhysExts[i].apte[0] = NIL_PGMPOOL_PHYSEXT_IDX_PTE;
    51395148        paPhysExts[i].aidx[1] = NIL_PGMPOOL_IDX;
     5149        paPhysExts[i].apte[1] = NIL_PGMPOOL_PHYSEXT_IDX_PTE;
    51405150        paPhysExts[i].aidx[2] = NIL_PGMPOOL_IDX;
     5151        paPhysExts[i].apte[2] = NIL_PGMPOOL_PHYSEXT_IDX_PTE;
    51415152    }
    51425153    paPhysExts[cMaxPhysExts - 1].iNext = NIL_PGMPOOL_PHYSEXT_INDEX;
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