Changeset 87766 in vbox for trunk/src/VBox/VMM/VMMR3
- Timestamp:
- Feb 16, 2021 2:27:43 PM (4 years ago)
- svn:sync-xref-src-repo-rev:
- 142820
- Location:
- trunk/src/VBox/VMM/VMMR3
- Files:
-
- 10 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMR3/CPUM.cpp
r87765 r87766 2099 2099 2100 2100 /** 2101 * Callback that fires when the nested VMX-preemption timer expired. 2102 * 2103 * @param pVM The cross context VM structure. 2104 * @param pTimer Pointer to timer. 2105 * @param pvUser Opaque pointer to the virtual-CPU. 2106 */ 2107 static DECLCALLBACK(void) cpumR3VmxPreemptTimerCallback(PVM pVM, PTMTIMER pTimer, void *pvUser) 2108 { 2109 RT_NOREF2(pVM, pTimer); 2110 Assert(pvUser); 2111 2101 * @callback_method_impl{FNTMTIMERINT, 2102 * Callback that fires when the nested VMX-preemption timer expired.} 2103 */ 2104 static DECLCALLBACK(void) cpumR3VmxPreemptTimerCallback(PVM pVM, TMTIMERHANDLE hTimer, void *pvUser) 2105 { 2106 RT_NOREF(pVM, hTimer); 2112 2107 PVMCPU pVCpu = (PVMCPUR3)pvUser; 2108 AssertPtr(pVCpu); 2113 2109 VMCPU_FF_SET(pVCpu, VMCPU_FF_VMX_PREEMPT_TIMER); 2114 2110 } … … 2224 2220 2225 2221 pVCpu->cpum.s.Host.fXStateMask = fXStateHostMask; 2222 2223 pVCpu->cpum.s.hNestedVmxPreemptTimer = NIL_TMTIMERHANDLE; 2226 2224 } 2227 2225 … … 2334 2332 { 2335 2333 PVMCPU pVCpu = pVM->apCpusR3[idCpu]; 2336 int rc = TMR3TimerDestroy(pVCpu->cpum.s.pNestedVmxPreemptTimerR3); AssertRC(rc); 2337 pVCpu->cpum.s.pNestedVmxPreemptTimerR0 = NIL_RTR0PTR; 2334 if (pVCpu->cpum.s.hNestedVmxPreemptTimer != NIL_TMTIMERHANDLE) 2335 { 2336 int rc = TMR3TimerDestroy(pVM, pVCpu->cpum.s.hNestedVmxPreemptTimer); AssertRC(rc); 2337 pVCpu->cpum.s.hNestedVmxPreemptTimer = NIL_TMTIMERHANDLE; 2338 } 2338 2339 } 2339 2340 … … 4502 4503 cpumR3MsrRegStats(pVM); 4503 4504 4504 /* Create VMX-preemption timer for nested guests if required. */4505 /** @todo r=bird: this should be one in CPUMR3Init, not here.*/4505 /* Create VMX-preemption timer for nested guests if required. Must be 4506 done here as CPUM is initialized before TM. */ 4506 4507 if (pVM->cpum.s.GuestFeatures.fVmx) 4507 4508 { … … 4513 4514 char *pszTimerName = MMR3HeapAPrintf(pVM, MM_TAG_CPUM_CTX, "Nested Guest VMX-preempt. timer %u", idCpu); 4514 4515 int rc = TMR3TimerCreate(pVM, TMCLOCK_VIRTUAL_SYNC, cpumR3VmxPreemptTimerCallback, pVCpu, 4515 TMTIMER_FLAGS_RING0, pszTimerName, &pVCpu->cpum.s. pNestedVmxPreemptTimerR3);4516 TMTIMER_FLAGS_RING0, pszTimerName, &pVCpu->cpum.s.hNestedVmxPreemptTimer); 4516 4517 AssertLogRelRCReturn(rc, rc); 4517 pVCpu->cpum.s.pNestedVmxPreemptTimerR0 = TMTimerR0Ptr(pVCpu->cpum.s.pNestedVmxPreemptTimerR3);4518 4518 } 4519 4519 } -
trunk/src/VBox/VMM/VMMR3/GIMHv.cpp
r87765 r87766 187 187 static int gimR3HvInitDebugSupport(PVM pVM); 188 188 static void gimR3HvTermDebugSupport(PVM pVM); 189 static DECLCALLBACK(void) gimR3HvTimerCallback(PVM pVM, PTMTIMERpTimer, void *pvUser);189 static DECLCALLBACK(void) gimR3HvTimerCallback(PVM pVM, TMTIMERHANDLE pTimer, void *pvUser); 190 190 191 191 /** … … 202 202 203 203 PGIMHV pHv = &pVM->gim.s.u.Hv; 204 205 /* 206 * Initialize timer handles and such. 207 */ 208 for (VMCPUID idCpu = 0; idCpu < pVM->cCpus; idCpu++) 209 { 210 PVMCPU pVCpu = pVM->apCpusR3[idCpu]; 211 PGIMHVCPU pHvCpu = &pVCpu->gim.s.u.HvCpu; 212 for (uint8_t idxStimer = 0; idxStimer < RT_ELEMENTS(pHvCpu->aStimers); idxStimer++) 213 pHvCpu->aStimers[idxStimer].hTimer = NIL_TMTIMERHANDLE; 214 } 204 215 205 216 /* … … 510 521 idxStimer); 511 522 rc = TMR3TimerCreate(pVM, TMCLOCK_VIRTUAL_SYNC, gimR3HvTimerCallback, pHvStimer /* pvUser */, 512 TMTIMER_FLAGS_RING0, pHvStimer->szTimerDesc, &pHvStimer-> pTimerR3);523 TMTIMER_FLAGS_RING0, pHvStimer->szTimerDesc, &pHvStimer->hTimer); 513 524 AssertLogRelRCReturn(rc, rc); 514 pHvStimer->pTimerR0 = TMTimerR0Ptr(pHvStimer->pTimerR3);515 525 } 516 526 } … … 605 615 { 606 616 PGIMHVSTIMER pHvStimer = &pHvCpu->aStimers[idxStimer]; 607 TMR3TimerDestroy(pHvStimer->pTimerR3); 617 TMR3TimerDestroy(pVM, pHvStimer->hTimer); 618 pHvStimer->hTimer = NIL_TMTIMERHANDLE; 608 619 } 609 620 } … … 1082 1093 1083 1094 /** 1084 * Hyper-V synthetic timer callback. 1085 * 1086 * @param pVM The cross context VM structure. 1087 * @param pTimer Pointer to timer. 1088 * @param pvUser Pointer to the synthetic timer. 1089 */ 1090 static DECLCALLBACK(void) gimR3HvTimerCallback(PVM pVM, PTMTIMER pTimer, void *pvUser) 1095 * @callback_method_impl{FNTMTIMERINT, Hyper-V synthetic timer callback.} 1096 */ 1097 static DECLCALLBACK(void) gimR3HvTimerCallback(PVM pVM, TMTIMERHANDLE hTimer, void *pvUser) 1091 1098 { 1092 1099 PGIMHVSTIMER pHvStimer = (PGIMHVSTIMER)pvUser; 1093 1100 Assert(pHvStimer); 1094 Assert(TMTimerIsLockOwner(p Timer)); RT_NOREF(pTimer);1101 Assert(TMTimerIsLockOwner(pVM, hTimer)); 1095 1102 Assert(pHvStimer->idCpu < pVM->cCpus); 1103 Assert(pHvStimer->hTimer == hTimer); 1104 RT_NOREF(hTimer); 1096 1105 1097 1106 PVMCPU pVCpu = pVM->apCpusR3[pHvStimer->idCpu]; -
trunk/src/VBox/VMM/VMMR3/PDMAsyncCompletionFile.cpp
r87765 r87766 363 363 { 364 364 ASMAtomicWriteU64(&pEpClassFile->cMilliesNext, tsDelay); 365 TMTimerSetMillies(p EpClassFile->pTimer, tsDelay);365 TMTimerSetMillies(pVM, pEpClassFile->hTimer, tsDelay); 366 366 } 367 367 … … 733 733 } 734 734 735 static DECLCALLBACK(void) pdmacR3TimerCallback(PVM pVM, PTMTIMER pTimer, void *pvUser) 736 { 735 /** 736 * @callback_method_impl{FNTMTIMERINT, } 737 */ 738 static DECLCALLBACK(void) pdmacR3TimerCallback(PVM pVM, TMTIMERHANDLE hTimer, void *pvUser) 739 { 740 Assert(hTimer == pEpClassFile->hTimer); 737 741 uint64_t tsCur = RTTimeProgramMilliTS(); 738 742 uint64_t cMilliesNext = UINT64_MAX; … … 784 788 { 785 789 ASMAtomicWriteU64(&pEpClassFile->cMilliesNext, cMilliesNext); 786 TMTimerSetMillies(p EpClassFile->pTimer, cMilliesNext);790 TMTimerSetMillies(pVM, hTimer, cMilliesNext); 787 791 } 788 792 } … … 868 872 # ifdef PDM_ASYNC_COMPLETION_FILE_WITH_DELAY 869 873 rc = TMR3TimerCreate(pEpClassFile->Core.pVM, TMCLOCK_REAL, pdmacR3TimerCallback, pEpClassFile, 870 TMTIMER_FLAGS_NO_RING0, "AC Delay", &pEpClassFile-> pTimer);874 TMTIMER_FLAGS_NO_RING0, "AC Delay", &pEpClassFile->hTimer); 871 875 AssertRC(rc); 872 876 pEpClassFile->cMilliesNext = UINT64_MAX; -
trunk/src/VBox/VMM/VMMR3/PDMBlkCache.cpp
r87765 r87766 736 736 if ( !(cbDirtyOld - cbCommitted) 737 737 && pBlkCache->pCache->u32CommitTimeoutMs != 0) 738 TMTimerStop(pBlkCache->pCache->p TimerCommit);738 TMTimerStop(pBlkCache->pCache->pVM, pBlkCache->pCache->hTimerCommit); 739 739 } 740 740 … … 808 808 { 809 809 /* Arm the commit timer. */ 810 TMTimerSetMillies(pCache->p TimerCommit, pCache->u32CommitTimeoutMs);810 TMTimerSetMillies(pCache->pVM, pCache->hTimerCommit, pCache->u32CommitTimeoutMs); 811 811 } 812 812 } … … 833 833 834 834 /** 835 * Commit timer callback.836 */ 837 static DECLCALLBACK(void) pdmBlkCacheCommitTimerCallback(PVM pVM, PTMTIMER pTimer, void *pvUser)835 * @callback_method_impl{FNTMTIMERINT, Commit timer callback.} 836 */ 837 static DECLCALLBACK(void) pdmBlkCacheCommitTimerCallback(PVM pVM, TMTIMERHANDLE hTimer, void *pvUser) 838 838 { 839 839 PPDMBLKCACHEGLOBAL pCache = (PPDMBLKCACHEGLOBAL)pvUser; 840 NOREF(pVM); NOREF(pTimer);840 RT_NOREF(pVM, hTimer); 841 841 842 842 LogFlowFunc(("Commit interval expired, commiting dirty entries\n")); … … 1158 1158 if (pBlkCacheGlobal->u32CommitTimeoutMs > 0) 1159 1159 rc = TMR3TimerCreate(pVM, TMCLOCK_REAL, pdmBlkCacheCommitTimerCallback, pBlkCacheGlobal, 1160 TMTIMER_FLAGS_NO_RING0, "BlkCache-Commit", &pBlkCacheGlobal-> pTimerCommit);1160 TMTIMER_FLAGS_NO_RING0, "BlkCache-Commit", &pBlkCacheGlobal->hTimerCommit); 1161 1161 1162 1162 if (RT_SUCCESS(rc)) … … 2778 2778 VMMR3DECL(int) PDMR3BlkCacheClear(PPDMBLKCACHE pBlkCache) 2779 2779 { 2780 int rc = VINF_SUCCESS;2781 2780 PPDMBLKCACHEGLOBAL pCache = pBlkCache->pCache; 2782 2781 … … 2796 2795 2797 2796 pdmBlkCacheLockLeave(pCache); 2798 return rc;2799 } 2800 2797 return VINF_SUCCESS; 2798 } 2799 -
trunk/src/VBox/VMM/VMMR3/PDMDevHlp.cpp
r87764 r87766 439 439 Assert(fFlags & TMTIMER_FLAGS_NO_RING0 /* just to make sure all devices has been considered */); 440 440 441 PTMTIMER pTimer = NULL; 442 int rc = TMR3TimerCreateDevice(pVM, pDevIns, enmClock, pfnCallback, pvUser, fFlags, pszDesc, &pTimer); 443 *phTimer = (uintptr_t)pTimer; 441 int rc = TMR3TimerCreateDevice(pVM, pDevIns, enmClock, pfnCallback, pvUser, fFlags, pszDesc, phTimer); 444 442 445 443 LogFlow(("pdmR3DevHlp_TimerCreate: caller='%s'/%d: returns %Rrc\n", pDevIns->pReg->szName, pDevIns->iInstance, rc)); 446 444 return rc; 447 }448 449 450 /** Converts timer handle to pointer (used to exposed, will be replace soon.) */451 DECLINLINE(PTMTIMERR3) pdmR3DevHlp_TimerToPtr(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer)452 {453 PDMDEV_ASSERT_DEVINS(pDevIns);454 RT_NOREF(pDevIns);455 return (PTMTIMERR3)hTimer;456 445 } 457 446 … … 460 449 static DECLCALLBACK(uint64_t) pdmR3DevHlp_TimerFromMicro(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer, uint64_t cMicroSecs) 461 450 { 462 return TMTimerFromMicro(pdmR3DevHlp_TimerToPtr(pDevIns, hTimer), cMicroSecs); 451 PDMDEV_ASSERT_DEVINS(pDevIns); 452 return TMTimerFromMicro(pDevIns->Internal.s.pVMR3, hTimer, cMicroSecs); 463 453 } 464 454 … … 468 458 { 469 459 PDMDEV_ASSERT_DEVINS(pDevIns); 470 return TMTimerFromMilli(pDevIns->Internal.s.pVMR3, pdmR3DevHlp_TimerToPtr(pDevIns, hTimer), cMilliSecs);460 return TMTimerFromMilli(pDevIns->Internal.s.pVMR3, hTimer, cMilliSecs); 471 461 } 472 462 … … 475 465 static DECLCALLBACK(uint64_t) pdmR3DevHlp_TimerFromNano(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer, uint64_t cNanoSecs) 476 466 { 477 return TMTimerFromNano(pdmR3DevHlp_TimerToPtr(pDevIns, hTimer), cNanoSecs); 467 PDMDEV_ASSERT_DEVINS(pDevIns); 468 return TMTimerFromNano(pDevIns->Internal.s.pVMR3, hTimer, cNanoSecs); 478 469 } 479 470 … … 481 472 static DECLCALLBACK(uint64_t) pdmR3DevHlp_TimerGet(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer) 482 473 { 483 return TMTimerGet(pdmR3DevHlp_TimerToPtr(pDevIns, hTimer)); 474 PDMDEV_ASSERT_DEVINS(pDevIns); 475 return TMTimerGet(pDevIns->Internal.s.pVMR3, hTimer); 484 476 } 485 477 … … 488 480 static DECLCALLBACK(uint64_t) pdmR3DevHlp_TimerGetFreq(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer) 489 481 { 490 return TMTimerGetFreq(pdmR3DevHlp_TimerToPtr(pDevIns, hTimer)); 482 PDMDEV_ASSERT_DEVINS(pDevIns); 483 return TMTimerGetFreq(pDevIns->Internal.s.pVMR3, hTimer); 491 484 } 492 485 … … 495 488 static DECLCALLBACK(uint64_t) pdmR3DevHlp_TimerGetNano(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer) 496 489 { 497 return TMTimerGetNano(pdmR3DevHlp_TimerToPtr(pDevIns, hTimer)); 490 PDMDEV_ASSERT_DEVINS(pDevIns); 491 return TMTimerGetNano(pDevIns->Internal.s.pVMR3, hTimer); 498 492 } 499 493 … … 502 496 static DECLCALLBACK(bool) pdmR3DevHlp_TimerIsActive(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer) 503 497 { 504 return TMTimerIsActive(pdmR3DevHlp_TimerToPtr(pDevIns, hTimer)); 498 PDMDEV_ASSERT_DEVINS(pDevIns); 499 return TMTimerIsActive(pDevIns->Internal.s.pVMR3, hTimer); 505 500 } 506 501 … … 509 504 static DECLCALLBACK(bool) pdmR3DevHlp_TimerIsLockOwner(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer) 510 505 { 511 return TMTimerIsLockOwner(pdmR3DevHlp_TimerToPtr(pDevIns, hTimer)); 506 PDMDEV_ASSERT_DEVINS(pDevIns); 507 return TMTimerIsLockOwner(pDevIns->Internal.s.pVMR3, hTimer); 512 508 } 513 509 … … 516 512 static DECLCALLBACK(VBOXSTRICTRC) pdmR3DevHlp_TimerLockClock(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer, int rcBusy) 517 513 { 518 return TMTimerLock(pdmR3DevHlp_TimerToPtr(pDevIns, hTimer), rcBusy); 514 PDMDEV_ASSERT_DEVINS(pDevIns); 515 return TMTimerLock(pDevIns->Internal.s.pVMR3, hTimer, rcBusy); 519 516 } 520 517 … … 524 521 PPDMCRITSECT pCritSect, int rcBusy) 525 522 { 526 VBOXSTRICTRC rc = TMTimerLock(pdmR3DevHlp_TimerToPtr(pDevIns, hTimer), rcBusy); 523 PDMDEV_ASSERT_DEVINS(pDevIns); 524 VBOXSTRICTRC rc = TMTimerLock(pDevIns->Internal.s.pVMR3, hTimer, rcBusy); 527 525 if (rc == VINF_SUCCESS) 528 526 { … … 531 529 return rc; 532 530 AssertRC(VBOXSTRICTRC_VAL(rc)); 533 TMTimerUnlock(p dmR3DevHlp_TimerToPtr(pDevIns, hTimer));531 TMTimerUnlock(pDevIns->Internal.s.pVMR3, hTimer); 534 532 } 535 533 else … … 542 540 static DECLCALLBACK(int) pdmR3DevHlp_TimerSet(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer, uint64_t uExpire) 543 541 { 544 return TMTimerSet(pdmR3DevHlp_TimerToPtr(pDevIns, hTimer), uExpire); 542 PDMDEV_ASSERT_DEVINS(pDevIns); 543 return TMTimerSet(pDevIns->Internal.s.pVMR3, hTimer, uExpire); 545 544 } 546 545 … … 549 548 static DECLCALLBACK(int) pdmR3DevHlp_TimerSetFrequencyHint(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer, uint32_t uHz) 550 549 { 551 return TMTimerSetFrequencyHint(pdmR3DevHlp_TimerToPtr(pDevIns, hTimer), uHz); 550 PDMDEV_ASSERT_DEVINS(pDevIns); 551 return TMTimerSetFrequencyHint(pDevIns->Internal.s.pVMR3, hTimer, uHz); 552 552 } 553 553 … … 556 556 static DECLCALLBACK(int) pdmR3DevHlp_TimerSetMicro(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer, uint64_t cMicrosToNext) 557 557 { 558 return TMTimerSetMicro(pdmR3DevHlp_TimerToPtr(pDevIns, hTimer), cMicrosToNext); 558 PDMDEV_ASSERT_DEVINS(pDevIns); 559 return TMTimerSetMicro(pDevIns->Internal.s.pVMR3, hTimer, cMicrosToNext); 559 560 } 560 561 … … 563 564 static DECLCALLBACK(int) pdmR3DevHlp_TimerSetMillies(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer, uint64_t cMilliesToNext) 564 565 { 565 return TMTimerSetMillies(pdmR3DevHlp_TimerToPtr(pDevIns, hTimer), cMilliesToNext); 566 PDMDEV_ASSERT_DEVINS(pDevIns); 567 return TMTimerSetMillies(pDevIns->Internal.s.pVMR3, hTimer, cMilliesToNext); 566 568 } 567 569 … … 570 572 static DECLCALLBACK(int) pdmR3DevHlp_TimerSetNano(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer, uint64_t cNanosToNext) 571 573 { 572 return TMTimerSetNano(pdmR3DevHlp_TimerToPtr(pDevIns, hTimer), cNanosToNext); 574 PDMDEV_ASSERT_DEVINS(pDevIns); 575 return TMTimerSetNano(pDevIns->Internal.s.pVMR3, hTimer, cNanosToNext); 573 576 } 574 577 … … 577 580 static DECLCALLBACK(int) pdmR3DevHlp_TimerSetRelative(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer, uint64_t cTicksToNext, uint64_t *pu64Now) 578 581 { 579 return TMTimerSetRelative(pdmR3DevHlp_TimerToPtr(pDevIns, hTimer), cTicksToNext, pu64Now); 582 PDMDEV_ASSERT_DEVINS(pDevIns); 583 return TMTimerSetRelative(pDevIns->Internal.s.pVMR3, hTimer, cTicksToNext, pu64Now); 580 584 } 581 585 … … 584 588 static DECLCALLBACK(int) pdmR3DevHlp_TimerStop(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer) 585 589 { 586 return TMTimerStop(pdmR3DevHlp_TimerToPtr(pDevIns, hTimer)); 590 PDMDEV_ASSERT_DEVINS(pDevIns); 591 return TMTimerStop(pDevIns->Internal.s.pVMR3, hTimer); 587 592 } 588 593 … … 591 596 static DECLCALLBACK(void) pdmR3DevHlp_TimerUnlockClock(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer) 592 597 { 593 TMTimerUnlock(pdmR3DevHlp_TimerToPtr(pDevIns, hTimer)); 598 PDMDEV_ASSERT_DEVINS(pDevIns); 599 TMTimerUnlock(pDevIns->Internal.s.pVMR3, hTimer); 594 600 } 595 601 … … 598 604 static DECLCALLBACK(void) pdmR3DevHlp_TimerUnlockClock2(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer, PPDMCRITSECT pCritSect) 599 605 { 600 TMTimerUnlock(pdmR3DevHlp_TimerToPtr(pDevIns, hTimer)); 606 PDMDEV_ASSERT_DEVINS(pDevIns); 607 TMTimerUnlock(pDevIns->Internal.s.pVMR3, hTimer); 601 608 int rc = PDMCritSectLeave(pCritSect); 602 609 AssertRC(rc); … … 607 614 static DECLCALLBACK(int) pdmR3DevHlp_TimerSetCritSect(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer, PPDMCRITSECT pCritSect) 608 615 { 609 return TMR3TimerSetCritSect(pdmR3DevHlp_TimerToPtr(pDevIns, hTimer), pCritSect); 616 PDMDEV_ASSERT_DEVINS(pDevIns); 617 return TMR3TimerSetCritSect(pDevIns->Internal.s.pVMR3, hTimer, pCritSect); 610 618 } 611 619 … … 614 622 static DECLCALLBACK(int) pdmR3DevHlp_TimerSave(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer, PSSMHANDLE pSSM) 615 623 { 616 return TMR3TimerSave(pdmR3DevHlp_TimerToPtr(pDevIns, hTimer), pSSM); 624 PDMDEV_ASSERT_DEVINS(pDevIns); 625 return TMR3TimerSave(pDevIns->Internal.s.pVMR3, hTimer, pSSM); 617 626 } 618 627 … … 621 630 static DECLCALLBACK(int) pdmR3DevHlp_TimerLoad(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer, PSSMHANDLE pSSM) 622 631 { 623 return TMR3TimerLoad(pdmR3DevHlp_TimerToPtr(pDevIns, hTimer), pSSM); 632 PDMDEV_ASSERT_DEVINS(pDevIns); 633 return TMR3TimerLoad(pDevIns->Internal.s.pVMR3, hTimer, pSSM); 624 634 } 625 635 … … 628 638 static DECLCALLBACK(int) pdmR3DevHlp_TimerDestroy(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer) 629 639 { 630 return TMR3TimerDestroy(pdmR3DevHlp_TimerToPtr(pDevIns, hTimer)); 640 PDMDEV_ASSERT_DEVINS(pDevIns); 641 return TMR3TimerDestroy(pDevIns->Internal.s.pVMR3, hTimer); 631 642 } 632 643 -
trunk/src/VBox/VMM/VMMR3/PDMDriver.cpp
r87761 r87766 1337 1337 fFlags |= TMTIMER_FLAGS_NO_RING0; 1338 1338 1339 PTMTIMERR3 pTimer = NULL; 1340 int rc = TMR3TimerCreateDriver(pDrvIns->Internal.s.pVMR3, pDrvIns, enmClock, pfnCallback, pvUser, fFlags, pszDesc, &pTimer); 1341 if (RT_SUCCESS(rc)) 1342 *phTimer = (TMTIMERHANDLE)pTimer; 1339 int rc = TMR3TimerCreateDriver(pDrvIns->Internal.s.pVMR3, pDrvIns, enmClock, pfnCallback, pvUser, fFlags, pszDesc, phTimer); 1343 1340 1344 1341 LogFlow(("pdmR3DrvHlp_TMTimerCreate: caller='%s'/%d: returns %Rrc *phTimer=%p\n", pDrvIns->pReg->szName, pDrvIns->iInstance, rc, *phTimer)); -
trunk/src/VBox/VMM/VMMR3/PDMQueue.cpp
r87765 r87766 39 39 DECLINLINE(void) pdmR3QueueFreeItem(PPDMQUEUE pQueue, PPDMQUEUEITEMCORE pItem); 40 40 static bool pdmR3QueueFlush(PPDMQUEUE pQueue); 41 static DECLCALLBACK(void) pdmR3QueueTimer(PVM pVM, PTMTIMER pTimer, void *pvUser);41 static DECLCALLBACK(void) pdmR3QueueTimer(PVM pVM, TMTIMERHANDLE hTimer, void *pvUser); 42 42 43 43 … … 89 89 pQueue->pszName = pszName; 90 90 pQueue->cMilliesInterval = cMilliesInterval; 91 //pQueue->pTimer = NULL;91 pQueue->hTimer = NIL_TMTIMERHANDLE; 92 92 pQueue->cbItem = (uint32_t)cbItem; 93 93 pQueue->cItems = cItems; … … 113 113 if (cMilliesInterval) 114 114 { 115 rc = TMR3TimerCreate(pVM, TMCLOCK_REAL, pdmR3QueueTimer, pQueue, TMTIMER_FLAGS_NO_RING0, "Queue timer", &pQueue-> pTimer);115 rc = TMR3TimerCreate(pVM, TMCLOCK_REAL, pdmR3QueueTimer, pQueue, TMTIMER_FLAGS_NO_RING0, "Queue timer", &pQueue->hTimer); 116 116 if (RT_SUCCESS(rc)) 117 117 { 118 rc = TMTimerSetMillies(p Queue->pTimer, cMilliesInterval);118 rc = TMTimerSetMillies(pVM, pQueue->hTimer, cMilliesInterval); 119 119 if (RT_FAILURE(rc)) 120 120 { 121 121 AssertMsgFailed(("TMTimerSetMillies failed rc=%Rrc\n", rc)); 122 int rc2 = TMR3TimerDestroy(p Queue->pTimer); AssertRC(rc2);122 int rc2 = TMR3TimerDestroy(pVM, pQueue->hTimer); AssertRC(rc2); 123 123 } 124 124 } … … 398 398 * Unlink it. 399 399 */ 400 if (pQueue-> pTimer)400 if (pQueue->hTimer != NIL_TMTIMERHANDLE) 401 401 { 402 402 if (pUVM->pdm.s.pQueuesTimer != pQueue) … … 448 448 * Destroy the timer and free it. 449 449 */ 450 if (pQueue-> pTimer)451 { 452 TMR3TimerDestroy(p Queue->pTimer);453 pQueue-> pTimer = NULL;450 if (pQueue->hTimer != NIL_TMTIMERHANDLE) 451 { 452 TMR3TimerDestroy(pVM, pQueue->hTimer); 453 pQueue->hTimer = NIL_TMTIMERHANDLE; 454 454 } 455 455 if (pQueue->pVMRC) … … 856 856 857 857 /** 858 * Timer handler for PDM queues. 859 * This is called by for a single queue. 860 * 861 * @param pVM The cross context VM structure. 862 * @param pTimer Pointer to timer. 863 * @param pvUser Pointer to the queue. 864 */ 865 static DECLCALLBACK(void) pdmR3QueueTimer(PVM pVM, PTMTIMER pTimer, void *pvUser) 858 * @callback_method_impl{FNTMTIMERINT, Timer handler for one PDM queue.} 859 */ 860 static DECLCALLBACK(void) pdmR3QueueTimer(PVM pVM, TMTIMERHANDLE hTimer, void *pvUser) 866 861 { 867 862 PPDMQUEUE pQueue = (PPDMQUEUE)pvUser; 868 Assert( pTimer == pQueue->pTimer); NOREF(pTimer); NOREF(pVM);863 Assert(hTimer == pQueue->hTimer); 869 864 870 865 if ( pQueue->pPendingR3 … … 872 867 || pQueue->pPendingRC) 873 868 pdmR3QueueFlush(pQueue); 874 int rc = TMTimerSetMillies(p Queue->pTimer, pQueue->cMilliesInterval);869 int rc = TMTimerSetMillies(pVM, hTimer, pQueue->cMilliesInterval); 875 870 AssertRC(rc); 876 871 } -
trunk/src/VBox/VMM/VMMR3/PDMUsb.cpp
r87764 r87766 1833 1833 pszDesc = pszDesc2; 1834 1834 1835 PTMTIMERR3 pTimer = NULL; 1836 int rc = TMR3TimerCreateUsb(pVM, pUsbIns, enmClock, pfnCallback, pvUser, fFlags, pszDesc, &pTimer); 1837 if (RT_SUCCESS(rc)) 1838 *phTimer = (TMTIMERHANDLE)pTimer; 1835 int rc = TMR3TimerCreateUsb(pVM, pUsbIns, enmClock, pfnCallback, pvUser, fFlags, pszDesc, phTimer); 1839 1836 1840 1837 LogFlow(("pdmR3UsbHlp_TMTimerCreate: caller='%s'/%d: returns %Rrc *phTimer=%p\n", pUsbIns->pReg->szName, pUsbIns->iInstance, rc, *phTimer)); … … 1843 1840 1844 1841 1845 /** Converts timer handle to pointer (will be replace soon.) */1846 DECLINLINE(PTMTIMERR3) pdmR3UsbHlp_TimerToPtr(PPDMUSBINS pUsbIns, TMTIMERHANDLE hTimer)1847 {1848 PDMUSB_ASSERT_USBINS(pUsbIns);1849 RT_NOREF(pUsbIns);1850 return (PTMTIMERR3)hTimer;1851 }1852 1853 1854 1842 /** @interface_method_impl{PDMUSBHLP,pfnTimerFromMicro} */ 1855 1843 static DECLCALLBACK(uint64_t) pdmR3UsbHlp_TimerFromMicro(PPDMUSBINS pUsbIns, TMTIMERHANDLE hTimer, uint64_t cMicroSecs) 1856 1844 { 1857 return TMTimerFromMicro(pdmR3UsbHlp_TimerToPtr(pUsbIns, hTimer), cMicroSecs); 1845 PDMUSB_ASSERT_USBINS(pUsbIns); 1846 return TMTimerFromMicro(pUsbIns->Internal.s.pVM, hTimer, cMicroSecs); 1858 1847 } 1859 1848 … … 1863 1852 { 1864 1853 PDMUSB_ASSERT_USBINS(pUsbIns); 1865 return TMTimerFromMilli(pUsbIns->Internal.s.pVM, pdmR3UsbHlp_TimerToPtr(pUsbIns, hTimer), cMilliSecs);1854 return TMTimerFromMilli(pUsbIns->Internal.s.pVM, hTimer, cMilliSecs); 1866 1855 } 1867 1856 … … 1870 1859 static DECLCALLBACK(uint64_t) pdmR3UsbHlp_TimerFromNano(PPDMUSBINS pUsbIns, TMTIMERHANDLE hTimer, uint64_t cNanoSecs) 1871 1860 { 1872 return TMTimerFromNano(pdmR3UsbHlp_TimerToPtr(pUsbIns, hTimer), cNanoSecs); 1861 PDMUSB_ASSERT_USBINS(pUsbIns); 1862 return TMTimerFromNano(pUsbIns->Internal.s.pVM, hTimer, cNanoSecs); 1873 1863 } 1874 1864 … … 1876 1866 static DECLCALLBACK(uint64_t) pdmR3UsbHlp_TimerGet(PPDMUSBINS pUsbIns, TMTIMERHANDLE hTimer) 1877 1867 { 1878 return TMTimerGet(pdmR3UsbHlp_TimerToPtr(pUsbIns, hTimer)); 1868 PDMUSB_ASSERT_USBINS(pUsbIns); 1869 return TMTimerGet(pUsbIns->Internal.s.pVM, hTimer); 1879 1870 } 1880 1871 … … 1883 1874 static DECLCALLBACK(uint64_t) pdmR3UsbHlp_TimerGetFreq(PPDMUSBINS pUsbIns, TMTIMERHANDLE hTimer) 1884 1875 { 1885 return TMTimerGetFreq(pdmR3UsbHlp_TimerToPtr(pUsbIns, hTimer)); 1876 PDMUSB_ASSERT_USBINS(pUsbIns); 1877 return TMTimerGetFreq(pUsbIns->Internal.s.pVM, hTimer); 1886 1878 } 1887 1879 … … 1890 1882 static DECLCALLBACK(uint64_t) pdmR3UsbHlp_TimerGetNano(PPDMUSBINS pUsbIns, TMTIMERHANDLE hTimer) 1891 1883 { 1892 return TMTimerGetNano(pdmR3UsbHlp_TimerToPtr(pUsbIns, hTimer)); 1884 PDMUSB_ASSERT_USBINS(pUsbIns); 1885 return TMTimerGetNano(pUsbIns->Internal.s.pVM, hTimer); 1893 1886 } 1894 1887 … … 1897 1890 static DECLCALLBACK(bool) pdmR3UsbHlp_TimerIsActive(PPDMUSBINS pUsbIns, TMTIMERHANDLE hTimer) 1898 1891 { 1899 return TMTimerIsActive(pdmR3UsbHlp_TimerToPtr(pUsbIns, hTimer)); 1892 PDMUSB_ASSERT_USBINS(pUsbIns); 1893 return TMTimerIsActive(pUsbIns->Internal.s.pVM, hTimer); 1900 1894 } 1901 1895 … … 1904 1898 static DECLCALLBACK(bool) pdmR3UsbHlp_TimerIsLockOwner(PPDMUSBINS pUsbIns, TMTIMERHANDLE hTimer) 1905 1899 { 1906 return TMTimerIsLockOwner(pdmR3UsbHlp_TimerToPtr(pUsbIns, hTimer)); 1900 PDMUSB_ASSERT_USBINS(pUsbIns); 1901 return TMTimerIsLockOwner(pUsbIns->Internal.s.pVM, hTimer); 1907 1902 } 1908 1903 … … 1911 1906 static DECLCALLBACK(int) pdmR3UsbHlp_TimerLockClock(PPDMUSBINS pUsbIns, TMTIMERHANDLE hTimer) 1912 1907 { 1913 return TMTimerLock(pdmR3UsbHlp_TimerToPtr(pUsbIns, hTimer), VERR_IGNORED); 1908 PDMUSB_ASSERT_USBINS(pUsbIns); 1909 return TMTimerLock(pUsbIns->Internal.s.pVM, hTimer, VERR_IGNORED); 1914 1910 } 1915 1911 … … 1918 1914 static DECLCALLBACK(int) pdmR3UsbHlp_TimerLockClock2(PPDMUSBINS pUsbIns, TMTIMERHANDLE hTimer, PPDMCRITSECT pCritSect) 1919 1915 { 1920 int rc = TMTimerLock(pdmR3UsbHlp_TimerToPtr(pUsbIns, hTimer), VERR_IGNORED); 1916 PDMUSB_ASSERT_USBINS(pUsbIns); 1917 int rc = TMTimerLock(pUsbIns->Internal.s.pVM, hTimer, VERR_IGNORED); 1921 1918 if (rc == VINF_SUCCESS) 1922 1919 { … … 1925 1922 return rc; 1926 1923 AssertRC(rc); 1927 TMTimerUnlock(p dmR3UsbHlp_TimerToPtr(pUsbIns, hTimer));1924 TMTimerUnlock(pUsbIns->Internal.s.pVM, hTimer); 1928 1925 } 1929 1926 else … … 1936 1933 static DECLCALLBACK(int) pdmR3UsbHlp_TimerSet(PPDMUSBINS pUsbIns, TMTIMERHANDLE hTimer, uint64_t uExpire) 1937 1934 { 1938 return TMTimerSet(pdmR3UsbHlp_TimerToPtr(pUsbIns, hTimer), uExpire); 1935 PDMUSB_ASSERT_USBINS(pUsbIns); 1936 return TMTimerSet(pUsbIns->Internal.s.pVM, hTimer, uExpire); 1939 1937 } 1940 1938 … … 1943 1941 static DECLCALLBACK(int) pdmR3UsbHlp_TimerSetFrequencyHint(PPDMUSBINS pUsbIns, TMTIMERHANDLE hTimer, uint32_t uHz) 1944 1942 { 1945 return TMTimerSetFrequencyHint(pdmR3UsbHlp_TimerToPtr(pUsbIns, hTimer), uHz); 1943 PDMUSB_ASSERT_USBINS(pUsbIns); 1944 return TMTimerSetFrequencyHint(pUsbIns->Internal.s.pVM, hTimer, uHz); 1946 1945 } 1947 1946 … … 1950 1949 static DECLCALLBACK(int) pdmR3UsbHlp_TimerSetMicro(PPDMUSBINS pUsbIns, TMTIMERHANDLE hTimer, uint64_t cMicrosToNext) 1951 1950 { 1952 return TMTimerSetMicro(pdmR3UsbHlp_TimerToPtr(pUsbIns, hTimer), cMicrosToNext); 1951 PDMUSB_ASSERT_USBINS(pUsbIns); 1952 return TMTimerSetMicro(pUsbIns->Internal.s.pVM, hTimer, cMicrosToNext); 1953 1953 } 1954 1954 … … 1957 1957 static DECLCALLBACK(int) pdmR3UsbHlp_TimerSetMillies(PPDMUSBINS pUsbIns, TMTIMERHANDLE hTimer, uint64_t cMilliesToNext) 1958 1958 { 1959 return TMTimerSetMillies(pdmR3UsbHlp_TimerToPtr(pUsbIns, hTimer), cMilliesToNext); 1959 PDMUSB_ASSERT_USBINS(pUsbIns); 1960 return TMTimerSetMillies(pUsbIns->Internal.s.pVM, hTimer, cMilliesToNext); 1960 1961 } 1961 1962 … … 1964 1965 static DECLCALLBACK(int) pdmR3UsbHlp_TimerSetNano(PPDMUSBINS pUsbIns, TMTIMERHANDLE hTimer, uint64_t cNanosToNext) 1965 1966 { 1966 return TMTimerSetNano(pdmR3UsbHlp_TimerToPtr(pUsbIns, hTimer), cNanosToNext); 1967 PDMUSB_ASSERT_USBINS(pUsbIns); 1968 return TMTimerSetNano(pUsbIns->Internal.s.pVM, hTimer, cNanosToNext); 1967 1969 } 1968 1970 … … 1971 1973 static DECLCALLBACK(int) pdmR3UsbHlp_TimerSetRelative(PPDMUSBINS pUsbIns, TMTIMERHANDLE hTimer, uint64_t cTicksToNext, uint64_t *pu64Now) 1972 1974 { 1973 return TMTimerSetRelative(pdmR3UsbHlp_TimerToPtr(pUsbIns, hTimer), cTicksToNext, pu64Now); 1975 PDMUSB_ASSERT_USBINS(pUsbIns); 1976 return TMTimerSetRelative(pUsbIns->Internal.s.pVM, hTimer, cTicksToNext, pu64Now); 1974 1977 } 1975 1978 … … 1978 1981 static DECLCALLBACK(int) pdmR3UsbHlp_TimerStop(PPDMUSBINS pUsbIns, TMTIMERHANDLE hTimer) 1979 1982 { 1980 return TMTimerStop(pdmR3UsbHlp_TimerToPtr(pUsbIns, hTimer)); 1983 PDMUSB_ASSERT_USBINS(pUsbIns); 1984 return TMTimerStop(pUsbIns->Internal.s.pVM, hTimer); 1981 1985 } 1982 1986 … … 1985 1989 static DECLCALLBACK(void) pdmR3UsbHlp_TimerUnlockClock(PPDMUSBINS pUsbIns, TMTIMERHANDLE hTimer) 1986 1990 { 1987 TMTimerUnlock(pdmR3UsbHlp_TimerToPtr(pUsbIns, hTimer)); 1991 PDMUSB_ASSERT_USBINS(pUsbIns); 1992 TMTimerUnlock(pUsbIns->Internal.s.pVM, hTimer); 1988 1993 } 1989 1994 … … 1992 1997 static DECLCALLBACK(void) pdmR3UsbHlp_TimerUnlockClock2(PPDMUSBINS pUsbIns, TMTIMERHANDLE hTimer, PPDMCRITSECT pCritSect) 1993 1998 { 1994 TMTimerUnlock(pdmR3UsbHlp_TimerToPtr(pUsbIns, hTimer)); 1999 PDMUSB_ASSERT_USBINS(pUsbIns); 2000 TMTimerUnlock(pUsbIns->Internal.s.pVM, hTimer); 1995 2001 int rc = PDMCritSectLeave(pCritSect); 1996 2002 AssertRC(rc); … … 2001 2007 static DECLCALLBACK(int) pdmR3UsbHlp_TimerSetCritSect(PPDMUSBINS pUsbIns, TMTIMERHANDLE hTimer, PPDMCRITSECT pCritSect) 2002 2008 { 2003 return TMR3TimerSetCritSect(pdmR3UsbHlp_TimerToPtr(pUsbIns, hTimer), pCritSect); 2009 PDMUSB_ASSERT_USBINS(pUsbIns); 2010 return TMR3TimerSetCritSect(pUsbIns->Internal.s.pVM, hTimer, pCritSect); 2004 2011 } 2005 2012 … … 2008 2015 static DECLCALLBACK(int) pdmR3UsbHlp_TimerSave(PPDMUSBINS pUsbIns, TMTIMERHANDLE hTimer, PSSMHANDLE pSSM) 2009 2016 { 2010 return TMR3TimerSave(pdmR3UsbHlp_TimerToPtr(pUsbIns, hTimer), pSSM); 2017 PDMUSB_ASSERT_USBINS(pUsbIns); 2018 return TMR3TimerSave(pUsbIns->Internal.s.pVM, hTimer, pSSM); 2011 2019 } 2012 2020 … … 2015 2023 static DECLCALLBACK(int) pdmR3UsbHlp_TimerLoad(PPDMUSBINS pUsbIns, TMTIMERHANDLE hTimer, PSSMHANDLE pSSM) 2016 2024 { 2017 return TMR3TimerLoad(pdmR3UsbHlp_TimerToPtr(pUsbIns, hTimer), pSSM); 2025 PDMUSB_ASSERT_USBINS(pUsbIns); 2026 return TMR3TimerLoad(pUsbIns->Internal.s.pVM, hTimer, pSSM); 2018 2027 } 2019 2028 … … 2022 2031 static DECLCALLBACK(int) pdmR3UsbHlp_TimerDestroy(PPDMUSBINS pUsbIns, TMTIMERHANDLE hTimer) 2023 2032 { 2024 return TMR3TimerDestroy(pdmR3UsbHlp_TimerToPtr(pUsbIns, hTimer)); 2033 PDMUSB_ASSERT_USBINS(pUsbIns); 2034 return TMR3TimerDestroy(pUsbIns->Internal.s.pVM, hTimer); 2025 2035 } 2026 2036 -
trunk/src/VBox/VMM/VMMR3/TM.cpp
r87765 r87766 180 180 static DECLCALLBACK(int) tmR3SetWarpDrive(PUVM pUVM, uint32_t u32Percent); 181 181 #ifndef VBOX_WITHOUT_NS_ACCOUNTING 182 static DECLCALLBACK(void) tmR3CpuLoadTimer(PVM pVM, PTMTIMER pTimer, void *pvUser);182 static DECLCALLBACK(void) tmR3CpuLoadTimer(PVM pVM, TMTIMERHANDLE hTimer, void *pvUser); 183 183 #endif 184 184 static DECLCALLBACK(void) tmR3TimerInfo(PVM pVM, PCDBGFINFOHLP pHlp, const char *pszArgs); … … 1100 1100 * Create a timer for refreshing the CPU load stats. 1101 1101 */ 1102 PTMTIMER pTimer;1103 rc = TMR3TimerCreate(pVM, TMCLOCK_REAL, tmR3CpuLoadTimer, NULL, TMTIMER_FLAGS_NO_RING0, "CPU Load Timer", & pTimer);1102 TMTIMERHANDLE hTimer; 1103 rc = TMR3TimerCreate(pVM, TMCLOCK_REAL, tmR3CpuLoadTimer, NULL, TMTIMER_FLAGS_NO_RING0, "CPU Load Timer", &hTimer); 1104 1104 if (RT_SUCCESS(rc)) 1105 rc = TMTimerSetMillies(p Timer, 1000);1105 rc = TMTimerSetMillies(pVM, hTimer, 1000); 1106 1106 #endif 1107 1107 … … 1542 1542 pTimer->u64Expire = 0; 1543 1543 pTimer->enmClock = enmClock; 1544 pTimer->hSelf = (TMTIMERHANDLE)pTimer; 1544 1545 pTimer->pVMR3 = pVM; 1545 1546 pTimer->pVMR0 = pVM->pVMR0ForCall; /** @todo fix properly */ … … 1602 1603 * @param pszDesc Pointer to description string which must stay around 1603 1604 * until the timer is fully destroyed (i.e. a bit after TMTimerDestroy()). 1604 * @param p pTimer Where to store the timeron success.1605 * @param phTimer Where to store the timer handle on success. 1605 1606 */ 1606 1607 VMM_INT_DECL(int) TMR3TimerCreateDevice(PVM pVM, PPDMDEVINS pDevIns, TMCLOCK enmClock, 1607 1608 PFNTMTIMERDEV pfnCallback, void *pvUser, 1608 uint32_t fFlags, const char *pszDesc, P PTMTIMERR3 ppTimer)1609 uint32_t fFlags, const char *pszDesc, PTMTIMERHANDLE phTimer) 1609 1610 { 1610 1611 AssertReturn(!(fFlags & ~(TMTIMER_FLAGS_NO_CRIT_SECT | TMTIMER_FLAGS_RING0 | TMTIMER_FLAGS_NO_RING0)), … … 1614 1615 * Allocate and init stuff. 1615 1616 */ 1616 int rc = tmr3TimerCreate(pVM, enmClock, fFlags, pszDesc, ppTimer); 1617 PTMTIMER pTimer; 1618 int rc = tmr3TimerCreate(pVM, enmClock, fFlags, pszDesc, &pTimer); 1617 1619 if (RT_SUCCESS(rc)) 1618 1620 { 1619 (*ppTimer)->enmType = TMTIMERTYPE_DEV;1620 (*ppTimer)->u.Dev.pfnTimer = pfnCallback;1621 (*ppTimer)->u.Dev.pDevIns = pDevIns;1622 (*ppTimer)->pvUser = pvUser;1621 pTimer->enmType = TMTIMERTYPE_DEV; 1622 pTimer->u.Dev.pfnTimer = pfnCallback; 1623 pTimer->u.Dev.pDevIns = pDevIns; 1624 pTimer->pvUser = pvUser; 1623 1625 if (!(fFlags & TMTIMER_FLAGS_NO_CRIT_SECT)) 1624 (*ppTimer)->pCritSect = PDMR3DevGetCritSect(pVM, pDevIns); 1625 Log(("TM: Created device timer %p clock %d callback %p '%s'\n", (*ppTimer), enmClock, pfnCallback, pszDesc)); 1626 pTimer->pCritSect = PDMR3DevGetCritSect(pVM, pDevIns); 1627 *phTimer = pTimer->hSelf; 1628 Log(("TM: Created device timer %p clock %d callback %p '%s'\n", phTimer, enmClock, pfnCallback, pszDesc)); 1626 1629 } 1627 1630 … … 1644 1647 * @param pszDesc Pointer to description string which must stay around 1645 1648 * until the timer is fully destroyed (i.e. a bit after TMTimerDestroy()). 1646 * @param p pTimer Where to store the timeron success.1649 * @param phTimer Where to store the timer handle on success. 1647 1650 */ 1648 1651 VMM_INT_DECL(int) TMR3TimerCreateUsb(PVM pVM, PPDMUSBINS pUsbIns, TMCLOCK enmClock, 1649 1652 PFNTMTIMERUSB pfnCallback, void *pvUser, 1650 uint32_t fFlags, const char *pszDesc, P PTMTIMERR3 ppTimer)1653 uint32_t fFlags, const char *pszDesc, PTMTIMERHANDLE phTimer) 1651 1654 { 1652 1655 AssertReturn(!(fFlags & ~(TMTIMER_FLAGS_NO_CRIT_SECT | TMTIMER_FLAGS_NO_RING0)), VERR_INVALID_PARAMETER); … … 1655 1658 * Allocate and init stuff. 1656 1659 */ 1657 int rc = tmr3TimerCreate(pVM, enmClock, fFlags, pszDesc, ppTimer); 1660 PTMTIMER pTimer; 1661 int rc = tmr3TimerCreate(pVM, enmClock, fFlags, pszDesc, &pTimer); 1658 1662 if (RT_SUCCESS(rc)) 1659 1663 { 1660 (*ppTimer)->enmType = TMTIMERTYPE_USB;1661 (*ppTimer)->u.Usb.pfnTimer = pfnCallback;1662 (*ppTimer)->u.Usb.pUsbIns = pUsbIns;1663 (*ppTimer)->pvUser = pvUser;1664 pTimer->enmType = TMTIMERTYPE_USB; 1665 pTimer->u.Usb.pfnTimer = pfnCallback; 1666 pTimer->u.Usb.pUsbIns = pUsbIns; 1667 pTimer->pvUser = pvUser; 1664 1668 //if (!(fFlags & TMTIMER_FLAGS_NO_CRIT_SECT)) 1665 1669 //{ 1666 1670 // if (pDevIns->pCritSectR3) 1667 // (*ppTimer)->pCritSect = pUsbIns->pCritSectR3;1671 // pTimer->pCritSect = pUsbIns->pCritSectR3; 1668 1672 // else 1669 // (*ppTimer)->pCritSect = IOMR3GetCritSect(pVM);1673 // pTimer->pCritSect = IOMR3GetCritSect(pVM); 1670 1674 //} 1671 Log(("TM: Created USB device timer %p clock %d callback %p '%s'\n", (*ppTimer), enmClock, pfnCallback, pszDesc)); 1675 *phTimer = pTimer->hSelf; 1676 Log(("TM: Created USB device timer %p clock %d callback %p '%s'\n", *phTimer, enmClock, pfnCallback, pszDesc)); 1672 1677 } 1673 1678 … … 1688 1693 * @param pszDesc Pointer to description string which must stay around 1689 1694 * until the timer is fully destroyed (i.e. a bit after TMTimerDestroy()). 1690 * @param p pTimer Where to store the timeron success.1695 * @param phTimer Where to store the timer handle on success. 1691 1696 */ 1692 1697 VMM_INT_DECL(int) TMR3TimerCreateDriver(PVM pVM, PPDMDRVINS pDrvIns, TMCLOCK enmClock, PFNTMTIMERDRV pfnCallback, void *pvUser, 1693 uint32_t fFlags, const char *pszDesc, P PTMTIMERR3 ppTimer)1698 uint32_t fFlags, const char *pszDesc, PTMTIMERHANDLE phTimer) 1694 1699 { 1695 1700 AssertReturn(!(fFlags & ~(TMTIMER_FLAGS_NO_CRIT_SECT | TMTIMER_FLAGS_RING0 | TMTIMER_FLAGS_NO_RING0)), … … 1699 1704 * Allocate and init stuff. 1700 1705 */ 1701 int rc = tmr3TimerCreate(pVM, enmClock, fFlags, pszDesc, ppTimer); 1706 PTMTIMER pTimer; 1707 int rc = tmr3TimerCreate(pVM, enmClock, fFlags, pszDesc, &pTimer); 1702 1708 if (RT_SUCCESS(rc)) 1703 1709 { 1704 (*ppTimer)->enmType = TMTIMERTYPE_DRV; 1705 (*ppTimer)->u.Drv.pfnTimer = pfnCallback; 1706 (*ppTimer)->u.Drv.pDrvIns = pDrvIns; 1707 (*ppTimer)->pvUser = pvUser; 1708 Log(("TM: Created device timer %p clock %d callback %p '%s'\n", (*ppTimer), enmClock, pfnCallback, pszDesc)); 1710 pTimer->enmType = TMTIMERTYPE_DRV; 1711 pTimer->u.Drv.pfnTimer = pfnCallback; 1712 pTimer->u.Drv.pDrvIns = pDrvIns; 1713 pTimer->pvUser = pvUser; 1714 *phTimer = pTimer->hSelf; 1715 Log(("TM: Created device timer %p clock %d callback %p '%s'\n", *phTimer, enmClock, pfnCallback, pszDesc)); 1709 1716 } 1710 1717 … … 1724 1731 * @param pszDesc Pointer to description string which must stay around 1725 1732 * until the timer is fully destroyed (i.e. a bit after TMTimerDestroy()). 1726 * @param p pTimer Where to store the timeron success.1733 * @param phTimer Where to store the timer handle on success. 1727 1734 */ 1728 1735 VMMR3DECL(int) TMR3TimerCreate(PVM pVM, TMCLOCK enmClock, PFNTMTIMERINT pfnCallback, void *pvUser, 1729 uint32_t fFlags, const char *pszDesc, P PTMTIMERR3 ppTimer)1736 uint32_t fFlags, const char *pszDesc, PTMTIMERHANDLE phTimer) 1730 1737 { 1731 1738 AssertReturn(fFlags & (TMTIMER_FLAGS_RING0 | TMTIMER_FLAGS_NO_RING0), VERR_INVALID_FLAGS); … … 1743 1750 pTimer->u.Internal.pfnTimer = pfnCallback; 1744 1751 pTimer->pvUser = pvUser; 1745 *p pTimer = pTimer;1752 *phTimer = pTimer->hSelf; 1746 1753 Log(("TM: Created internal timer %p clock %d callback %p '%s'\n", pTimer, enmClock, pfnCallback, pszDesc)); 1747 1754 } … … 1757 1764 * @param pTimer Timer handle as returned by one of the create functions. 1758 1765 */ 1759 VMMR3DECL(int) TMR3TimerDestroy(PTMTIMER pTimer) 1760 { 1761 /* 1762 * Be extra careful here. 1763 */ 1764 if (!pTimer) 1765 return VINF_SUCCESS; 1766 AssertPtr(pTimer); 1766 static int tmR3TimerDestroy(PVMCC pVM, PTMTIMER pTimer) 1767 { 1767 1768 Assert((unsigned)pTimer->enmClock < (unsigned)TMCLOCK_MAX); 1768 1769 1769 PVM pVM = pTimer->CTX_SUFF(pVM);1770 1770 PTMTIMERQUEUE pQueue = &pVM->tm.s.CTX_SUFF(paTimerQueues)[pTimer->enmClock]; 1771 1771 bool fActive = false; … … 1925 1925 1926 1926 /** 1927 * Destroy a timer 1928 * 1929 * @returns VBox status code. 1930 * @param pVM The cross context VM structure. 1931 * @param hTimer Timer handle as returned by one of the create functions. 1932 */ 1933 VMMR3DECL(int) TMR3TimerDestroy(PVM pVM, TMTIMERHANDLE hTimer) 1934 { 1935 /* We ignore NILs here. */ 1936 if (hTimer == NIL_TMTIMERHANDLE) 1937 return VINF_SUCCESS; 1938 PTMTIMER pTimer; 1939 TMTIMER_HANDLE_TO_PTR_RETURN(pVM, hTimer, pTimer); 1940 return tmR3TimerDestroy(pVM, pTimer); 1941 } 1942 1943 1944 /** 1927 1945 * Destroy all timers owned by a device. 1928 1946 * … … 1946 1964 && pDestroy->u.Dev.pDevIns == pDevIns) 1947 1965 { 1948 int rc = TMR3TimerDestroy(pDestroy);1966 int rc = tmR3TimerDestroy(pVM, pDestroy); 1949 1967 AssertRC(rc); 1950 1968 } … … 1979 1997 && pDestroy->u.Usb.pUsbIns == pUsbIns) 1980 1998 { 1981 int rc = TMR3TimerDestroy(pDestroy);1999 int rc = tmR3TimerDestroy(pVM, pDestroy); 1982 2000 AssertRC(rc); 1983 2001 } … … 2012 2030 && pDestroy->u.Drv.pDrvIns == pDrvIns) 2013 2031 { 2014 int rc = TMR3TimerDestroy(pDestroy);2032 int rc = tmR3TimerDestroy(pVM, pDestroy); 2015 2033 AssertRC(rc); 2016 2034 } … … 2288 2306 case TMTIMERTYPE_USB: pTimer->u.Usb.pfnTimer(pTimer->u.Usb.pUsbIns, pTimer, pTimer->pvUser); break; 2289 2307 case TMTIMERTYPE_DRV: pTimer->u.Drv.pfnTimer(pTimer->u.Drv.pDrvIns, pTimer, pTimer->pvUser); break; 2290 case TMTIMERTYPE_INTERNAL: pTimer->u.Internal.pfnTimer(pVM, pTimer , pTimer->pvUser); break;2308 case TMTIMERTYPE_INTERNAL: pTimer->u.Internal.pfnTimer(pVM, pTimer->hSelf, pTimer->pvUser); break; 2291 2309 default: 2292 2310 AssertMsgFailed(("Invalid timer type %d (%s)\n", pTimer->enmType, pTimer->pszDesc)); … … 2472 2490 case TMTIMERTYPE_USB: pTimer->u.Usb.pfnTimer(pTimer->u.Usb.pUsbIns, pTimer, pTimer->pvUser); break; 2473 2491 case TMTIMERTYPE_DRV: pTimer->u.Drv.pfnTimer(pTimer->u.Drv.pDrvIns, pTimer, pTimer->pvUser); break; 2474 case TMTIMERTYPE_INTERNAL: pTimer->u.Internal.pfnTimer(pVM, pTimer , pTimer->pvUser); break;2492 case TMTIMERTYPE_INTERNAL: pTimer->u.Internal.pfnTimer(pVM, pTimer->hSelf, pTimer->pvUser); break; 2475 2493 default: 2476 2494 AssertMsgFailed(("Invalid timer type %d (%s)\n", pTimer->enmType, pTimer->pszDesc)); … … 2696 2714 * 2697 2715 * @returns VBox status code. 2698 * @param pTimer Timer to save. 2716 * @param pVM The cross context VM structure. 2717 * @param hTimer Timer to save. 2699 2718 * @param pSSM Save State Manager handle. 2700 2719 */ 2701 VMMR3DECL(int) TMR3TimerSave(PTMTIMERR3 pTimer, PSSMHANDLE pSSM) 2702 { 2720 VMMR3DECL(int) TMR3TimerSave(PVM pVM, TMTIMERHANDLE hTimer, PSSMHANDLE pSSM) 2721 { 2722 VM_ASSERT_EMT(pVM); 2723 PTMTIMER pTimer; 2724 TMTIMER_HANDLE_TO_PTR_RETURN(pVM, hTimer, pTimer); 2703 2725 LogFlow(("TMR3TimerSave: %p:{enmState=%s, .pszDesc={%s}} pSSM=%p\n", pTimer, tmTimerState(pTimer->enmState), pTimer->pszDesc, pSSM)); 2726 2704 2727 switch (pTimer->enmState) 2705 2728 { … … 2738 2761 * 2739 2762 * @returns VBox status code. 2740 * @param pTimer Timer to restore. 2763 * @param pVM The cross context VM structure. 2764 * @param hTimer Handle of Timer to restore. 2741 2765 * @param pSSM Save State Manager handle. 2742 2766 */ 2743 VMMR3DECL(int) TMR3TimerLoad(PTMTIMERR3 pTimer, PSSMHANDLE pSSM) 2744 { 2745 Assert(pTimer); Assert(pSSM); VM_ASSERT_EMT(pTimer->pVMR3); 2767 VMMR3DECL(int) TMR3TimerLoad(PVM pVM, TMTIMERHANDLE hTimer, PSSMHANDLE pSSM) 2768 { 2769 VM_ASSERT_EMT(pVM); 2770 PTMTIMER pTimer; 2771 TMTIMER_HANDLE_TO_PTR_RETURN(pVM, hTimer, pTimer); 2772 Assert(pSSM); 2746 2773 LogFlow(("TMR3TimerLoad: %p:{enmState=%s, .pszDesc={%s}} pSSM=%p\n", pTimer, tmTimerState(pTimer->enmState), pTimer->pszDesc, pSSM)); 2747 2774 … … 2787 2814 */ 2788 2815 Log(("u8State=%d u64Expire=%llu\n", u8State, u64Expire)); 2789 rc = TMTimerSet(p Timer, u64Expire);2816 rc = TMTimerSet(pVM, hTimer, u64Expire); 2790 2817 } 2791 2818 else … … 2795 2822 */ 2796 2823 Log(("u8State=%d\n", u8State)); 2797 rc = TMTimerStop(p Timer);2824 rc = TMTimerStop(pVM, hTimer); 2798 2825 } 2799 2826 … … 2887 2914 * active. 2888 2915 */ 2889 VMMR3DECL(int) TMR3TimerSetCritSect(PTMTIMERR3 pTimer, PPDMCRITSECT pCritSect) 2890 { 2891 AssertPtrReturn(pTimer, VERR_INVALID_HANDLE); 2916 VMMR3DECL(int) TMR3TimerSetCritSect(PVM pVM, TMTIMERHANDLE hTimer, PPDMCRITSECT pCritSect) 2917 { 2918 PTMTIMER pTimer; 2919 TMTIMER_HANDLE_TO_PTR_RETURN(pVM, hTimer, pTimer); 2892 2920 AssertPtrReturn(pCritSect, VERR_INVALID_PARAMETER); 2893 2921 const char *pszName = PDMR3CritSectName(pCritSect); /* exploited for validation */ … … 3414 3442 3415 3443 /** 3416 * Timer callback that calculates the CPU load since the last time it was 3417 * called. 3418 * 3419 * @param pVM The cross context VM structure. 3420 * @param pTimer The timer. 3421 * @param pvUser NULL, unused. 3422 */ 3423 static DECLCALLBACK(void) tmR3CpuLoadTimer(PVM pVM, PTMTIMER pTimer, void *pvUser) 3444 * @callback_method_impl{FNTMTIMERINT, 3445 * Timer callback that calculates the CPU load since the last 3446 * time it was called.} 3447 */ 3448 static DECLCALLBACK(void) tmR3CpuLoadTimer(PVM pVM, TMTIMERHANDLE hTimer, void *pvUser) 3424 3449 { 3425 3450 /* 3426 3451 * Re-arm the timer first. 3427 3452 */ 3428 int rc = TMTimerSetMillies(p Timer, 1000);3453 int rc = TMTimerSetMillies(pVM, hTimer, 1000); 3429 3454 AssertLogRelRC(rc); 3430 3455 NOREF(pvUser); … … 3680 3705 pTimer->offScheduleNext, 3681 3706 tmR3Get5CharClockName(pTimer->enmClock), 3682 TMTimerGet(p Timer),3707 TMTimerGet(pVM, pTimer->hSelf), 3683 3708 pTimer->u64Expire, 3684 3709 pTimer->uHzHint, … … 3726 3751 pTimer->offScheduleNext, 3727 3752 tmR3Get5CharClockName(pTimer->enmClock), 3728 TMTimerGet(p Timer),3753 TMTimerGet(pVM, pTimer->hSelf), 3729 3754 pTimer->u64Expire, 3730 3755 pTimer->uHzHint, -
trunk/src/VBox/VMM/VMMR3/VMM.cpp
r87765 r87766 169 169 static DECLCALLBACK(int) vmmR3Save(PVM pVM, PSSMHANDLE pSSM); 170 170 static DECLCALLBACK(int) vmmR3Load(PVM pVM, PSSMHANDLE pSSM, uint32_t uVersion, uint32_t uPass); 171 static DECLCALLBACK(void) vmmR3YieldEMT(PVM pVM, PTMTIMER pTimer, void *pvUser);171 static DECLCALLBACK(void) vmmR3YieldEMT(PVM pVM, TMTIMERHANDLE hTimer, void *pvUser); 172 172 static VBOXSTRICTRC vmmR3EmtRendezvousCommon(PVM pVM, PVMCPU pVCpu, bool fIsCaller, 173 173 uint32_t fFlags, PFNVMMEMTRENDEZVOUS pfnRendezvous, void *pvUser); … … 661 661 */ 662 662 rc = TMR3TimerCreate(pVM, TMCLOCK_REAL, vmmR3YieldEMT, NULL, TMTIMER_FLAGS_NO_RING0, 663 "EMT Yielder", &pVM->vmm.s. pYieldTimer);663 "EMT Yielder", &pVM->vmm.s.hYieldTimer); 664 664 AssertRCReturn(rc, rc); 665 665 666 rc = TMTimerSetMillies(pVM ->vmm.s.pYieldTimer, pVM->vmm.s.cYieldEveryMillies);666 rc = TMTimerSetMillies(pVM, pVM->vmm.s.hYieldTimer, pVM->vmm.s.cYieldEveryMillies); 667 667 AssertRCReturn(rc, rc); 668 668 break; … … 998 998 if (!pVM->vmm.s.cYieldResumeMillies) 999 999 { 1000 uint64_t u64Now = TMTimerGet(pVM ->vmm.s.pYieldTimer);1001 uint64_t u64Expire = TMTimerGetExpire(pVM ->vmm.s.pYieldTimer);1000 uint64_t u64Now = TMTimerGet(pVM, pVM->vmm.s.hYieldTimer); 1001 uint64_t u64Expire = TMTimerGetExpire(pVM, pVM->vmm.s.hYieldTimer); 1002 1002 if (u64Now >= u64Expire || u64Expire == ~(uint64_t)0) 1003 1003 pVM->vmm.s.cYieldResumeMillies = pVM->vmm.s.cYieldEveryMillies; 1004 1004 else 1005 pVM->vmm.s.cYieldResumeMillies = TMTimerToMilli(pVM ->vmm.s.pYieldTimer, u64Expire - u64Now);1006 TMTimerStop(pVM ->vmm.s.pYieldTimer);1005 pVM->vmm.s.cYieldResumeMillies = TMTimerToMilli(pVM, pVM->vmm.s.hYieldTimer, u64Expire - u64Now); 1006 TMTimerStop(pVM, pVM->vmm.s.hYieldTimer); 1007 1007 } 1008 1008 pVM->vmm.s.u64LastYield = RTTimeNanoTS(); … … 1018 1018 { 1019 1019 if (!pVM->vmm.s.cYieldResumeMillies) 1020 TMTimerStop(pVM ->vmm.s.pYieldTimer);1020 TMTimerStop(pVM, pVM->vmm.s.hYieldTimer); 1021 1021 pVM->vmm.s.cYieldResumeMillies = pVM->vmm.s.cYieldEveryMillies; 1022 1022 pVM->vmm.s.u64LastYield = RTTimeNanoTS(); … … 1033 1033 if (pVM->vmm.s.cYieldResumeMillies) 1034 1034 { 1035 TMTimerSetMillies(pVM ->vmm.s.pYieldTimer, pVM->vmm.s.cYieldResumeMillies);1035 TMTimerSetMillies(pVM, pVM->vmm.s.hYieldTimer, pVM->vmm.s.cYieldResumeMillies); 1036 1036 pVM->vmm.s.cYieldResumeMillies = 0; 1037 1037 } … … 1040 1040 1041 1041 /** 1042 * Internal timer callback function. 1043 * 1044 * @param pVM The cross context VM structure. 1045 * @param pTimer The timer handle. 1046 * @param pvUser User argument specified upon timer creation. 1047 */ 1048 static DECLCALLBACK(void) vmmR3YieldEMT(PVM pVM, PTMTIMER pTimer, void *pvUser) 1042 * @callback_method_impl{FNTMTIMERINT, EMT yielder} 1043 * 1044 * @todo This is a UNI core/thread thing, really... Should be reconsidered. 1045 */ 1046 static DECLCALLBACK(void) vmmR3YieldEMT(PVM pVM, TMTIMERHANDLE hTimer, void *pvUser) 1049 1047 { 1050 1048 NOREF(pvUser); … … 1077 1075 #endif 1078 1076 } 1079 TMTimerSetMillies(p Timer, pVM->vmm.s.cYieldEveryMillies);1077 TMTimerSetMillies(pVM, hTimer, pVM->vmm.s.cYieldEveryMillies); 1080 1078 } 1081 1079
Note:
See TracChangeset
for help on using the changeset viewer.