Changeset 47786 in vbox
- Timestamp:
- Aug 16, 2013 8:59:32 AM (12 years ago)
- svn:sync-xref-src-repo-rev:
- 88047
- Location:
- trunk/src/VBox/VMM
- Files:
-
- 9 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMAll/PGMAllHandler.cpp
r47719 r47786 424 424 void pgmHandlerPhysicalResetAliasedPage(PVM pVM, PPGMPAGE pPage, RTGCPHYS GCPhysPage, bool fDoAccounting) 425 425 { 426 Assert(PGM_PAGE_GET_TYPE(pPage) == PGMPAGETYPE_MMIO2_ALIAS_MMIO); 426 Assert( PGM_PAGE_GET_TYPE(pPage) == PGMPAGETYPE_MMIO2_ALIAS_MMIO 427 || PGM_PAGE_GET_TYPE(pPage) == PGMPAGETYPE_SPECIAL_ALIAS_MMIO); 427 428 Assert(PGM_PAGE_GET_HNDL_PHYS_STATE(pPage) == PGM_PAGE_HNDL_PHYS_STATE_DISABLED); 428 429 … … 495 496 if (RT_SUCCESS(rc)) 496 497 { 497 /* Reset MMIO2 forMMIO pages to MMIO, since this aliasing is our business.498 /* Reset aliased MMIO pages to MMIO, since this aliasing is our business. 498 499 (We don't flip MMIO to RAM though, that's PGMPhys.cpp's job.) */ 499 if (PGM_PAGE_GET_TYPE(pPage) == PGMPAGETYPE_MMIO2_ALIAS_MMIO) 500 if ( PGM_PAGE_GET_TYPE(pPage) == PGMPAGETYPE_MMIO2_ALIAS_MMIO 501 || PGM_PAGE_GET_TYPE(pPage) == PGMPAGETYPE_SPECIAL_ALIAS_MMIO) 500 502 { 501 503 Assert(pCur->cAliasedPages > 0); … … 888 890 while (cLeft-- > 0) 889 891 { 890 if (PGM_PAGE_GET_TYPE(pPage) == PGMPAGETYPE_MMIO2_ALIAS_MMIO) 892 if ( PGM_PAGE_GET_TYPE(pPage) == PGMPAGETYPE_MMIO2_ALIAS_MMIO 893 || PGM_PAGE_GET_TYPE(pPage) == PGMPAGETYPE_SPECIAL_ALIAS_MMIO) 891 894 { 892 895 Assert(pCur->cAliasedPages > 0); … … 1134 1137 1135 1138 /** 1136 * Replaces an MMIO page with an arbitrary HC page. 1137 * 1138 * This is a worker for IOMMMIOMapMMIO2Page that works in a similar way to 1139 * PGMHandlerPhysicalPageTempOff but for an MMIO page. Since an MMIO page has no 1140 * backing, the caller must provide a replacement page. For various reasons the 1141 * replacement page must be an MMIO2 page. 1139 * Replaces an MMIO page with an arbitrary HC page in the shadow page tables. 1140 * 1141 * This differs from PGMHandlerPhysicalPageAlias in that the page doesn't need 1142 * to be a known MMIO2 page and that only shadow paging may access the page. 1143 * The latter distinction is important because the only use for this feature is 1144 * for mapping the special APIC access page that VT-x uses to detect APIC MMIO 1145 * operations, the page is shared between all guest CPUs and actually not 1146 * written to. At least at the moment. 1142 1147 * 1143 1148 * The caller must do required page table modifications. You can get away … … 1147 1152 * Call PGMHandlerPhysicalReset() to restore the MMIO page. 1148 1153 * 1149 * The caller may still get handler callback even after this call and must be1150 * able to deal correctly with such calls. The reason for these callbacks are1151 * either that we're executing in the recompiler (which doesn't know about this1152 * arrangement) or that we've been restored from saved state (where we won't1153 * save the change).1154 1154 * 1155 1155 * @returns VBox status code. … … 1194 1194 { 1195 1195 pgmUnlock(pVM); 1196 AssertMsgReturn(PGM_PAGE_GET_TYPE(pPage) == PGMPAGETYPE_ MMIO2_ALIAS_MMIO,1196 AssertMsgReturn(PGM_PAGE_GET_TYPE(pPage) == PGMPAGETYPE_SPECIAL_ALIAS_MMIO, 1197 1197 ("GCPhysPage=%RGp %R[pgmpage]\n", GCPhysPage, pPage), 1198 1198 VERR_PGM_PHYS_NOT_MMIO2); … … 1203 1203 /* 1204 1204 * Do the actual remapping here. 1205 * This page now serves as an alias for the backing memory specified. 1205 * This page now serves as an alias for the backing memory 1206 * specified as far as shadow paging is concerned. 1206 1207 */ 1207 1208 LogFlow(("PGMHandlerPhysicalPageAlias: %RGp (%R[pgmpage]) alias for %RHp\n", 1208 1209 GCPhysPage, pPage, HCPhysPageRemap)); 1209 1210 PGM_PAGE_SET_HCPHYS(pVM, pPage, HCPhysPageRemap); 1210 PGM_PAGE_SET_TYPE(pVM, pPage, PGMPAGETYPE_ MMIO2_ALIAS_MMIO);1211 PGM_PAGE_SET_TYPE(pVM, pPage, PGMPAGETYPE_SPECIAL_ALIAS_MMIO); 1211 1212 PGM_PAGE_SET_STATE(pVM, pPage, PGM_PAGE_STATE_ALLOCATED); 1212 /** @todo hack alert1213 * This needs to be done properly. Currently we get away with it as the recompiler directly calls1214 * IOM read and write functions. Access through PGMPhysRead/Write will crash the process.1215 */1216 1213 PGM_PAGE_SET_PAGEID(pVM, pPage, NIL_GMM_PAGEID); 1217 1214 PGM_PAGE_SET_HNDL_PHYS_STATE(pPage, PGM_PAGE_HNDL_PHYS_STATE_DISABLED); -
trunk/src/VBox/VMM/VMMAll/PGMAllPhys.cpp
r47739 r47786 571 571 PGM_LOCK_ASSERT_OWNER(pVM); 572 572 AssertMsg(PGM_PAGE_IS_ZERO(pPage) || PGM_PAGE_IS_SHARED(pPage), ("%R[pgmpage] %RGp\n", pPage, GCPhys)); 573 Assert(!PGM_PAGE_IS_MMIO (pPage));573 Assert(!PGM_PAGE_IS_MMIO_OR_ALIAS(pPage)); 574 574 575 575 # ifdef PGM_WITH_LARGE_PAGES … … 620 620 PGM_LOCK_ASSERT_OWNER(pVM); 621 621 AssertMsg(PGM_PAGE_IS_ZERO(pPage) || PGM_PAGE_IS_SHARED(pPage), ("%R[pgmpage] %RGp\n", pPage, GCPhys)); 622 Assert(!PGM_PAGE_IS_MMIO (pPage));622 Assert(!PGM_PAGE_IS_MMIO_OR_ALIAS(pPage)); 623 623 624 624 uint32_t iHandyPage = --pVM->pgm.s.cHandyPages; … … 1028 1028 1029 1029 /* 1030 * Special case: ZERO and MMIO2 pages. 1031 */ 1030 * Special cases: MMIO2, ZERO and specially aliased MMIO pages. 1031 */ 1032 if ( PGM_PAGE_GET_TYPE(pPage) == PGMPAGETYPE_MMIO2 1033 || PGM_PAGE_GET_TYPE(pPage) == PGMPAGETYPE_MMIO2_ALIAS_MMIO) 1034 { 1035 /* Fend off the VT-x APIC access page hack. */ 1036 AssertLogRelReturn(PGM_PAGE_GET_PAGEID(pPage) == NIL_GMM_PAGEID, VERR_PGM_MAP_MMIO2_ALIAS_MMIO); 1037 1038 /* Decode the page id to a page in a MMIO2 ram range. */ 1039 uint8_t idMmio2 = PGM_MMIO2_PAGEID_GET_MMIO2_ID(PGM_PAGE_GET_PAGEID(pPage)); 1040 uint32_t iPage = PGM_MMIO2_PAGEID_GET_IDX(PGM_PAGE_GET_PAGEID(pPage)); 1041 AssertLogRelReturn((uint8_t)(idMmio2 - 1U)< RT_ELEMENTS(pVM->pgm.s.CTX_SUFF(apMmio2Ranges)), 1042 VERR_PGM_PHYS_PAGE_MAP_MMIO2_IPE); 1043 PPGMMMIO2RANGE pMmio2Range = pVM->pgm.s.CTX_SUFF(apMmio2Ranges)[idMmio2 - 1]; 1044 AssertLogRelReturn(pMmio2Range, VERR_PGM_PHYS_PAGE_MAP_MMIO2_IPE); 1045 AssertLogRelReturn(pMmio2Range->idMmio2 == idMmio2, VERR_PGM_PHYS_PAGE_MAP_MMIO2_IPE); 1046 AssertLogRelReturn(iPage < (pMmio2Range->RamRange.cb >> PAGE_SHIFT), VERR_PGM_PHYS_PAGE_MAP_MMIO2_IPE); 1047 *ppv = (uint8_t *)pMmio2Range->RamRange.pvR3 + ((uintptr_t)iPage << PAGE_SHIFT); 1048 *ppMap = NULL; 1049 return VINF_SUCCESS; 1050 } 1051 1032 1052 const uint32_t idChunk = PGM_PAGE_GET_CHUNKID(pPage); 1033 1053 if (idChunk == NIL_GMM_CHUNKID) 1034 1054 { 1035 AssertMsgReturn(PGM_PAGE_GET_PAGEID(pPage) == NIL_GMM_PAGEID, ("pPage=%R[pgmpage]\n", pPage), VERR_PGM_PHYS_PAGE_MAP_IPE_1); 1036 if (PGM_PAGE_GET_TYPE(pPage) == PGMPAGETYPE_MMIO2) 1037 { 1038 /* Lookup the MMIO2 range and use pvR3 to calc the address. */ 1039 PPGMRAMRANGE pRam = pgmPhysGetRange(pVM, GCPhys); 1040 AssertMsgReturn(pRam || !pRam->pvR3, ("pRam=%p pPage=%R[pgmpage]\n", pRam, pPage), VERR_PGM_PHYS_PAGE_MAP_IPE_2); 1041 *ppv = (void *)((uintptr_t)pRam->pvR3 + (uintptr_t)((GCPhys & ~(RTGCPHYS)PAGE_OFFSET_MASK) - pRam->GCPhys)); 1042 } 1043 else if (PGM_PAGE_GET_TYPE(pPage) == PGMPAGETYPE_MMIO2_ALIAS_MMIO) 1044 { 1045 /** @todo deal with aliased MMIO2 pages somehow... 1046 * One solution would be to seed MMIO2 pages to GMM and get unique Page IDs for 1047 * them, that would also avoid this mess. It would actually be kind of 1048 * elegant... */ 1049 AssertLogRelMsgFailedReturn(("%RGp\n", GCPhys), VERR_PGM_MAP_MMIO2_ALIAS_MMIO); 1050 } 1051 else 1052 { 1053 /** @todo handle MMIO2 */ 1054 AssertMsgReturn(PGM_PAGE_IS_ZERO(pPage), ("pPage=%R[pgmpage]\n", pPage), VERR_PGM_PHYS_PAGE_MAP_IPE_3); 1055 AssertMsgReturn(PGM_PAGE_GET_HCPHYS(pPage) == pVM->pgm.s.HCPhysZeroPg, 1056 ("pPage=%R[pgmpage]\n", pPage), 1055 AssertMsgReturn(PGM_PAGE_GET_PAGEID(pPage) == NIL_GMM_PAGEID, ("pPage=%R[pgmpage]\n", pPage), 1056 VERR_PGM_PHYS_PAGE_MAP_IPE_1); 1057 if (!PGM_PAGE_IS_SPECIAL_ALIAS_MMIO(pPage)) 1058 { 1059 AssertMsgReturn(PGM_PAGE_IS_ZERO(pPage), ("pPage=%R[pgmpage]\n", pPage), 1060 VERR_PGM_PHYS_PAGE_MAP_IPE_3); 1061 AssertMsgReturn(PGM_PAGE_GET_HCPHYS(pPage)== pVM->pgm.s.HCPhysZeroPg, ("pPage=%R[pgmpage]\n", pPage), 1057 1062 VERR_PGM_PHYS_PAGE_MAP_IPE_4); 1058 1063 *ppv = pVM->pgm.s.CTXALLSUFF(pvZeroPg); 1064 } 1065 else 1066 { 1067 static uint8_t s_abPlayItSafe[0x1000*2]; /* I don't dare return the zero page at the moment. */ 1068 *ppv = (uint8_t *)((uintptr_t)&s_abPlayItSafe[0x1000] & ~(uintptr_t)0xfff); 1059 1069 } 1060 1070 *ppMap = NULL; … … 1684 1694 if (RT_SUCCESS(rc)) 1685 1695 { 1686 if (RT_UNLIKELY(PGM_PAGE_IS_MMIO (pPage)))1696 if (RT_UNLIKELY(PGM_PAGE_IS_MMIO_OR_SPECIAL_ALIAS(pPage))) 1687 1697 rc = VERR_PGM_PHYS_PAGE_RESERVED; 1688 1698 else … … 1716 1726 /* MMIO pages doesn't have any readable backing. */ 1717 1727 PPGMPAGE pPage = pTlbe->pPage; 1718 if (RT_UNLIKELY(PGM_PAGE_IS_MMIO (pPage)))1728 if (RT_UNLIKELY(PGM_PAGE_IS_MMIO_OR_SPECIAL_ALIAS(pPage))) 1719 1729 rc = VERR_PGM_PHYS_PAGE_RESERVED; 1720 1730 else … … 2099 2109 PPGMPHYSHANDLER pPhys = NULL; 2100 2110 #endif 2101 if (PGM_PAGE_GET_HNDL_PHYS_STATE(pPage) == PGM_PAGE_HNDL_PHYS_STATE_ALL) 2111 if ( PGM_PAGE_GET_HNDL_PHYS_STATE(pPage) == PGM_PAGE_HNDL_PHYS_STATE_ALL 2112 || PGM_PAGE_IS_MMIO_OR_SPECIAL_ALIAS(pPage)) 2102 2113 { 2103 2114 #ifdef IN_RING3 … … 2236 2247 * Any ALL access handlers? 2237 2248 */ 2238 if (RT_UNLIKELY(PGM_PAGE_HAS_ACTIVE_ALL_HANDLERS(pPage))) 2249 if (RT_UNLIKELY( PGM_PAGE_HAS_ACTIVE_ALL_HANDLERS(pPage) 2250 || PGM_PAGE_IS_SPECIAL_ALIAS_MMIO(pPage))) 2239 2251 { 2240 2252 int rc = pgmPhysReadHandler(pVM, pPage, pRam->GCPhys + off, pvBuf, cb); … … 2335 2347 * the heavy usage of full page handlers in the page pool. 2336 2348 */ 2337 if ( 2338 || PGM_PAGE_IS_MMIO(pPage) /* screw virtual handlers on MMIO pages */)2349 if ( !PGM_PAGE_HAS_ACTIVE_VIRTUAL_HANDLERS(pPage) 2350 || PGM_PAGE_IS_MMIO_OR_SPECIAL_ALIAS(pPage) /* screw virtual handlers on MMIO pages */) 2339 2351 { 2340 2352 PPGMPHYSHANDLER pCur = pgmHandlerPhysicalLookup(pVM, GCPhys); … … 2356 2368 #else /* IN_RING3 */ 2357 2369 Log5(("pgmPhysWriteHandler: GCPhys=%RGp cbRange=%#x pPage=%R[pgmpage] phys %s\n", GCPhys, cbRange, pPage, R3STRING(pCur->pszDesc) )); 2358 if (!PGM_PAGE_IS_MMIO (pPage))2370 if (!PGM_PAGE_IS_MMIO_OR_SPECIAL_ALIAS(pPage)) 2359 2371 rc = pgmPhysGCPhys2CCPtrInternal(pVM, pPage, GCPhys, &pvDst, &PgMpLck); 2360 2372 else … … 2404 2416 } 2405 2417 /* else: the handler is somewhere else in the page, deal with it below. */ 2406 Assert(!PGM_PAGE_IS_MMIO (pPage)); /* MMIO handlers are all PAGE_SIZEed! */2418 Assert(!PGM_PAGE_IS_MMIO_OR_ALIAS(pPage)); /* MMIO handlers are all PAGE_SIZEed! */ 2407 2419 } 2408 2420 /* … … 2771 2783 * Any active WRITE or ALL access handlers? 2772 2784 */ 2773 if (PGM_PAGE_HAS_ACTIVE_HANDLERS(pPage)) 2785 if ( PGM_PAGE_HAS_ACTIVE_HANDLERS(pPage) 2786 || PGM_PAGE_IS_SPECIAL_ALIAS_MMIO(pPage)) 2774 2787 { 2775 2788 int rc = pgmPhysWriteHandler(pVM, pPage, pRam->GCPhys + off, pvBuf, cb); … … 4039 4052 if (PGM_PAGE_IS_BALLOONED(pPage)) 4040 4053 rc = VERR_PGM_PHYS_TLB_CATCH_WRITE; 4054 else if (PGM_PAGE_IS_SPECIAL_ALIAS_MMIO(pPage)) 4055 rc = VERR_PGM_PHYS_TLB_CATCH_ALL; 4041 4056 else if ( !PGM_PAGE_HAS_ANY_HANDLERS(pPage) 4042 4057 || (fByPassHandlers && !PGM_PAGE_IS_MMIO(pPage)) ) … … 4151 4166 if (PGM_PAGE_IS_BALLOONED(pPage)) 4152 4167 rc = VERR_PGM_PHYS_TLB_CATCH_WRITE; 4168 else if (PGM_PAGE_IS_SPECIAL_ALIAS_MMIO(pPage)) 4169 rc = VERR_PGM_PHYS_TLB_CATCH_ALL; 4153 4170 else if ( !PGM_PAGE_HAS_ANY_HANDLERS(pPage) 4154 4171 || (fByPassHandlers && !PGM_PAGE_IS_MMIO(pPage)) ) -
trunk/src/VBox/VMM/VMMR3/FTM.cpp
r46788 r47786 717 717 718 718 case PGMPAGETYPE_MMIO2_ALIAS_MMIO: 719 case PGMPAGETYPE_SPECIAL_ALIAS_MMIO: 719 720 AssertFailed(); 720 721 break; -
trunk/src/VBox/VMM/VMMR3/PGM.cpp
r46420 r47786 3952 3952 default: 3953 3953 AssertFailed(); 3954 case PGMPAGETYPE_MMIO: 3954 3955 case PGMPAGETYPE_MMIO2_ALIAS_MMIO: 3955 case PGMPAGETYPE_ MMIO:3956 case PGMPAGETYPE_SPECIAL_ALIAS_MMIO: 3956 3957 if (fIncZeroPgs) 3957 3958 { -
trunk/src/VBox/VMM/VMMR3/PGMDbg.cpp
r46220 r47786 661 661 if ( ( !PGM_PAGE_IS_ZERO(pPage) 662 662 || fAllZero) 663 && !PGM_PAGE_IS_MMIO(pPage) 664 && PGM_PAGE_GET_TYPE(pPage) != PGMPAGETYPE_MMIO2_ALIAS_MMIO 663 && !PGM_PAGE_IS_MMIO_OR_ALIAS(pPage) 665 664 && !PGM_PAGE_IS_BALLOONED(pPage)) 666 665 { … … 807 806 && ( !PGM_PAGE_IS_ZERO(pPage) 808 807 || fAllZero) 809 && !PGM_PAGE_IS_MMIO(pPage) 810 && PGM_PAGE_GET_TYPE(pPage) != PGMPAGETYPE_MMIO2_ALIAS_MMIO 808 && !PGM_PAGE_IS_MMIO_OR_ALIAS(pPage) 811 809 && !PGM_PAGE_IS_BALLOONED(pPage)) 812 810 { -
trunk/src/VBox/VMM/VMMR3/PGMPhys.cpp
r45618 r47786 144 144 * delegate the job to EMT. 145 145 */ 146 if (PGM_PAGE_HAS_ACTIVE_ALL_HANDLERS(pPage)) 146 if ( PGM_PAGE_HAS_ACTIVE_ALL_HANDLERS(pPage) 147 || PGM_PAGE_IS_SPECIAL_ALIAS_MMIO(pPage)) 147 148 { 148 149 pgmUnlock(pVM); … … 151 152 pVM, &GCPhys, pvBuf, cbRead); 152 153 } 153 Assert(!PGM_PAGE_IS_MMIO (pPage));154 Assert(!PGM_PAGE_IS_MMIO_OR_SPECIAL_ALIAS(pPage)); 154 155 155 156 /* … … 282 283 */ 283 284 if ( PGM_PAGE_HAS_ACTIVE_HANDLERS(pPage) 284 || PGM_PAGE_GET_STATE(pPage) != PGM_PAGE_STATE_ALLOCATED) 285 || PGM_PAGE_GET_STATE(pPage) != PGM_PAGE_STATE_ALLOCATED 286 || PGM_PAGE_IS_SPECIAL_ALIAS_MMIO(pPage)) 285 287 { 286 288 if ( PGM_PAGE_GET_STATE(pPage) == PGM_PAGE_STATE_WRITE_MONITORED … … 295 297 } 296 298 } 297 Assert(!PGM_PAGE_IS_MMIO (pPage));299 Assert(!PGM_PAGE_IS_MMIO_OR_SPECIAL_ALIAS(pPage)); 298 300 299 301 /* … … 378 380 AssertFatalRC(rc2); 379 381 PPGMPAGE pPage = pTlbe->pPage; 380 if (PGM_PAGE_IS_MMIO (pPage))382 if (PGM_PAGE_IS_MMIO_OR_SPECIAL_ALIAS(pPage)) 381 383 { 382 384 PGMPhysReleasePageMappingLock(pVM, pLock); … … 449 451 { 450 452 PPGMPAGE pPage = pTlbe->pPage; 451 if (PGM_PAGE_IS_MMIO (pPage))453 if (PGM_PAGE_IS_MMIO_OR_SPECIAL_ALIAS(pPage)) 452 454 rc = VERR_PGM_PHYS_PAGE_RESERVED; 453 455 else … … 552 554 #if 1 553 555 /* MMIO pages doesn't have any readable backing. */ 554 if (PGM_PAGE_IS_MMIO (pPage))556 if (PGM_PAGE_IS_MMIO_OR_SPECIAL_ALIAS(pPage)) 555 557 rc = VERR_PGM_PHYS_PAGE_RESERVED; 556 558 #else … … 1979 1981 1980 1982 case PGMPAGETYPE_MMIO2_ALIAS_MMIO: 1983 case PGMPAGETYPE_SPECIAL_ALIAS_MMIO: /** @todo perhaps leave the special page alone? I don't think VT-x copes with this code. */ 1981 1984 pgmHandlerPhysicalResetAliasedPage(pVM, pPage, pRam->GCPhys + ((RTGCPHYS)iPage << PAGE_SHIFT), 1982 1985 true /*fDoAccounting*/); … … 2032 2035 2033 2036 case PGMPAGETYPE_MMIO2_ALIAS_MMIO: 2037 case PGMPAGETYPE_SPECIAL_ALIAS_MMIO: /** @todo perhaps leave the special page alone? I don't think VT-x copes with this code. */ 2034 2038 pgmHandlerPhysicalResetAliasedPage(pVM, pPage, pRam->GCPhys + ((RTGCPHYS)iPage << PAGE_SHIFT), 2035 2039 true /*fDoAccounting*/); … … 2127 2131 2128 2132 case PGMPAGETYPE_MMIO2_ALIAS_MMIO: 2133 case PGMPAGETYPE_SPECIAL_ALIAS_MMIO: 2129 2134 case PGMPAGETYPE_MMIO2: 2130 2135 case PGMPAGETYPE_ROM_SHADOW: /* handled by pgmR3PhysRomReset. */ … … 2149 2154 return VINF_SUCCESS; 2150 2155 } 2156 2151 2157 2152 2158 /** … … 2363 2369 { 2364 2370 PPGMPAGE pPage = &pRam->aPages[iPage]; 2365 if ( PGM_PAGE_GET_TYPE(pPage) != PGMPAGETYPE_MMIO2371 if ( !PGM_PAGE_IS_MMIO_OR_ALIAS(pPage) 2366 2372 /*|| not-out-of-action later */) 2367 2373 { 2368 2374 fAllMMIO = false; 2369 Assert(PGM_PAGE_GET_TYPE(pPage) != PGMPAGETYPE_MMIO2_ALIAS_MMIO);2370 2375 AssertMsgFailed(("%RGp %R[pgmpage]\n", pRam->GCPhys + ((RTGCPHYS)iPage << PAGE_SHIFT), pPage)); 2371 2376 break; 2372 2377 } 2373 Assert(PGM_PAGE_IS_ZERO(pPage)); 2378 Assert( PGM_PAGE_IS_ZERO(pPage) 2379 || PGM_PAGE_GET_TYPE(pPage) == PGMPAGETYPE_MMIO2_ALIAS_MMIO 2380 || PGM_PAGE_GET_TYPE(pPage) == PGMPAGETYPE_SPECIAL_ALIAS_MMIO); 2374 2381 pPage++; 2375 2382 } … … 2409 2416 { 2410 2417 PPGMPAGE pPage = &pRam->aPages[iPage]; 2411 AssertMsg(PGM_PAGE_IS_MMIO(pPage), ("%RGp %R[pgmpage]\n", pRam->GCPhys + ((RTGCPHYS)iPage << PAGE_SHIFT), pPage)); 2412 AssertMsg(PGM_PAGE_IS_ZERO(pPage), ("%RGp %R[pgmpage]\n", pRam->GCPhys + ((RTGCPHYS)iPage << PAGE_SHIFT), pPage)); 2413 if (PGM_PAGE_GET_TYPE(pPage) == PGMPAGETYPE_MMIO) 2418 AssertMsg( (PGM_PAGE_IS_MMIO(pPage) && PGM_PAGE_IS_ZERO(pPage)) 2419 || PGM_PAGE_GET_TYPE(pPage) == PGMPAGETYPE_MMIO2_ALIAS_MMIO 2420 || PGM_PAGE_GET_TYPE(pPage) == PGMPAGETYPE_SPECIAL_ALIAS_MMIO, 2421 ("%RGp %R[pgmpage]\n", pRam->GCPhys + ((RTGCPHYS)iPage << PAGE_SHIFT), pPage)); 2422 if (PGM_PAGE_IS_MMIO_OR_ALIAS(pPage)) 2414 2423 PGM_PAGE_SET_TYPE(pVM, pPage, PGMPAGETYPE_RAM); 2415 2424 } … … 2488 2497 * @param pszDesc The description. 2489 2498 */ 2490 VMMR3DECL(int) PGMR3PhysMMIO2Register(PVM pVM, PPDMDEVINS pDevIns, uint32_t iRegion, RTGCPHYS cb, uint32_t fFlags, void **ppv, const char *pszDesc) 2499 VMMR3DECL(int) PGMR3PhysMMIO2Register(PVM pVM, PPDMDEVINS pDevIns, uint32_t iRegion, RTGCPHYS cb, uint32_t fFlags, 2500 void **ppv, const char *pszDesc) 2491 2501 { 2492 2502 /* … … 2506 2516 const uint32_t cPages = cb >> PAGE_SHIFT; 2507 2517 AssertLogRelReturn(((RTGCPHYS)cPages << PAGE_SHIFT) == cb, VERR_INVALID_PARAMETER); 2508 AssertLogRelReturn(cPages <= INT32_MAX / 2, VERR_NO_MEMORY);2518 AssertLogRelReturn(cPages <= PGM_MMIO2_MAX_PAGE_COUNT, VERR_NO_MEMORY); 2509 2519 2510 2520 /* … … 2517 2527 return VERR_NO_MEMORY; 2518 2528 } 2529 2530 /* 2531 * Allocate an MMIO2 range ID (not freed on failure). 2532 * The zero ID is not used as it could be confused with NIL_GMM_PAGEID. 2533 */ 2534 pgmLock(pVM); 2535 uint8_t idMmio2 = pVM->pgm.s.cMmio2Regions + 1; 2536 if (idMmio2 > PGM_MMIO2_MAX_RANGES) 2537 { 2538 pgmUnlock(pVM); 2539 AssertLogRelFailedReturn(VERR_PGM_TOO_MANY_MMIO2_RANGES); 2540 } 2541 pVM->pgm.s.cMmio2Regions = idMmio2; 2542 pgmUnlock(pVM); 2519 2543 2520 2544 /* … … 2549 2573 pNew->iRegion = iRegion; 2550 2574 pNew->idSavedState = UINT8_MAX; 2575 pNew->idMmio2 = idMmio2; 2551 2576 pNew->RamRange.pSelfR0 = MMHyperCCToR0(pVM, &pNew->RamRange); 2552 2577 pNew->RamRange.pSelfRC = MMHyperCCToRC(pVM, &pNew->RamRange); … … 2563 2588 { 2564 2589 PGM_PAGE_INIT(&pNew->RamRange.aPages[iPage], 2565 paPages[iPage].Phys, NIL_GMM_PAGEID, 2590 paPages[iPage].Phys, 2591 PGM_MMIO2_PAGEID_MAKE(idMmio2, iPage), 2566 2592 PGMPAGETYPE_MMIO2, PGM_PAGE_STATE_ALLOCATED); 2567 2593 } … … 2575 2601 * Since there is no particular order, just push it. 2576 2602 */ 2603 /** @todo we can save us the linked list now, just search the lookup table... */ 2577 2604 pgmLock(pVM); 2605 Assert(pVM->pgm.s.apMmio2RangesR3[idMmio2] == NULL); 2606 Assert(pVM->pgm.s.apMmio2RangesR0[idMmio2] == NIL_RTR0PTR); 2578 2607 pNew->pNextR3 = pVM->pgm.s.pMmio2RangesR3; 2579 2608 pVM->pgm.s.pMmio2RangesR3 = pNew; 2609 pVM->pgm.s.apMmio2RangesR3[idMmio2] = pNew; 2610 pVM->pgm.s.apMmio2RangesR0[idMmio2] = MMHyperCCToR0(pVM, pNew); 2580 2611 pgmUnlock(pVM); 2581 2612 … … 2650 2681 pVM->pgm.s.pMmio2RangesR3 = pNext; 2651 2682 pCur->pNextR3 = NULL; 2683 2684 uint8_t idMmio2 = pCur->idMmio2; 2685 Assert(pVM->pgm.s.apMmio2RangesR3[idMmio2] == pCur); 2686 pVM->pgm.s.apMmio2RangesR3[idMmio2] = NULL; 2687 pVM->pgm.s.apMmio2RangesR0[idMmio2] = NIL_RTR0PTR; 2652 2688 2653 2689 /* -
trunk/src/VBox/VMM/VMMR3/PGMSavedState.cpp
r44528 r47786 103 103 /** The CRC-32 for a zero half page. */ 104 104 #define PGM_STATE_CRC32_ZERO_HALF_PAGE UINT32_C(0xf1e8ba9e) 105 106 107 108 /** @name Old Page types used in older saved states. 109 * @{ */ 110 /** Old saved state: The usual invalid zero entry. */ 111 #define PGMPAGETYPE_OLD_INVALID 0 112 /** Old saved state: RAM page. (RWX) */ 113 #define PGMPAGETYPE_OLD_RAM 1 114 /** Old saved state: MMIO2 page. (RWX) */ 115 #define PGMPAGETYPE_OLD_MMIO2 1 116 /** Old saved state: MMIO2 page aliased over an MMIO page. (RWX) 117 * See PGMHandlerPhysicalPageAlias(). */ 118 #define PGMPAGETYPE_OLD_MMIO2_ALIAS_MMIO 2 119 /** Old saved state: Shadowed ROM. (RWX) */ 120 #define PGMPAGETYPE_OLD_ROM_SHADOW 3 121 /** Old saved state: ROM page. (R-X) */ 122 #define PGMPAGETYPE_OLD_ROM 4 123 /** Old saved state: MMIO page. (---) */ 124 #define PGMPAGETYPE_OLD_MMIO 5 125 /** @} */ 105 126 106 127 … … 1156 1177 1157 1178 case PGMPAGETYPE_MMIO: 1179 case PGMPAGETYPE_SPECIAL_ALIAS_MMIO: 1158 1180 paLSPages[iPage].fZero = 0; 1159 1181 paLSPages[iPage].fShared = 0; … … 2172 2194 2173 2195 /** 2196 * Compares a page with an old save type value. 2197 * 2198 * @returns true if equal, false if not. 2199 * @param pPage The page to compare. 2200 * @param uOldType The old type value from the saved state. 2201 */ 2202 DECLINLINE(bool) pgmR3CompareNewAndOldPageTypes(PPGMPAGE pPage, uint8_t uOldType) 2203 { 2204 uint8_t uOldPageType; 2205 switch (PGM_PAGE_GET_TYPE(pPage)) 2206 { 2207 case PGMPAGETYPE_INVALID: uOldPageType = PGMPAGETYPE_OLD_INVALID; break; 2208 case PGMPAGETYPE_RAM: uOldPageType = PGMPAGETYPE_OLD_RAM; break; 2209 case PGMPAGETYPE_MMIO2: uOldPageType = PGMPAGETYPE_OLD_MMIO2; break; 2210 case PGMPAGETYPE_MMIO2_ALIAS_MMIO: uOldPageType = PGMPAGETYPE_OLD_MMIO2_ALIAS_MMIO; break; 2211 case PGMPAGETYPE_ROM_SHADOW: uOldPageType = PGMPAGETYPE_OLD_ROM_SHADOW; break; 2212 case PGMPAGETYPE_ROM: uOldPageType = PGMPAGETYPE_OLD_ROM; break; 2213 case PGMPAGETYPE_SPECIAL_ALIAS_MMIO: /* fall thru */ 2214 case PGMPAGETYPE_MMIO: uOldPageType = PGMPAGETYPE_OLD_MMIO; break; 2215 default: 2216 AssertFailed(); 2217 uOldPageType = PGMPAGETYPE_OLD_INVALID; 2218 break; 2219 } 2220 return uOldPageType == uOldType; 2221 } 2222 2223 2224 /** 2174 2225 * Loads a page without any bits in the saved state, i.e. making sure it's 2175 2226 * really zero. … … 2177 2228 * @returns VBox status code. 2178 2229 * @param pVM Pointer to the VM. 2179 * @param u Type The page type or PGMPAGETYPE_INVALID (old saved2230 * @param uOldType The page type or PGMPAGETYPE_OLD_INVALID (old saved 2180 2231 * state). 2181 2232 * @param pPage The guest page tracking structure. … … 2183 2234 * @param pRam The ram range (logging). 2184 2235 */ 2185 static int pgmR3LoadPageZeroOld(PVM pVM, uint8_t u Type, PPGMPAGE pPage, RTGCPHYS GCPhys, PPGMRAMRANGE pRam)2186 { 2187 if ( PGM_PAGE_GET_TYPE(pPage) != uType2188 && uType != PGMPAGETYPE_INVALID)2236 static int pgmR3LoadPageZeroOld(PVM pVM, uint8_t uOldType, PPGMPAGE pPage, RTGCPHYS GCPhys, PPGMRAMRANGE pRam) 2237 { 2238 if ( uOldType != PGMPAGETYPE_OLD_INVALID 2239 && !pgmR3CompareNewAndOldPageTypes(pPage, uOldType)) 2189 2240 return VERR_SSM_UNEXPECTED_DATA; 2190 2241 … … 2207 2258 * @param pVM Pointer to the VM. 2208 2259 * @param pSSM The SSM handle. 2209 * @param u Type The page type or PGMPAGETYEP_INVALID (old saved2260 * @param uOldType The page type or PGMPAGETYPE_OLD_INVALID (old saved 2210 2261 * state). 2211 2262 * @param pPage The guest page tracking structure. … … 2213 2264 * @param pRam The ram range (logging). 2214 2265 */ 2215 static int pgmR3LoadPageBitsOld(PVM pVM, PSSMHANDLE pSSM, uint8_t u Type, PPGMPAGE pPage, RTGCPHYS GCPhys, PPGMRAMRANGE pRam)2266 static int pgmR3LoadPageBitsOld(PVM pVM, PSSMHANDLE pSSM, uint8_t uOldType, PPGMPAGE pPage, RTGCPHYS GCPhys, PPGMRAMRANGE pRam) 2216 2267 { 2217 2268 /* 2218 2269 * Match up the type, dealing with MMIO2 aliases (dropped). 2219 2270 */ 2220 AssertLogRelMsgReturn( PGM_PAGE_GET_TYPE(pPage) == uType2221 || uType == PGMPAGETYPE_INVALID2271 AssertLogRelMsgReturn( uOldType == PGMPAGETYPE_INVALID 2272 || pgmR3CompareNewAndOldPageTypes(pPage, uOldType) 2222 2273 /* kudge for the expanded PXE bios (r67885) - @bugref{5687}: */ 2223 || ( u Type == PGMPAGETYPE_RAM2274 || ( uOldType == PGMPAGETYPE_OLD_RAM 2224 2275 && GCPhys >= 0xed000 2225 2276 && GCPhys <= 0xeffff … … 2251 2302 * @param pVM Pointer to the VM. 2252 2303 * @param pSSM The SSM handle. 2253 * @param u TypeThe page type.2304 * @param uOldType The page type. 2254 2305 * @param pPage The page. 2255 2306 * @param GCPhys The page address. 2256 2307 * @param pRam The RAM range (for error messages). 2257 2308 */ 2258 static int pgmR3LoadPageOld(PVM pVM, PSSMHANDLE pSSM, uint8_t u Type, PPGMPAGE pPage, RTGCPHYS GCPhys, PPGMRAMRANGE pRam)2309 static int pgmR3LoadPageOld(PVM pVM, PSSMHANDLE pSSM, uint8_t uOldType, PPGMPAGE pPage, RTGCPHYS GCPhys, PPGMRAMRANGE pRam) 2259 2310 { 2260 2311 uint8_t uState; … … 2262 2313 AssertLogRelMsgRCReturn(rc, ("pPage=%R[pgmpage] GCPhys=%#x %s rc=%Rrc\n", pPage, GCPhys, pRam->pszDesc, rc), rc); 2263 2314 if (uState == 0 /* zero */) 2264 rc = pgmR3LoadPageZeroOld(pVM, u Type, pPage, GCPhys, pRam);2315 rc = pgmR3LoadPageZeroOld(pVM, uOldType, pPage, GCPhys, pRam); 2265 2316 else if (uState == 1) 2266 rc = pgmR3LoadPageBitsOld(pVM, pSSM, u Type, pPage, GCPhys, pRam);2317 rc = pgmR3LoadPageBitsOld(pVM, pSSM, uOldType, pPage, GCPhys, pRam); 2267 2318 else 2268 2319 rc = VERR_PGM_INVALID_SAVED_PAGE_STATE; 2269 AssertLogRelMsgRCReturn(rc, ("pPage=%R[pgmpage] uState=%d u Type=%d GCPhys=%RGp %s rc=%Rrc\n",2270 pPage, uState, u Type, GCPhys, pRam->pszDesc, rc),2320 AssertLogRelMsgRCReturn(rc, ("pPage=%R[pgmpage] uState=%d uOldType=%d GCPhys=%RGp %s rc=%Rrc\n", 2321 pPage, uState, uOldType, GCPhys, pRam->pszDesc, rc), 2271 2322 rc); 2272 2323 return VINF_SUCCESS; … … 2440 2491 RTGCPHYS const GCPhysPage = ((RTGCPHYS)iPage << PAGE_SHIFT) + pRam->GCPhys; 2441 2492 PPGMPAGE pPage = &pRam->aPages[iPage]; 2442 uint8_t u Type;2443 rc = SSMR3GetU8(pSSM, &u Type);2493 uint8_t uOldType; 2494 rc = SSMR3GetU8(pSSM, &uOldType); 2444 2495 AssertLogRelMsgRCReturn(rc, ("pPage=%R[pgmpage] iPage=%#x GCPhysPage=%#x %s\n", pPage, iPage, GCPhysPage, pRam->pszDesc), rc); 2445 if (u Type == PGMPAGETYPE_ROM_SHADOW)2496 if (uOldType == PGMPAGETYPE_OLD_ROM_SHADOW) 2446 2497 rc = pgmR3LoadShadowedRomPageOld(pVM, pSSM, pPage, GCPhysPage, pRam); 2447 2498 else 2448 rc = pgmR3LoadPageOld(pVM, pSSM, u Type, pPage, GCPhysPage, pRam);2499 rc = pgmR3LoadPageOld(pVM, pSSM, uOldType, pPage, GCPhysPage, pRam); 2449 2500 AssertLogRelMsgRCReturn(rc, ("rc=%Rrc iPage=%#x GCPhysPage=%#x %s\n", rc, iPage, GCPhysPage, pRam->pszDesc), rc); 2450 2501 } … … 2494 2545 if (fPresent) 2495 2546 { 2496 if (PGM_PAGE_GET_TYPE(pPage) == PGMPAGETYPE_MMIO) 2547 if ( PGM_PAGE_GET_TYPE(pPage) == PGMPAGETYPE_MMIO 2548 || PGM_PAGE_GET_TYPE(pPage) == PGMPAGETYPE_SPECIAL_ALIAS_MMIO) 2497 2549 rc = pgmR3LoadPageToDevNullOld(pSSM); 2498 2550 else -
trunk/src/VBox/VMM/include/PGMInternal.h
r47526 r47786 731 731 uint64_t u10PteIdx : 10; 732 732 733 /** The GMM page ID. */ 733 /** The GMM page ID. 734 * @remarks In the current implementation, MMIO2 and pages aliased to 735 * MMIO2 pages will be exploiting this field to calculate the 736 * ring-3 mapping address corresponding to the page. 737 * Later we may consider including MMIO2 management into GMM. */ 734 738 uint32_t idPage; 735 739 /** Usage tracking (page pool). */ … … 962 966 963 967 /** 964 * Checks if the page is marked for MMIO .968 * Checks if the page is marked for MMIO, no MMIO2 aliasing. 965 969 * @returns true/false. 966 970 * @param a_pPage Pointer to the physical guest page tracking structure. 967 971 */ 968 972 #define PGM_PAGE_IS_MMIO(a_pPage) ( (a_pPage)->s.uTypeY == PGMPAGETYPE_MMIO ) 973 974 /** 975 * Checks if the page is marked for MMIO, including both aliases. 976 * @returns true/false. 977 * @param a_pPage Pointer to the physical guest page tracking structure. 978 */ 979 #define PGM_PAGE_IS_MMIO_OR_ALIAS(a_pPage) ( (a_pPage)->s.uTypeY == PGMPAGETYPE_MMIO \ 980 || (a_pPage)->s.uTypeY == PGMPAGETYPE_MMIO2_ALIAS_MMIO \ 981 || (a_pPage)->s.uTypeY == PGMPAGETYPE_SPECIAL_ALIAS_MMIO \ 982 ) 983 984 /** 985 * Checks if the page is marked for MMIO, including special aliases. 986 * @returns true/false. 987 * @param a_pPage Pointer to the physical guest page tracking structure. 988 */ 989 #define PGM_PAGE_IS_MMIO_OR_SPECIAL_ALIAS(a_pPage) ( (a_pPage)->s.uTypeY == PGMPAGETYPE_MMIO \ 990 || (a_pPage)->s.uTypeY == PGMPAGETYPE_SPECIAL_ALIAS_MMIO ) 991 992 /** 993 * Checks if the page is a special aliased MMIO page. 994 * @returns true/false. 995 * @param a_pPage Pointer to the physical guest page tracking structure. 996 */ 997 #define PGM_PAGE_IS_SPECIAL_ALIAS_MMIO(a_pPage) ( (a_pPage)->s.uTypeY == PGMPAGETYPE_SPECIAL_ALIAS_MMIO ) 969 998 970 999 /** … … 1585 1614 /** The saved state range ID. */ 1586 1615 uint8_t idSavedState; 1616 /** MMIO2 range identifier, for page IDs (PGMPAGE::s.idPage). */ 1617 uint8_t idMmio2; 1587 1618 /** Alignment padding for putting the ram range on a PGMPAGE alignment boundary. */ 1588 uint8_t abAlignment[HC_ARCH_BITS == 32 ? 1 2 : 12];1619 uint8_t abAlignment[HC_ARCH_BITS == 32 ? 11 : 11]; 1589 1620 /** Live save per page tracking data. */ 1590 1621 R3PTRTYPE(PPGMLIVESAVEMMIO2PAGE) paLSPages; … … 1595 1626 typedef PGMMMIO2RANGE *PPGMMMIO2RANGE; 1596 1627 1628 /** @name Intenal MMIO2 constants. 1629 * @{ */ 1630 /** The maximum number of MMIO2 ranges. */ 1631 #define PGM_MMIO2_MAX_RANGES 8 1632 /** The maximum number of pages in a MMIO2 range. */ 1633 #define PGM_MMIO2_MAX_PAGE_COUNT UINT32_C(0x00ffffff) 1634 /** Makes a MMIO2 page ID out of a MMIO2 range ID and page index number. */ 1635 #define PGM_MMIO2_PAGEID_MAKE(a_idMmio2, a_iPage) ( ((uint32_t)(a_idMmio2) << 24) | (uint32_t)(a_iPage) ) 1636 /** Gets the MMIO2 range ID from an MMIO2 page ID. */ 1637 #define PGM_MMIO2_PAGEID_GET_MMIO2_ID(a_idPage) ( (uint8_t)((a_idPage) >> 24) ) 1638 /** Gets the MMIO2 page index from an MMIO2 page ID. */ 1639 #define PGM_MMIO2_PAGEID_GET_IDX(a_idPage) ( ((a_idPage) & UINT32_C(0x00ffffff)) ) 1640 /** @} */ 1597 1641 1598 1642 … … 3087 3131 /** Set if PCI passthrough is enabled. */ 3088 3132 bool fPciPassthrough; 3133 /** The number of MMIO2 regions (serves as the next MMIO2 ID). */ 3134 uint8_t cMmio2Regions; 3089 3135 /** Alignment padding that makes the next member start on a 8 byte boundary. */ 3090 bool afAlignment1[ 3];3136 bool afAlignment1[2]; 3091 3137 3092 3138 /** Indicates that PGMR3FinalizeMappings has been called and that further … … 3144 3190 R3PTRTYPE(PPGMMODEDATA) paModeData; 3145 3191 RTR3PTR R3PtrAlignment0; 3192 /** MMIO2 lookup array for ring-3. Indexed by idMmio2 minus 1. */ 3193 R3PTRTYPE(PPGMMMIO2RANGE) apMmio2RangesR3[PGM_MMIO2_MAX_RANGES]; 3146 3194 3147 3195 /** RAM range TLB for R0. */ … … 3163 3211 R0PTRTYPE(PPGMROMRANGE) pRomRangesR0; 3164 3212 RTR0PTR R0PtrAlignment0; 3165 3213 /** MMIO2 lookup array for ring-3. Indexed by idMmio2 minus 1. */ 3214 R0PTRTYPE(PPGMMMIO2RANGE) apMmio2RangesR0[PGM_MMIO2_MAX_RANGES]; 3166 3215 3167 3216 /** RAM range TLB for RC. */ -
trunk/src/VBox/VMM/include/internal/pgm.h
r44528 r47786 46 46 * See PGMHandlerPhysicalPageAlias(). */ 47 47 PGMPAGETYPE_MMIO2_ALIAS_MMIO, 48 /** Special page aliased over an MMIO page. (RWX) 49 * See PGMHandlerPhysicalPageAliasHC(), but this is generally only used for 50 * VT-x's APIC access page at the moment. Treated as MMIO by everyone except 51 * the shadow paging code. */ 52 PGMPAGETYPE_SPECIAL_ALIAS_MMIO, 48 53 /** Shadowed ROM. (RWX) */ 49 54 PGMPAGETYPE_ROM_SHADOW, … … 55 60 PGMPAGETYPE_END 56 61 } PGMPAGETYPE; 57 AssertCompile(PGMPAGETYPE_END <= 7);62 AssertCompile(PGMPAGETYPE_END == 8); 58 63 59 64 VMMDECL(PGMPAGETYPE) PGMPhysGetPageType(PVM pVM, RTGCPHYS GCPhys);
Note:
See TracChangeset
for help on using the changeset viewer.