VirtualBox

Changeset 87766 in vbox for trunk/src/VBox/VMM/VMMR3


Ignore:
Timestamp:
Feb 16, 2021 2:27:43 PM (4 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
142820
Message:

VMM/TM,VMM/*: Refactored the TM timer APIs to use 'handles' and take a pVM parameter. Only internal callbacks have been updated with a hTimer parameter, so far. bugref:9943

Location:
trunk/src/VBox/VMM/VMMR3
Files:
10 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMR3/CPUM.cpp

    r87765 r87766  
    20992099
    21002100/**
    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 */
     2104static DECLCALLBACK(void) cpumR3VmxPreemptTimerCallback(PVM pVM, TMTIMERHANDLE hTimer, void *pvUser)
     2105{
     2106    RT_NOREF(pVM, hTimer);
    21122107    PVMCPU pVCpu = (PVMCPUR3)pvUser;
     2108    AssertPtr(pVCpu);
    21132109    VMCPU_FF_SET(pVCpu, VMCPU_FF_VMX_PREEMPT_TIMER);
    21142110}
     
    22242220
    22252221        pVCpu->cpum.s.Host.fXStateMask = fXStateHostMask;
     2222
     2223        pVCpu->cpum.s.hNestedVmxPreemptTimer = NIL_TMTIMERHANDLE;
    22262224    }
    22272225
     
    23342332        {
    23352333            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            }
    23382339        }
    23392340
     
    45024503            cpumR3MsrRegStats(pVM);
    45034504
    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. */
    45064507            if (pVM->cpum.s.GuestFeatures.fVmx)
    45074508            {
     
    45134514                    char *pszTimerName = MMR3HeapAPrintf(pVM, MM_TAG_CPUM_CTX, "Nested Guest VMX-preempt. timer %u", idCpu);
    45144515                    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);
    45164517                    AssertLogRelRCReturn(rc, rc);
    4517                     pVCpu->cpum.s.pNestedVmxPreemptTimerR0 = TMTimerR0Ptr(pVCpu->cpum.s.pNestedVmxPreemptTimerR3);
    45184518                }
    45194519            }
  • trunk/src/VBox/VMM/VMMR3/GIMHv.cpp

    r87765 r87766  
    187187static int    gimR3HvInitDebugSupport(PVM pVM);
    188188static void   gimR3HvTermDebugSupport(PVM pVM);
    189 static DECLCALLBACK(void) gimR3HvTimerCallback(PVM pVM, PTMTIMER pTimer, void *pvUser);
     189static DECLCALLBACK(void) gimR3HvTimerCallback(PVM pVM, TMTIMERHANDLE pTimer, void *pvUser);
    190190
    191191/**
     
    202202
    203203    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    }
    204215
    205216    /*
     
    510521                            idxStimer);
    511522                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);
    513524                AssertLogRelRCReturn(rc, rc);
    514                 pHvStimer->pTimerR0 = TMTimerR0Ptr(pHvStimer->pTimerR3);
    515525            }
    516526        }
     
    605615            {
    606616                PGIMHVSTIMER pHvStimer = &pHvCpu->aStimers[idxStimer];
    607                 TMR3TimerDestroy(pHvStimer->pTimerR3);
     617                TMR3TimerDestroy(pVM, pHvStimer->hTimer);
     618                pHvStimer->hTimer = NIL_TMTIMERHANDLE;
    608619            }
    609620        }
     
    10821093
    10831094/**
    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 */
     1097static DECLCALLBACK(void) gimR3HvTimerCallback(PVM pVM, TMTIMERHANDLE hTimer, void *pvUser)
    10911098{
    10921099    PGIMHVSTIMER pHvStimer = (PGIMHVSTIMER)pvUser;
    10931100    Assert(pHvStimer);
    1094     Assert(TMTimerIsLockOwner(pTimer)); RT_NOREF(pTimer);
     1101    Assert(TMTimerIsLockOwner(pVM, hTimer));
    10951102    Assert(pHvStimer->idCpu < pVM->cCpus);
     1103    Assert(pHvStimer->hTimer == hTimer);
     1104    RT_NOREF(hTimer);
    10961105
    10971106    PVMCPU    pVCpu  = pVM->apCpusR3[pHvStimer->idCpu];
  • trunk/src/VBox/VMM/VMMR3/PDMAsyncCompletionFile.cpp

    r87765 r87766  
    363363                {
    364364                    ASMAtomicWriteU64(&pEpClassFile->cMilliesNext, tsDelay);
    365                     TMTimerSetMillies(pEpClassFile->pTimer, tsDelay);
     365                    TMTimerSetMillies(pVM, pEpClassFile->hTimer, tsDelay);
    366366                }
    367367
     
    733733}
    734734
    735 static DECLCALLBACK(void) pdmacR3TimerCallback(PVM pVM, PTMTIMER pTimer, void *pvUser)
    736 {
     735/**
     736 * @callback_method_impl{FNTMTIMERINT, }
     737 */
     738static DECLCALLBACK(void) pdmacR3TimerCallback(PVM pVM, TMTIMERHANDLE hTimer, void *pvUser)
     739{
     740    Assert(hTimer == pEpClassFile->hTimer);
    737741    uint64_t tsCur = RTTimeProgramMilliTS();
    738742    uint64_t cMilliesNext = UINT64_MAX;
     
    784788    {
    785789        ASMAtomicWriteU64(&pEpClassFile->cMilliesNext, cMilliesNext);
    786         TMTimerSetMillies(pEpClassFile->pTimer, cMilliesNext);
     790        TMTimerSetMillies(pVM, hTimer, cMilliesNext);
    787791    }
    788792}
     
    868872# ifdef PDM_ASYNC_COMPLETION_FILE_WITH_DELAY
    869873    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);
    871875    AssertRC(rc);
    872876    pEpClassFile->cMilliesNext = UINT64_MAX;
  • trunk/src/VBox/VMM/VMMR3/PDMBlkCache.cpp

    r87765 r87766  
    736736    if (   !(cbDirtyOld - cbCommitted)
    737737        && pBlkCache->pCache->u32CommitTimeoutMs != 0)
    738         TMTimerStop(pBlkCache->pCache->pTimerCommit);
     738        TMTimerStop(pBlkCache->pCache->pVM, pBlkCache->pCache->hTimerCommit);
    739739}
    740740
     
    808808        {
    809809            /* Arm the commit timer. */
    810             TMTimerSetMillies(pCache->pTimerCommit, pCache->u32CommitTimeoutMs);
     810            TMTimerSetMillies(pCache->pVM, pCache->hTimerCommit, pCache->u32CommitTimeoutMs);
    811811        }
    812812    }
     
    833833
    834834/**
    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 */
     837static DECLCALLBACK(void) pdmBlkCacheCommitTimerCallback(PVM pVM, TMTIMERHANDLE hTimer, void *pvUser)
    838838{
    839839    PPDMBLKCACHEGLOBAL pCache = (PPDMBLKCACHEGLOBAL)pvUser;
    840     NOREF(pVM); NOREF(pTimer);
     840    RT_NOREF(pVM, hTimer);
    841841
    842842    LogFlowFunc(("Commit interval expired, commiting dirty entries\n"));
     
    11581158        if (pBlkCacheGlobal->u32CommitTimeoutMs > 0)
    11591159            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);
    11611161
    11621162        if (RT_SUCCESS(rc))
     
    27782778VMMR3DECL(int) PDMR3BlkCacheClear(PPDMBLKCACHE pBlkCache)
    27792779{
    2780     int rc = VINF_SUCCESS;
    27812780    PPDMBLKCACHEGLOBAL pCache = pBlkCache->pCache;
    27822781
     
    27962795
    27972796    pdmBlkCacheLockLeave(pCache);
    2798     return rc;
    2799 }
    2800 
     2797    return VINF_SUCCESS;
     2798}
     2799
  • trunk/src/VBox/VMM/VMMR3/PDMDevHlp.cpp

    r87764 r87766  
    439439        Assert(fFlags & TMTIMER_FLAGS_NO_RING0 /* just to make sure all devices has been considered */);
    440440
    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);
    444442
    445443    LogFlow(("pdmR3DevHlp_TimerCreate: caller='%s'/%d: returns %Rrc\n", pDevIns->pReg->szName, pDevIns->iInstance, rc));
    446444    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;
    456445}
    457446
     
    460449static DECLCALLBACK(uint64_t) pdmR3DevHlp_TimerFromMicro(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer, uint64_t cMicroSecs)
    461450{
    462     return TMTimerFromMicro(pdmR3DevHlp_TimerToPtr(pDevIns, hTimer), cMicroSecs);
     451    PDMDEV_ASSERT_DEVINS(pDevIns);
     452    return TMTimerFromMicro(pDevIns->Internal.s.pVMR3, hTimer, cMicroSecs);
    463453}
    464454
     
    468458{
    469459    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);
    471461}
    472462
     
    475465static DECLCALLBACK(uint64_t) pdmR3DevHlp_TimerFromNano(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer, uint64_t cNanoSecs)
    476466{
    477     return TMTimerFromNano(pdmR3DevHlp_TimerToPtr(pDevIns, hTimer), cNanoSecs);
     467    PDMDEV_ASSERT_DEVINS(pDevIns);
     468    return TMTimerFromNano(pDevIns->Internal.s.pVMR3, hTimer, cNanoSecs);
    478469}
    479470
     
    481472static DECLCALLBACK(uint64_t) pdmR3DevHlp_TimerGet(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer)
    482473{
    483     return TMTimerGet(pdmR3DevHlp_TimerToPtr(pDevIns, hTimer));
     474    PDMDEV_ASSERT_DEVINS(pDevIns);
     475    return TMTimerGet(pDevIns->Internal.s.pVMR3, hTimer);
    484476}
    485477
     
    488480static DECLCALLBACK(uint64_t) pdmR3DevHlp_TimerGetFreq(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer)
    489481{
    490     return TMTimerGetFreq(pdmR3DevHlp_TimerToPtr(pDevIns, hTimer));
     482    PDMDEV_ASSERT_DEVINS(pDevIns);
     483    return TMTimerGetFreq(pDevIns->Internal.s.pVMR3, hTimer);
    491484}
    492485
     
    495488static DECLCALLBACK(uint64_t) pdmR3DevHlp_TimerGetNano(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer)
    496489{
    497     return TMTimerGetNano(pdmR3DevHlp_TimerToPtr(pDevIns, hTimer));
     490    PDMDEV_ASSERT_DEVINS(pDevIns);
     491    return TMTimerGetNano(pDevIns->Internal.s.pVMR3, hTimer);
    498492}
    499493
     
    502496static DECLCALLBACK(bool) pdmR3DevHlp_TimerIsActive(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer)
    503497{
    504     return TMTimerIsActive(pdmR3DevHlp_TimerToPtr(pDevIns, hTimer));
     498    PDMDEV_ASSERT_DEVINS(pDevIns);
     499    return TMTimerIsActive(pDevIns->Internal.s.pVMR3, hTimer);
    505500}
    506501
     
    509504static DECLCALLBACK(bool) pdmR3DevHlp_TimerIsLockOwner(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer)
    510505{
    511     return TMTimerIsLockOwner(pdmR3DevHlp_TimerToPtr(pDevIns, hTimer));
     506    PDMDEV_ASSERT_DEVINS(pDevIns);
     507    return TMTimerIsLockOwner(pDevIns->Internal.s.pVMR3, hTimer);
    512508}
    513509
     
    516512static DECLCALLBACK(VBOXSTRICTRC) pdmR3DevHlp_TimerLockClock(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer, int rcBusy)
    517513{
    518     return TMTimerLock(pdmR3DevHlp_TimerToPtr(pDevIns, hTimer), rcBusy);
     514    PDMDEV_ASSERT_DEVINS(pDevIns);
     515    return TMTimerLock(pDevIns->Internal.s.pVMR3, hTimer, rcBusy);
    519516}
    520517
     
    524521                                                              PPDMCRITSECT pCritSect, int rcBusy)
    525522{
    526     VBOXSTRICTRC rc = TMTimerLock(pdmR3DevHlp_TimerToPtr(pDevIns, hTimer), rcBusy);
     523    PDMDEV_ASSERT_DEVINS(pDevIns);
     524    VBOXSTRICTRC rc = TMTimerLock(pDevIns->Internal.s.pVMR3, hTimer, rcBusy);
    527525    if (rc == VINF_SUCCESS)
    528526    {
     
    531529            return rc;
    532530        AssertRC(VBOXSTRICTRC_VAL(rc));
    533         TMTimerUnlock(pdmR3DevHlp_TimerToPtr(pDevIns, hTimer));
     531        TMTimerUnlock(pDevIns->Internal.s.pVMR3, hTimer);
    534532    }
    535533    else
     
    542540static DECLCALLBACK(int) pdmR3DevHlp_TimerSet(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer, uint64_t uExpire)
    543541{
    544     return TMTimerSet(pdmR3DevHlp_TimerToPtr(pDevIns, hTimer), uExpire);
     542    PDMDEV_ASSERT_DEVINS(pDevIns);
     543    return TMTimerSet(pDevIns->Internal.s.pVMR3, hTimer, uExpire);
    545544}
    546545
     
    549548static DECLCALLBACK(int) pdmR3DevHlp_TimerSetFrequencyHint(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer, uint32_t uHz)
    550549{
    551     return TMTimerSetFrequencyHint(pdmR3DevHlp_TimerToPtr(pDevIns, hTimer), uHz);
     550    PDMDEV_ASSERT_DEVINS(pDevIns);
     551    return TMTimerSetFrequencyHint(pDevIns->Internal.s.pVMR3, hTimer, uHz);
    552552}
    553553
     
    556556static DECLCALLBACK(int) pdmR3DevHlp_TimerSetMicro(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer, uint64_t cMicrosToNext)
    557557{
    558     return TMTimerSetMicro(pdmR3DevHlp_TimerToPtr(pDevIns, hTimer), cMicrosToNext);
     558    PDMDEV_ASSERT_DEVINS(pDevIns);
     559    return TMTimerSetMicro(pDevIns->Internal.s.pVMR3, hTimer, cMicrosToNext);
    559560}
    560561
     
    563564static DECLCALLBACK(int) pdmR3DevHlp_TimerSetMillies(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer, uint64_t cMilliesToNext)
    564565{
    565     return TMTimerSetMillies(pdmR3DevHlp_TimerToPtr(pDevIns, hTimer), cMilliesToNext);
     566    PDMDEV_ASSERT_DEVINS(pDevIns);
     567    return TMTimerSetMillies(pDevIns->Internal.s.pVMR3, hTimer, cMilliesToNext);
    566568}
    567569
     
    570572static DECLCALLBACK(int) pdmR3DevHlp_TimerSetNano(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer, uint64_t cNanosToNext)
    571573{
    572     return TMTimerSetNano(pdmR3DevHlp_TimerToPtr(pDevIns, hTimer), cNanosToNext);
     574    PDMDEV_ASSERT_DEVINS(pDevIns);
     575    return TMTimerSetNano(pDevIns->Internal.s.pVMR3, hTimer, cNanosToNext);
    573576}
    574577
     
    577580static DECLCALLBACK(int) pdmR3DevHlp_TimerSetRelative(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer, uint64_t cTicksToNext, uint64_t *pu64Now)
    578581{
    579     return TMTimerSetRelative(pdmR3DevHlp_TimerToPtr(pDevIns, hTimer), cTicksToNext, pu64Now);
     582    PDMDEV_ASSERT_DEVINS(pDevIns);
     583    return TMTimerSetRelative(pDevIns->Internal.s.pVMR3, hTimer, cTicksToNext, pu64Now);
    580584}
    581585
     
    584588static DECLCALLBACK(int) pdmR3DevHlp_TimerStop(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer)
    585589{
    586     return TMTimerStop(pdmR3DevHlp_TimerToPtr(pDevIns, hTimer));
     590    PDMDEV_ASSERT_DEVINS(pDevIns);
     591    return TMTimerStop(pDevIns->Internal.s.pVMR3, hTimer);
    587592}
    588593
     
    591596static DECLCALLBACK(void) pdmR3DevHlp_TimerUnlockClock(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer)
    592597{
    593     TMTimerUnlock(pdmR3DevHlp_TimerToPtr(pDevIns, hTimer));
     598    PDMDEV_ASSERT_DEVINS(pDevIns);
     599    TMTimerUnlock(pDevIns->Internal.s.pVMR3, hTimer);
    594600}
    595601
     
    598604static DECLCALLBACK(void) pdmR3DevHlp_TimerUnlockClock2(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer, PPDMCRITSECT pCritSect)
    599605{
    600     TMTimerUnlock(pdmR3DevHlp_TimerToPtr(pDevIns, hTimer));
     606    PDMDEV_ASSERT_DEVINS(pDevIns);
     607    TMTimerUnlock(pDevIns->Internal.s.pVMR3, hTimer);
    601608    int rc = PDMCritSectLeave(pCritSect);
    602609    AssertRC(rc);
     
    607614static DECLCALLBACK(int) pdmR3DevHlp_TimerSetCritSect(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer, PPDMCRITSECT pCritSect)
    608615{
    609     return TMR3TimerSetCritSect(pdmR3DevHlp_TimerToPtr(pDevIns, hTimer), pCritSect);
     616    PDMDEV_ASSERT_DEVINS(pDevIns);
     617    return TMR3TimerSetCritSect(pDevIns->Internal.s.pVMR3, hTimer, pCritSect);
    610618}
    611619
     
    614622static DECLCALLBACK(int) pdmR3DevHlp_TimerSave(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer, PSSMHANDLE pSSM)
    615623{
    616     return TMR3TimerSave(pdmR3DevHlp_TimerToPtr(pDevIns, hTimer), pSSM);
     624    PDMDEV_ASSERT_DEVINS(pDevIns);
     625    return TMR3TimerSave(pDevIns->Internal.s.pVMR3, hTimer, pSSM);
    617626}
    618627
     
    621630static DECLCALLBACK(int) pdmR3DevHlp_TimerLoad(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer, PSSMHANDLE pSSM)
    622631{
    623     return TMR3TimerLoad(pdmR3DevHlp_TimerToPtr(pDevIns, hTimer), pSSM);
     632    PDMDEV_ASSERT_DEVINS(pDevIns);
     633    return TMR3TimerLoad(pDevIns->Internal.s.pVMR3, hTimer, pSSM);
    624634}
    625635
     
    628638static DECLCALLBACK(int) pdmR3DevHlp_TimerDestroy(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer)
    629639{
    630     return TMR3TimerDestroy(pdmR3DevHlp_TimerToPtr(pDevIns, hTimer));
     640    PDMDEV_ASSERT_DEVINS(pDevIns);
     641    return TMR3TimerDestroy(pDevIns->Internal.s.pVMR3, hTimer);
    631642}
    632643
  • trunk/src/VBox/VMM/VMMR3/PDMDriver.cpp

    r87761 r87766  
    13371337        fFlags |= TMTIMER_FLAGS_NO_RING0;
    13381338
    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);
    13431340
    13441341    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  
    3939DECLINLINE(void)            pdmR3QueueFreeItem(PPDMQUEUE pQueue, PPDMQUEUEITEMCORE pItem);
    4040static bool                 pdmR3QueueFlush(PPDMQUEUE pQueue);
    41 static DECLCALLBACK(void)   pdmR3QueueTimer(PVM pVM, PTMTIMER pTimer, void *pvUser);
     41static DECLCALLBACK(void)   pdmR3QueueTimer(PVM pVM, TMTIMERHANDLE hTimer, void *pvUser);
    4242
    4343
     
    8989    pQueue->pszName = pszName;
    9090    pQueue->cMilliesInterval = cMilliesInterval;
    91     //pQueue->pTimer = NULL;
     91    pQueue->hTimer = NIL_TMTIMERHANDLE;
    9292    pQueue->cbItem = (uint32_t)cbItem;
    9393    pQueue->cItems = cItems;
     
    113113    if (cMilliesInterval)
    114114    {
    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);
    116116        if (RT_SUCCESS(rc))
    117117        {
    118             rc = TMTimerSetMillies(pQueue->pTimer, cMilliesInterval);
     118            rc = TMTimerSetMillies(pVM, pQueue->hTimer, cMilliesInterval);
    119119            if (RT_FAILURE(rc))
    120120            {
    121121                AssertMsgFailed(("TMTimerSetMillies failed rc=%Rrc\n", rc));
    122                 int rc2 = TMR3TimerDestroy(pQueue->pTimer); AssertRC(rc2);
     122                int rc2 = TMR3TimerDestroy(pVM, pQueue->hTimer); AssertRC(rc2);
    123123            }
    124124        }
     
    398398     * Unlink it.
    399399     */
    400     if (pQueue->pTimer)
     400    if (pQueue->hTimer != NIL_TMTIMERHANDLE)
    401401    {
    402402        if (pUVM->pdm.s.pQueuesTimer != pQueue)
     
    448448     * Destroy the timer and free it.
    449449     */
    450     if (pQueue->pTimer)
    451     {
    452         TMR3TimerDestroy(pQueue->pTimer);
    453         pQueue->pTimer = NULL;
     450    if (pQueue->hTimer != NIL_TMTIMERHANDLE)
     451    {
     452        TMR3TimerDestroy(pVM, pQueue->hTimer);
     453        pQueue->hTimer = NIL_TMTIMERHANDLE;
    454454    }
    455455    if (pQueue->pVMRC)
     
    856856
    857857/**
    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 */
     860static DECLCALLBACK(void) pdmR3QueueTimer(PVM pVM, TMTIMERHANDLE hTimer, void *pvUser)
    866861{
    867862    PPDMQUEUE pQueue = (PPDMQUEUE)pvUser;
    868     Assert(pTimer == pQueue->pTimer); NOREF(pTimer); NOREF(pVM);
     863    Assert(hTimer == pQueue->hTimer);
    869864
    870865    if (   pQueue->pPendingR3
     
    872867        || pQueue->pPendingRC)
    873868        pdmR3QueueFlush(pQueue);
    874     int rc = TMTimerSetMillies(pQueue->pTimer, pQueue->cMilliesInterval);
     869    int rc = TMTimerSetMillies(pVM, hTimer, pQueue->cMilliesInterval);
    875870    AssertRC(rc);
    876871}
  • trunk/src/VBox/VMM/VMMR3/PDMUsb.cpp

    r87764 r87766  
    18331833        pszDesc = pszDesc2;
    18341834
    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);
    18391836
    18401837    LogFlow(("pdmR3UsbHlp_TMTimerCreate: caller='%s'/%d: returns %Rrc *phTimer=%p\n", pUsbIns->pReg->szName, pUsbIns->iInstance, rc, *phTimer));
     
    18431840
    18441841
    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 
    18541842/** @interface_method_impl{PDMUSBHLP,pfnTimerFromMicro} */
    18551843static DECLCALLBACK(uint64_t) pdmR3UsbHlp_TimerFromMicro(PPDMUSBINS pUsbIns, TMTIMERHANDLE hTimer, uint64_t cMicroSecs)
    18561844{
    1857     return TMTimerFromMicro(pdmR3UsbHlp_TimerToPtr(pUsbIns, hTimer), cMicroSecs);
     1845    PDMUSB_ASSERT_USBINS(pUsbIns);
     1846    return TMTimerFromMicro(pUsbIns->Internal.s.pVM, hTimer, cMicroSecs);
    18581847}
    18591848
     
    18631852{
    18641853    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);
    18661855}
    18671856
     
    18701859static DECLCALLBACK(uint64_t) pdmR3UsbHlp_TimerFromNano(PPDMUSBINS pUsbIns, TMTIMERHANDLE hTimer, uint64_t cNanoSecs)
    18711860{
    1872     return TMTimerFromNano(pdmR3UsbHlp_TimerToPtr(pUsbIns, hTimer), cNanoSecs);
     1861    PDMUSB_ASSERT_USBINS(pUsbIns);
     1862    return TMTimerFromNano(pUsbIns->Internal.s.pVM, hTimer, cNanoSecs);
    18731863}
    18741864
     
    18761866static DECLCALLBACK(uint64_t) pdmR3UsbHlp_TimerGet(PPDMUSBINS pUsbIns, TMTIMERHANDLE hTimer)
    18771867{
    1878     return TMTimerGet(pdmR3UsbHlp_TimerToPtr(pUsbIns, hTimer));
     1868    PDMUSB_ASSERT_USBINS(pUsbIns);
     1869    return TMTimerGet(pUsbIns->Internal.s.pVM, hTimer);
    18791870}
    18801871
     
    18831874static DECLCALLBACK(uint64_t) pdmR3UsbHlp_TimerGetFreq(PPDMUSBINS pUsbIns, TMTIMERHANDLE hTimer)
    18841875{
    1885     return TMTimerGetFreq(pdmR3UsbHlp_TimerToPtr(pUsbIns, hTimer));
     1876    PDMUSB_ASSERT_USBINS(pUsbIns);
     1877    return TMTimerGetFreq(pUsbIns->Internal.s.pVM, hTimer);
    18861878}
    18871879
     
    18901882static DECLCALLBACK(uint64_t) pdmR3UsbHlp_TimerGetNano(PPDMUSBINS pUsbIns, TMTIMERHANDLE hTimer)
    18911883{
    1892     return TMTimerGetNano(pdmR3UsbHlp_TimerToPtr(pUsbIns, hTimer));
     1884    PDMUSB_ASSERT_USBINS(pUsbIns);
     1885    return TMTimerGetNano(pUsbIns->Internal.s.pVM, hTimer);
    18931886}
    18941887
     
    18971890static DECLCALLBACK(bool) pdmR3UsbHlp_TimerIsActive(PPDMUSBINS pUsbIns, TMTIMERHANDLE hTimer)
    18981891{
    1899     return TMTimerIsActive(pdmR3UsbHlp_TimerToPtr(pUsbIns, hTimer));
     1892    PDMUSB_ASSERT_USBINS(pUsbIns);
     1893    return TMTimerIsActive(pUsbIns->Internal.s.pVM, hTimer);
    19001894}
    19011895
     
    19041898static DECLCALLBACK(bool) pdmR3UsbHlp_TimerIsLockOwner(PPDMUSBINS pUsbIns, TMTIMERHANDLE hTimer)
    19051899{
    1906     return TMTimerIsLockOwner(pdmR3UsbHlp_TimerToPtr(pUsbIns, hTimer));
     1900    PDMUSB_ASSERT_USBINS(pUsbIns);
     1901    return TMTimerIsLockOwner(pUsbIns->Internal.s.pVM, hTimer);
    19071902}
    19081903
     
    19111906static DECLCALLBACK(int) pdmR3UsbHlp_TimerLockClock(PPDMUSBINS pUsbIns, TMTIMERHANDLE hTimer)
    19121907{
    1913     return TMTimerLock(pdmR3UsbHlp_TimerToPtr(pUsbIns, hTimer), VERR_IGNORED);
     1908    PDMUSB_ASSERT_USBINS(pUsbIns);
     1909    return TMTimerLock(pUsbIns->Internal.s.pVM, hTimer, VERR_IGNORED);
    19141910}
    19151911
     
    19181914static DECLCALLBACK(int) pdmR3UsbHlp_TimerLockClock2(PPDMUSBINS pUsbIns, TMTIMERHANDLE hTimer, PPDMCRITSECT pCritSect)
    19191915{
    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);
    19211918    if (rc == VINF_SUCCESS)
    19221919    {
     
    19251922            return rc;
    19261923        AssertRC(rc);
    1927         TMTimerUnlock(pdmR3UsbHlp_TimerToPtr(pUsbIns, hTimer));
     1924        TMTimerUnlock(pUsbIns->Internal.s.pVM, hTimer);
    19281925    }
    19291926    else
     
    19361933static DECLCALLBACK(int) pdmR3UsbHlp_TimerSet(PPDMUSBINS pUsbIns, TMTIMERHANDLE hTimer, uint64_t uExpire)
    19371934{
    1938     return TMTimerSet(pdmR3UsbHlp_TimerToPtr(pUsbIns, hTimer), uExpire);
     1935    PDMUSB_ASSERT_USBINS(pUsbIns);
     1936    return TMTimerSet(pUsbIns->Internal.s.pVM, hTimer, uExpire);
    19391937}
    19401938
     
    19431941static DECLCALLBACK(int) pdmR3UsbHlp_TimerSetFrequencyHint(PPDMUSBINS pUsbIns, TMTIMERHANDLE hTimer, uint32_t uHz)
    19441942{
    1945     return TMTimerSetFrequencyHint(pdmR3UsbHlp_TimerToPtr(pUsbIns, hTimer), uHz);
     1943    PDMUSB_ASSERT_USBINS(pUsbIns);
     1944    return TMTimerSetFrequencyHint(pUsbIns->Internal.s.pVM, hTimer, uHz);
    19461945}
    19471946
     
    19501949static DECLCALLBACK(int) pdmR3UsbHlp_TimerSetMicro(PPDMUSBINS pUsbIns, TMTIMERHANDLE hTimer, uint64_t cMicrosToNext)
    19511950{
    1952     return TMTimerSetMicro(pdmR3UsbHlp_TimerToPtr(pUsbIns, hTimer), cMicrosToNext);
     1951    PDMUSB_ASSERT_USBINS(pUsbIns);
     1952    return TMTimerSetMicro(pUsbIns->Internal.s.pVM, hTimer, cMicrosToNext);
    19531953}
    19541954
     
    19571957static DECLCALLBACK(int) pdmR3UsbHlp_TimerSetMillies(PPDMUSBINS pUsbIns, TMTIMERHANDLE hTimer, uint64_t cMilliesToNext)
    19581958{
    1959     return TMTimerSetMillies(pdmR3UsbHlp_TimerToPtr(pUsbIns, hTimer), cMilliesToNext);
     1959    PDMUSB_ASSERT_USBINS(pUsbIns);
     1960    return TMTimerSetMillies(pUsbIns->Internal.s.pVM, hTimer, cMilliesToNext);
    19601961}
    19611962
     
    19641965static DECLCALLBACK(int) pdmR3UsbHlp_TimerSetNano(PPDMUSBINS pUsbIns, TMTIMERHANDLE hTimer, uint64_t cNanosToNext)
    19651966{
    1966     return TMTimerSetNano(pdmR3UsbHlp_TimerToPtr(pUsbIns, hTimer), cNanosToNext);
     1967    PDMUSB_ASSERT_USBINS(pUsbIns);
     1968    return TMTimerSetNano(pUsbIns->Internal.s.pVM, hTimer, cNanosToNext);
    19671969}
    19681970
     
    19711973static DECLCALLBACK(int) pdmR3UsbHlp_TimerSetRelative(PPDMUSBINS pUsbIns, TMTIMERHANDLE hTimer, uint64_t cTicksToNext, uint64_t *pu64Now)
    19721974{
    1973     return TMTimerSetRelative(pdmR3UsbHlp_TimerToPtr(pUsbIns, hTimer), cTicksToNext, pu64Now);
     1975    PDMUSB_ASSERT_USBINS(pUsbIns);
     1976    return TMTimerSetRelative(pUsbIns->Internal.s.pVM, hTimer, cTicksToNext, pu64Now);
    19741977}
    19751978
     
    19781981static DECLCALLBACK(int) pdmR3UsbHlp_TimerStop(PPDMUSBINS pUsbIns, TMTIMERHANDLE hTimer)
    19791982{
    1980     return TMTimerStop(pdmR3UsbHlp_TimerToPtr(pUsbIns, hTimer));
     1983    PDMUSB_ASSERT_USBINS(pUsbIns);
     1984    return TMTimerStop(pUsbIns->Internal.s.pVM, hTimer);
    19811985}
    19821986
     
    19851989static DECLCALLBACK(void) pdmR3UsbHlp_TimerUnlockClock(PPDMUSBINS pUsbIns, TMTIMERHANDLE hTimer)
    19861990{
    1987     TMTimerUnlock(pdmR3UsbHlp_TimerToPtr(pUsbIns, hTimer));
     1991    PDMUSB_ASSERT_USBINS(pUsbIns);
     1992    TMTimerUnlock(pUsbIns->Internal.s.pVM, hTimer);
    19881993}
    19891994
     
    19921997static DECLCALLBACK(void) pdmR3UsbHlp_TimerUnlockClock2(PPDMUSBINS pUsbIns, TMTIMERHANDLE hTimer, PPDMCRITSECT pCritSect)
    19931998{
    1994     TMTimerUnlock(pdmR3UsbHlp_TimerToPtr(pUsbIns, hTimer));
     1999    PDMUSB_ASSERT_USBINS(pUsbIns);
     2000    TMTimerUnlock(pUsbIns->Internal.s.pVM, hTimer);
    19952001    int rc = PDMCritSectLeave(pCritSect);
    19962002    AssertRC(rc);
     
    20012007static DECLCALLBACK(int) pdmR3UsbHlp_TimerSetCritSect(PPDMUSBINS pUsbIns, TMTIMERHANDLE hTimer, PPDMCRITSECT pCritSect)
    20022008{
    2003     return TMR3TimerSetCritSect(pdmR3UsbHlp_TimerToPtr(pUsbIns, hTimer), pCritSect);
     2009    PDMUSB_ASSERT_USBINS(pUsbIns);
     2010    return TMR3TimerSetCritSect(pUsbIns->Internal.s.pVM, hTimer, pCritSect);
    20042011}
    20052012
     
    20082015static DECLCALLBACK(int) pdmR3UsbHlp_TimerSave(PPDMUSBINS pUsbIns, TMTIMERHANDLE hTimer, PSSMHANDLE pSSM)
    20092016{
    2010     return TMR3TimerSave(pdmR3UsbHlp_TimerToPtr(pUsbIns, hTimer), pSSM);
     2017    PDMUSB_ASSERT_USBINS(pUsbIns);
     2018    return TMR3TimerSave(pUsbIns->Internal.s.pVM, hTimer, pSSM);
    20112019}
    20122020
     
    20152023static DECLCALLBACK(int) pdmR3UsbHlp_TimerLoad(PPDMUSBINS pUsbIns, TMTIMERHANDLE hTimer, PSSMHANDLE pSSM)
    20162024{
    2017     return TMR3TimerLoad(pdmR3UsbHlp_TimerToPtr(pUsbIns, hTimer), pSSM);
     2025    PDMUSB_ASSERT_USBINS(pUsbIns);
     2026    return TMR3TimerLoad(pUsbIns->Internal.s.pVM, hTimer, pSSM);
    20182027}
    20192028
     
    20222031static DECLCALLBACK(int) pdmR3UsbHlp_TimerDestroy(PPDMUSBINS pUsbIns, TMTIMERHANDLE hTimer)
    20232032{
    2024     return TMR3TimerDestroy(pdmR3UsbHlp_TimerToPtr(pUsbIns, hTimer));
     2033    PDMUSB_ASSERT_USBINS(pUsbIns);
     2034    return TMR3TimerDestroy(pUsbIns->Internal.s.pVM, hTimer);
    20252035}
    20262036
  • trunk/src/VBox/VMM/VMMR3/TM.cpp

    r87765 r87766  
    180180static DECLCALLBACK(int)    tmR3SetWarpDrive(PUVM pUVM, uint32_t u32Percent);
    181181#ifndef VBOX_WITHOUT_NS_ACCOUNTING
    182 static DECLCALLBACK(void)   tmR3CpuLoadTimer(PVM pVM, PTMTIMER pTimer, void *pvUser);
     182static DECLCALLBACK(void)   tmR3CpuLoadTimer(PVM pVM, TMTIMERHANDLE hTimer, void *pvUser);
    183183#endif
    184184static DECLCALLBACK(void)   tmR3TimerInfo(PVM pVM, PCDBGFINFOHLP pHlp, const char *pszArgs);
     
    11001100     * Create a timer for refreshing the CPU load stats.
    11011101     */
    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);
    11041104    if (RT_SUCCESS(rc))
    1105         rc = TMTimerSetMillies(pTimer, 1000);
     1105        rc = TMTimerSetMillies(pVM, hTimer, 1000);
    11061106#endif
    11071107
     
    15421542    pTimer->u64Expire       = 0;
    15431543    pTimer->enmClock        = enmClock;
     1544    pTimer->hSelf           = (TMTIMERHANDLE)pTimer;
    15441545    pTimer->pVMR3           = pVM;
    15451546    pTimer->pVMR0           = pVM->pVMR0ForCall; /** @todo fix properly */
     
    16021603 * @param   pszDesc         Pointer to description string which must stay around
    16031604 *                          until the timer is fully destroyed (i.e. a bit after TMTimerDestroy()).
    1604  * @param   ppTimer         Where to store the timer on success.
     1605 * @param   phTimer         Where to store the timer handle on success.
    16051606 */
    16061607VMM_INT_DECL(int) TMR3TimerCreateDevice(PVM pVM, PPDMDEVINS pDevIns, TMCLOCK enmClock,
    16071608                                        PFNTMTIMERDEV pfnCallback, void *pvUser,
    1608                                         uint32_t fFlags, const char *pszDesc, PPTMTIMERR3 ppTimer)
     1609                                        uint32_t fFlags, const char *pszDesc, PTMTIMERHANDLE phTimer)
    16091610{
    16101611    AssertReturn(!(fFlags & ~(TMTIMER_FLAGS_NO_CRIT_SECT | TMTIMER_FLAGS_RING0 | TMTIMER_FLAGS_NO_RING0)),
     
    16141615     * Allocate and init stuff.
    16151616     */
    1616     int rc = tmr3TimerCreate(pVM, enmClock, fFlags, pszDesc, ppTimer);
     1617    PTMTIMER pTimer;
     1618    int rc = tmr3TimerCreate(pVM, enmClock, fFlags, pszDesc, &pTimer);
    16171619    if (RT_SUCCESS(rc))
    16181620    {
    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;
    16231625        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));
    16261629    }
    16271630
     
    16441647 * @param   pszDesc         Pointer to description string which must stay around
    16451648 *                          until the timer is fully destroyed (i.e. a bit after TMTimerDestroy()).
    1646  * @param   ppTimer         Where to store the timer on success.
     1649 * @param   phTimer         Where to store the timer handle on success.
    16471650 */
    16481651VMM_INT_DECL(int) TMR3TimerCreateUsb(PVM pVM, PPDMUSBINS pUsbIns, TMCLOCK enmClock,
    16491652                                     PFNTMTIMERUSB pfnCallback, void *pvUser,
    1650                                      uint32_t fFlags, const char *pszDesc, PPTMTIMERR3 ppTimer)
     1653                                     uint32_t fFlags, const char *pszDesc, PTMTIMERHANDLE phTimer)
    16511654{
    16521655    AssertReturn(!(fFlags & ~(TMTIMER_FLAGS_NO_CRIT_SECT | TMTIMER_FLAGS_NO_RING0)), VERR_INVALID_PARAMETER);
     
    16551658     * Allocate and init stuff.
    16561659     */
    1657     int rc = tmr3TimerCreate(pVM, enmClock, fFlags, pszDesc, ppTimer);
     1660    PTMTIMER pTimer;
     1661    int rc = tmr3TimerCreate(pVM, enmClock, fFlags, pszDesc, &pTimer);
    16581662    if (RT_SUCCESS(rc))
    16591663    {
    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;
    16641668        //if (!(fFlags & TMTIMER_FLAGS_NO_CRIT_SECT))
    16651669        //{
    16661670        //    if (pDevIns->pCritSectR3)
    1667         //        (*ppTimer)->pCritSect = pUsbIns->pCritSectR3;
     1671        //        pTimer->pCritSect = pUsbIns->pCritSectR3;
    16681672        //    else
    1669         //        (*ppTimer)->pCritSect = IOMR3GetCritSect(pVM);
     1673        //        pTimer->pCritSect = IOMR3GetCritSect(pVM);
    16701674        //}
    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));
    16721677    }
    16731678
     
    16881693 * @param   pszDesc         Pointer to description string which must stay around
    16891694 *                          until the timer is fully destroyed (i.e. a bit after TMTimerDestroy()).
    1690  * @param   ppTimer         Where to store the timer on success.
     1695 * @param   phTimer         Where to store the timer handle on success.
    16911696 */
    16921697VMM_INT_DECL(int) TMR3TimerCreateDriver(PVM pVM, PPDMDRVINS pDrvIns, TMCLOCK enmClock, PFNTMTIMERDRV pfnCallback, void *pvUser,
    1693                                         uint32_t fFlags, const char *pszDesc, PPTMTIMERR3 ppTimer)
     1698                                        uint32_t fFlags, const char *pszDesc, PTMTIMERHANDLE phTimer)
    16941699{
    16951700    AssertReturn(!(fFlags & ~(TMTIMER_FLAGS_NO_CRIT_SECT | TMTIMER_FLAGS_RING0 | TMTIMER_FLAGS_NO_RING0)),
     
    16991704     * Allocate and init stuff.
    17001705     */
    1701     int rc = tmr3TimerCreate(pVM, enmClock, fFlags, pszDesc, ppTimer);
     1706    PTMTIMER pTimer;
     1707    int rc = tmr3TimerCreate(pVM, enmClock, fFlags, pszDesc, &pTimer);
    17021708    if (RT_SUCCESS(rc))
    17031709    {
    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));
    17091716    }
    17101717
     
    17241731 * @param   pszDesc         Pointer to description string which must stay around
    17251732 *                          until the timer is fully destroyed (i.e. a bit after TMTimerDestroy()).
    1726  * @param   ppTimer         Where to store the timer on success.
     1733 * @param   phTimer         Where to store the timer handle on success.
    17271734 */
    17281735VMMR3DECL(int) TMR3TimerCreate(PVM pVM, TMCLOCK enmClock, PFNTMTIMERINT pfnCallback, void *pvUser,
    1729                                uint32_t fFlags, const char *pszDesc, PPTMTIMERR3 ppTimer)
     1736                               uint32_t fFlags, const char *pszDesc, PTMTIMERHANDLE phTimer)
    17301737{
    17311738    AssertReturn(fFlags & (TMTIMER_FLAGS_RING0 | TMTIMER_FLAGS_NO_RING0), VERR_INVALID_FLAGS);
     
    17431750        pTimer->u.Internal.pfnTimer = pfnCallback;
    17441751        pTimer->pvUser              = pvUser;
    1745         *ppTimer = pTimer;
     1752        *phTimer = pTimer->hSelf;
    17461753        Log(("TM: Created internal timer %p clock %d callback %p '%s'\n", pTimer, enmClock, pfnCallback, pszDesc));
    17471754    }
     
    17571764 * @param   pTimer          Timer handle as returned by one of the create functions.
    17581765 */
    1759 VMMR3DECL(int) TMR3TimerDestroy(PTMTIMER pTimer)
    1760 {
    1761     /*
    1762      * Be extra careful here.
    1763      */
    1764     if (!pTimer)
    1765         return VINF_SUCCESS;
    1766     AssertPtr(pTimer);
     1766static int tmR3TimerDestroy(PVMCC pVM, PTMTIMER pTimer)
     1767{
    17671768    Assert((unsigned)pTimer->enmClock < (unsigned)TMCLOCK_MAX);
    17681769
    1769     PVM             pVM      = pTimer->CTX_SUFF(pVM);
    17701770    PTMTIMERQUEUE   pQueue   = &pVM->tm.s.CTX_SUFF(paTimerQueues)[pTimer->enmClock];
    17711771    bool            fActive  = false;
     
    19251925
    19261926/**
     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 */
     1933VMMR3DECL(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/**
    19271945 * Destroy all timers owned by a device.
    19281946 *
     
    19461964            &&  pDestroy->u.Dev.pDevIns == pDevIns)
    19471965        {
    1948             int rc = TMR3TimerDestroy(pDestroy);
     1966            int rc = tmR3TimerDestroy(pVM, pDestroy);
    19491967            AssertRC(rc);
    19501968        }
     
    19791997            &&  pDestroy->u.Usb.pUsbIns == pUsbIns)
    19801998        {
    1981             int rc = TMR3TimerDestroy(pDestroy);
     1999            int rc = tmR3TimerDestroy(pVM, pDestroy);
    19822000            AssertRC(rc);
    19832001        }
     
    20122030            &&  pDestroy->u.Drv.pDrvIns == pDrvIns)
    20132031        {
    2014             int rc = TMR3TimerDestroy(pDestroy);
     2032            int rc = tmR3TimerDestroy(pVM, pDestroy);
    20152033            AssertRC(rc);
    20162034        }
     
    22882306                case TMTIMERTYPE_USB:       pTimer->u.Usb.pfnTimer(pTimer->u.Usb.pUsbIns, pTimer, pTimer->pvUser); break;
    22892307                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;
    22912309                default:
    22922310                    AssertMsgFailed(("Invalid timer type %d (%s)\n", pTimer->enmType, pTimer->pszDesc));
     
    24722490            case TMTIMERTYPE_USB:       pTimer->u.Usb.pfnTimer(pTimer->u.Usb.pUsbIns, pTimer, pTimer->pvUser); break;
    24732491            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;
    24752493            default:
    24762494                AssertMsgFailed(("Invalid timer type %d (%s)\n", pTimer->enmType, pTimer->pszDesc));
     
    26962714 *
    26972715 * @returns VBox status code.
    2698  * @param   pTimer          Timer to save.
     2716 * @param   pVM             The cross context VM structure.
     2717 * @param   hTimer          Timer to save.
    26992718 * @param   pSSM            Save State Manager handle.
    27002719 */
    2701 VMMR3DECL(int) TMR3TimerSave(PTMTIMERR3 pTimer, PSSMHANDLE pSSM)
    2702 {
     2720VMMR3DECL(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);
    27032725    LogFlow(("TMR3TimerSave: %p:{enmState=%s, .pszDesc={%s}} pSSM=%p\n", pTimer, tmTimerState(pTimer->enmState), pTimer->pszDesc, pSSM));
     2726
    27042727    switch (pTimer->enmState)
    27052728    {
     
    27382761 *
    27392762 * @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.
    27412765 * @param   pSSM            Save State Manager handle.
    27422766 */
    2743 VMMR3DECL(int) TMR3TimerLoad(PTMTIMERR3 pTimer, PSSMHANDLE pSSM)
    2744 {
    2745     Assert(pTimer); Assert(pSSM); VM_ASSERT_EMT(pTimer->pVMR3);
     2767VMMR3DECL(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);
    27462773    LogFlow(("TMR3TimerLoad: %p:{enmState=%s, .pszDesc={%s}} pSSM=%p\n", pTimer, tmTimerState(pTimer->enmState), pTimer->pszDesc, pSSM));
    27472774
     
    27872814         */
    27882815        Log(("u8State=%d u64Expire=%llu\n", u8State, u64Expire));
    2789         rc = TMTimerSet(pTimer, u64Expire);
     2816        rc = TMTimerSet(pVM, hTimer, u64Expire);
    27902817    }
    27912818    else
     
    27952822         */
    27962823        Log(("u8State=%d\n", u8State));
    2797         rc = TMTimerStop(pTimer);
     2824        rc = TMTimerStop(pVM, hTimer);
    27982825    }
    27992826
     
    28872914 *          active.
    28882915 */
    2889 VMMR3DECL(int) TMR3TimerSetCritSect(PTMTIMERR3 pTimer, PPDMCRITSECT pCritSect)
    2890 {
    2891     AssertPtrReturn(pTimer, VERR_INVALID_HANDLE);
     2916VMMR3DECL(int) TMR3TimerSetCritSect(PVM pVM, TMTIMERHANDLE hTimer, PPDMCRITSECT pCritSect)
     2917{
     2918    PTMTIMER pTimer;
     2919    TMTIMER_HANDLE_TO_PTR_RETURN(pVM, hTimer, pTimer);
    28922920    AssertPtrReturn(pCritSect, VERR_INVALID_PARAMETER);
    28932921    const char *pszName = PDMR3CritSectName(pCritSect); /* exploited for validation */
     
    34143442
    34153443/**
    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 */
     3448static DECLCALLBACK(void) tmR3CpuLoadTimer(PVM pVM, TMTIMERHANDLE hTimer, void *pvUser)
    34243449{
    34253450    /*
    34263451     * Re-arm the timer first.
    34273452     */
    3428     int rc = TMTimerSetMillies(pTimer, 1000);
     3453    int rc = TMTimerSetMillies(pVM, hTimer, 1000);
    34293454    AssertLogRelRC(rc);
    34303455    NOREF(pvUser);
     
    36803705                        pTimer->offScheduleNext,
    36813706                        tmR3Get5CharClockName(pTimer->enmClock),
    3682                         TMTimerGet(pTimer),
     3707                        TMTimerGet(pVM, pTimer->hSelf),
    36833708                        pTimer->u64Expire,
    36843709                        pTimer->uHzHint,
     
    37263751                            pTimer->offScheduleNext,
    37273752                            tmR3Get5CharClockName(pTimer->enmClock),
    3728                             TMTimerGet(pTimer),
     3753                            TMTimerGet(pVM, pTimer->hSelf),
    37293754                            pTimer->u64Expire,
    37303755                            pTimer->uHzHint,
  • trunk/src/VBox/VMM/VMMR3/VMM.cpp

    r87765 r87766  
    169169static DECLCALLBACK(int)    vmmR3Save(PVM pVM, PSSMHANDLE pSSM);
    170170static DECLCALLBACK(int)    vmmR3Load(PVM pVM, PSSMHANDLE pSSM, uint32_t uVersion, uint32_t uPass);
    171 static DECLCALLBACK(void)   vmmR3YieldEMT(PVM pVM, PTMTIMER pTimer, void *pvUser);
     171static DECLCALLBACK(void)   vmmR3YieldEMT(PVM pVM, TMTIMERHANDLE hTimer, void *pvUser);
    172172static VBOXSTRICTRC         vmmR3EmtRendezvousCommon(PVM pVM, PVMCPU pVCpu, bool fIsCaller,
    173173                                                     uint32_t fFlags, PFNVMMEMTRENDEZVOUS pfnRendezvous, void *pvUser);
     
    661661             */
    662662            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);
    664664            AssertRCReturn(rc, rc);
    665665
    666             rc = TMTimerSetMillies(pVM->vmm.s.pYieldTimer, pVM->vmm.s.cYieldEveryMillies);
     666            rc = TMTimerSetMillies(pVM, pVM->vmm.s.hYieldTimer, pVM->vmm.s.cYieldEveryMillies);
    667667            AssertRCReturn(rc, rc);
    668668            break;
     
    998998    if (!pVM->vmm.s.cYieldResumeMillies)
    999999    {
    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);
    10021002        if (u64Now >= u64Expire || u64Expire == ~(uint64_t)0)
    10031003            pVM->vmm.s.cYieldResumeMillies = pVM->vmm.s.cYieldEveryMillies;
    10041004        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);
    10071007    }
    10081008    pVM->vmm.s.u64LastYield = RTTimeNanoTS();
     
    10181018{
    10191019    if (!pVM->vmm.s.cYieldResumeMillies)
    1020         TMTimerStop(pVM->vmm.s.pYieldTimer);
     1020        TMTimerStop(pVM, pVM->vmm.s.hYieldTimer);
    10211021    pVM->vmm.s.cYieldResumeMillies = pVM->vmm.s.cYieldEveryMillies;
    10221022    pVM->vmm.s.u64LastYield = RTTimeNanoTS();
     
    10331033    if (pVM->vmm.s.cYieldResumeMillies)
    10341034    {
    1035         TMTimerSetMillies(pVM->vmm.s.pYieldTimer, pVM->vmm.s.cYieldResumeMillies);
     1035        TMTimerSetMillies(pVM, pVM->vmm.s.hYieldTimer, pVM->vmm.s.cYieldResumeMillies);
    10361036        pVM->vmm.s.cYieldResumeMillies = 0;
    10371037    }
     
    10401040
    10411041/**
    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 */
     1046static DECLCALLBACK(void) vmmR3YieldEMT(PVM pVM, TMTIMERHANDLE hTimer, void *pvUser)
    10491047{
    10501048    NOREF(pvUser);
     
    10771075#endif
    10781076    }
    1079     TMTimerSetMillies(pTimer, pVM->vmm.s.cYieldEveryMillies);
     1077    TMTimerSetMillies(pVM, hTimer, pVM->vmm.s.cYieldEveryMillies);
    10801078}
    10811079
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette