VirtualBox

Changeset 36013 in vbox


Ignore:
Timestamp:
Feb 17, 2011 1:03:30 PM (14 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
70097
Message:

VMM/VMMR3/PGMSavedState: Save and restore ballooned pages in saved state files (#5515).

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

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMR3/PGMSavedState.cpp

    r36009 r36013  
    4848/** Saved state data unit version.
    4949 * @todo remove the guest mappings from the saved state at next version change! */
    50 #define PGM_SAVED_STATE_VERSION                 12
     50#define PGM_SAVED_STATE_VERSION                 13
     51/** Saved state data unit version after this includes ballooned page flags in
     52 *  the state (see #5515). */
     53#define PGM_SAVED_STATE_VERSION_BALLOON_BROKEN  12
    5154/** Saved state before the balloon change. */
    5255#define PGM_SAVED_STATE_VERSION_PRE_BALLOON     11
     
    8285/** ROM protection (8-bit). */
    8386#define PGM_STATE_REC_ROM_PROT          UINT8_C(0x07)
     87/** Ballooned page. */
     88#define PGM_STATE_REC_RAM_BALLOONED     UINT8_C(0x08)
    8489/** The last record type. */
    85 #define PGM_STATE_REC_LAST              PGM_STATE_REC_ROM_PROT
     90#define PGM_STATE_REC_LAST              PGM_STATE_REC_RAM_BALLOONED
    8691/** End marker. */
    8792#define PGM_STATE_REC_END               UINT8_C(0xff)
     
    509514                    RTGCPHYS    GCPhys  = pRom->GCPhys + ((RTGCPHYS)iPage << PAGE_SHIFT);
    510515                    PPGMPAGE    pPage   = PGMROMPROT_IS_ROM(enmProt) ? &pRomPage->Shadow : pgmPhysGetPage(&pVM->pgm.s, GCPhys);
    511                     bool        fZero   = PGM_PAGE_IS_ZERO(pPage) || PGM_PAGE_IS_BALLOONED(pPage);
     516                    bool        fZero   = PGM_PAGE_IS_ZERO(pPage) || PGM_PAGE_IS_BALLOONED(pPage);  /* Do we ever balloon shadow ROM pages!? */
    512517                    int         rc      = VINF_SUCCESS;
    513518                    if (!fZero)
     
    15941599                    int         rc;
    15951600                    RTGCPHYS    GCPhys = pCur->GCPhys + ((RTGCPHYS)iPage << PAGE_SHIFT);
    1596                     bool        fZero  = PGM_PAGE_IS_ZERO(pCurPage) || PGM_PAGE_IS_BALLOONED(pCurPage);
     1601                    bool        fZero  = PGM_PAGE_IS_ZERO(pCurPage);
     1602                    bool        fBallooned = PGM_PAGE_IS_BALLOONED(pCurPage);
    15971603                    bool        fSkipped = false;
    15981604
    1599                     if (!fZero)
     1605                    if (!fZero && !fBallooned)
    16001606                    {
    16011607                        /*
     
    16741680                        pgmUnlock(pVM);
    16751681
     1682                        uint8_t u8RecType = fBallooned ? PGM_STATE_REC_RAM_BALLOONED : PGM_STATE_REC_RAM_ZERO;
    16761683                        if (GCPhys == GCPhysLast + PAGE_SIZE)
    1677                             rc = SSMR3PutU8(pSSM, PGM_STATE_REC_RAM_ZERO);
     1684                            rc = SSMR3PutU8(pSSM, u8RecType);
    16781685                        else
    16791686                        {
    1680                             SSMR3PutU8(pSSM, PGM_STATE_REC_RAM_ZERO | PGM_STATE_REC_FLAG_ADDR);
     1687                            SSMR3PutU8(pSSM, u8RecType | PGM_STATE_REC_FLAG_ADDR);
    16811688                            rc = SSMR3PutGCPhys(pSSM, GCPhys);
    16821689                        }
     
    25592566 * @param   pVM                 The VM handle.
    25602567 * @param   pSSM                The SSM handle.
    2561  * @param   uVersion            The saved state version.
     2568 * @param   uPass               The pass number.
    25622569 *
    25632570 * @todo    This needs splitting up if more record types or code twists are
     
    26022609            if (cPendingPages)
    26032610            {
     2611                Log(("pgmR3LoadMemory: GMMR3FreePagesPerform pVM=%p cPendingPages=%u\n", pVM, cPendingPages));
    26042612                rc = GMMR3FreePagesPerform(pVM, pReq, cPendingPages);
    26052613                AssertLogRelRCReturn(rc, rc);
     
    26162624            case PGM_STATE_REC_RAM_ZERO:
    26172625            case PGM_STATE_REC_RAM_RAW:
     2626            case PGM_STATE_REC_RAM_BALLOONED:
    26182627            {
    26192628                /*
     
    26642673                            AssertRCReturn(rc, rc);
    26652674                        }
     2675                        /** @todo handle large pages (see #5545) */
     2676                        break;
     2677                    }
     2678
     2679                    case PGM_STATE_REC_RAM_BALLOONED:
     2680                    {
     2681                        if (PGM_PAGE_IS_BALLOONED(pPage))
     2682                            break;
     2683
     2684                        /*
     2685                         * We don't map ballooned pages in our shadow page tables, let's just free it if allocated and mark as ballooned.
     2686                         * See #5515.
     2687                         */
     2688                        if (PGM_PAGE_IS_ALLOCATED(pPage))
     2689                        {
     2690                            /** @todo handle large pages + ballooning when it works. (see #5515, #5545). */
     2691                            AssertLogRelMsgReturn(   PGM_PAGE_GET_PDE_TYPE(pPage) != PGM_PAGE_PDE_TYPE_PDE
     2692                                                  && PGM_PAGE_GET_PDE_TYPE(pPage) != PGM_PAGE_PDE_TYPE_PDE_DISABLED,
     2693                                                     ("GCPhys=%RGp %R[pgmpage]\n", GCPhys, pPage), VERR_INTERNAL_ERROR_5);
     2694
     2695                            rc = pgmPhysFreePage(pVM, pReq, &cPendingPages, pPage, GCPhys);
     2696                            AssertRCReturn(rc, rc);
     2697                        }
     2698                        Assert(PGM_PAGE_IS_ZERO(pPage));
     2699                        PGM_PAGE_SET_STATE(pPage, PGM_PAGE_STATE_BALLOONED);
    26662700                        break;
    26672701                    }
     
    30043038    if (pVM->pgm.s.cBalloonedPages)
    30053039    {
     3040        Log(("pgmR3LoadFinalLocked: pVM=%p cBalloonedPages=%#x\n", pVM, pVM->pgm.s.cBalloonedPages));
    30063041        rc = GMMR3BalloonedPages(pVM, GMMBALLOONACTION_INFLATE, pVM->pgm.s.cBalloonedPages);
    30073042        AssertRCReturn(rc, rc);
     
    30303065    if (   (   uPass != SSM_PASS_FINAL
    30313066            && uVersion != PGM_SAVED_STATE_VERSION
     3067            && uVersion != PGM_SAVED_STATE_VERSION_BALLOON_BROKEN
    30323068            && uVersion != PGM_SAVED_STATE_VERSION_PRE_BALLOON
    30333069            && uVersion != PGM_SAVED_STATE_VERSION_NO_RAM_CFG)
    30343070        || (   uVersion != PGM_SAVED_STATE_VERSION
     3071            && uVersion != PGM_SAVED_STATE_VERSION_BALLOON_BROKEN
    30353072            && uVersion != PGM_SAVED_STATE_VERSION_PRE_BALLOON
    30363073            && uVersion != PGM_SAVED_STATE_VERSION_NO_RAM_CFG
  • trunk/src/VBox/VMM/include/PGMInternal.h

    r36009 r36013  
    925925 */
    926926#define PGM_PAGE_IS_BALLOONED(pPage)        ( (pPage)->uStateY == PGM_PAGE_STATE_BALLOONED )
     927
     928/**
     929 * Checks if the page is allocated.
     930 * @returns true/false.
     931 * @param   pPage       Pointer to the physical guest page tracking structure.
     932 */
     933#define PGM_PAGE_IS_ALLOCATED(pPage)        ( (pPage)->uStateY == PGM_PAGE_STATE_ALLOCATED )
    927934
    928935/**
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