Lines Matching defs:pGVMM

276  * @param   pGVMM   The name of the pGVMM variable.
280 #define GVMM_GET_VALID_INSTANCE(pGVMM, rc) \
282 (pGVMM) = g_pGVMM;\
283 AssertPtrReturn((pGVMM), (rc)); \
284 AssertMsgReturn((pGVMM)->u32Magic == GVMM_MAGIC, ("%p - %#x\n", (pGVMM), (pGVMM)->u32Magic), (rc)); \
290 * @param pGVMM The name of the pGVMM variable.
292 #define GVMM_GET_VALID_INSTANCE_VOID(pGVMM) \
294 (pGVMM) = g_pGVMM;\
295 AssertPtrReturnVoid((pGVMM)); \
296 AssertMsgReturnVoid((pGVMM)->u32Magic == GVMM_MAGIC, ("%p - %#x\n", (pGVMM), (pGVMM)->u32Magic)); \
329 PGVMM pGVMM = (PGVMM)RTMemAllocZ(RT_UOFFSETOF(GVMM, aHostCpus[cHostCpus]));
330 if (!pGVMM)
332 int rc = RTSemFastMutexCreate(&pGVMM->CreateDestroyLock);
335 rc = RTSemFastMutexCreate(&pGVMM->UsedLock);
338 pGVMM->u32Magic = GVMM_MAGIC;
339 pGVMM->iUsedHead = 0;
340 pGVMM->iFreeHead = 1;
343 pGVMM->aHandles[0].iSelf = 0;
344 pGVMM->aHandles[0].iNext = 0;
347 unsigned i = RT_ELEMENTS(pGVMM->aHandles) - 1;
348 pGVMM->aHandles[i].iSelf = i;
349 pGVMM->aHandles[i].iNext = 0; /* nil */
354 pGVMM->aHandles[i].iSelf = i;
355 pGVMM->aHandles[i].iNext = i + 1;
360 pGVMM->cEMTsMeansCompany = 1; /** @todo should be adjusted to relative to the cpu count or something... */
363 pGVMM->nsMinSleepAlone = 750000 /* ns (0.750 ms) */; /** @todo this should be adjusted to be 75% (or something) of the scheduler granularity... */
364 pGVMM->nsMinSleepCompany = 15000 /* ns (0.015 ms) */;
365 pGVMM->nsEarlyWakeUp1 = 25000 /* ns (0.025 ms) */;
366 pGVMM->nsEarlyWakeUp2 = 50000 /* ns (0.050 ms) */;
370 pGVMM->nsMinSleepAlone = cNsResolution / 2;
371 pGVMM->nsMinSleepCompany = cNsResolution / 4;
372 pGVMM->nsEarlyWakeUp1 = 0;
373 pGVMM->nsEarlyWakeUp2 = 0;
377 pGVMM->nsMinSleepAlone = 2000;
378 pGVMM->nsMinSleepCompany = 2000;
379 pGVMM->nsEarlyWakeUp1 = 0;
380 pGVMM->nsEarlyWakeUp2 = 0;
384 pGVMM->cHostCpus = cHostCpus;
390 pGVMM->aHostCpus[iCpu].idxCpuSet = iCpu;
392 pGVMM->aHostCpus[iCpu].Ppt.pTimer = NULL;
393 pGVMM->aHostCpus[iCpu].Ppt.hSpinlock = NIL_RTSPINLOCK;
394 pGVMM->aHostCpus[iCpu].Ppt.uMinHz = 5; /** @todo Add some API which figures this one out. (not *that* important) */
395 pGVMM->aHostCpus[iCpu].Ppt.cTicksHistoriziationInterval = 1;
396 //pGVMM->aHostCpus[iCpu].Ppt.iTickHistorization = 0;
397 //pGVMM->aHostCpus[iCpu].Ppt.cNsInterval = 0;
398 //pGVMM->aHostCpus[iCpu].Ppt.uTimerHz = 0;
399 //pGVMM->aHostCpus[iCpu].Ppt.uDesiredHz = 0;
400 //pGVMM->aHostCpus[iCpu].Ppt.fStarted = false;
401 //pGVMM->aHostCpus[iCpu].Ppt.fStarting = false;
402 //pGVMM->aHostCpus[iCpu].Ppt.iHzHistory = 0;
403 //pGVMM->aHostCpus[iCpu].Ppt.aHzHistory = {0};
408 pGVMM->aHostCpus[iCpu].idCpu = RTMpCpuIdFromSetIndex(iCpu);
409 pGVMM->aHostCpus[iCpu].u32Magic = GVMMHOSTCPU_MAGIC;
412 rc = RTTimerCreateEx(&pGVMM->aHostCpus[iCpu].Ppt.pTimer,
416 &pGVMM->aHostCpus[iCpu]);
418 rc = RTSpinlockCreate(&pGVMM->aHostCpus[iCpu].Ppt.hSpinlock, RTSPINLOCK_FLAGS_INTERRUPT_SAFE, "GVMM/CPU");
423 RTTimerDestroy(pGVMM->aHostCpus[iCpu].Ppt.pTimer);
424 RTSpinlockDestroy(pGVMM->aHostCpus[iCpu].Ppt.hSpinlock);
425 pGVMM->aHostCpus[iCpu].Ppt.hSpinlock = NIL_RTSPINLOCK;
434 pGVMM->aHostCpus[iCpu].idCpu = NIL_RTCPUID;
435 pGVMM->aHostCpus[iCpu].u32Magic = 0;
440 g_pGVMM = pGVMM;
441 LogFlow(("GVMMR0Init: pGVMM=%p cHostCpus=%u\n", pGVMM, cHostCpus));
446 RTSemFastMutexDestroy(pGVMM->UsedLock);
447 pGVMM->UsedLock = NIL_RTSEMFASTMUTEX;
449 RTSemFastMutexDestroy(pGVMM->CreateDestroyLock);
450 pGVMM->CreateDestroyLock = NIL_RTSEMFASTMUTEX;
453 RTMemFree(pGVMM);
469 PGVMM pGVMM = g_pGVMM;
471 if (RT_UNLIKELY(!VALID_PTR(pGVMM)))
473 SUPR0Printf("GVMMR0Term: pGVMM=%p\n", pGVMM);
481 uint32_t iCpu = pGVMM->cHostCpus;
484 ASMAtomicWriteU32(&pGVMM->aHostCpus[iCpu].u32Magic, ~GVMMHOSTCPU_MAGIC);
486 if ( pGVMM->aHostCpus[iCpu].Ppt.pTimer != NULL
487 && RT_SUCCESS(RTTimerStop(pGVMM->aHostCpus[iCpu].Ppt.pTimer)))
497 pGVMM->u32Magic = ~GVMM_MAGIC;
498 RTSemFastMutexDestroy(pGVMM->UsedLock);
499 pGVMM->UsedLock = NIL_RTSEMFASTMUTEX;
500 RTSemFastMutexDestroy(pGVMM->CreateDestroyLock);
501 pGVMM->CreateDestroyLock = NIL_RTSEMFASTMUTEX;
503 pGVMM->iFreeHead = 0;
504 if (pGVMM->iUsedHead)
506 SUPR0Printf("GVMMR0Term: iUsedHead=%#x! (cVMs=%#x cEMTs=%#x)\n", pGVMM->iUsedHead, pGVMM->cVMs, pGVMM->cEMTs);
507 pGVMM->iUsedHead = 0;
511 iCpu = pGVMM->cHostCpus;
514 RTTimerDestroy(pGVMM->aHostCpus[iCpu].Ppt.pTimer);
515 pGVMM->aHostCpus[iCpu].Ppt.pTimer = NULL;
516 RTSpinlockDestroy(pGVMM->aHostCpus[iCpu].Ppt.hSpinlock);
517 pGVMM->aHostCpus[iCpu].Ppt.hSpinlock = NIL_RTSPINLOCK;
521 RTMemFree(pGVMM);
539 PGVMM pGVMM;
540 GVMM_GET_VALID_INSTANCE(pGVMM, VERR_GVMM_INSTANCE);
554 pGVMM->cEMTsMeansCompany = u64Value;
561 pGVMM->nsMinSleepAlone = u64Value;
568 pGVMM->nsMinSleepCompany = u64Value;
575 pGVMM->nsEarlyWakeUp1 = u64Value;
582 pGVMM->nsEarlyWakeUp2 = u64Value;
606 PGVMM pGVMM;
607 GVMM_GET_VALID_INSTANCE(pGVMM, VERR_GVMM_INSTANCE);
620 *pu64Value = pGVMM->cEMTsMeansCompany;
622 *pu64Value = pGVMM->nsMinSleepAlone;
624 *pu64Value = pGVMM->nsMinSleepCompany;
626 *pu64Value = pGVMM->nsEarlyWakeUp1;
628 *pu64Value = pGVMM->nsEarlyWakeUp2;
639 * @param pGVMM The GVMM instance data.
641 DECLINLINE(int) gvmmR0UsedLock(PGVMM pGVMM)
643 LogFlow(("++gvmmR0UsedLock(%p)\n", pGVMM));
644 int rc = RTSemFastMutexRequest(pGVMM->UsedLock);
645 LogFlow(("gvmmR0UsedLock(%p)->%Rrc\n", pGVMM, rc));
654 * @param pGVMM The GVMM instance data.
656 DECLINLINE(int) gvmmR0UsedUnlock(PGVMM pGVMM)
658 LogFlow(("--gvmmR0UsedUnlock(%p)\n", pGVMM));
659 int rc = RTSemFastMutexRelease(pGVMM->UsedLock);
669 * @param pGVMM The GVMM instance data.
671 DECLINLINE(int) gvmmR0CreateDestroyLock(PGVMM pGVMM)
673 LogFlow(("++gvmmR0CreateDestroyLock(%p)\n", pGVMM));
674 int rc = RTSemFastMutexRequest(pGVMM->CreateDestroyLock);
675 LogFlow(("gvmmR0CreateDestroyLock(%p)->%Rrc\n", pGVMM, rc));
684 * @param pGVMM The GVMM instance data.
686 DECLINLINE(int) gvmmR0CreateDestroyUnlock(PGVMM pGVMM)
688 LogFlow(("--gvmmR0CreateDestroyUnlock(%p)\n", pGVMM));
689 int rc = RTSemFastMutexRelease(pGVMM->CreateDestroyLock);
744 PGVMM pGVMM;
745 GVMM_GET_VALID_INSTANCE(pGVMM, VERR_GVMM_INSTANCE);
762 int rc = gvmmR0CreateDestroyLock(pGVMM);
768 uint16_t iHandle = pGVMM->iFreeHead;
771 PGVMHANDLE pHandle = &pGVMM->aHandles[iHandle];
779 pHandle->pvObj = SUPR0ObjRegister(pSession, SUPDRVOBJTYPE_VM, gvmmR0HandleObjDestructor, pGVMM, pHandle);
785 rc = gvmmR0UsedLock(pGVMM);
788 pGVMM->iFreeHead = pHandle->iNext;
789 pHandle->iNext = pGVMM->iUsedHead;
790 pGVMM->iUsedHead = iHandle;
791 pGVMM->cVMs++;
799 gvmmR0UsedUnlock(pGVMM);
879 rc = gvmmR0UsedLock(pGVMM);
889 pGVMM->cEMTs += cCpus;
896 gvmmR0UsedUnlock(pGVMM);
897 gvmmR0CreateDestroyUnlock(pGVMM);
924 gvmmR0CreateDestroyUnlock(pGVMM);
940 gvmmR0CreateDestroyUnlock(pGVMM);
983 PGVMM pGVMM;
984 int rc = gvmmR0ByVMAndEMT(pVM, 0 /* idCpu */, &pGVM, &pGVMM);
1020 PGVMM pGVMM;
1021 int rc = gvmmR0ByVMAndEMT(pVM, 0 /* idCpu */, &pGVM, &pGVMM);
1044 PGVMM pGVMM;
1045 int rc = gvmmR0ByVMAndEMT(pVM, 0 /* idCpu */, &pGVM, &pGVMM);
1073 PGVMM pGVMM;
1074 GVMM_GET_VALID_INSTANCE(pGVMM, VERR_GVMM_INSTANCE);
1086 AssertReturn(hGVM < RT_ELEMENTS(pGVMM->aHandles), VERR_INVALID_HANDLE);
1088 PGVMHANDLE pHandle = &pGVMM->aHandles[hGVM];
1102 int rc = gvmmR0CreateDestroyLock(pGVMM);
1117 gvmmR0CreateDestroyUnlock(pGVMM);
1134 gvmmR0CreateDestroyUnlock(pGVMM);
1181 PGVMM pGVMM = (PGVMM)pvGVMM;
1182 Assert(pGVMM == g_pGVMM);
1183 const uint16_t iHandle = pHandle - &pGVMM->aHandles[0];
1185 || iHandle >= RT_ELEMENTS(pGVMM->aHandles)
1192 int rc = gvmmR0CreateDestroyLock(pGVMM);
1194 rc = gvmmR0UsedLock(pGVMM);
1200 if (RT_UNLIKELY(pHandle->iNext >= RT_ELEMENTS(pGVMM->aHandles)))
1203 gvmmR0UsedUnlock(pGVMM);
1204 gvmmR0CreateDestroyUnlock(pGVMM);
1208 if (pGVMM->iUsedHead == iHandle)
1209 pGVMM->iUsedHead = pHandle->iNext;
1212 uint16_t iPrev = pGVMM->iUsedHead;
1213 int c = RT_ELEMENTS(pGVMM->aHandles) + 2;
1216 if (RT_UNLIKELY(iPrev >= RT_ELEMENTS(pGVMM->aHandles)))
1219 gvmmR0UsedUnlock(pGVMM);
1220 gvmmR0CreateDestroyUnlock(pGVMM);
1229 if (pGVMM->aHandles[iPrev].iNext == iHandle)
1231 iPrev = pGVMM->aHandles[iPrev].iNext;
1236 gvmmR0UsedUnlock(pGVMM);
1237 gvmmR0CreateDestroyUnlock(pGVMM);
1241 Assert(pGVMM->aHandles[iPrev].iNext == iHandle);
1242 pGVMM->aHandles[iPrev].iNext = pHandle->iNext;
1245 pGVMM->cVMs--;
1254 pGVMM->cEMTs -= pGVM->cCpus;
1255 gvmmR0UsedUnlock(pGVMM);
1301 rc = gvmmR0UsedLock(pGVMM);
1309 pHandle->iNext = pGVMM->iFreeHead;
1310 pGVMM->iFreeHead = iHandle;
1318 gvmmR0UsedUnlock(pGVMM);
1319 gvmmR0CreateDestroyUnlock(pGVMM);
1341 PGVMM pGVMM;
1342 int rc = gvmmR0ByVM(pVM, &pGVM, &pGVMM, false /* fTakeUsedLock */);
1366 PGVMM pGVMM;
1367 GVMM_GET_VALID_INSTANCE(pGVMM, NULL);
1373 AssertReturn(hGVM < RT_ELEMENTS(pGVMM->aHandles), NULL);
1378 PGVMHANDLE pHandle = &pGVMM->aHandles[hGVM];
1408 PGVMM pGVMM;
1409 GVMM_GET_VALID_INSTANCE(pGVMM, VERR_GVMM_INSTANCE);
1423 || hGVM >= RT_ELEMENTS(pGVMM->aHandles)))
1429 PGVMHANDLE pHandle = &pGVMM->aHandles[hGVM];
1433 int rc = gvmmR0UsedLock(pGVMM);
1443 gvmmR0UsedUnlock(pGVMM);
1464 *ppGVMM = pGVMM;
1481 PGVMM pGVMM;
1482 return gvmmR0ByVM(pVM, ppGVM, &pGVMM, false /* fTakeUsedLock */);
1501 PGVMM pGVMM;
1502 GVMM_GET_VALID_INSTANCE(pGVMM, VERR_GVMM_INSTANCE);
1512 AssertReturn(hGVM < RT_ELEMENTS(pGVMM->aHandles), VERR_INVALID_HANDLE);
1517 PGVMHANDLE pHandle = &pGVMM->aHandles[hGVM];
1531 *ppGVMM = pGVMM;
1549 PGVMM pGVMM;
1550 return gvmmR0ByVMAndEMT(pVM, idCpu, ppGVM, &pGVMM);
1584 PGVMM pGVMM = g_pGVMM;
1585 if ( !VALID_PTR(pGVMM)
1586 || pGVMM->u32Magic != GVMM_MAGIC)
1596 for (unsigned i = 1; i < RT_ELEMENTS(pGVMM->aHandles); i++)
1598 if ( pGVMM->aHandles[i].iSelf == i
1599 && pGVMM->aHandles[i].ProcId == ProcId
1600 && VALID_PTR(pGVMM->aHandles[i].pvObj)
1601 && VALID_PTR(pGVMM->aHandles[i].pVM)
1602 && VALID_PTR(pGVMM->aHandles[i].pGVM))
1604 if (pGVMM->aHandles[i].hEMT0 == hEMT)
1605 return pGVMM->aHandles[i].pVM;
1608 PGVM pGVM = pGVMM->aHandles[i].pGVM;
1615 return pGVMM->aHandles[i].pVM;
1626 * @param pGVMM Pointer to the GVMM instance data.
1629 static unsigned gvmmR0SchedDoWakeUps(PGVMM pGVMM, uint64_t u64Now)
1635 if ( !pGVMM->nsEarlyWakeUp1
1636 && !pGVMM->nsEarlyWakeUp2)
1644 const uint64_t uNsEarlyWakeUp2 = u64Now + pGVMM->nsEarlyWakeUp2;
1645 if ( pGVMM->cHaltedEMTs == 0
1646 || uNsEarlyWakeUp2 > pGVMM->uNsNextEmtWakeup)
1653 const uint64_t uNsEarlyWakeUp1 = u64Now + pGVMM->nsEarlyWakeUp1;
1659 for (unsigned i = pGVMM->iUsedHead, cGuard = 0;
1660 i != NIL_GVM_HANDLE && i < RT_ELEMENTS(pGVMM->aHandles);
1661 i = pGVMM->aHandles[i].iNext)
1663 PGVM pCurGVM = pGVMM->aHandles[i].pGVM;
1695 AssertLogRelBreak(cGuard++ < RT_ELEMENTS(pGVMM->aHandles));
1700 for (unsigned i = pGVMM->iUsedHead, cGuard = 0;
1701 i != NIL_GVM_HANDLE && i < RT_ELEMENTS(pGVMM->aHandles);
1702 i = pGVMM->aHandles[i].iNext)
1704 PGVM pCurGVM = pGVMM->aHandles[i].pGVM;
1724 AssertLogRelBreak(cGuard++ < RT_ELEMENTS(pGVMM->aHandles));
1730 for (unsigned i = pGVMM->iUsedHead, cGuard = 0;
1731 i != NIL_GVM_HANDLE && i < RT_ELEMENTS(pGVMM->aHandles);
1732 i = pGVMM->aHandles[i].iNext)
1734 PGVM pCurGVM = pGVMM->aHandles[i].pGVM;
1754 AssertLogRelBreak(cGuard++ < RT_ELEMENTS(pGVMM->aHandles));
1761 pGVMM->uNsNextEmtWakeup = u64Min;
1785 PGVMM pGVMM;
1786 int rc = gvmmR0ByVMAndEMT(pVM, idCpu, &pGVM, &pGVMM);
1799 rc = gvmmR0UsedLock(pGVMM);
1810 pGVM->gvmm.s.StatsSched.cHaltWakeUps += gvmmR0SchedDoWakeUps(pGVMM, u64NowGip);
1818 && cNsInterval >= (pGVMM->cEMTs > pGVMM->cEMTsMeansCompany
1819 ? pGVMM->nsMinSleepCompany
1820 : pGVMM->nsMinSleepAlone))
1825 if (u64ExpireGipTime < pGVMM->uNsNextEmtWakeup)
1826 pGVMM->uNsNextEmtWakeup = u64ExpireGipTime;
1828 ASMAtomicIncU32(&pGVMM->cHaltedEMTs);
1829 gvmmR0UsedUnlock(pGVMM);
1836 ASMAtomicDecU32(&pGVMM->cHaltedEMTs);
1850 gvmmR0UsedUnlock(pGVMM);
1918 PGVMM pGVMM;
1919 int rc = gvmmR0ByVM(pVM, &pGVM, &pGVMM, fTakeUsedLock);
1936 pGVM->gvmm.s.StatsSched.cWakeUpWakeUps += gvmmR0SchedDoWakeUps(pGVMM, u64Now);
1944 int rc2 = gvmmR0UsedUnlock(pGVMM);
2015 PGVMM pGVMM;
2016 int rc = gvmmR0ByVM(pVM, &pGVM, &pGVMM, fTakeUsedLock);
2026 int rc2 = gvmmR0UsedUnlock(pGVMM);
2071 PGVMM pGVMM;
2072 int rc = gvmmR0ByVM(pVM, &pGVM, &pGVMM, true /* fTakeUsedLock */);
2090 int rc2 = gvmmR0UsedUnlock(pGVMM);
2140 PGVMM pGVMM;
2141 int rc = gvmmR0ByVMAndEMT(pVM, idCpu, &pGVM, &pGVMM);
2144 rc = gvmmR0UsedLock(pGVMM);
2152 pGVM->gvmm.s.StatsSched.cPollWakeUps += gvmmR0SchedDoWakeUps(pGVMM, u64Now);
2159 gvmmR0UsedUnlock(pGVMM);
2272 PGVMM pGVMM = g_pGVMM;
2273 if ( !VALID_PTR(pGVMM)
2274 || pGVMM->u32Magic != GVMM_MAGIC)
2276 AssertMsgReturnVoid(iCpu < pGVMM->cHostCpus, ("iCpu=%d cHostCpus=%d\n", iCpu, pGVMM->cHostCpus));
2277 PGVMMHOSTCPU pCpu = &pGVMM->aHostCpus[iCpu];
2357 PGVMM pGVMM;
2361 int rc = gvmmR0ByVM(pVM, &pGVM, &pGVMM, true /*fTakeUsedLock*/);
2368 GVMM_GET_VALID_INSTANCE(pGVMM, VERR_GVMM_INSTANCE);
2371 int rc = gvmmR0UsedLock(pGVMM);
2382 for (unsigned i = pGVMM->iUsedHead;
2383 i != NIL_GVM_HANDLE && i < RT_ELEMENTS(pGVMM->aHandles);
2384 i = pGVMM->aHandles[i].iNext)
2386 PGVM pGVM = pGVMM->aHandles[i].pGVM;
2387 void *pvObj = pGVMM->aHandles[i].pvObj;
2419 uint32_t cSrcCpus = pGVMM->cHostCpus;
2422 if (pGVMM->aHostCpus[iSrcCpu].idCpu != NIL_RTCPUID)
2424 pStats->aHostCpus[iDstCpu].idCpu = pGVMM->aHostCpus[iSrcCpu].idCpu;
2425 pStats->aHostCpus[iDstCpu].idxCpuSet = pGVMM->aHostCpus[iSrcCpu].idxCpuSet;
2427 pStats->aHostCpus[iDstCpu].uDesiredHz = pGVMM->aHostCpus[iSrcCpu].Ppt.uDesiredHz;
2428 pStats->aHostCpus[iDstCpu].uTimerHz = pGVMM->aHostCpus[iSrcCpu].Ppt.uTimerHz;
2429 pStats->aHostCpus[iDstCpu].cChanges = pGVMM->aHostCpus[iSrcCpu].Ppt.cChanges;
2430 pStats->aHostCpus[iDstCpu].cStarts = pGVMM->aHostCpus[iSrcCpu].Ppt.cStarts;
2444 gvmmR0UsedUnlock(pGVMM);
2491 PGVMM pGVMM;
2495 int rc = gvmmR0ByVM(pVM, &pGVM, &pGVMM, true /*fTakeUsedLock*/);
2517 GVMM_GET_VALID_INSTANCE(pGVMM, VERR_GVMM_INSTANCE);
2519 int rc = gvmmR0UsedLock(pGVMM);
2528 for (unsigned i = pGVMM->iUsedHead;
2529 i != NIL_GVM_HANDLE && i < RT_ELEMENTS(pGVMM->aHandles);
2530 i = pGVMM->aHandles[i].iNext)
2532 PGVM pGVM = pGVMM->aHandles[i].pGVM;
2533 void *pvObj = pGVMM->aHandles[i].pvObj;
2559 gvmmR0UsedUnlock(pGVMM);