VirtualBox

Changeset 23565 in vbox


Ignore:
Timestamp:
Oct 5, 2009 3:47:04 PM (15 years ago)
Author:
vboxsync
Message:

PGMSavedState: Enabled the new saved state format (v10).

File:
1 edited

Legend:

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

    r23544 r23565  
    4848*******************************************************************************/
    4949/** Saved state data unit version. */
    50 #ifdef VBOX_WITH_LIVE_MIGRATION
    51 # define PGM_SAVED_STATE_VERSION                10
    52 #else
    53 # define PGM_SAVED_STATE_VERSION                9
    54 #endif
     50#define PGM_SAVED_STATE_VERSION                 10
    5551/** Saved state data unit version for 3.0. (pre live migration) */
    5652#define PGM_SAVED_STATE_VERSION_3_0_0           9
     
    17211717}
    17221718
    1723 #ifndef VBOX_WITH_LIVE_MIGRATION
    1724 
    1725 /**
    1726  * Save zero indicator + bits for the specified page.
    1727  *
    1728  * @returns VBox status code, errors are logged/asserted before returning.
    1729  * @param   pVM         The VM handle.
    1730  * @param   pSSH        The saved state handle.
    1731  * @param   pPage       The page to save.
    1732  * @param   GCPhys      The address of the page.
    1733  * @param   pRam        The ram range (for error logging).
    1734  */
    1735 static int pgmR3SavePage(PVM pVM, PSSMHANDLE pSSM, PPGMPAGE pPage, RTGCPHYS GCPhys, PPGMRAMRANGE pRam)
    1736 {
    1737     int rc;
    1738     if (PGM_PAGE_IS_ZERO(pPage))
    1739         rc = SSMR3PutU8(pSSM, 0);
    1740     else
    1741     {
    1742         void const *pvPage;
    1743         rc = pgmPhysGCPhys2CCPtrInternalReadOnly(pVM, pPage, GCPhys, &pvPage);
    1744         AssertLogRelMsgRCReturn(rc, ("pPage=%R[pgmpage] GCPhys=%#x %s\n", pPage, GCPhys, pRam->pszDesc), rc);
    1745 
    1746         SSMR3PutU8(pSSM, 1);
    1747         rc = SSMR3PutMem(pSSM, pvPage, PAGE_SIZE);
    1748     }
    1749     return rc;
    1750 }
    1751 
    1752 
    1753 /**
    1754  * Save a shadowed ROM page.
    1755  *
    1756  * Format: Type, protection, and two pages with zero indicators.
    1757  *
    1758  * @returns VBox status code, errors are logged/asserted before returning.
    1759  * @param   pVM         The VM handle.
    1760  * @param   pSSH        The saved state handle.
    1761  * @param   pPage       The page to save.
    1762  * @param   GCPhys      The address of the page.
    1763  * @param   pRam        The ram range (for error logging).
    1764  */
    1765 static int pgmR3SaveShadowedRomPage(PVM pVM, PSSMHANDLE pSSM, PPGMPAGE pPage, RTGCPHYS GCPhys, PPGMRAMRANGE pRam)
    1766 {
    1767     /* Need to save both pages and the current state. */
    1768     PPGMROMPAGE pRomPage = pgmR3GetRomPage(pVM, GCPhys);
    1769     AssertLogRelMsgReturn(pRomPage, ("GCPhys=%RGp %s\n", GCPhys, pRam->pszDesc), VERR_INTERNAL_ERROR);
    1770 
    1771     SSMR3PutU8(pSSM, PGMPAGETYPE_ROM_SHADOW);
    1772     SSMR3PutU8(pSSM, pRomPage->enmProt);
    1773 
    1774     int rc = pgmR3SavePage(pVM, pSSM, pPage, GCPhys, pRam);
    1775     if (RT_SUCCESS(rc))
    1776     {
    1777         PPGMPAGE pPagePassive = PGMROMPROT_IS_ROM(pRomPage->enmProt) ? &pRomPage->Shadow : &pRomPage->Virgin;
    1778         rc = pgmR3SavePage(pVM, pSSM, pPagePassive, GCPhys, pRam);
    1779     }
    1780     return rc;
    1781 }
    1782 
    1783 #endif /* !VBOX_WITH_LIVE_MIGRATION */
    1784 
    17851719
    17861720/**
     
    18781812    rc = SSMR3PutU32(pSSM, ~0); /* terminator. */
    18791813
    1880 #ifdef VBOX_WITH_LIVE_MIGRATION
    18811814    /*
    18821815     * Save the (remainder of the) memory.
     
    19121845        SSMR3PutU8(pSSM, PGM_STATE_REC_END);    /* (Ignore the rc, SSM takes of it.) */
    19131846    }
    1914 
    1915 #else /* !VBOX_WITH_LIVE_MIGRATION */
    1916     /*
    1917      * Ram ranges and the memory they describe.
    1918      */
    1919     i = 0;
    1920     for (PPGMRAMRANGE pRam = pPGM->pRamRangesR3; pRam; pRam = pRam->pNextR3, i++)
    1921     {
    1922         /*
    1923          * Save the ram range details.
    1924          */
    1925         SSMR3PutU32(pSSM,       i);
    1926         SSMR3PutGCPhys(pSSM,    pRam->GCPhys);
    1927         SSMR3PutGCPhys(pSSM,    pRam->GCPhysLast);
    1928         SSMR3PutGCPhys(pSSM,    pRam->cb);
    1929         SSMR3PutU8(pSSM,        !!pRam->pvR3);      /* Boolean indicating memory or not. */
    1930         SSMR3PutStrZ(pSSM,      pRam->pszDesc);     /* This is the best unique id we have... */
    1931 
    1932         /*
    1933          * Iterate the pages, only two special case.
    1934          */
    1935         uint32_t const cPages = pRam->cb >> PAGE_SHIFT;
    1936         for (uint32_t iPage = 0; iPage < cPages; iPage++)
    1937         {
    1938             RTGCPHYS GCPhysPage = pRam->GCPhys + ((RTGCPHYS)iPage << PAGE_SHIFT);
    1939             PPGMPAGE pPage      = &pRam->aPages[iPage];
    1940             uint8_t  uType      = PGM_PAGE_GET_TYPE(pPage);
    1941 
    1942             if (uType == PGMPAGETYPE_ROM_SHADOW) /** @todo This isn't right, but it doesn't currently matter. */
    1943                 rc = pgmR3SaveShadowedRomPage(pVM, pSSM, pPage, GCPhysPage, pRam);
    1944             else if (uType == PGMPAGETYPE_MMIO2_ALIAS_MMIO)
    1945             {
    1946                 /* MMIO2 alias -> MMIO; the device will just have to deal with this. */
    1947                 SSMR3PutU8(pSSM, PGMPAGETYPE_MMIO);
    1948                 rc = SSMR3PutU8(pSSM, 0 /* ZERO */);
    1949             }
    1950             else
    1951             {
    1952                 SSMR3PutU8(pSSM, uType);
    1953                 rc = pgmR3SavePage(pVM, pSSM, pPage, GCPhysPage, pRam);
    1954             }
    1955             if (RT_FAILURE(rc))
    1956                 break;
    1957         }
    1958         if (RT_FAILURE(rc))
    1959             break;
    1960     }
    1961 
    1962     rc = SSMR3PutU32(pSSM, ~0); /* terminator. */
    1963 #endif /* !VBOX_WITH_LIVE_MIGRATION */
    19641847
    19651848    pgmUnlock(pVM);
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