VirtualBox

Changeset 18205 in vbox for trunk/src/VBox/VMM/PGMPhys.cpp


Ignore:
Timestamp:
Mar 24, 2009 4:41:24 PM (16 years ago)
Author:
vboxsync
Message:

PGMPhys: Fixed bug in the freeing of shadowed ROM pages during reset (the immeidate cause of the restore regression). More logging.

File:
1 edited

Legend:

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

    r18167 r18205  
    2424*   Header Files                                                               *
    2525*******************************************************************************/
    26 #define LOG_GROUP LOG_GROUP_PGM
     26#define LOG_GROUP LOG_GROUP_PGM_PHYS
    2727#include <VBox/pgm.h>
    2828#include <VBox/cpum.h>
     
    21582158            if (!pVM->pgm.s.fRamPreAlloc)
    21592159            {
    2160                 /* Count dirty shadow pages. */
    2161                 uint32_t cDirty = 0;
    2162                 uint32_t iPage = cPages;
    2163                 while (iPage-- > 0)
     2160                /* Free the dirty pages. */
     2161                uint32_t            cPendingPages = 0;
     2162                PGMMFREEPAGESREQ    pReq;
     2163                rc = GMMR3FreePagesPrepare(pVM, &pReq, PGMPHYS_FREE_PAGE_BATCH_SIZE, GMMACCOUNT_BASE);
     2164                AssertRCReturn(rc, rc);
     2165
     2166                for (uint32_t iPage = 0; iPage < cPages; iPage++)
    21642167                    if (PGM_PAGE_GET_STATE(&pRom->aPages[iPage].Shadow) != PGM_PAGE_STATE_ZERO)
    2165                         cDirty++;
    2166                 if (cDirty)
     2168                    {
     2169                        Assert(PGM_PAGE_GET_STATE(&pRom->aPages[iPage].Shadow) == PGM_PAGE_STATE_ALLOCATED);
     2170                        rc = pgmPhysFreePage(pVM, pReq, &cPendingPages, &pRom->aPages[iPage].Shadow, pRom->GCPhys + (iPage << PAGE_SHIFT));
     2171                        AssertLogRelRCReturn(rc, rc);
     2172                    }
     2173
     2174                if (cPendingPages)
    21672175                {
    2168                     /* Free the dirty pages. */
    2169                     PGMMFREEPAGESREQ pReq;
    2170                     rc = GMMR3FreePagesPrepare(pVM, &pReq, cDirty, GMMACCOUNT_BASE);
    2171                     AssertRCReturn(rc, rc);
    2172 
    2173                     uint32_t iReqPage = 0;
    2174                     for (iPage = 0; iPage < cPages; iPage++)
    2175                         if (PGM_PAGE_GET_STATE(&pRom->aPages[iPage].Shadow) != PGM_PAGE_STATE_ZERO)
    2176                         {
    2177                             Assert(PGM_PAGE_GET_STATE(&pRom->aPages[iPage].Shadow) == PGM_PAGE_STATE_ALLOCATED);
    2178                             pReq->aPages[iReqPage].idPage = PGM_PAGE_GET_PAGEID(&pRom->aPages[iPage].Shadow);
    2179                             iReqPage++;
    2180                         }
    2181 
    2182                     rc = GMMR3FreePagesPerform(pVM, pReq, cDirty);
    2183                     GMMR3FreePagesCleanup(pReq);
    2184                     AssertRCReturn(rc, rc);
    2185 
    2186                     /* setup the zero page. */
    2187                     for (iPage = 0; iPage < cPages; iPage++)
    2188                         if (PGM_PAGE_GET_STATE(&pRom->aPages[iPage].Shadow) != PGM_PAGE_STATE_ZERO)
    2189                             PGM_PAGE_INIT_ZERO_REAL(&pRom->aPages[iPage].Shadow, pVM, PGMPAGETYPE_ROM_SHADOW);
    2190 
    2191                     /* update the page count stats. */
    2192                     pVM->pgm.s.cPrivatePages -= cDirty;
    2193                     pVM->pgm.s.cZeroPages    += cDirty;
     2176                    rc = GMMR3FreePagesPerform(pVM, pReq, cPendingPages);
     2177                    AssertLogRelRCReturn(rc, rc);
    21942178                }
     2179                GMMR3FreePagesCleanup(pReq);
    21952180            }
    21962181            else
    21972182            {
    2198                 /* clear all the pages. */
     2183                /* clear all the shadow pages. */
    21992184                for (uint32_t iPage = 0; iPage < cPages; iPage++)
    22002185                {
     
    30723057            ASMMemZeroPage(pv);
    30733058            iClear++;
     3059            Log3(("PGMR3PhysAllocateHandyPages: idPage=%#x HCPhys=%RGp\n", pPage->idPage, pPage->HCPhysGCPhys));
    30743060        }
    30753061
     
    30893075        for (uint32_t i = 0; i < RT_ELEMENTS(pVM->pgm.s.aHandyPages); i++)
    30903076        {
    3091             LogRel(("PGM: aHandyPages[#%-2d] = {.HCPhysGCPhys=%RHp, .idPage=%#08x, .idSharedPage=%#08x}\n",
     3077            LogRel(("PGM: aHandyPages[#%#04x] = {.HCPhysGCPhys=%RHp, .idPage=%#08x, .idSharedPage=%#08x}\n",
    30923078                    i, pVM->pgm.s.aHandyPages[i].HCPhysGCPhys, pVM->pgm.s.aHandyPages[i].idPage,
    30933079                    pVM->pgm.s.aHandyPages[i].idSharedPage));
     
    31413127     */
    31423128    Assert(PDMCritSectIsOwner(&pVM->pgm.s.CritSect));
    3143     if (RT_UNLIKELY(PGM_PAGE_GET_TYPE(pPage) != PGMPAGETYPE_RAM))
     3129    if (RT_UNLIKELY(    PGM_PAGE_GET_TYPE(pPage) != PGMPAGETYPE_RAM
     3130                    &&  PGM_PAGE_GET_TYPE(pPage) != PGMPAGETYPE_ROM_SHADOW))
    31443131    {
    31453132        AssertMsgFailed(("GCPhys=%RGp pPage=%R[pgmpage]\n", GCPhys, pPage));
     
    31513138
    31523139    const uint32_t idPage = PGM_PAGE_GET_PAGEID(pPage);
     3140    Log3(("pgmPhysFreePage: idPage=%#x HCPhys=%RGp pPage=%R[pgmpage]\n", idPage, pPage));
    31533141    if (RT_UNLIKELY(    idPage == NIL_GMM_PAGEID
    31543142                    ||  idPage > GMM_PAGEID_LAST
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