Changeset 23565 in vbox
- Timestamp:
- Oct 5, 2009 3:47:04 PM (15 years ago)
- File:
-
- 1 edited
-
trunk/src/VBox/VMM/PGMSavedState.cpp (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/PGMSavedState.cpp
r23544 r23565 48 48 *******************************************************************************/ 49 49 /** 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 55 51 /** Saved state data unit version for 3.0. (pre live migration) */ 56 52 #define PGM_SAVED_STATE_VERSION_3_0_0 9 … … 1721 1717 } 1722 1718 1723 #ifndef VBOX_WITH_LIVE_MIGRATION1724 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 else1741 {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 1785 1719 1786 1720 /** … … 1878 1812 rc = SSMR3PutU32(pSSM, ~0); /* terminator. */ 1879 1813 1880 #ifdef VBOX_WITH_LIVE_MIGRATION1881 1814 /* 1882 1815 * Save the (remainder of the) memory. … … 1912 1845 SSMR3PutU8(pSSM, PGM_STATE_REC_END); /* (Ignore the rc, SSM takes of it.) */ 1913 1846 } 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 else1951 {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 */1964 1847 1965 1848 pgmUnlock(pVM);
Note:
See TracChangeset
for help on using the changeset viewer.

