Changeset 96979 in vbox for trunk/src/VBox
- Timestamp:
- Oct 4, 2022 12:46:05 PM (2 years ago)
- svn:sync-xref-src-repo-rev:
- 153902
- Location:
- trunk/src/VBox/VMM
- Files:
-
- 10 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMAll/PGMAll.cpp
r96978 r96979 3910 3910 if (IS_PART_INCLUDED(5)) 3911 3911 { 3912 static const char s_achHandlerStates[4] = { '-', 't', 'w', 'a' }; 3913 szTmp[cch++] = s_achHandlerStates[PGM_PAGE_GET_HNDL_PHYS_STATE(pPage)]; 3912 static const char s_achHandlerStates[4*2] = { '-', 't', 'w', 'a' , '_', 'T', 'W', 'A' }; 3913 szTmp[cch++] = s_achHandlerStates[ PGM_PAGE_GET_HNDL_PHYS_STATE(pPage) 3914 | ((uint8_t)PGM_PAGE_IS_HNDL_PHYS_NOT_IN_HM(pPage) << 2)]; 3914 3915 } 3915 3916 -
trunk/src/VBox/VMM/VMMAll/PGMAllBth.h
r96963 r96979 711 711 * Any handlers for this page? 712 712 */ 713 if (PGM_PAGE_HAS_ACTIVE_HANDLERS(pPage) )713 if (PGM_PAGE_HAS_ACTIVE_HANDLERS(pPage) && !PGM_PAGE_IS_HNDL_PHYS_NOT_IN_HM(pPage)) 714 714 # if PGM_WITH_PAGING(PGM_GST_TYPE, PGM_SHW_TYPE) 715 715 return VBOXSTRICTRC_TODO(PGM_BTH_NAME(Trap0eHandlerDoAccessHandlers)(pVCpu, uErr, pRegFrame, pvFault, pPage, pfLockTaken, … … 1253 1253 rc = pgmPhysGetPageEx(pVM, GCPhysPage, &pPage); 1254 1254 AssertRCReturn(rc, rc); 1255 if (PGM_PAGE_HAS_ACTIVE_HANDLERS(pPage) )1255 if (PGM_PAGE_HAS_ACTIVE_HANDLERS(pPage) && !PGM_PAGE_IS_HNDL_PHYS_NOT_IN_HM(pPage)) 1256 1256 { 1257 1257 Log7Func(("MMIO: Calling NestedTrap0eHandlerDoAccessHandlers for GCPhys %RGp\n", GCPhysPage)); … … 1791 1791 ) 1792 1792 { 1793 # if defined(VBOX_WITH_NESTED_HWVIRT_VMX) && PGM_SHW_TYPE == PGM_TYPE_EPT && defined(PGM_WITH_NESTED_APIC_ACCESS_PAGE)1794 /*1795 * If an "ALL" access handler has been registered for the VMX APIC-access page,1796 * we want to ensure EPT violations are triggered rather than EPT misconfigs1797 * as the former allows us to translate it to an APIC-access VM-exit. This is a1798 * weird case because this is not an MMIO page (it's regular guest RAM) but we1799 * want to treat it as an MMIO page wrt to trapping all accesses but we only1800 * want EPT violations for the reasons state above.1801 *1802 * NOTE! This is required even when the nested-hypervisor is not using EPT!1803 */1804 if (CPUMIsGuestVmxApicAccessPageAddr(pVCpu, GCPhysPage))1805 {1806 Log7Func(("SyncHandlerPte: VMX APIC-access page at %#RGp -> marking not present\n", GCPhysPage));1807 pPteDst->u = PGM_PAGE_GET_HCPHYS(pPage);1808 return;1809 }1810 # endif1811 1812 1793 LogFlow(("SyncHandlerPte: MMIO page -> invalid \n")); 1813 1794 # if PGM_SHW_TYPE == PGM_TYPE_EPT … … 1940 1921 uint64_t fGstShwPteFlags = X86_PTE_P | X86_PTE_RW | X86_PTE_US | X86_PTE_A | X86_PTE_D; 1941 1922 # endif 1942 if (PGM_PAGE_HAS_ACTIVE_HANDLERS(pPage)) 1943 PGM_BTH_NAME(SyncHandlerPte)(pVM, pVCpu, pPage, GCPhysPage, fGstShwPteFlags, &PteDst); 1944 else 1923 if (!PGM_PAGE_HAS_ACTIVE_HANDLERS(pPage) || PGM_PAGE_IS_HNDL_PHYS_NOT_IN_HM(pPage)) 1945 1924 { 1946 1925 # if PGM_WITH_PAGING(PGM_GST_TYPE, PGM_SHW_TYPE) … … 1993 1972 } 1994 1973 } 1974 else 1975 PGM_BTH_NAME(SyncHandlerPte)(pVM, pVCpu, pPage, GCPhysPage, fGstShwPteFlags, &PteDst); 1995 1976 1996 1977 /* … … 2311 2292 */ 2312 2293 SHWPTE PteDst; 2313 if (PGM_PAGE_HAS_ACTIVE_HANDLERS(pPage)) 2294 if (!PGM_PAGE_HAS_ACTIVE_HANDLERS(pPage) || PGM_PAGE_IS_HNDL_PHYS_NOT_IN_HM(pPage)) 2295 SHW_PTE_SET(PteDst, GST_GET_BIG_PDE_SHW_FLAGS_4_PTE(pVCpu, PdeSrc) | PGM_PAGE_GET_HCPHYS(pPage)); 2296 else 2314 2297 PGM_BTH_NAME(SyncHandlerPte)(pVM, pVCpu, pPage, GCPhys, GST_GET_BIG_PDE_SHW_FLAGS_4_PTE(pVCpu, PdeSrc), &PteDst); 2315 else2316 SHW_PTE_SET(PteDst, GST_GET_BIG_PDE_SHW_FLAGS_4_PTE(pVCpu, PdeSrc) | PGM_PAGE_GET_HCPHYS(pPage));2317 2298 2318 2299 const unsigned iPTDst = (GCPtrPage >> SHW_PT_SHIFT) & SHW_PT_MASK; … … 2525 2506 #endif /* PGM_SHW_TYPE != PGM_TYPE_NONE */ 2526 2507 2527 2528 2508 #if !defined(IN_RING3) && defined(VBOX_WITH_NESTED_HWVIRT_VMX_EPT) && PGM_SHW_TYPE == PGM_TYPE_EPT 2509 2529 2510 /** 2530 2511 * Sync a shadow page for a nested-guest page. … … 2562 2543 # ifndef VBOX_WITH_NEW_LAZY_PAGE_ALLOC 2563 2544 /* Make the page writable if necessary. */ 2545 /** @todo This needs to be applied to the regular case below, not here. And, 2546 * no we should *NOT* make the page writble, instead we need to write 2547 * protect them if necessary. */ 2564 2548 if ( PGM_PAGE_GET_TYPE(pPage) == PGMPAGETYPE_RAM 2565 2549 && PGM_PAGE_IS_ZERO(pPage) … … 2582 2566 SHWPTE Pte; 2583 2567 uint64_t const fGstShwPteFlags = pGstWalkAll->u.Ept.Pte.u & pVCpu->pgm.s.fGstEptShadowedPteMask; 2584 if (!PGM_PAGE_HAS_ACTIVE_HANDLERS(pPage)) 2585 { 2568 if (!PGM_PAGE_HAS_ACTIVE_HANDLERS(pPage) || PGM_PAGE_IS_HNDL_PHYS_NOT_IN_HM(pPage)) 2569 { 2570 /** @todo access bit. */ 2586 2571 Pte.u = PGM_PAGE_GET_HCPHYS(pPage) | fGstShwPteFlags; 2587 Log7Func(("regular page (%R[pgmpage]) at %RGp -> %RX64\n", pPage, GCPhysPage, Pte.u));2572 Log7Func(("regular page (%R[pgmpage]) at %RGp -> %RX64\n", pPage, GCPhysPage, Pte.u)); 2588 2573 } 2589 2574 else if (!PGM_PAGE_HAS_ACTIVE_ALL_HANDLERS(pPage)) … … 2595 2580 else 2596 2581 { 2597 # if defined(PGM_WITH_NESTED_APIC_ACCESS_PAGE) 2598 if (CPUMIsGuestVmxApicAccessPageAddr(pVCpu, GCPhysPage)) 2599 { 2600 Pte.u = PGM_PAGE_GET_HCPHYS(pPage) | fGstShwPteFlags; 2601 Log7Func(("APIC-access page at %RGp -> shadowing nested-hypervisor %RX64 (%RGp)\n", GCPhysPage, fGstShwPteFlags, pShwPage->GCPhys)); 2602 } 2603 # if 0 /** @todo r=bird: What on earth is the rational for this? */ 2604 else if (!PGM_PAGE_HAS_ACTIVE_ALL_HANDLERS(pPage)) 2605 { 2606 if (fGstShwPteFlags & EPT_E_WRITE) 2607 { 2608 PGMHandlerPhysicalPageTempOff(pVCpu->CTX_SUFF(pVM), GCPhysPage, GCPhysPage); 2609 Log7Func(("monitored page (%R[pgmpage]) at %RGp -> read-write, monitoring disabled\n", pPage, GCPhysPage)); 2610 } 2611 Pte.u = PGM_PAGE_GET_HCPHYS(pPage) | fGstShwPteFlags; 2612 Log7Func(("monitored page (%R[pgmpage]) at %RGp -> shadowing nested-hypervisor %RX64\n", pPage, GCPhysPage, fGstShwPteFlags)); 2613 } 2614 # endif 2615 else 2616 # endif 2617 { 2618 # if defined(PGM_WITH_NESTED_APIC_ACCESS_PAGE) 2619 /** @todo Track using fVirtVmxApicAccess bit in PGMPHYSHANDLER and maybe in PGMPAGE 2620 * too? */ 2621 /** @todo r=bird: this is wrong for device passthru among other scenarios. */ 2622 PGMHandlerPhysicalDeregister(pVCpu->CTX_SUFF(pVM), GCPhysPage); 2623 Pte.u = PGM_PAGE_GET_HCPHYS(pPage) | fGstShwPteFlags; 2624 Log7Func(("MMIO at %RGp potentially former VMX APIC-access page -> unregistered\n", GCPhysPage)); 2625 # else 2626 /** @todo Do MMIO optimizations here too? */ 2627 Log7Func(("mmio page (%R[pgmpage]) at %RGp -> 0\n", pPage, GCPhysPage)); 2628 Pte.u = 0; 2629 # endif 2630 } 2582 /** @todo Do MMIO optimizations here too? */ 2583 Log7Func(("mmio/all page (%R[pgmpage]) at %RGp -> 0\n", pPage, GCPhysPage)); 2584 Pte.u = 0; 2631 2585 } 2632 2586 … … 2969 2923 return rc; 2970 2924 } 2925 2971 2926 #endif /* !IN_RING3 && VBOX_WITH_NESTED_HWVIRT_VMX_EPT && PGM_SHW_TYPE == PGM_TYPE_EPT*/ 2972 2973 2974 2927 #if PGM_WITH_PAGING(PGM_GST_TYPE, PGM_SHW_TYPE) && PGM_SHW_TYPE != PGM_TYPE_NONE 2975 2928 … … 3074 3027 if (RT_LIKELY(pPage)) 3075 3028 { 3076 if (PGM_PAGE_HAS_ACTIVE_HANDLERS(pPage) )3029 if (PGM_PAGE_HAS_ACTIVE_HANDLERS(pPage) && !PGM_PAGE_IS_HNDL_PHYS_NOT_IN_HM(pPage)) 3077 3030 { 3078 3031 //AssertMsgFailed(("%R[pgmpage] - we don't set PGM_PTFLAGS_TRACK_DIRTY for these pages\n", pPage)); … … 3496 3449 # endif 3497 3450 3498 if (PGM_PAGE_HAS_ACTIVE_HANDLERS(pPage) )3451 if (PGM_PAGE_HAS_ACTIVE_HANDLERS(pPage) && !PGM_PAGE_IS_HNDL_PHYS_NOT_IN_HM(pPage)) 3499 3452 PGM_BTH_NAME(SyncHandlerPte)(pVM, pVCpu, pPage, GCPhys, SHW_PTE_GET_U(PteDstBase), &PteDst); 3500 3453 else if (PGM_PAGE_IS_BALLOONED(pPage)) … … 4598 4551 4599 4552 /* flags */ 4600 if (PGM_PAGE_HAS_ACTIVE_HANDLERS(pPhysPage) )4553 if (PGM_PAGE_HAS_ACTIVE_HANDLERS(pPhysPage) && !PGM_PAGE_IS_HNDL_PHYS_NOT_IN_HM(pPhysPage)) 4601 4554 { 4602 4555 if (!PGM_PAGE_HAS_ACTIVE_ALL_HANDLERS(pPhysPage)) … … 4838 4791 if (PGM_PAGE_GET_HNDL_PHYS_STATE(pPhysPage) != PGM_PAGE_HNDL_PHYS_STATE_DISABLED) 4839 4792 { 4840 if (SHW_PTE_IS_RW(PteDst)) 4793 if ( SHW_PTE_IS_RW(PteDst) 4794 && !PGM_PAGE_IS_HNDL_PHYS_NOT_IN_HM(pPhysPage)) 4841 4795 { 4842 4796 AssertMsgFailed(("WRITE access flagged at %RGv but the page is writable! pPhysPage=%R[pgmpage] PdeSrc=%#RX64 PteDst=%#RX64\n", … … 4851 4805 { 4852 4806 if ( SHW_PTE_IS_P(PteDst) 4807 && !PGM_PAGE_IS_HNDL_PHYS_NOT_IN_HM(pPhysPage) 4853 4808 # if PGM_SHW_TYPE == PGM_TYPE_EPT || PGM_SHW_TYPE == PGM_TYPE_PAE || PGM_SHW_TYPE == PGM_TYPE_AMD64 4854 4809 && !PGM_PAGE_IS_MMIO(pPhysPage) -
trunk/src/VBox/VMM/VMMAll/PGMAllHandler.cpp
r96407 r96979 70 70 /* .fRing0DevInsIdx = */ false, 71 71 #ifdef IN_RING0 72 /* . afPadding = */ {false},72 /* .fNotInHm = */ false, 73 73 /* .pfnHandler = */ pgmR0HandlerPhysicalHandlerToRing3, 74 74 /* .pfnPfHandler = */ pgmR0HandlerPhysicalPfHandlerToRing3, 75 75 #elif defined(IN_RING3) 76 76 /* .fRing0Enabled = */ false, 77 /* .fNotInHm = */ false, 77 78 /* .pfnHandler = */ pgmR3HandlerPhysicalHandlerInvalid, 78 79 #else … … 236 237 { 237 238 case PGMPHYSHANDLERKIND_WRITE: 238 break; 239 if (!pType->fNotInHm) 240 break; 241 RT_FALL_THRU(); /* Simplification: fNotInHm can only be used with full pages */ 239 242 case PGMPHYSHANDLERKIND_MMIO: 240 243 case PGMPHYSHANDLERKIND_ALL: … … 384 387 if (PGM_PAGE_GET_HNDL_PHYS_STATE(pPage) < uState) 385 388 { 386 PGM_PAGE_SET_HNDL_PHYS_STATE(pPage, uState );389 PGM_PAGE_SET_HNDL_PHYS_STATE(pPage, uState, pCurType->fNotInHm); 387 390 388 391 const RTGCPHYS GCPhysPage = pRam->GCPhys + (i << GUEST_PAGE_SHIFT); … … 685 688 /* 686 689 * Update if we found something that is a higher priority state than the current. 690 * Note! The PGMPHYSHANDLER_F_NOT_IN_HM can be ignored here as it requires whole pages. 687 691 */ 688 692 if (uState != PGM_PAGE_HNDL_PHYS_STATE_NONE) … … 690 694 PPGMPAGE pPage; 691 695 int rc = pgmPhysGetPageWithHintEx(pVM, GCPhys, &pPage, ppRamHint); 692 if ( 693 && 696 if ( RT_SUCCESS(rc) 697 && PGM_PAGE_GET_HNDL_PHYS_STATE(pPage) < uState) 694 698 { 695 699 /* This should normally not be necessary. */ 696 PGM_PAGE_SET_HNDL_PHYS_STATE (pPage, uState);697 bool fFlushTLBs 700 PGM_PAGE_SET_HNDL_PHYS_STATE_ONLY(pPage, uState); 701 bool fFlushTLBs; 698 702 rc = pgmPoolTrackUpdateGCPhys(pVM, GCPhys, pPage, false /*fFlushPTEs*/, &fFlushTLBs); 699 703 if (RT_SUCCESS(rc) && fFlushTLBs) … … 757 761 PGM_PAGE_SET_STATE(pVM, pPage, PGM_PAGE_STATE_ZERO); 758 762 PGM_PAGE_SET_PAGEID(pVM, pPage, NIL_GMM_PAGEID); 759 PGM_PAGE_SET_HNDL_PHYS_STATE (pPage, PGM_PAGE_HNDL_PHYS_STATE_ALL);763 PGM_PAGE_SET_HNDL_PHYS_STATE_ONLY(pPage, PGM_PAGE_HNDL_PHYS_STATE_ALL); 760 764 761 765 /* Flush its TLB entry. */ … … 839 843 ("%RGp %R[pgmpage]\n", GCPhys, pPage)); 840 844 #endif 841 PGM_PAGE_SET_HNDL_PHYS_STATE(pPage, PGM_PAGE_HNDL_PHYS_STATE_NONE );845 PGM_PAGE_SET_HNDL_PHYS_STATE(pPage, PGM_PAGE_HNDL_PHYS_STATE_NONE, false); 842 846 843 847 #ifdef VBOX_WITH_NATIVE_NEM … … 1399 1403 if (PGM_PAGE_GET_HNDL_PHYS_STATE(pPage) != PGM_PAGE_HNDL_PHYS_STATE_DISABLED) 1400 1404 { 1401 PGM_PAGE_SET_HNDL_PHYS_STATE (pPage, PGM_PAGE_HNDL_PHYS_STATE_DISABLED);1405 PGM_PAGE_SET_HNDL_PHYS_STATE_ONLY(pPage, PGM_PAGE_HNDL_PHYS_STATE_DISABLED); 1402 1406 pCur->cTmpOffPages++; 1403 1407 … … 1603 1607 PGM_PAGE_SET_STATE(pVM, pPage, PGM_PAGE_STATE_ALLOCATED); 1604 1608 PGM_PAGE_SET_PAGEID(pVM, pPage, PGM_PAGE_GET_PAGEID(pPageRemap)); 1605 PGM_PAGE_SET_HNDL_PHYS_STATE (pPage, PGM_PAGE_HNDL_PHYS_STATE_DISABLED);1609 PGM_PAGE_SET_HNDL_PHYS_STATE_ONLY(pPage, PGM_PAGE_HNDL_PHYS_STATE_DISABLED); 1606 1610 pCur->cAliasedPages++; 1607 1611 Assert(pCur->cAliasedPages <= pCur->cPages); … … 1727 1731 PGM_PAGE_SET_STATE(pVM, pPage, PGM_PAGE_STATE_ALLOCATED); 1728 1732 PGM_PAGE_SET_PAGEID(pVM, pPage, NIL_GMM_PAGEID); 1729 PGM_PAGE_SET_HNDL_PHYS_STATE (pPage, PGM_PAGE_HNDL_PHYS_STATE_DISABLED);1733 PGM_PAGE_SET_HNDL_PHYS_STATE_ONLY(pPage, PGM_PAGE_HNDL_PHYS_STATE_DISABLED); 1730 1734 pCur->cAliasedPages++; 1731 1735 Assert(pCur->cAliasedPages <= pCur->cPages); … … 1908 1912 { 1909 1913 PCPGMPHYSHANDLERTYPEINT pPhysType = pgmHandlerPhysicalTypeHandleToPtr(pVM, pPhys->hType); 1910 unsigned uState = pPhysType->uState; 1914 unsigned uState = pPhysType->uState; 1915 bool const fNotInHm = pPhysType->fNotInHm; /* whole pages, so no need to accumulate sub-page configs. */ 1911 1916 1912 1917 /* more? */ … … 1934 1939 State.cErrors++; 1935 1940 } 1941 AssertMsgStmt(PGM_PAGE_IS_HNDL_PHYS_NOT_IN_HM(pPage) == fNotInHm, 1942 ("ram range vs phys handler flags mismatch. GCPhys=%RGp fNotInHm=%d, %d %s\n", 1943 State.GCPhys, PGM_PAGE_IS_HNDL_PHYS_NOT_IN_HM(pPage), fNotInHm, pPhysType->pszDesc), 1944 State.cErrors++); 1936 1945 } 1937 1946 else -
trunk/src/VBox/VMM/VMMAll/PGMAllPool.cpp
r96966 r96979 3371 3371 if (!fFlushPTEs) 3372 3372 { 3373 /* Note! Disregarding the PGMPHYSHANDLER_F_NOT_IN_HM bit here. Should be harmless. */ 3373 3374 switch (PGM_PAGE_GET_HNDL_PHYS_STATE(pPhysPage)) 3374 3375 { … … 3447 3448 if (!fFlushPTEs) 3448 3449 { 3450 /* Note! Disregarding the PGMPHYSHANDLER_F_NOT_IN_HM bit here. Should be harmless. */ 3449 3451 switch (PGM_PAGE_GET_HNDL_PHYS_STATE(pPhysPage)) 3450 3452 { -
trunk/src/VBox/VMM/VMMR0/IEMR0.cpp
r96407 r96979 53 53 if (pGVM->cpum.ro.GuestFeatures.fVmx) 54 54 { 55 int rc = PGMR0HandlerPhysicalTypeSetUpContext(pGVM, PGMPHYSHANDLERKIND_ALL, 0 /*fFlags*/,55 int rc = PGMR0HandlerPhysicalTypeSetUpContext(pGVM, PGMPHYSHANDLERKIND_ALL, PGMPHYSHANDLER_F_NOT_IN_HM, 56 56 iemVmxApicAccessPageHandler, iemVmxApicAccessPagePfHandler, 57 57 "VMX APIC-access page", pGVM->iem.s.hVmxApicAccessPage); -
trunk/src/VBox/VMM/VMMR0/PGMR0.cpp
r96735 r96979 895 895 VERR_INVALID_HANDLE); 896 896 AssertMsgReturn(pTypeR3->fKeepPgmLock == RT_BOOL(fFlags & PGMPHYSHANDLER_F_KEEP_PGM_LOCK), 897 ("%#x: %d, fFlags=% d\n", hType, pTypeR3->fKeepPgmLock, fFlags),897 ("%#x: %d, fFlags=%#x\n", hType, pTypeR3->fKeepPgmLock, fFlags), 898 898 VERR_INVALID_HANDLE); 899 899 AssertMsgReturn(pTypeR3->fRing0DevInsIdx == RT_BOOL(fFlags & PGMPHYSHANDLER_F_R0_DEVINS_IDX), 900 ("%#x: %d, fFlags=%d\n", hType, pTypeR3->fRing0DevInsIdx, fFlags), 900 ("%#x: %d, fFlags=%#x\n", hType, pTypeR3->fRing0DevInsIdx, fFlags), 901 VERR_INVALID_HANDLE); 902 AssertMsgReturn(pTypeR3->fNotInHm == RT_BOOL(fFlags & PGMPHYSHANDLER_F_NOT_IN_HM), 903 ("%#x: %d, fFlags=%#x\n", hType, pTypeR3->fNotInHm, fFlags), 901 904 VERR_INVALID_HANDLE); 902 905 … … 909 912 pTypeR0->fKeepPgmLock = RT_BOOL(fFlags & PGMPHYSHANDLER_F_KEEP_PGM_LOCK); 910 913 pTypeR0->fRing0DevInsIdx = RT_BOOL(fFlags & PGMPHYSHANDLER_F_R0_DEVINS_IDX); 914 pTypeR0->fNotInHm = RT_BOOL(fFlags & PGMPHYSHANDLER_F_NOT_IN_HM); 911 915 pTypeR0->pfnHandler = pfnHandler; 912 916 pTypeR0->pfnPfHandler = pfnPfHandler; … … 1296 1300 { 1297 1301 PCPGMPHYSHANDLERTYPEINT pHandlerType = PGMPHYSHANDLER_GET_TYPE_NO_NULL(pGVM, pHandler); 1298 if (RT_LIKELY(pHandlerType->enmKind != PGMPHYSHANDLERKIND_WRITE)) 1302 if (RT_LIKELY( pHandlerType->enmKind != PGMPHYSHANDLERKIND_WRITE 1303 && !pHandlerType->fNotInHm /*paranoia*/ )) 1299 1304 { 1300 1305 /* -
trunk/src/VBox/VMM/VMMR3/IEMR3.cpp
r96811 r96979 246 246 if (pVM->cpum.ro.GuestFeatures.fVmx) 247 247 { 248 rc = PGMR3HandlerPhysicalTypeRegister(pVM, PGMPHYSHANDLERKIND_ALL, 0 /*fFlags*/,248 rc = PGMR3HandlerPhysicalTypeRegister(pVM, PGMPHYSHANDLERKIND_ALL, PGMPHYSHANDLER_F_NOT_IN_HM, 249 249 iemVmxApicAccessPageHandler, 250 250 "VMX APIC-access page", &pVM->iem.s.hVmxApicAccessPage); -
trunk/src/VBox/VMM/VMMR3/PGMHandler.cpp
r96407 r96979 128 128 pType->fKeepPgmLock = RT_BOOL(fFlags & PGMPHYSHANDLER_F_KEEP_PGM_LOCK); 129 129 pType->fRing0DevInsIdx = RT_BOOL(fFlags & PGMPHYSHANDLER_F_R0_DEVINS_IDX); 130 pType->fNotInHm = RT_BOOL(fFlags & PGMPHYSHANDLER_F_NOT_IN_HM); 130 131 pType->pfnHandler = pfnHandler; 131 132 pType->pszDesc = pszDesc; … … 182 183 if (RT_SUCCESS(rc)) 183 184 { 184 PGM_PAGE_SET_HNDL_PHYS_STATE(pPage, PGM_PAGE_HNDL_PHYS_STATE_NONE );185 PGM_PAGE_SET_HNDL_PHYS_STATE(pPage, PGM_PAGE_HNDL_PHYS_STATE_NONE, false); 185 186 186 187 #ifdef VBOX_WITH_NATIVE_NEM … … 228 229 if (RT_SUCCESS(rc)) 229 230 { 230 PGM_PAGE_SET_HNDL_PHYS_STATE(pPage, uState );231 PGM_PAGE_SET_HNDL_PHYS_STATE(pPage, uState, pType->fNotInHm); 231 232 232 233 #ifdef VBOX_WITH_NATIVE_NEM -
trunk/src/VBox/VMM/include/PGMInternal.h
r96958 r96979 86 86 87 87 /** 88 * Enables the nested APIC access page support tweaks in PGM.89 * If disabled, the nested VM's APIC accesses will by MMIO based in VT-x mode.90 */91 //#define PGM_WITH_NESTED_APIC_ACCESS_PAGE92 93 /**94 88 * Enables optimizations for MMIO handlers that exploits X86_TRAP_PF_RSVD and 95 89 * VMX_EXIT_EPT_MISCONFIG. … … 526 520 * @sa PGMPHYSHANDLER_F_R0_DEVINS_IDX */ 527 521 bool fRing0DevInsIdx; 528 bool afPadding[1]; 522 /** See PGMPHYSHANDLER_F_NOT_IN_HM. */ 523 bool fNotInHm : 1; 529 524 /** Pointer to the ring-0 callback function. */ 530 525 R0PTRTYPE(PFNPGMPHYSHANDLER) pfnHandler; … … 557 552 /** Set by ring-0 if the handler is ring-0 enabled (for debug). */ 558 553 bool fRing0Enabled : 1; 554 /** See PGMPHYSHANDLER_F_NOT_IN_HM. */ 555 bool fNotInHm : 1; 559 556 /** Pointer to the ring-3 callback function. */ 560 557 R3PTRTYPE(PFNPGMPHYSHANDLER) pfnHandler; … … 662 659 * (PGM_PAGE_PDE_TYPE_*). */ 663 660 uint64_t u2PDETypeY : 2; 664 /** 4 - Unused (was used by FTE for dirty tracking). */665 uint64_t f Unused1: 1;661 /** 4 - Don't apply the physical handler in HM mode (nested APIC hack). */ 662 uint64_t fHandlerPhysNotInHm : 1; 666 663 /** 5 - Flag indicating that a write monitored page was written to 667 664 * when set. */ … … 1060 1057 * @param a_pPage Pointer to the physical guest page tracking structure. 1061 1058 * @param a_uState The new state value. 1062 */ 1063 #define PGM_PAGE_SET_HNDL_PHYS_STATE(a_pPage, a_uState) \ 1059 * @param a_fNotIHm The PGMPHYSHANDLER_F_NOT_HM bit. 1060 */ 1061 #define PGM_PAGE_SET_HNDL_PHYS_STATE(a_pPage, a_uState, a_fNotInHm) \ 1062 do { (a_pPage)->s.u2HandlerPhysStateY = (a_uState); (a_pPage)->s.fHandlerPhysNotInHm = (a_fNotInHm); } while (0) 1063 1064 /** 1065 * Sets the physical access handler state of a page. 1066 * @param a_pPage Pointer to the physical guest page tracking structure. 1067 * @param a_uState The new state value. 1068 */ 1069 #define PGM_PAGE_SET_HNDL_PHYS_STATE_ONLY(a_pPage, a_uState) \ 1064 1070 do { (a_pPage)->s.u2HandlerPhysStateY = (a_uState); } while (0) 1065 1071 … … 1104 1110 ( PGM_PAGE_GET_HNDL_PHYS_STATE(a_pPage) == PGM_PAGE_HNDL_PHYS_STATE_ALL ) 1105 1111 1112 /** @def PGM_PAGE_IS_HNDL_PHYS_NOT_IN_HM 1113 * Checks if the physical handlers of the page should be ignored in shadow page 1114 * tables and such. 1115 * @returns true/false 1116 * @param a_pPage Pointer to the physical guest page tracking structure. 1117 */ 1118 #define PGM_PAGE_IS_HNDL_PHYS_NOT_IN_HM(a_pPage) ((a_pPage)->s.fHandlerPhysNotInHm) 1106 1119 1107 1120 /** @def PGM_PAGE_GET_TRACKING -
trunk/src/VBox/VMM/testcase/tstVMStructSize.cpp
r96511 r96979 436 436 CHECK_EXPR(PGM_PAGE_HAS_ACTIVE_ALL_HANDLERS(&Page) == false); 437 437 438 PGM_PAGE_SET_HNDL_PHYS_STATE(&Page, PGM_PAGE_HNDL_PHYS_STATE_ALL );438 PGM_PAGE_SET_HNDL_PHYS_STATE(&Page, PGM_PAGE_HNDL_PHYS_STATE_ALL, false); 439 439 CHECK_EXPR(PGM_PAGE_GET_HNDL_PHYS_STATE(&Page) == PGM_PAGE_HNDL_PHYS_STATE_ALL); 440 440 CHECK_EXPR(PGM_PAGE_HAS_ANY_HANDLERS(&Page) == true); … … 442 442 CHECK_EXPR(PGM_PAGE_HAS_ACTIVE_ALL_HANDLERS(&Page) == true); 443 443 444 PGM_PAGE_SET_HNDL_PHYS_STATE(&Page, PGM_PAGE_HNDL_PHYS_STATE_WRITE );444 PGM_PAGE_SET_HNDL_PHYS_STATE(&Page, PGM_PAGE_HNDL_PHYS_STATE_WRITE, false); 445 445 CHECK_EXPR(PGM_PAGE_GET_HNDL_PHYS_STATE(&Page) == PGM_PAGE_HNDL_PHYS_STATE_WRITE); 446 446 CHECK_EXPR(PGM_PAGE_HAS_ANY_HANDLERS(&Page) == true);
Note:
See TracChangeset
for help on using the changeset viewer.