- Timestamp:
- Feb 24, 2022 9:13:26 AM (3 years ago)
- Location:
- trunk/src/VBox/VMM
- Files:
-
- 13 edited
-
Config.kmk (modified) (1 diff)
-
VMMAll/PGMAll.cpp (modified) (1 diff)
-
VMMAll/PGMAllBth.h (modified) (2 diffs)
-
VMMAll/PGMAllShw.h (modified) (1 diff)
-
VMMR3/CPUM.cpp (modified) (4 diffs)
-
VMMR3/CPUMR3CpuId.cpp (modified) (2 diffs)
-
VMMR3/HM.cpp (modified) (2 diffs)
-
VMMR3/NEMR3.cpp (modified) (1 diff)
-
VMMR3/PGM.cpp (modified) (2 diffs)
-
VMMR3/PGMPhys.cpp (modified) (5 diffs)
-
include/NEMInternal.h (modified) (1 diff)
-
include/PGMInternal.h (modified) (1 diff)
-
testcase/tstVMStructSize.cpp (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/Config.kmk
r93419 r93905 78 78 VMM_COMMON_DEFS += VBOX_WITH_LINEAR_HOST_PHYS_MEM 79 79 endif 80 ifn1of ($(KBUILD_TARGET_ARCH), amd64 x86) 81 VMM_COMMON_DEFS += VBOX_WITH_PGM_NEM_MODE 82 endif 80 83 81 84 # VMM_COMMON_DEFS += VBOX_WITH_NS_ACCOUNTING_STATS -
trunk/src/VBox/VMM/VMMAll/PGMAll.cpp
r93901 r93905 3152 3152 3153 3153 /* 3154 * Override the shadow mode when NEM or nested paging is active.3154 * Override the shadow mode when NEM, IEM or nested paging is active. 3155 3155 */ 3156 if (VM_IS_NEM_ENABLED(pVM)) 3157 { 3156 if (!VM_IS_HM_ENABLED(pVM)) 3157 { 3158 Assert(VM_IS_NEM_ENABLED(pVM) || VM_IS_EXEC_ENGINE_IEM(pVM)); 3158 3159 pVM->pgm.s.fNestedPaging = true; 3159 3160 enmShadowMode = PGMMODE_NONE; -
trunk/src/VBox/VMM/VMMAll/PGMAllBth.h
r93824 r93905 111 111 PVMCC pVM = pVCpu->CTX_SUFF(pVM); 112 112 113 Assert( (HMIsNestedPagingActive(pVM) || VM_IS_NEM_ENABLED(pVM)) == pVM->pgm.s.fNestedPaging);113 Assert(HMIsNestedPagingActive(pVM)); 114 114 Assert(!pVM->pgm.s.fNestedPaging); 115 115 … … 2866 2866 2867 2867 # if defined(PGM_WITH_LARGE_PAGES) && PGM_SHW_TYPE != PGM_TYPE_32BIT && PGM_SHW_TYPE != PGM_TYPE_PAE 2868 if ( BTH_IS_NP_ACTIVE(pVM) 2869 && !VM_IS_NEM_ENABLED(pVM)) /** @todo NEM: Large page support. */ 2870 { 2868 if (BTH_IS_NP_ACTIVE(pVM)) 2869 { 2870 Assert(!VM_IS_NEM_ENABLED(pVM)); 2871 2871 2872 /* Check if we allocated a big page before for this 2 MB range. */ 2872 2873 PPGMPAGE pPage; -
trunk/src/VBox/VMM/VMMAll/PGMAllShw.h
r93617 r93905 234 234 PVMCC pVM = pVCpu->CTX_SUFF(pVM); 235 235 236 Assert( (HMIsNestedPagingActive(pVM) || VM_IS_NEM_ENABLED(pVM)) == pVM->pgm.s.fNestedPaging);236 Assert(HMIsNestedPagingActive(pVM)); 237 237 Assert(pVM->pgm.s.fNestedPaging); 238 238 Assert(!pVCpu->pgm.s.pShwPageCR3R3); -
trunk/src/VBox/VMM/VMMR3/CPUM.cpp
r93830 r93905 2046 2046 * Check that the CPU supports the minimum features we require. 2047 2047 */ 2048 #if defined(RT_ARCH_AMD64) || defined(RT_ARCH_X86) 2048 2049 if (!pVM->cpum.s.HostFeatures.fFxSaveRstor) 2049 2050 return VMSetError(pVM, VERR_UNSUPPORTED_CPU, RT_SRC_POS, "Host CPU does not support the FXSAVE/FXRSTOR instruction."); … … 2052 2053 if (!pVM->cpum.s.HostFeatures.fTsc) 2053 2054 return VMSetError(pVM, VERR_UNSUPPORTED_CPU, RT_SRC_POS, "Host CPU does not support RDTSC."); 2055 #endif 2054 2056 2055 2057 /* … … 2081 2083 * Initialize the host XSAVE/XRSTOR mask. 2082 2084 */ 2085 #if defined(RT_ARCH_X86) || defined(RT_ARCH_AMD64) 2083 2086 uint32_t cbMaxXState = pVM->cpum.s.HostFeatures.cbMaxExtendedState; 2084 2087 cbMaxXState = RT_ALIGN(cbMaxXState, 128); … … 2087 2090 && pVM->cpum.s.HostFeatures.cbMaxExtendedState <= sizeof(pVM->apCpusR3[0]->cpum.s.Guest.XState) 2088 2091 , VERR_CPUM_IPE_2); 2092 #endif 2089 2093 2090 2094 for (VMCPUID i = 0; i < pVM->cCpus; i++) -
trunk/src/VBox/VMM/VMMR3/CPUMR3CpuId.cpp
r93745 r93905 4354 4354 bool const fMayHaveXSave = pVM->cpum.s.HostFeatures.fXSaveRstor 4355 4355 && pVM->cpum.s.HostFeatures.fOpSysXSaveRstor 4356 && ( !VM_IS_NEM_ENABLED(pVM) 4357 ? fNestedPagingAndFullGuestExec 4358 : NEMHCGetFeatures(pVM) & NEM_FEAT_F_XSAVE_XRSTOR); 4356 && ( VM_IS_NEM_ENABLED(pVM) 4357 ? NEMHCGetFeatures(pVM) & NEM_FEAT_F_XSAVE_XRSTOR 4358 : VM_IS_EXEC_ENGINE_IEM(pVM) 4359 ? false /** @todo IEM and XSAVE @bugref{9898} */ 4360 : fNestedPagingAndFullGuestExec); 4359 4361 uint64_t const fXStateHostMask = pVM->cpum.s.fXStateHostMask; 4360 4362 … … 4557 4559 RT_ZERO(Config); 4558 4560 4559 bool const fNestedPagingAndFullGuestExec = VM_IS_NEM_ENABLED(pVM) || HMAreNestedPagingAndFullGuestExecEnabled(pVM); 4561 bool const fNestedPagingAndFullGuestExec = VM_IS_NEM_ENABLED(pVM) 4562 || VM_IS_EXEC_ENGINE_IEM(pVM) 4563 || HMAreNestedPagingAndFullGuestExecEnabled(pVM); 4560 4564 int rc = cpumR3CpuIdReadConfig(pVM, &Config, pCpumCfg, fNestedPagingAndFullGuestExec); 4561 4565 AssertRCReturn(rc, rc); -
trunk/src/VBox/VMM/VMMR3/HM.cpp
r93901 r93905 638 638 LogRel(("HM: HMR3Init: Falling back on IEM: %s\n", !fFallbackToNEM ? pszMsg : "NEM not available")); 639 639 VM_SET_MAIN_EXECUTION_ENGINE(pVM, VM_EXEC_ENGINE_IEM); 640 #ifdef VBOX_WITH_PGM_NEM_MODE 641 PGMR3EnableNemMode(pVM); 642 #endif 640 643 } 641 644 else … … 667 670 LogRel(("HM: HMR3Init: Falling back on IEM%s\n", fUseNEMInstead ? ": NEM not available" : "")); 668 671 VM_SET_MAIN_EXECUTION_ENGINE(pVM, VM_EXEC_ENGINE_IEM); 672 #ifdef VBOX_WITH_PGM_NEM_MODE 673 PGMR3EnableNemMode(pVM); 674 #endif 669 675 } 670 676 -
trunk/src/VBox/VMM/VMMR3/NEMR3.cpp
r93788 r93905 451 451 } 452 452 453 454 453 #ifndef VBOX_WITH_NATIVE_NEM 454 455 455 VMMR3_INT_DECL(void) NEMR3NotifySetA20(PVMCPU pVCpu, bool fEnabled) 456 456 { 457 457 RT_NOREF(pVCpu, fEnabled); 458 458 } 459 #endif 460 459 460 # ifdef VBOX_WITH_PGM_NEM_MODE 461 462 VMMR3_INT_DECL(bool) NEMR3IsMmio2DirtyPageTrackingSupported(PVM pVM) 463 { 464 RT_NOREF(pVM); 465 return false; 466 } 467 468 469 VMMR3_INT_DECL(int) NEMR3PhysMmio2QueryAndResetDirtyBitmap(PVM pVM, RTGCPHYS GCPhys, RTGCPHYS cb, uint32_t uNemRange, 470 void *pvBitmap, size_t cbBitmap) 471 { 472 RT_NOREF(pVM, GCPhys, cb, uNemRange, pvBitmap, cbBitmap); 473 AssertFailed(); 474 return VERR_INTERNAL_ERROR_2; 475 } 476 477 478 VMMR3_INT_DECL(int) NEMR3NotifyPhysMmioExMapEarly(PVM pVM, RTGCPHYS GCPhys, RTGCPHYS cb, uint32_t fFlags, 479 void *pvRam, void *pvMmio2, uint8_t *pu2State, uint32_t *puNemRange) 480 { 481 RT_NOREF(pVM, GCPhys, cb, fFlags, pvRam, pvMmio2, pu2State, puNemRange); 482 AssertFailed(); 483 return VERR_INTERNAL_ERROR_2; 484 } 485 486 # endif /* VBOX_WITH_PGM_NEM_MODE */ 487 #endif /* !VBOX_WITH_NATIVE_NEM */ 461 488 462 489 /** -
trunk/src/VBox/VMM/VMMR3/PGM.cpp
r93824 r93905 1135 1135 case SUPPAGINGMODE_PAE_NX: 1136 1136 case SUPPAGINGMODE_PAE_GLOBAL_NX: 1137 break;1138 1137 1139 1138 case SUPPAGINGMODE_AMD64: … … 1148 1147 } 1149 1148 break; 1149 #if !defined(RT_ARCH_AMD64) && !defined(RT_ARCH_X86) 1150 case SUPPAGINGMODE_INVALID: 1151 pVM->pgm.s.enmHostMode = SUPPAGINGMODE_AMD64_GLOBAL_NX; 1152 break; 1153 #endif 1150 1154 default: 1151 1155 AssertMsgFailed(("Host mode %d is not supported\n", pVM->pgm.s.enmHostMode)); -
trunk/src/VBox/VMM/VMMR3/PGMPhys.cpp
r93650 r93905 1498 1498 if (pVM->pgm.s.fNemMode) 1499 1499 { 1500 Assert(VM_IS_NEM_ENABLED(pVM)); 1501 uint32_t const fNemNotify = (pvMmio2 ? NEM_NOTIFY_PHYS_MMIO_EX_F_MMIO2 : 0) | NEM_NOTIFY_PHYS_MMIO_EX_F_REPLACE; 1502 uint8_t u2State = 0; /* (We don't support UINT8_MAX here.) */ 1503 int rc = NEMR3NotifyPhysMmioExMapEarly(pVM, GCPhys, GCPhysLast - GCPhys + 1, fNemNotify, 1504 pRam->pvR3 ? (uint8_t *)pRam->pvR3 + GCPhys - pRam->GCPhys : NULL, 1505 pvMmio2, &u2State, NULL /*puNemRange*/); 1506 AssertLogRelRCReturn(rc, rc); 1500 Assert(VM_IS_NEM_ENABLED(pVM) || VM_IS_EXEC_ENGINE_IEM(pVM)); 1501 uint8_t u2State = 0; /* (We don't support UINT8_MAX here.) */ 1502 if (VM_IS_NEM_ENABLED(pVM)) 1503 { 1504 uint32_t const fNemNotify = (pvMmio2 ? NEM_NOTIFY_PHYS_MMIO_EX_F_MMIO2 : 0) | NEM_NOTIFY_PHYS_MMIO_EX_F_REPLACE; 1505 int rc = NEMR3NotifyPhysMmioExMapEarly(pVM, GCPhys, GCPhysLast - GCPhys + 1, fNemNotify, 1506 pRam->pvR3 ? (uint8_t *)pRam->pvR3 + GCPhys - pRam->GCPhys : NULL, 1507 pvMmio2, &u2State, NULL /*puNemRange*/); 1508 AssertLogRelRCReturn(rc, rc); 1509 } 1507 1510 1508 1511 /* Iterate the pages. */ … … 1511 1514 while (cPagesLeft-- > 0) 1512 1515 { 1513 rc = pgmPhysFreePage(pVM, NULL, NULL, pPageDst, GCPhys, PGMPAGETYPE_MMIO);1516 int rc = pgmPhysFreePage(pVM, NULL, NULL, pPageDst, GCPhys, PGMPAGETYPE_MMIO); 1514 1517 AssertLogRelRCReturn(rc, rc); /* We're done for if this goes wrong. */ 1515 1518 … … 1520 1523 pPageDst++; 1521 1524 } 1522 return rc;1525 return VINF_SUCCESS; 1523 1526 } 1524 1527 #else /* !VBOX_WITH_PGM_NEM_MODE */ … … 3051 3054 #ifdef VBOX_WITH_PGM_NEM_MODE 3052 3055 if (PGM_IS_IN_NEM_MODE(pVM)) 3053 {3054 for (uint32_t i = 0; i < cHostPages; i++)3055 {3056 paPages[i].Phys = UINT64_C(0x0000fffffffff000);3057 paPages[i].uReserved = 0;3058 }3059 3056 rc = SUPR3PageAlloc(cHostPages, pVM->pgm.s.fUseLargePages ? SUP_PAGE_ALLOC_F_LARGE_PAGES : 0, &pvPages); 3060 }3061 3057 else 3062 3058 #endif … … 3093 3089 3094 3090 uint32_t iDstPage = pCur->RamRange.cb >> GUEST_PAGE_SHIFT; 3095 while (iDstPage-- > 0) 3091 #ifdef VBOX_WITH_PGM_NEM_MODE 3092 if (PGM_IS_IN_NEM_MODE(pVM)) 3093 while (iDstPage-- > 0) 3094 PGM_PAGE_INIT(&pNew->RamRange.aPages[iDstPage], UINT64_C(0x0000ffffffff0000), 3095 PGM_MMIO2_PAGEID_MAKE(idMmio2, iDstPage), 3096 PGMPAGETYPE_MMIO2, PGM_PAGE_STATE_ALLOCATED); 3097 else 3098 #endif 3096 3099 { 3097 PGM_PAGE_INIT(&pNew->RamRange.aPages[iDstPage], 3098 paPages[iDstPage + iSrcPage].Phys, 3099 PGM_MMIO2_PAGEID_MAKE(idMmio2, iDstPage), 3100 PGMPAGETYPE_MMIO2, PGM_PAGE_STATE_ALLOCATED); 3100 AssertRelease(HOST_PAGE_SHIFT == GUEST_PAGE_SHIFT); 3101 while (iDstPage-- > 0) 3102 PGM_PAGE_INIT(&pNew->RamRange.aPages[iDstPage], paPages[iDstPage + iSrcPage].Phys, 3103 PGM_MMIO2_PAGEID_MAKE(idMmio2, iDstPage), 3104 PGMPAGETYPE_MMIO2, PGM_PAGE_STATE_ALLOCATED); 3101 3105 } 3102 3106 -
trunk/src/VBox/VMM/include/NEMInternal.h
r93831 r93905 44 44 */ 45 45 46 #if defined(VBOX_WITH_PGM_NEM_MODE) && !defined(VBOX_WITH_NATIVE_NEM) 46 #if defined(VBOX_WITH_PGM_NEM_MODE) && !defined(VBOX_WITH_NATIVE_NEM) && !defined(RT_ARCH_ARM64) 47 47 # error "VBOX_WITH_PGM_NEM_MODE requires VBOX_WITH_NATIVE_NEM to be defined" 48 48 #endif -
trunk/src/VBox/VMM/include/PGMInternal.h
r93824 r93905 719 719 do { \ 720 720 RTHCPHYS SetHCPhysTmp = (a_HCPhys); \ 721 AssertFatal (!(SetHCPhysTmp & ~UINT64_C(0x0000fffffffff000))); \721 AssertFatalMsg(!(SetHCPhysTmp & ~UINT64_C(0x0000fffffffff000)), ("%RHp\n", SetHCPhysTmp)); \ 722 722 (a_pPage)->au64[0] = SetHCPhysTmp; \ 723 723 (a_pPage)->au64[1] = 0; \ -
trunk/src/VBox/VMM/testcase/tstVMStructSize.cpp
r93718 r93905 439 439 440 440 #undef AssertFatal 441 #define AssertFatal(expr) do { } while (0) 441 #define AssertFatal(expr) do { } while (0) 442 #undef AssertFatalMsg 443 #define AssertFatalMsg(expr, msg) do { } while (0) 442 444 #undef Assert 443 #define Assert(expr) do { } while (0)445 #define Assert(expr) do { } while (0) 444 446 445 447 PGM_PAGE_CLEAR(&Page);
Note:
See TracChangeset
for help on using the changeset viewer.

