VirtualBox

Ignore:
Timestamp:
Aug 27, 2010 1:05:10 PM (14 years ago)
Author:
vboxsync
Message:

FT updates

File:
1 edited

Legend:

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

    r31847 r32051  
    3232#include <VBox/param.h>
    3333#include <VBox/err.h>
     34#include <VBox/ftm.h>
    3435
    3536#include <iprt/asm.h>
     
    398399static int pgmR3SaveRomVirginPages(PVM pVM, PSSMHANDLE pSSM, bool fLiveSave)
    399400{
     401    if (FTMIsDeltaLoadSaveActive(pVM))
     402        return VINF_SUCCESS;    /* nothing to do as nothing has changed here */
     403
    400404    pgmLock(pVM);
    401405    for (PPGMROMRANGE pRom = pVM->pgm.s.pRomRangesR3; pRom; pRom = pRom->pNextR3)
     
    473477static int pgmR3SaveShadowedRomPages(PVM pVM, PSSMHANDLE pSSM, bool fLiveSave, bool fFinalPass)
    474478{
     479    if (FTMIsDeltaLoadSaveActive(pVM))
     480        return VINF_SUCCESS;    /* nothing to do as we deal with those pages seperately */
     481
    475482    /*
    476483     * The Shadowed ROMs.
     
    15131520    RTGCPHYS GCPhysCur = 0;
    15141521    PPGMRAMRANGE pCur;
     1522    bool fFTMDeltaSaveActive = FTMIsDeltaLoadSaveActive(pVM);
     1523
    15151524    pgmLock(pVM);
    15161525    do
     
    15381547                    }
    15391548
     1549                    PPGMPAGE pCurPage = &pCur->aPages[iPage];
     1550
    15401551                    /*
    15411552                     * Only save pages that haven't changed since last scan and are dirty.
     
    15501561                        if (paLSPages[iPage].fIgnore)
    15511562                            continue;
    1552                         if (PGM_PAGE_GET_TYPE(&pCur->aPages[iPage]) != PGMPAGETYPE_RAM) /* in case of recent remappings */
     1563                        if (PGM_PAGE_GET_TYPE(pCurPage) != PGMPAGETYPE_RAM) /* in case of recent remappings */
    15531564                            continue;
    1554                         if (    PGM_PAGE_GET_STATE(&pCur->aPages[iPage])
     1565                        if (    PGM_PAGE_GET_STATE(pCurPage)
    15551566                            !=  (  paLSPages[iPage].fZero
    15561567                                 ? PGM_PAGE_STATE_ZERO
     
    15691580                        {
    15701581#ifdef PGMLIVESAVERAMPAGE_WITH_CRC32
    1571                             if (PGM_PAGE_GET_TYPE(&pCur->aPages[iPage]) != PGMPAGETYPE_RAM)
     1582                            if (PGM_PAGE_GET_TYPE(pCurPage) != PGMPAGETYPE_RAM)
    15721583                                pgmR3StateVerifyCrc32ForRamPage(pVM, pCur, paLSPages, iPage, "save#1");
    15731584#endif
    15741585                            continue;
    15751586                        }
    1576                         if (PGM_PAGE_GET_TYPE(&pCur->aPages[iPage]) != PGMPAGETYPE_RAM)
     1587                        if (PGM_PAGE_GET_TYPE(pCurPage) != PGMPAGETYPE_RAM)
    15771588                            continue;
    15781589                    }
     
    15831594                    int         rc;
    15841595                    RTGCPHYS    GCPhys = pCur->GCPhys + ((RTGCPHYS)iPage << PAGE_SHIFT);
    1585                     bool        fZero  = PGM_PAGE_IS_ZERO(&pCur->aPages[iPage]) || PGM_PAGE_IS_BALLOONED(&pCur->aPages[iPage]);
     1596                    bool        fZero  = PGM_PAGE_IS_ZERO(pCurPage) || PGM_PAGE_IS_BALLOONED(pCurPage);
    15861597
    15871598                    if (!fZero)
     
    15931604                        uint8_t     abPage[PAGE_SIZE];
    15941605                        void const *pvPage;
    1595                         rc = pgmPhysGCPhys2CCPtrInternalReadOnly(pVM, &pCur->aPages[iPage], GCPhys, &pvPage);
     1606                        rc = pgmPhysGCPhys2CCPtrInternalReadOnly(pVM, pCurPage, GCPhys, &pvPage);
    15961607                        if (RT_SUCCESS(rc))
    15971608                        {
     
    16081619                        if (!ASMMemIsZeroPage(pvPage))
    16091620                        {
    1610                             if (GCPhys == GCPhysLast + PAGE_SIZE)
    1611                                 SSMR3PutU8(pSSM, PGM_STATE_REC_RAM_RAW);
     1621                            if (fFTMDeltaSaveActive)
     1622                            {
     1623                                if (    PGM_PAGE_IS_WRITTEN_TO(pCurPage)
     1624                                    ||  PGM_PAGE_IS_FT_DIRTY(pCurPage))
     1625                                {
     1626                                    SSMR3PutU8(pSSM, PGM_STATE_REC_RAM_RAW | PGM_STATE_REC_FLAG_ADDR);
     1627                                    SSMR3PutGCPhys(pSSM, GCPhys);
     1628                                    rc = SSMR3PutMem(pSSM, abPage, PAGE_SIZE);
     1629                                }
     1630                                /* else nothing changed, so skip it. */
     1631                            }
    16121632                            else
    16131633                            {
    1614                                 SSMR3PutU8(pSSM, PGM_STATE_REC_RAM_RAW | PGM_STATE_REC_FLAG_ADDR);
    1615                                 SSMR3PutGCPhys(pSSM, GCPhys);
     1634                                if (GCPhys == GCPhysLast + PAGE_SIZE)
     1635                                    SSMR3PutU8(pSSM, PGM_STATE_REC_RAM_RAW);
     1636                                else
     1637                                {
     1638                                    SSMR3PutU8(pSSM, PGM_STATE_REC_RAM_RAW | PGM_STATE_REC_FLAG_ADDR);
     1639                                    SSMR3PutGCPhys(pSSM, GCPhys);
     1640                                }
     1641                                rc = SSMR3PutMem(pSSM, abPage, PAGE_SIZE);
    16161642                            }
    1617                             rc = SSMR3PutMem(pSSM, abPage, PAGE_SIZE);
    16181643                        }
    16191644                        else
     
    16751700        } /* for each range */
    16761701    } while (pCur);
     1702
    16771703    pgmUnlock(pVM);
    16781704
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