Changeset 36013 in vbox
- Timestamp:
- Feb 17, 2011 1:03:30 PM (14 years ago)
- svn:sync-xref-src-repo-rev:
- 70097
- Location:
- trunk/src/VBox/VMM
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMR3/PGMSavedState.cpp
r36009 r36013 48 48 /** Saved state data unit version. 49 49 * @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 51 54 /** Saved state before the balloon change. */ 52 55 #define PGM_SAVED_STATE_VERSION_PRE_BALLOON 11 … … 82 85 /** ROM protection (8-bit). */ 83 86 #define PGM_STATE_REC_ROM_PROT UINT8_C(0x07) 87 /** Ballooned page. */ 88 #define PGM_STATE_REC_RAM_BALLOONED UINT8_C(0x08) 84 89 /** The last record type. */ 85 #define PGM_STATE_REC_LAST PGM_STATE_REC_R OM_PROT90 #define PGM_STATE_REC_LAST PGM_STATE_REC_RAM_BALLOONED 86 91 /** End marker. */ 87 92 #define PGM_STATE_REC_END UINT8_C(0xff) … … 509 514 RTGCPHYS GCPhys = pRom->GCPhys + ((RTGCPHYS)iPage << PAGE_SHIFT); 510 515 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!? */ 512 517 int rc = VINF_SUCCESS; 513 518 if (!fZero) … … 1594 1599 int rc; 1595 1600 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); 1597 1603 bool fSkipped = false; 1598 1604 1599 if (!fZero )1605 if (!fZero && !fBallooned) 1600 1606 { 1601 1607 /* … … 1674 1680 pgmUnlock(pVM); 1675 1681 1682 uint8_t u8RecType = fBallooned ? PGM_STATE_REC_RAM_BALLOONED : PGM_STATE_REC_RAM_ZERO; 1676 1683 if (GCPhys == GCPhysLast + PAGE_SIZE) 1677 rc = SSMR3PutU8(pSSM, PGM_STATE_REC_RAM_ZERO);1684 rc = SSMR3PutU8(pSSM, u8RecType); 1678 1685 else 1679 1686 { 1680 SSMR3PutU8(pSSM, PGM_STATE_REC_RAM_ZERO| PGM_STATE_REC_FLAG_ADDR);1687 SSMR3PutU8(pSSM, u8RecType | PGM_STATE_REC_FLAG_ADDR); 1681 1688 rc = SSMR3PutGCPhys(pSSM, GCPhys); 1682 1689 } … … 2559 2566 * @param pVM The VM handle. 2560 2567 * @param pSSM The SSM handle. 2561 * @param u Version The saved state version.2568 * @param uPass The pass number. 2562 2569 * 2563 2570 * @todo This needs splitting up if more record types or code twists are … … 2602 2609 if (cPendingPages) 2603 2610 { 2611 Log(("pgmR3LoadMemory: GMMR3FreePagesPerform pVM=%p cPendingPages=%u\n", pVM, cPendingPages)); 2604 2612 rc = GMMR3FreePagesPerform(pVM, pReq, cPendingPages); 2605 2613 AssertLogRelRCReturn(rc, rc); … … 2616 2624 case PGM_STATE_REC_RAM_ZERO: 2617 2625 case PGM_STATE_REC_RAM_RAW: 2626 case PGM_STATE_REC_RAM_BALLOONED: 2618 2627 { 2619 2628 /* … … 2664 2673 AssertRCReturn(rc, rc); 2665 2674 } 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); 2666 2700 break; 2667 2701 } … … 3004 3038 if (pVM->pgm.s.cBalloonedPages) 3005 3039 { 3040 Log(("pgmR3LoadFinalLocked: pVM=%p cBalloonedPages=%#x\n", pVM, pVM->pgm.s.cBalloonedPages)); 3006 3041 rc = GMMR3BalloonedPages(pVM, GMMBALLOONACTION_INFLATE, pVM->pgm.s.cBalloonedPages); 3007 3042 AssertRCReturn(rc, rc); … … 3030 3065 if ( ( uPass != SSM_PASS_FINAL 3031 3066 && uVersion != PGM_SAVED_STATE_VERSION 3067 && uVersion != PGM_SAVED_STATE_VERSION_BALLOON_BROKEN 3032 3068 && uVersion != PGM_SAVED_STATE_VERSION_PRE_BALLOON 3033 3069 && uVersion != PGM_SAVED_STATE_VERSION_NO_RAM_CFG) 3034 3070 || ( uVersion != PGM_SAVED_STATE_VERSION 3071 && uVersion != PGM_SAVED_STATE_VERSION_BALLOON_BROKEN 3035 3072 && uVersion != PGM_SAVED_STATE_VERSION_PRE_BALLOON 3036 3073 && uVersion != PGM_SAVED_STATE_VERSION_NO_RAM_CFG -
trunk/src/VBox/VMM/include/PGMInternal.h
r36009 r36013 925 925 */ 926 926 #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 ) 927 934 928 935 /**
Note:
See TracChangeset
for help on using the changeset viewer.