VirtualBox

Changeset 92720 in vbox for trunk/src/VBox/VMM


Ignore:
Timestamp:
Dec 2, 2021 10:41:09 PM (3 years ago)
Author:
vboxsync
Message:

VMM/TM: Driverless adjustments for init complete code. bugref:10138

File:
1 edited

Legend:

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

    r92712 r92720  
    192192static const char          *tmR3GetTSCModeName(PVM pVM);
    193193static const char          *tmR3GetTSCModeNameEx(TMTSCMODE enmMode);
     194static int                  tmR3TimerQueueGrow(PVM pVM, PTMTIMERQUEUE pQueue, uint32_t cNewTimers);
    194195
    195196
     
    10721073
    10731074    /*
    1074      * Resolve symbols.
    1075      */
    1076     rc = PDMR3LdrGetSymbolR0(pVM, NULL, "tmVirtualNanoTSBad",           &pVM->tm.s.VirtualGetRawDataR0.pfnBad);
    1077     AssertRCReturn(rc, rc);
    1078     rc = PDMR3LdrGetSymbolR0(pVM, NULL, "tmVirtualNanoTSBadCpuIndex",   &pVM->tm.s.VirtualGetRawDataR0.pfnBadCpuIndex);
    1079     AssertRCReturn(rc, rc);
    1080     rc = PDMR3LdrGetSymbolR0(pVM, NULL, "tmVirtualNanoTSRediscover",    &pVM->tm.s.VirtualGetRawDataR0.pfnRediscover);
    1081     AssertRCReturn(rc, rc);
    1082     pVM->tm.s.pfnVirtualGetRawR0 = pVM->tm.s.VirtualGetRawDataR0.pfnRediscover;
     1075     * Resolve symbols, unless we're in driverless mode.
     1076     */
     1077    if (!SUPR3IsDriverless())
     1078    {
     1079        rc = PDMR3LdrGetSymbolR0(pVM, NULL, "tmVirtualNanoTSBad",           &pVM->tm.s.VirtualGetRawDataR0.pfnBad);
     1080        AssertRCReturn(rc, rc);
     1081        rc = PDMR3LdrGetSymbolR0(pVM, NULL, "tmVirtualNanoTSBadCpuIndex",   &pVM->tm.s.VirtualGetRawDataR0.pfnBadCpuIndex);
     1082        AssertRCReturn(rc, rc);
     1083        rc = PDMR3LdrGetSymbolR0(pVM, NULL, "tmVirtualNanoTSRediscover",    &pVM->tm.s.VirtualGetRawDataR0.pfnRediscover);
     1084        AssertRCReturn(rc, rc);
     1085        pVM->tm.s.pfnVirtualGetRawR0 = pVM->tm.s.VirtualGetRawDataR0.pfnRediscover;
     1086    }
    10831087
    10841088#ifndef VBOX_WITHOUT_NS_ACCOUNTING
     
    11071111    {
    11081112        PTMTIMERQUEUE pQueue = &pVM->tm.s.aTimerQueues[s_aExtra[i].idxQueue];
     1113        PDMCritSectRwEnterExcl(pVM, &pQueue->AllocLock, VERR_IGNORED);
    11091114        if (s_aExtra[i].cExtra > pQueue->cTimersFree)
    11101115        {
    1111             PDMCritSectRwEnterExcl(pVM, &pQueue->AllocLock, VERR_IGNORED);
    11121116            uint32_t cTimersAlloc = pQueue->cTimersAlloc + s_aExtra[i].cExtra - pQueue->cTimersFree;
    1113             rc = VMMR3CallR0Emt(pVM, VMMGetCpu(pVM), VMMR0_DO_TM_GROW_TIMER_QUEUE,
    1114                                 RT_MAKE_U64(cTimersAlloc, s_aExtra[i].idxQueue), NULL);
     1117            rc = tmR3TimerQueueGrow(pVM, pQueue, cTimersAlloc);
    11151118            AssertLogRelMsgReturn(RT_SUCCESS(rc), ("rc=%Rrc cTimersAlloc=%u %s\n", rc, cTimersAlloc, pQueue->szName), rc);
    1116             PDMCritSectRwLeaveExcl(pVM, &pQueue->AllocLock);
    11171119        }
     1120        PDMCritSectRwLeaveExcl(pVM, &pQueue->AllocLock);
    11181121    }
    11191122
     
    15301533 * @param   pVM         The cross context VM structure.
    15311534 * @param   pQueue      The timer queue to grow.
     1535 * @param   cNewTimers  The minimum number of timers after growing.
    15321536 * @note    Caller owns the queue's allocation lock.
    15331537 */
    1534 static int tmR3TimerQueueGrow(PVM pVM, PTMTIMERQUEUE pQueue)
     1538static int tmR3TimerQueueGrow(PVM pVM, PTMTIMERQUEUE pQueue, uint32_t cNewTimers)
    15351539{
    15361540    /*
     
    15411545    AssertReturn(!pQueue->fCannotGrow, VERR_TM_TIMER_QUEUE_CANNOT_GROW);
    15421546
     1547    uint32_t const cOldEntries = pQueue->cTimersAlloc;
     1548    AssertReturn(cNewTimers > cOldEntries, VERR_TM_IPE_1);
     1549    AssertReturn(cNewTimers < _32K, VERR_TM_IPE_1);
     1550
    15431551    /*
    15441552     * Do the growing.
    15451553     */
    15461554    int rc;
    1547     uint32_t const cOldEntries = pQueue->cTimersAlloc;
    1548     uint32_t       cNewTimers  = cOldEntries + 64;
    1549     Assert(cNewTimers < _32K);
    15501555    if (!SUPR3IsDriverless())
    15511556    {
     
    16381643    if (!pQueue->cTimersFree)
    16391644    {
    1640         rc = tmR3TimerQueueGrow(pVM, pQueue);
     1645        rc = tmR3TimerQueueGrow(pVM, pQueue, pQueue->cTimersAlloc + 64);
    16411646        AssertRCReturnStmt(rc, PDMCritSectRwLeaveExcl(pVM, &pQueue->AllocLock), rc);
    16421647    }
     
    38423847    PSUPGLOBALINFOPAGE pGip;
    38433848    return tmR3HasFixedTSC(pVM)                             /* Host has fixed-rate TSC. */
    3844         && (   (pGip = g_pSUPGlobalInfoPage) != NULL        /* Can be NULL in driverless mode. */
     3849        && (   (pGip = g_pSUPGlobalInfoPage) == NULL        /* Can be NULL in driverless mode. */
    38453850            || (pGip->u32Mode != SUPGIPMODE_ASYNC_TSC));    /* GIP thinks it's monotonic. */
    38463851}
Note: See TracChangeset for help on using the changeset viewer.

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