Lines Matching defs:pVM

41 static DECLCALLBACK(bool) mmR3HyperRelocateCallback(PVM pVM, RTGCPTR GCPtrOld, RTGCPTR GCPtrNew, PGMRELOCATECALL enmMode,
43 static int mmR3HyperMap(PVM pVM, const size_t cb, const char *pszDesc, PRTGCPTR pGCPtr, PMMLOOKUPHYPER *ppLookup);
44 static int mmR3HyperHeapCreate(PVM pVM, const size_t cb, PMMHYPERHEAP *ppHeap, PRTR0PTR pR0PtrHeap);
45 static int mmR3HyperHeapMap(PVM pVM, PMMHYPERHEAP pHeap, PRTGCPTR ppHeapGC);
46 static DECLCALLBACK(void) mmR3HyperInfoHma(PVM pVM, PCDBGFINFOHLP pHlp, const char *pszArgs);
53 * @param pVM Pointer to the VM.
55 static uint32_t mmR3HyperComputeHeapSize(PVM pVM)
61 int rc = CFGMR3QueryBoolDef(CFGMR3GetChild(CFGMR3GetRoot(pVM), "MM"), "CanUseLargerHeap", &fCanUseLargerHeap, false);
65 rc = CFGMR3QueryU64(CFGMR3GetRoot(pVM), "RamSize", &cbRam);
73 && !HMIsEnabled(pVM)
88 if (pVM->cCpus > 1)
89 cbHeap += pVM->cCpus * _64K;
108 int mmR3HyperInit(PVM pVM)
116 pVM->mm.s.pvHyperAreaGC = (RTGCPTR)MM_HYPER_AREA_ADDRESS;
117 pVM->mm.s.cbHyperArea = MM_HYPER_AREA_MAX_SIZE;
118 AssertRelease(RT_ALIGN_T(pVM->mm.s.pvHyperAreaGC, 1 << X86_PD_SHIFT, RTGCPTR) == pVM->mm.s.pvHyperAreaGC);
119 Assert(pVM->mm.s.pvHyperAreaGC < 0xff000000);
125 PCFGMNODE pMM = CFGMR3GetChild(CFGMR3GetRoot(pVM), "MM");
127 int rc = CFGMR3QueryU32Def(pMM, "cbHyperHeap", &cbHyperHeap, mmR3HyperComputeHeapSize(pVM));
139 rc = mmR3HyperHeapCreate(pVM, cbHyperHeap, &pVM->mm.s.pHyperHeapR3, &pVM->mm.s.pHyperHeapR0);
145 MMR3HyperReserve(pVM, PAGE_SIZE, "fence", NULL);
150 AssertRelease(pVM->cbSelf == RT_UOFFSETOF(VM, aCpus[pVM->cCpus]));
152 rc = MMR3HyperMapPages(pVM, pVM, pVM->pVMR0, RT_ALIGN_Z(pVM->cbSelf, PAGE_SIZE) >> PAGE_SHIFT, pVM->paVMPagesR3, "VM",
156 pVM->pVMRC = (RTRCPTR)GCPtr;
157 for (VMCPUID i = 0; i < pVM->cCpus; i++)
158 pVM->aCpus[i].pVMRC = pVM->pVMRC;
161 MMR3HyperReserve(pVM, PAGE_SIZE, "fence", NULL);
166 rc = mmR3HyperHeapMap(pVM, pVM->mm.s.pHyperHeapR3, &GCPtr);
169 pVM->mm.s.pHyperHeapRC = (RTRCPTR)GCPtr;
170 Assert(pVM->mm.s.pHyperHeapRC == GCPtr);
175 DBGFR3InfoRegisterInternal(pVM, "hma", "Show the layout of the Hypervisor Memory Area.", mmR3HyperInfoHma);
194 int mmR3HyperTerm(PVM pVM)
196 if (pVM->mm.s.pHyperHeapR3)
197 PDMR3CritSectDelete(&pVM->mm.s.pHyperHeapR3->Lock);
211 VMMR3DECL(int) MMR3HyperInitFinalize(PVM pVM)
218 int rc = PDMR3CritSectInit(pVM, &pVM->mm.s.pHyperHeapR3->Lock, RT_SRC_POS, "MM-HYPER");
224 while ((RTINT)pVM->mm.s.offHyperNextStatic + 64*_1K < (RTINT)pVM->mm.s.cbHyperArea - _4M)
225 pVM->mm.s.cbHyperArea -= _4M;
226 rc = PGMR3MapPT(pVM, pVM->mm.s.pvHyperAreaGC, pVM->mm.s.cbHyperArea, 0 /*fFlags*/,
230 pVM->mm.s.fPGMInitialized = true;
235 PMMLOOKUPHYPER pLookup = (PMMLOOKUPHYPER)((uintptr_t)pVM->mm.s.pHyperHeapR3 + pVM->mm.s.offLookupHyper);
238 RTGCPTR GCPtr = pVM->mm.s.pvHyperAreaGC + pLookup->off;
247 rc = PGMMap(pVM, GCPtr + (i << PAGE_SHIFT), paHCPhysPages[i], PAGE_SIZE, 0);
254 rc = PGMMap(pVM, GCPtr, pLookup->u.HCPhys.HCPhys, pLookup->cb, 0);
264 rc = PGMPhysGCPhys2HCPhys(pVM, GCPhys + off, &HCPhys);
267 rc = PGMMap(pVM, GCPtr + off, HCPhys, PAGE_SIZE, 0);
280 rc = PGMR3PhysMMIO2GetHCPhys(pVM, pLookup->u.MMIO2.pDevIns, pLookup->u.MMIO2.iRegion, offCur, &HCPhys);
283 rc = PGMMap(pVM, GCPtr + (offCur - pLookup->u.MMIO2.off), HCPhys, PAGE_SIZE, 0);
328 * @param pVM Pointer to the VM.
336 static DECLCALLBACK(bool) mmR3HyperRelocateCallback(PVM pVM, RTGCPTR GCPtrOld, RTGCPTR GCPtrNew,
356 AssertMsg(GCPtrOld == pVM->mm.s.pvHyperAreaGC,
357 ("GCPtrOld=%RGv pVM->mm.s.pvHyperAreaGC=%RGv\n", GCPtrOld, pVM->mm.s.pvHyperAreaGC));
364 pVM->pVMRC += offDelta;
365 for (VMCPUID i = 0; i < pVM->cCpus; i++)
366 pVM->aCpus[i].pVMRC = pVM->pVMRC;
368 pVM->mm.s.pvHyperAreaGC += offDelta;
369 Assert(pVM->mm.s.pvHyperAreaGC < _4G);
370 pVM->mm.s.pHyperHeapRC += offDelta;
371 pVM->mm.s.pHyperHeapR3->pbHeapRC += offDelta;
372 pVM->mm.s.pHyperHeapR3->pVMRC = pVM->pVMRC;
377 VMR3Relocate(pVM, offDelta);
392 * @param pVM Pointer to the VM.
394 VMMR3DECL(int) MMR3LockCall(PVM pVM)
396 PMMHYPERHEAP pHeap = pVM->mm.s.CTX_SUFF(pHyperHeap);
408 * @param pVM Pointer to the VM.
417 VMMR3DECL(int) MMR3HyperMapHCPhys(PVM pVM, void *pvR3, RTR0PTR pvR0, RTHCPHYS HCPhys, size_t cb,
438 int rc = mmR3HyperMap(pVM, cbAligned, pszDesc, &GCPtr, &pLookup);
449 if (pVM->mm.s.fPGMInitialized)
450 rc = PGMMap(pVM, GCPtr, HCPhys, cbAligned, 0);
463 * @param pVM Pointer to the VM.
469 VMMR3DECL(int) MMR3HyperMapGCPhys(PVM pVM, RTGCPHYS GCPhys, size_t cb, const char *pszDesc, PRTGCPTR pGCPtr)
485 int rc = mmR3HyperMap(pVM, cb, pszDesc, &GCPtr, &pLookup);
497 rc = PGMPhysGCPhys2HCPhys(pVM, GCPhys + off, &HCPhys);
504 if (pVM->mm.s.fPGMInitialized)
506 rc = PGMMap(pVM, GCPtr + off, HCPhys, PAGE_SIZE, 0);
532 * @param pVM Pointer to the VM.
540 VMMR3DECL(int) MMR3HyperMapMMIO2(PVM pVM, PPDMDEVINS pDevIns, uint32_t iRegion, RTGCPHYS off, RTGCPHYS cb,
561 rc = PGMR3PhysMMIO2GetHCPhys(pVM, pDevIns, iRegion, offCur, &HCPhys);
570 rc = mmR3HyperMap(pVM, cb, pszDesc, &GCPtr, &pLookup);
581 if (pVM->mm.s.fPGMInitialized)
586 rc = PGMR3PhysMMIO2GetHCPhys(pVM, pDevIns, iRegion, offCur, &HCPhys);
588 rc = PGMMap(pVM, GCPtr + (offCur - off), HCPhys, PAGE_SIZE, 0);
613 * @param pVM Pointer to the VM.
621 VMMR3DECL(int) MMR3HyperMapPages(PVM pVM, void *pvR3, RTR0PTR pvR0, size_t cPages, PCSUPPAGE paPages,
643 int rc = mmR3HyperMap(pVM, cPages << PAGE_SHIFT, pszDesc, &GCPtr, &pLookup);
649 PRTHCPHYS paHCPhysPages = (PRTHCPHYS)MMR3HeapAlloc(pVM, MM_TAG_MM, sizeof(RTHCPHYS) * cPages);
662 if (pVM->mm.s.fPGMInitialized)
666 rc = PGMMap(pVM, GCPtr + (i << PAGE_SHIFT), paHCPhysPages[i], PAGE_SIZE, 0);
695 * @param pVM Pointer to the VM.
700 VMMR3DECL(int) MMR3HyperReserve(PVM pVM, unsigned cb, const char *pszDesc, PRTGCPTR pGCPtr)
720 int rc = mmR3HyperMap(pVM, cb, pszDesc, &GCPtr, &pLookup);
736 * @param pVM Pointer to the VM.
744 static int mmR3HyperMap(PVM pVM, const size_t cb, const char *pszDesc, PRTGCPTR pGCPtr, PMMLOOKUPHYPER *ppLookup)
751 if (pVM->mm.s.offHyperNextStatic + cbAligned >= pVM->mm.s.cbHyperArea) /* don't use the last page, it's a fence. */
754 pVM->mm.s.offHyperNextStatic, cbAligned, pVM->mm.s.cbHyperArea));
762 int rc = MMHyperAlloc(pVM, sizeof(*pLookup), 1, MM_TAG_MM, (void **)&pLookup);
768 pLookup->offNext = pVM->mm.s.offLookupHyper;
770 pLookup->off = pVM->mm.s.offHyperNextStatic;
771 pVM->mm.s.offLookupHyper = (uint8_t *)pLookup - (uint8_t *)pVM->mm.s.pHyperHeapR3;
773 pLookup->offNext -= pVM->mm.s.offLookupHyper;
779 *pGCPtr = pVM->mm.s.pvHyperAreaGC + pVM->mm.s.offHyperNextStatic;
780 pVM->mm.s.offHyperNextStatic += cbAligned;
796 * @param pVM Pointer to the VM.
802 static int mmR3HyperHeapCreate(PVM pVM, const size_t cb, PMMHYPERHEAP *ppHeap, PRTR0PTR pR0PtrHeap)
810 PSUPPAGE paPages = (PSUPPAGE)MMR3HeapAlloc(pVM, MM_TAG_MM, cPages * sizeof(paPages[0]));
839 pHeap->pVMR3 = pVM;
840 pHeap->pVMR0 = pVM->pVMR0;
841 pHeap->pVMRC = pVM->pVMRC;
858 STAMR3Register(pVM, &pHeap->cbHeap, STAMTYPE_U32, STAMVISIBILITY_ALWAYS, "/MM/HyperHeap/cbHeap", STAMUNIT_BYTES, "The heap size.");
859 STAMR3Register(pVM, &pHeap->cbFree, STAMTYPE_U32, STAMVISIBILITY_ALWAYS, "/MM/HyperHeap/cbFree", STAMUNIT_BYTES, "The free space.");
874 static int mmR3HyperHeapMap(PVM pVM, PMMHYPERHEAP pHeap, PRTGCPTR ppHeapGC)
878 int rc = MMR3HyperMapPages(pVM,
886 pHeap->pVMRC = pVM->pVMRC;
889 MMR3HyperReserve(pVM, PAGE_SIZE, "fence", NULL);
910 * @param pVM Pointer to the VM.
920 VMMR3DECL(int) MMR3HyperAllocOnceNoRel(PVM pVM, size_t cb, unsigned uAlignment, MMTAG enmTag, void **ppv)
922 return MMR3HyperAllocOnceNoRelEx(pVM, cb, uAlignment, enmTag, 0/*fFlags*/, ppv);
937 * @param pVM Pointer to the VM.
947 VMMR3DECL(int) MMR3HyperAllocOnceNoRelEx(PVM pVM, size_t cb, unsigned uAlignment, MMTAG enmTag, uint32_t fFlags, void **ppv)
962 || VMR3GetState(pVM) != VMSTATE_CREATING
966 int rc = MMHyperAlloc(pVM, cb, uAlignment, enmTag, ppv);
980 if (HMIsEnabled(pVM))
1036 rc = MMR3HyperMapPages(pVM,
1041 MMR3HeapAPrintf(pVM, MM_TAG_MM, "alloc once (%s)", mmGetTagName(enmTag)),
1048 MMR3HyperReserve(pVM, PAGE_SIZE, "fence", NULL);
1061 int rc2 = MMHyperAlloc(pVM, cb, uAlignment, enmTag, ppv);
1083 * @param pVM Pointer to the VM.
1086 DECLINLINE(PMMLOOKUPHYPER) mmR3HyperLookupR3(PVM pVM, void *pvR3)
1088 PMMLOOKUPHYPER pLookup = (PMMLOOKUPHYPER)((uint8_t *)pVM->mm.s.pHyperHeapR3 + pVM->mm.s.offLookupHyper);
1132 * @param pVM Pointer to the VM.
1138 VMMR3DECL(int) MMR3HyperSetGuard(PVM pVM, void *pvStart, size_t cb, bool fSet)
1146 PMMLOOKUPHYPER pLookup = mmR3HyperLookupR3(pVM, pvStart);
1163 rc = PGMMapSetPage(pVM, MMHyperR3ToRC(pVM, pvStart), cb, 0);
1168 rc = PGMMapSetPage(pVM, MMHyperR3ToRC(pVM, pvStart), cb, X86_PTE_P | X86_PTE_A | X86_PTE_D | X86_PTE_RW);
1179 * @param pVM Pointer to the VM
1182 VMMR3DECL(RTHCPHYS) MMR3HyperHCVirt2HCPhys(PVM pVM, void *pvR3)
1184 PMMLOOKUPHYPER pLookup = (PMMLOOKUPHYPER)((uint8_t *)pVM->mm.s.pHyperHeapR3 + pVM->mm.s.offLookupHyper);
1231 * @param pVM Pointer to the VM.
1238 static int mmR3HyperQueryInfoFromHCPhysFound(PVM pVM, RTHCPHYS HCPhys, PMMLOOKUPHYPER pLookup,
1241 NOREF(pVM); NOREF(HCPhys);
1252 * @param pVM Pointer to the VM.
1258 VMMR3_INT_DECL(int) MMR3HyperQueryInfoFromHCPhys(PVM pVM, RTHCPHYS HCPhys, char *pszWhat, size_t cbWhat, uint32_t *pcbAlloc)
1261 PMMLOOKUPHYPER pLookup = (PMMLOOKUPHYPER)((uint8_t *)pVM->mm.s.pHyperHeapR3 + pVM->mm.s.offLookupHyper);
1271 return mmR3HyperQueryInfoFromHCPhysFound(pVM, HCPhys, pLookup, pszWhat, cbWhat, pcbAlloc);
1278 return mmR3HyperQueryInfoFromHCPhysFound(pVM, HCPhys, pLookup, pszWhat, cbWhat, pcbAlloc);
1290 RTGCPTR GCPtr = pLookup->off + pVM->mm.s.pvHyperAreaGC;
1292 int rc = PGMMapGetPage(pVM, GCPtr, NULL, &HCPhysCur);
1294 return mmR3HyperQueryInfoFromHCPhysFound(pVM, HCPhys, pLookup, pszWhat, cbWhat, pcbAlloc);
1317 * @param pVM Pointer to the VM
1320 VMMR3DECL(void *) MMR3HyperHCPhys2HCVirt(PVM pVM, RTHCPHYS HCPhys)
1323 int rc = MMR3HyperHCPhys2HCVirtEx(pVM, HCPhys, &pv);
1335 * @param pVM Pointer to the VM
1339 VMMR3DECL(int) MMR3HyperHCPhys2HCVirtEx(PVM pVM, RTHCPHYS HCPhys, void **ppv)
1354 * @param pVM Pointer to the VM.
1361 VMMR3DECL(int) MMR3HyperReadGCVirt(PVM pVM, void *pvDst, RTGCPTR GCPtr, size_t cb)
1363 if (GCPtr - pVM->mm.s.pvHyperAreaGC >= pVM->mm.s.cbHyperArea)
1365 return PGMR3MapRead(pVM, pvDst, GCPtr, cb);
1372 * @param pVM Pointer to the VM.
1376 static DECLCALLBACK(void) mmR3HyperInfoHma(PVM pVM, PCDBGFINFOHLP pHlp, const char *pszArgs)
1381 pVM->mm.s.pvHyperAreaGC, pVM->mm.s.cbHyperArea);
1383 PMMLOOKUPHYPER pLookup = (PMMLOOKUPHYPER)((uint8_t *)pVM->mm.s.pHyperHeapR3 + pVM->mm.s.offLookupHyper);
1390 pLookup->off + pVM->mm.s.pvHyperAreaGC,
1391 pLookup->off + pVM->mm.s.pvHyperAreaGC + pLookup->cb,
1400 pLookup->off + pVM->mm.s.pvHyperAreaGC,
1401 pLookup->off + pVM->mm.s.pvHyperAreaGC + pLookup->cb,
1410 pLookup->off + pVM->mm.s.pvHyperAreaGC,
1411 pLookup->off + pVM->mm.s.pvHyperAreaGC + pLookup->cb,
1419 pLookup->off + pVM->mm.s.pvHyperAreaGC,
1420 pLookup->off + pVM->mm.s.pvHyperAreaGC + pLookup->cb,
1428 pLookup->off + pVM->mm.s.pvHyperAreaGC,
1429 pLookup->off + pVM->mm.s.pvHyperAreaGC + pLookup->cb,
1452 * @param pVM Pointer to the VM.
1468 VMMR3DECL(int) MMR3HyperRealloc(PVM pVM, void *pvOld, size_t cbOld, unsigned uAlignmentNew, MMTAG enmTagNew, size_t cbNew,
1472 return MMHyperAlloc(pVM, cbNew, uAlignmentNew, enmTagNew, ppv);
1475 return MMHyperFree(pVM, pvOld);
1484 MMHyperFree(pVM, pvOld);
1489 int rc = MMHyperFree(pVM, pvOld);
1492 rc = MMHyperAlloc(pVM, cbNew, uAlignmentNew, enmTagNew, ppv);