- Timestamp:
- Mar 3, 2009 2:05:15 PM (16 years ago)
- svn:sync-xref-src-repo-rev:
- 43640
- Location:
- trunk/src/VBox/VMM
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/PGMInternal.h
r17205 r17279 958 958 || (pPage)->u2HandlerVirtStateX == PGM_PAGE_HNDL_VIRT_STATE_ALL ) 959 959 960 961 962 963 /** @def PGM_PAGE_GET_TRACKING 964 * Gets the packed shadow page pool tracking data associated with a guest page. 965 * @returns uint16_t containing the data. 966 * @param pPage Pointer to the physical guest page tracking structure. 967 */ 968 #define PGM_PAGE_GET_TRACKING(pPage) \ 969 ( *((uint16_t *)&(pPage)->HCPhys + 3) ) 970 971 /** @def PGM_PAGE_SET_TRACKING 972 * Sets the packed shadow page pool tracking data associated with a guest page. 973 * @param pPage Pointer to the physical guest page tracking structure. 974 * @param u16TrackingData The tracking data to store. 975 */ 976 #define PGM_PAGE_SET_TRACKING(pPage, u16TrackingData) \ 977 do { *((uint16_t *)&(pPage)->HCPhys + 3) = (u16TrackingData); } while (0) 978 979 /** @def PGM_PAGE_GET_TD_CREFS 980 * Gets the @a cRefs tracking data member. 981 * @returns cRefs. 982 * @param pPage Pointer to the physical guest page tracking structure. 983 */ 984 #define PGM_PAGE_GET_TD_CREFS(pPage) \ 985 ((PGM_PAGE_GET_TRACKING(pPage) >> PGMPOOL_TD_CREFS_SHIFT) & PGMPOOL_TD_CREFS_MASK) 986 987 #define PGM_PAGE_GET_TD_IDX(pPage) \ 988 ((PGM_PAGE_GET_TRACKING(pPage) >> PGMPOOL_TD_IDX_SHIFT) & PGMPOOL_TD_IDX_MASK) 960 989 961 990 /** … … 1476 1505 /** 1477 1506 * Node in the chain of physical cross reference extents. 1507 * @todo Calling this an 'extent' is not quite right, find a better name. 1478 1508 */ 1479 1509 #pragma pack(1) … … 1886 1916 1887 1917 1918 /** @name Per guest page tracking data. 1919 * This is currently as a 16-bit word in the PGMPAGE structure, the idea though 1920 * is to use more bits for it and split it up later on. But for now we'll play 1921 * safe and change as little as possible. 1922 * 1923 * The 16-bit word has two parts: 1924 * 1925 * The first 14-bit forms the @a idx field. It is either the index of a page in 1926 * the shadow page pool, or and index into the extent list. 1927 * 1928 * The 2 topmost bits makes up the @a cRefs field, which counts the number of 1929 * shadow page pool references to the page. If cRefs equals 1930 * PGMPOOL_CREFS_PHYSEXT, then the @a idx field is an indext into the extent 1931 * (misnomer) table and not the shadow page pool. 1932 * 1933 * See PGM_PAGE_GET_TRACKING and PGM_PAGE_SET_TRACKING for how to get and set 1934 * the 16-bit word. 1935 * 1936 * @{ */ 1937 /** The shift count for getting to the cRefs part. */ 1938 #define PGMPOOL_TD_CREFS_SHIFT 14 1939 /** The mask applied after shifting the tracking data down by 1940 * PGMPOOL_TD_CREFS_SHIFT. */ 1941 #define PGMPOOL_TD_CREFS_MASK 0x3 1942 /** The cRef value used to indiciate that the idx is the head of a 1943 * physical cross reference list. */ 1944 #define PGMPOOL_TD_CREFS_PHYSEXT PGMPOOL_TD_CREFS_MASK 1945 /** The shift used to get idx. */ 1946 #define PGMPOOL_TD_IDX_SHIFT 0 1947 /** The mask applied to the idx after shifting down by PGMPOOL_TD_IDX_SHIFT. */ 1948 #define PGMPOOL_TD_IDX_MASK 0x3fff 1949 /** The idx value when we're out of of PGMPOOLPHYSEXT entries or/and there are 1950 * simply too many mappings of this page. */ 1951 #define PGMPOOL_TD_IDX_OVERFLOWED PGMPOOL_TD_IDX_MASK 1952 /** @} */ 1953 1954 #ifdef MM_RAM_FLAGS_CREFS_SHIFT 1955 # if MM_RAM_FLAGS_CREFS_SHIFT - MM_RAM_FLAGS_IDX_SHIFT != PGMPOOL_TD_CREFS_SHIFT 1956 # error "MM_RAM_FLAGS_CREFS_SHIFT - MM_RAM_FLAGS_IDX_SHIFT != PGMPOOL_TD_CREFS_SHIFT" 1957 # endif 1958 # if MM_RAM_FLAGS_CREFS_MASK != MM_RAM_FLAGS_CREFS_MASK 1959 # error "MM_RAM_FLAGS_CREFS_MASK != MM_RAM_FLAGS_CREFS_MASK" 1960 # endif 1961 # if MM_RAM_FLAGS_CREFS_PHYSEXT != MM_RAM_FLAGS_CREFS_PHYSEXT 1962 # error "MM_RAM_FLAGS_CREFS_PHYSEXT != MM_RAM_FLAGS_CREFS_PHYSEXT" 1963 # endif 1964 # if MM_RAM_FLAGS_IDX_SHIFT - 48 != PGMPOOL_TD_IDX_SHIFT 1965 # error "MM_RAM_FLAGS_IDX_SHIFT - 48 != PGMPOOL_TD_IDX_SHIFT" 1966 # endif 1967 # if MM_RAM_FLAGS_IDX_MASK != PGMPOOL_TD_IDX_MASK 1968 # error "MM_RAM_FLAGS_IDX_MASK != PGMPOOL_TD_IDX_MASK" 1969 # endif 1970 # if MM_RAM_FLAGS_IDX_OVERFLOWED != PGMPOOL_TD_IDX_OVERFLOWED 1971 # error "MM_RAM_FLAGS_IDX_OVERFLOWED != PGMPOOL_TD_IDX_OVERFLOWED" 1972 # endif 1973 #endif 1974 1888 1975 1889 1976 /** … … 4677 4764 */ 4678 4765 # ifdef LOG_ENABLED 4679 const RTHCPHYS HCPhysOrg = pPhysPage->HCPhys; /** @todo PAGE FLAGS */4766 const unsigned uOrg = PGM_PAGE_GET_TRACKING(pPhysPage); 4680 4767 # endif 4681 const unsigned cRefs = pPhysPage->HCPhys >> MM_RAM_FLAGS_CREFS_SHIFT; /** @todo PAGE FLAGS */4768 const unsigned cRefs = PGM_PAGE_GET_TD_CREFS(pPhysPage); 4682 4769 if (cRefs == 1) 4683 4770 { 4684 Assert(pPoolPage->idx == ((pPhysPage->HCPhys >> MM_RAM_FLAGS_IDX_SHIFT) & MM_RAM_FLAGS_IDX_MASK));4685 pPhysPage->HCPhys = pPhysPage->HCPhys & MM_RAM_FLAGS_NO_REFS_MASK;4771 Assert(pPoolPage->idx == PGM_PAGE_GET_TD_IDX(pPhysPage)); 4772 PGM_PAGE_SET_TRACKING(pPhysPage, 0); 4686 4773 } 4687 4774 else 4688 4775 pgmPoolTrackPhysExtDerefGCPhys(pPool, pPoolPage, pPhysPage); 4689 Log2(("pgmTrackDerefGCPhys: HCPhys=%RHp -> %RHp\n", HCPhysOrg, pPhysPage->HCPhys));4776 Log2(("pgmTrackDerefGCPhys: %x -> %x HCPhys=%RGp\n", uOrg, PGM_PAGE_GET_TRACKING(pPhysPage), PGM_PAGE_GET_HCPHYS(pPhysPage) )); 4690 4777 } 4691 4778 #endif /* PGMPOOL_WITH_GCPHYS_TRACKING */ -
trunk/src/VBox/VMM/VMMAll/PGMAllBth.h
r17216 r17279 946 946 PPGMPOOLPAGE pShwPde; 947 947 PX86PDPAE pPDDst; 948 948 949 949 /* Fetch the pgm pool shadow descriptor. */ 950 950 rc = pgmShwGetPaePoolPagePD(&pVM->pgm.s, GCPtrPage, &pShwPde); … … 1425 1425 { 1426 1426 STAM_COUNTER_INC(&pVM->pgm.s.StatTrackVirgin); 1427 u16 = (1 << (MM_RAM_FLAGS_CREFS_SHIFT - MM_RAM_FLAGS_IDX_SHIFT)) | pShwPage->idx;1427 u16 = (1 << PGMPOOL_TD_CREFS_SHIFT) | pShwPage->idx; 1428 1428 } 1429 1429 else 1430 1430 u16 = pgmPoolTrackPhysExtAddref(pVM, u16, pShwPage->idx); 1431 1431 1432 /* write back , trying to be clever...*/1433 Log2(("SyncPageWorkerTrackAddRef: u16=%#x pPage->HCPhys=%RHp->%RHp iPTDst=%#x\n",1434 u16, pPage->HCPhys, (pPage->HCPhys & MM_RAM_FLAGS_NO_REFS_MASK) | ((uint64_t)u16 << MM_RAM_FLAGS_CREFS_SHIFT), iPTDst));1435 *((uint16_t *)&pPage->HCPhys + 3) = u16; /** @todo PAGE FLAGS */ 1432 /* write back */ 1433 Log2(("SyncPageWorkerTrackAddRef: u16=%#x->%#x iPTDst=%#x\n", u16, PGM_PAGE_GET_TRACKING(pPage), iPTDst)); 1434 PGM_PAGE_SET_TRACKING(pPage, u16); 1435 1436 1436 # endif /* PGMPOOL_WITH_GCPHYS_TRACKING */ 1437 1437 … … 1655 1655 PPGMPOOLPAGE pShwPde; 1656 1656 PX86PDPAE pPDDst; 1657 1657 1658 1658 /* Fetch the pgm pool shadow descriptor. */ 1659 1659 int rc = pgmShwGetPaePoolPagePD(&pVM->pgm.s, GCPtrPage, &pShwPde); … … 2390 2390 PX86PDPAE pPDDst; 2391 2391 PSHWPDE pPdeDst; 2392 2392 2393 2393 /* Fetch the pgm pool shadow descriptor. */ 2394 2394 rc = pgmShwGetPaePoolPagePD(&pVM->pgm.s, GCPtrPage, &pShwPde); … … 2570 2570 | (PdeSrc.u & ~(GST_PDE_PG_MASK | X86_PDE_AVL_MASK | X86_PDE_PCD | X86_PDE_PWT | X86_PDE_PS | X86_PDE4M_G | X86_PDE4M_D)); 2571 2571 *pPdeDst = PdeDst; 2572 # if defined(IN_RC) && defined(VBOX_WITH_PGMPOOL_PAGING_ONLY) 2572 # if defined(IN_RC) && defined(VBOX_WITH_PGMPOOL_PAGING_ONLY) 2573 2573 PGMDynUnlockHCPage(pVM, (uint8_t *)pPdeDst); 2574 2574 # endif … … 2676 2676 } 2677 2677 *pPdeDst = PdeDst; 2678 # if defined(IN_RC) && defined(VBOX_WITH_PGMPOOL_PAGING_ONLY) 2678 # if defined(IN_RC) && defined(VBOX_WITH_PGMPOOL_PAGING_ONLY) 2679 2679 PGMDynUnlockHCPage(pVM, (uint8_t *)pPdeDst); 2680 2680 # endif … … 2815 2815 PX86PDPAE pPDDst; 2816 2816 PSHWPDE pPdeDst; 2817 2817 2818 2818 /* Fetch the pgm pool shadow descriptor. */ 2819 2819 rc = pgmShwGetPaePoolPagePD(&pVM->pgm.s, GCPtrPage, &pShwPde); … … 4688 4688 4689 4689 # ifndef PGM_WITHOUT_MAPPINGS 4690 /* Apply all hypervisor mappings to the new CR3. 4690 /* Apply all hypervisor mappings to the new CR3. 4691 4691 * Note that SyncCR3 will be executed in case CR3 is changed in a guest paging mode; this will 4692 4692 * make sure we check for conflicts in the new CR3 root. -
trunk/src/VBox/VMM/VMMAll/PGMAllHandler.cpp
r16465 r17279 245 245 # endif 246 246 247 if ((u16 >> (MM_RAM_FLAGS_CREFS_SHIFT - MM_RAM_FLAGS_IDX_SHIFT)) != MM_RAM_FLAGS_CREFS_PHYSEXT)247 if ((u16 >> PGMPOOL_TD_CREFS_SHIFT) != MM_RAM_FLAGS_CREFS_PHYSEXT) 248 248 pgmPoolTrackFlushGCPhysPT(pVM, 249 249 pPage, 250 250 u16 & MM_RAM_FLAGS_IDX_MASK, 251 u16 >> (MM_RAM_FLAGS_CREFS_SHIFT - MM_RAM_FLAGS_IDX_SHIFT));252 else if (u16 != ((MM_RAM_FLAGS_CREFS_PHYSEXT << (MM_RAM_FLAGS_CREFS_SHIFT - MM_RAM_FLAGS_IDX_SHIFT)) | MM_RAM_FLAGS_IDX_OVERFLOWED))251 u16 >> PGMPOOL_TD_CREFS_SHIFT); 252 else if (u16 != ((MM_RAM_FLAGS_CREFS_PHYSEXT << PGMPOOL_TD_CREFS_SHIFT) | MM_RAM_FLAGS_IDX_OVERFLOWED)) 253 253 pgmPoolTrackFlushGCPhysPTs(pVM, pPage, u16 & MM_RAM_FLAGS_IDX_MASK); 254 254 else … … 969 969 970 970 /* Do the actual remapping here. This page now serves as an alias for the backing memory specified. */ 971 pPage->HCPhys = pPageRemap->HCPhys & MM_RAM_FLAGS_NO_REFS_MASK; 971 #ifdef VBOX_WITH_NEW_PHYS_CODE 972 AssertReleaseFailed(); /** @todo see todo above! */ 973 #else 974 pPage->HCPhys = pPageRemap->HCPhys; 975 PGM_PAGE_SET_TRACKING(pPage, 0); 976 #endif 972 977 973 978 LogFlow(("PGMHandlerPhysicalPageAlias %RGp -> %RGp - %RHp\n", GCPhysPage, GCPhysPageRemap, pPageRemap->HCPhys)); -
trunk/src/VBox/VMM/VMMAll/PGMAllPool.cpp
r17231 r17279 320 320 # ifdef PGMPOOL_WITH_GCPHYS_TRACKING 321 321 X86PTE GstPte; 322 322 323 323 int rc = pgmPoolPhysSimpleReadGCPhys(pPool->CTX_SUFF(pVM), &GstPte, pvAddress, GCPhysFault, sizeof(GstPte)); 324 324 AssertRC(rc); … … 371 371 372 372 LogFlow(("pgmPoolMonitorChainChanging PAE for 32 bits: iGst=%x idx = %d page idx=%d\n", iGst, iShwPdpt, pPage->enmKind - PGMPOOLKIND_PAE_PD0_FOR_32BIT_PD)); 373 if (iShwPdpt == pPage->enmKind - PGMPOOLKIND_PAE_PD0_FOR_32BIT_PD)373 if (iShwPdpt == pPage->enmKind - (unsigned)PGMPOOLKIND_PAE_PD0_FOR_32BIT_PD) 374 374 { 375 for (unsigned i =0;i<2;i++)375 for (unsigned i = 0; i < 2; i++) 376 376 { 377 377 # ifndef IN_RING0 … … 678 678 #ifdef VBOX_WITH_PGMPOOL_PAGING_ONLY 679 679 # ifndef IN_RING0 680 else 680 else 681 681 # endif /* !IN_RING0 */ 682 682 if (uShw.pPDPae->a[iShw2].n.u1Present) … … 1580 1580 if ((PGMPOOLKIND)pPage->enmKind == enmKind) 1581 1581 { 1582 /* Put it at the start of the use list to make sure pgmPoolTrackAddUser 1582 /* Put it at the start of the use list to make sure pgmPoolTrackAddUser 1583 1583 * doesn't flush it in case there are no more free use records. 1584 1584 */ … … 2334 2334 unsigned iPage = pRam->cb >> PAGE_SHIFT; 2335 2335 while (iPage-- > 0) 2336 pRam->aPages[iPage].HCPhys &= MM_RAM_FLAGS_NO_REFS_MASK; /** @todo PAGE FLAGS */2336 PGM_PAGE_SET_TRACKING(&pRam->aPages[iPage], 0); 2337 2337 } 2338 2338 … … 2917 2917 STAM_PROFILE_START(&pPool->StatTrackFlushGCPhysPT, f); 2918 2918 pgmPoolTrackFlushGCPhysPTInt(pVM, pPhysPage, iShw, cRefs); 2919 pPhysPage->HCPhys &= MM_RAM_FLAGS_NO_REFS_MASK; /** @todo PAGE FLAGS */2919 PGM_PAGE_SET_TRACKING(pPhysPage, 0); 2920 2920 STAM_PROFILE_STOP(&pPool->StatTrackFlushGCPhysPT, f); 2921 2921 } … … 2955 2955 pPhysExt->iNext = pPool->iPhysExtFreeHead; 2956 2956 pPool->iPhysExtFreeHead = iPhysExtStart; 2957 pPhysPage->HCPhys &= MM_RAM_FLAGS_NO_REFS_MASK; /** @todo PAGE FLAGS */2957 PGM_PAGE_SET_TRACKING(pPhysPage, 0); 2958 2958 2959 2959 STAM_PROFILE_STOP(&pPool->StatTrackFlushGCPhysPTs, f); … … 3060 3060 } 3061 3061 3062 pPhysPage->HCPhys &= MM_RAM_FLAGS_NO_REFS_MASK; /** @todo PAGE FLAGS */3062 PGM_PAGE_SET_TRACKING(pPhysPage, 0); 3063 3063 STAM_PROFILE_STOP(&pPool->StatTrackFlushGCPhysPTsSlow, s); 3064 3064 return VINF_SUCCESS; … … 3359 3359 STAM_COUNTER_INC(&pVM->pgm.s.StatTrackAliasedMany); 3360 3360 LogFlow(("pgmPoolTrackPhysExtAddref: %d:{,,%d}\n", iPhysExt, iShwPT)); 3361 return iPhysExt | (MM_RAM_FLAGS_CREFS_PHYSEXT << (MM_RAM_FLAGS_CREFS_SHIFT - MM_RAM_FLAGS_IDX_SHIFT));3361 return iPhysExt | (MM_RAM_FLAGS_CREFS_PHYSEXT << PGMPOOL_TD_CREFS_SHIFT); 3362 3362 } 3363 3363 … … 3374 3374 STAM_COUNTER_INC(&pVM->pgm.s.StatTrackAliasedMany); 3375 3375 LogFlow(("pgmPoolTrackPhysExtAddref: %d:{%d} i=%d cMax=%d\n", iPhysExt, iShwPT, i, cMax)); 3376 return iPhysExtStart | (MM_RAM_FLAGS_CREFS_PHYSEXT << (MM_RAM_FLAGS_CREFS_SHIFT - MM_RAM_FLAGS_IDX_SHIFT));3376 return iPhysExtStart | (MM_RAM_FLAGS_CREFS_PHYSEXT << PGMPOOL_TD_CREFS_SHIFT); 3377 3377 } 3378 3378 if (!--cMax) … … 3381 3381 pgmPoolTrackPhysExtFreeList(pVM, iPhysExtStart); 3382 3382 LogFlow(("pgmPoolTrackPhysExtAddref: overflow (1) iShwPT=%d\n", iShwPT)); 3383 return MM_RAM_FLAGS_IDX_OVERFLOWED | (MM_RAM_FLAGS_CREFS_PHYSEXT << (MM_RAM_FLAGS_CREFS_SHIFT - MM_RAM_FLAGS_IDX_SHIFT));3383 return MM_RAM_FLAGS_IDX_OVERFLOWED | (MM_RAM_FLAGS_CREFS_PHYSEXT << PGMPOOL_TD_CREFS_SHIFT); 3384 3384 } 3385 3385 } … … 3391 3391 STAM_COUNTER_INC(&pVM->pgm.s.StatTrackOverflows); 3392 3392 pgmPoolTrackPhysExtFreeList(pVM, iPhysExtStart); 3393 return MM_RAM_FLAGS_IDX_OVERFLOWED | (MM_RAM_FLAGS_CREFS_PHYSEXT << (MM_RAM_FLAGS_CREFS_SHIFT - MM_RAM_FLAGS_IDX_SHIFT));3393 return MM_RAM_FLAGS_IDX_OVERFLOWED | (MM_RAM_FLAGS_CREFS_PHYSEXT << PGMPOOL_TD_CREFS_SHIFT); 3394 3394 } 3395 3395 pNew->iNext = iPhysExtStart; 3396 3396 pNew->aidx[0] = iShwPT; 3397 3397 LogFlow(("pgmPoolTrackPhysExtAddref: added new extent %d:{%d}->%d\n", iPhysExt, iShwPT, iPhysExtStart)); 3398 return iPhysExt | (MM_RAM_FLAGS_CREFS_PHYSEXT << (MM_RAM_FLAGS_CREFS_SHIFT - MM_RAM_FLAGS_IDX_SHIFT));3398 return iPhysExt | (MM_RAM_FLAGS_CREFS_PHYSEXT << PGMPOOL_TD_CREFS_SHIFT); 3399 3399 } 3400 3400 … … 3411 3411 uint16_t pgmPoolTrackPhysExtAddref(PVM pVM, uint16_t u16, uint16_t iShwPT) 3412 3412 { 3413 if ((u16 >> (MM_RAM_FLAGS_CREFS_SHIFT - MM_RAM_FLAGS_IDX_SHIFT)) != MM_RAM_FLAGS_CREFS_PHYSEXT)3413 if ((u16 >> PGMPOOL_TD_CREFS_SHIFT) != MM_RAM_FLAGS_CREFS_PHYSEXT) 3414 3414 { 3415 3415 /* 3416 3416 * Convert to extent list. 3417 3417 */ 3418 Assert((u16 >> (MM_RAM_FLAGS_CREFS_SHIFT - MM_RAM_FLAGS_IDX_SHIFT)) == 1);3418 Assert((u16 >> PGMPOOL_TD_CREFS_SHIFT) == 1); 3419 3419 uint16_t iPhysExt; 3420 3420 PPGMPOOLPHYSEXT pPhysExt = pgmPoolTrackPhysExtAlloc(pVM, &iPhysExt); … … 3425 3425 pPhysExt->aidx[0] = u16 & MM_RAM_FLAGS_IDX_MASK; 3426 3426 pPhysExt->aidx[1] = iShwPT; 3427 u16 = iPhysExt | (MM_RAM_FLAGS_CREFS_PHYSEXT << (MM_RAM_FLAGS_CREFS_SHIFT - MM_RAM_FLAGS_IDX_SHIFT));3427 u16 = iPhysExt | (MM_RAM_FLAGS_CREFS_PHYSEXT << PGMPOOL_TD_CREFS_SHIFT); 3428 3428 } 3429 3429 else 3430 u16 = MM_RAM_FLAGS_IDX_OVERFLOWED | (MM_RAM_FLAGS_CREFS_PHYSEXT << (MM_RAM_FLAGS_CREFS_SHIFT - MM_RAM_FLAGS_IDX_SHIFT));3431 } 3432 else if (u16 != (MM_RAM_FLAGS_IDX_OVERFLOWED | (MM_RAM_FLAGS_CREFS_PHYSEXT << (MM_RAM_FLAGS_CREFS_SHIFT - MM_RAM_FLAGS_IDX_SHIFT))))3430 u16 = MM_RAM_FLAGS_IDX_OVERFLOWED | (MM_RAM_FLAGS_CREFS_PHYSEXT << PGMPOOL_TD_CREFS_SHIFT); 3431 } 3432 else if (u16 != (MM_RAM_FLAGS_IDX_OVERFLOWED | (MM_RAM_FLAGS_CREFS_PHYSEXT << PGMPOOL_TD_CREFS_SHIFT))) 3433 3433 { 3434 3434 /* … … 3489 3489 pgmPoolTrackPhysExtFree(pVM, iPhysExt); 3490 3490 Log2(("pgmPoolTrackPhysExtDerefGCPhys: HCPhys=%RX64 idx=%d lonely\n", pPhysPage->HCPhys, pPage->idx)); 3491 pPhysPage->HCPhys &= MM_RAM_FLAGS_NO_REFS_MASK; /** @todo PAGE FLAGS */3491 PGM_PAGE_SET_TRACKING(pPhysPage, 0); 3492 3492 } 3493 3493 else if (iPhysExtPrev == NIL_PGMPOOL_PHYSEXT_INDEX) … … 3495 3495 /* head */ 3496 3496 Log2(("pgmPoolTrackPhysExtDerefGCPhys: HCPhys=%RX64 idx=%d head\n", pPhysPage->HCPhys, pPage->idx)); 3497 pPhysPage->HCPhys = (pPhysPage->HCPhys & MM_RAM_FLAGS_NO_REFS_MASK) /** @todo PAGE FLAGS */ 3498 | ((uint64_t)MM_RAM_FLAGS_CREFS_PHYSEXT << MM_RAM_FLAGS_CREFS_SHIFT) 3499 | ((uint64_t)iPhysExtNext << MM_RAM_FLAGS_IDX_SHIFT); 3497 PGM_PAGE_SET_TRACKING(pPhysPage, (PGMPOOL_TD_CREFS_PHYSEXT << PGMPOOL_TD_CREFS_SHIFT) 3498 | (iPhysExtNext << PGMPOOL_TD_IDX_SHIFT)); 3500 3499 pgmPoolTrackPhysExtFree(pVM, iPhysExt); 3501 3500 } … … 4207 4206 unsigned iPage = pRam->cb >> PAGE_SHIFT; 4208 4207 while (iPage-- > 0) 4209 pRam->aPages[iPage].HCPhys &= MM_RAM_FLAGS_NO_REFS_MASK; /** @todo PAGE FLAGS */4208 PGM_PAGE_SET_TRACKING(&pRam->aPages[iPage], 0); 4210 4209 } 4211 4210
Note:
See TracChangeset
for help on using the changeset viewer.