VirtualBox

Changeset 82329 in vbox


Ignore:
Timestamp:
Dec 2, 2019 6:16:13 PM (5 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
135153
Message:

PDM,DevACPI,DevHPET,DevPit-i8254,DevRTC,APIC: Added device helpers for locking and unlocking both the virtual-sync clock and entering a user specified critical section. bugref:9218

Location:
trunk
Files:
9 edited

Legend:

Unmodified
Added
Removed
  • trunk/include/VBox/vmm/pdmdev.h

    r82316 r82329  
    19641964
    19651965/** Current PDMDEVHLPR3 version number. */
    1966 #define PDM_DEVHLPR3_VERSION                    PDM_VERSION_MAKE_PP(0xffe7, 40, 0)
     1966#define PDM_DEVHLPR3_VERSION                    PDM_VERSION_MAKE_PP(0xffe7, 41, 0)
    19671967
    19681968/**
     
    24672467    DECLR3CALLBACKMEMBER(bool,     pfnTimerIsActive,(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer));
    24682468    DECLR3CALLBACKMEMBER(bool,     pfnTimerIsLockOwner,(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer));
    2469     DECLR3CALLBACKMEMBER(int,      pfnTimerLock,(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer, int rcBusy));
     2469    DECLR3CALLBACKMEMBER(VBOXSTRICTRC, pfnTimerLockClock,(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer, int rcBusy));
     2470    /** Takes the clock lock then enters the specified critical section. */
     2471    DECLR3CALLBACKMEMBER(VBOXSTRICTRC, pfnTimerLockClock2,(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer, PPDMCRITSECT pCritSect, int rcBusy));
    24702472    DECLR3CALLBACKMEMBER(int,      pfnTimerSet,(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer, uint64_t uExpire));
    24712473    DECLR3CALLBACKMEMBER(int,      pfnTimerSetFrequencyHint,(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer, uint32_t uHz));
     
    24752477    DECLR3CALLBACKMEMBER(int,      pfnTimerSetRelative,(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer, uint64_t cTicksToNext, uint64_t *pu64Now));
    24762478    DECLR3CALLBACKMEMBER(int,      pfnTimerStop,(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer));
    2477     DECLR3CALLBACKMEMBER(void,     pfnTimerUnlock,(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer));
     2479    DECLR3CALLBACKMEMBER(void,     pfnTimerUnlockClock,(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer));
     2480    DECLR3CALLBACKMEMBER(void,     pfnTimerUnlockClock2,(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer, PPDMCRITSECT pCritSect));
    24782481    DECLR3CALLBACKMEMBER(int,      pfnTimerSetCritSect,(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer, PPDMCRITSECT pCritSect));
    24792482    DECLR3CALLBACKMEMBER(int,      pfnTimerSave,(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer, PSSMHANDLE pSSM));
     
    47094712    DECLR0CALLBACKMEMBER(bool,     pfnTimerIsActive,(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer));
    47104713    DECLR0CALLBACKMEMBER(bool,     pfnTimerIsLockOwner,(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer));
    4711     DECLR0CALLBACKMEMBER(int,      pfnTimerLock,(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer, int rcBusy));
     4714    DECLR0CALLBACKMEMBER(VBOXSTRICTRC, pfnTimerLockClock,(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer, int rcBusy));
     4715    /** Takes the clock lock then enters the specified critical section. */
     4716    DECLR0CALLBACKMEMBER(VBOXSTRICTRC, pfnTimerLockClock2,(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer, PPDMCRITSECT pCritSect, int rcBusy));
    47124717    DECLR0CALLBACKMEMBER(int,      pfnTimerSet,(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer, uint64_t uExpire));
    47134718    DECLR0CALLBACKMEMBER(int,      pfnTimerSetFrequencyHint,(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer, uint32_t uHz));
     
    47174722    DECLR0CALLBACKMEMBER(int,      pfnTimerSetRelative,(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer, uint64_t cTicksToNext, uint64_t *pu64Now));
    47184723    DECLR0CALLBACKMEMBER(int,      pfnTimerStop,(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer));
    4719     DECLR0CALLBACKMEMBER(void,     pfnTimerUnlock,(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer));
     4724    DECLR0CALLBACKMEMBER(void,     pfnTimerUnlockClock,(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer));
     4725    DECLR0CALLBACKMEMBER(void,     pfnTimerUnlockClock2,(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer, PPDMCRITSECT pCritSect));
    47204726    /** @} */
    47214727
     
    49374943
    49384944/** Current PDMDEVHLP version number. */
    4939 #define PDM_DEVHLPR0_VERSION                    PDM_VERSION_MAKE(0xffe5, 15, 0)
     4945#define PDM_DEVHLPR0_VERSION                    PDM_VERSION_MAKE(0xffe5, 16, 0)
    49404946
    49414947
     
    58625868 * @copydoc PDMDEVHLPR3::pfnTimerLock
    58635869 */
    5864 DECLINLINE(int)      PDMDevHlpTimerLock(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer, int rcBusy)
    5865 {
    5866     return pDevIns->CTX_SUFF(pHlp)->pfnTimerLock(pDevIns, hTimer, rcBusy);
     5870DECLINLINE(VBOXSTRICTRC) PDMDevHlpTimerLockClock(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer, int rcBusy)
     5871{
     5872    return pDevIns->CTX_SUFF(pHlp)->pfnTimerLockClock(pDevIns, hTimer, rcBusy);
     5873}
     5874
     5875/**
     5876 * @copydoc PDMDEVHLPR3::pfnTimerLock2
     5877 */
     5878DECLINLINE(VBOXSTRICTRC) PDMDevHlpTimerLockClock2(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer, PPDMCRITSECT pCritSect, int rcBusy)
     5879{
     5880    return pDevIns->CTX_SUFF(pHlp)->pfnTimerLockClock2(pDevIns, hTimer, pCritSect, rcBusy);
    58675881}
    58685882
     
    59245938
    59255939/**
    5926  * @copydoc PDMDEVHLPR3::pfnTimerUnlock
    5927  */
    5928 DECLINLINE(void)     PDMDevHlpTimerUnlock(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer)
    5929 {
    5930     pDevIns->CTX_SUFF(pHlp)->pfnTimerUnlock(pDevIns, hTimer);
     5940 * @copydoc PDMDEVHLPR3::pfnTimerUnlockClock
     5941 */
     5942DECLINLINE(void)     PDMDevHlpTimerUnlockClock(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer)
     5943{
     5944    pDevIns->CTX_SUFF(pHlp)->pfnTimerUnlockClock(pDevIns, hTimer);
     5945}
     5946
     5947/**
     5948 * @copydoc PDMDEVHLPR3::pfnTimerUnlockClock2
     5949 */
     5950DECLINLINE(void)     PDMDevHlpTimerUnlockClock2(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer, PPDMCRITSECT pCritSect)
     5951{
     5952    pDevIns->CTX_SUFF(pHlp)->pfnTimerUnlockClock2(pDevIns, hTimer, pCritSect);
    59315953}
    59325954
  • trunk/src/VBox/Devices/Audio/DevIchAc97.cpp

    r82328 r82329  
    578578#define DEVAC97_LOCK_BOTH_RETURN(a_pDevIns, a_pThis, a_SD, a_rcBusy) \
    579579    do { \
    580         int rcLock = PDMDevHlpTimerLock((a_pDevIns), RT_SAFE_SUBSCRIPT8((a_pThis)->ahTimers, (a_SD)), (a_rcBusy)); \
    581         if (rcLock == VINF_SUCCESS) \
     580        VBOXSTRICTRC rcLock = PDMDevHlpTimerLockClock2((a_pDevIns), RT_SAFE_SUBSCRIPT8((a_pThis)->ahTimers, (a_SD)), \
     581                                                       &(a_pThis)->CritSect, (a_rcBusy)); \
     582        if (RT_LIKELY(rcLock == VINF_SUCCESS)) \
     583        { /* likely */ } \
     584        else \
    582585        { \
    583             rcLock = PDMDevHlpCritSectEnter((a_pDevIns), &(a_pThis)->CritSect, (a_rcBusy)); \
    584             if (rcLock == VINF_SUCCESS) \
    585                 break; \
    586             PDMDevHlpTimerUnlock((a_pDevIns), RT_SAFE_SUBSCRIPT8((a_pThis)->ahTimers, (a_SD))); \
     586            AssertRC(VBOXSTRICTRC_VAL(rcLock)); \
     587            return rcLock; \
    587588        } \
    588         AssertRC(rcLock); \
    589         return rcLock; \
    590589    } while (0)
    591590
     
    594593 */
    595594#define DEVAC97_UNLOCK_BOTH(a_pDevIns, a_pThis, a_SD) \
    596     do { \
    597         PDMDevHlpCritSectLeave((a_pDevIns), &(a_pThis)->CritSect); \
    598         PDMDevHlpTimerUnlock((a_pDevIns), RT_SAFE_SUBSCRIPT8((a_pThis)->ahTimers, (a_SD))); \
    599     } while (0)
     595    PDMDevHlpTimerUnlockClock2((a_pDevIns), RT_SAFE_SUBSCRIPT8((a_pThis)->ahTimers, (a_SD)), &(a_pThis)->CritSect)
    600596
    601597#ifdef VBOX_WITH_STATISTICS
  • trunk/src/VBox/Devices/PC/DevACPI.cpp

    r82068 r82329  
    18011801     */
    18021802    PACPISTATE pThis = PDMDEVINS_2_DATA(pDevIns, PACPISTATE);
    1803     VBOXSTRICTRC rc = PDMDevHlpTimerLock(pDevIns, pThis->hPmTimer, VINF_IOM_R3_IOPORT_READ);
     1803    VBOXSTRICTRC rc = PDMDevHlpTimerLockClock2(pDevIns, pThis->hPmTimer, &pThis->CritSect, VINF_IOM_R3_IOPORT_READ);
    18041804    if (rc == VINF_SUCCESS)
    18051805    {
    1806         rc = PDMDevHlpCritSectEnter(pDevIns, &pThis->CritSect, VINF_IOM_R3_IOPORT_READ);
    1807         if (rc == VINF_SUCCESS)
     1806        uint64_t u64Now = PDMDevHlpTimerGet(pDevIns, pThis->hPmTimer);
     1807        acpiPmTimerUpdate(pDevIns, pThis, u64Now);
     1808        *pu32 = pThis->uPmTimerVal;
     1809
     1810        PDMDevHlpTimerUnlockClock2(pDevIns, pThis->hPmTimer, &pThis->CritSect);
     1811
     1812        DBGFTRACE_PDM_U64_TAG(pDevIns, u64Now, "acpi");
     1813        Log(("acpi: acpiPMTmrRead -> %#x\n", *pu32));
     1814
     1815#if 0
     1816        /** @todo temporary: sanity check against running backwards */
     1817        uint32_t uOld = ASMAtomicXchgU32(&pThis->uPmTimeOld, *pu32);
     1818        if (*pu32 - uOld >= 0x10000000)
    18081819        {
    1809             uint64_t u64Now = PDMDevHlpTimerGet(pDevIns, pThis->hPmTimer);
    1810             acpiPmTimerUpdate(pDevIns, pThis, u64Now);
    1811             *pu32 = pThis->uPmTimerVal;
    1812 
    1813             DEVACPI_UNLOCK(pDevIns, pThis);
    1814             PDMDevHlpTimerUnlock(pDevIns, pThis->hPmTimer);
    1815 
    1816             DBGFTRACE_PDM_U64_TAG(pDevIns, u64Now, "acpi");
    1817             Log(("acpi: acpiPMTmrRead -> %#x\n", *pu32));
    1818 
    1819 #if 0
    1820             /** @todo temporary: sanity check against running backwards */
    1821             uint32_t uOld = ASMAtomicXchgU32(&pThis->uPmTimeOld, *pu32);
    1822             if (*pu32 - uOld >= 0x10000000)
    1823             {
    18241820# if defined(IN_RING0)
    1825                 pThis->uPmTimeA = uOld;
    1826                 pThis->uPmTimeB = *pu32;
    1827                 return VERR_TM_TIMER_BAD_CLOCK;
     1821            pThis->uPmTimeA = uOld;
     1822            pThis->uPmTimeB = *pu32;
     1823            return VERR_TM_TIMER_BAD_CLOCK;
    18281824# elif defined(IN_RING3)
    1829                 AssertReleaseMsgFailed(("acpiPMTmrRead: old=%08RX32, current=%08RX32\n", uOld, *pu32));
     1825            AssertReleaseMsgFailed(("acpiPMTmrRead: old=%08RX32, current=%08RX32\n", uOld, *pu32));
    18301826# endif
    1831             }
     1827        }
    18321828#endif
    1833         }
    1834         else
    1835             PDMDevHlpTimerUnlock(pDevIns, pThis->hPmTimer);
    18361829    }
    18371830    return rc;
     
    26072600        AssertRCReturn(rc, rc);
    26082601
    2609         PDMDevHlpTimerLock(pDevIns, pThis->hPmTimer, VERR_IGNORED);
     2602        PDMDevHlpTimerLockClock(pDevIns, pThis->hPmTimer, VERR_IGNORED);
    26102603        DEVACPI_LOCK_R3(pDevIns, pThis);
    26112604        uint64_t u64Now = PDMDevHlpTimerGet(pDevIns, pThis->hPmTimer);
     
    26142607        acpiR3PmTimerReset(pDevIns, pThis, u64Now);
    26152608        DEVACPI_UNLOCK(pDevIns, pThis);
    2616         PDMDevHlpTimerUnlock(pDevIns, pThis->hPmTimer);
     2609        PDMDevHlpTimerUnlockClock(pDevIns, pThis->hPmTimer);
    26172610    }
    26182611    return rc;
     
    35853578    acpiSetIrq(pDevIns, 0);
    35863579
    3587     PDMDevHlpTimerLock(pDevIns, pThis->hPmTimer, VERR_IGNORED);
     3580    PDMDevHlpTimerLockClock(pDevIns, pThis->hPmTimer, VERR_IGNORED);
    35883581    pThis->pm1a_en           = 0;
    35893582    pThis->pm1a_sts          = 0;
     
    35983591    pThis->gpe0_sts          = 0;
    35993592    pThis->uSleepState       = 0;
    3600     PDMDevHlpTimerUnlock(pDevIns, pThis->hPmTimer);
     3593    PDMDevHlpTimerUnlockClock(pDevIns, pThis->hPmTimer);
    36013594
    36023595    /* Real device behavior is resetting only the PM controller state,
     
    40934086    AssertRCReturn(rc, rc);
    40944087
    4095     rc = PDMDevHlpTimerLock(pDevIns, pThis->hPmTimer, VERR_IGNORED);
    4096     AssertRCReturn(rc, rc);
     4088    PDMDevHlpTimerLockClock(pDevIns, pThis->hPmTimer, VERR_IGNORED);
    40974089    pThis->u64PmTimerInitial = PDMDevHlpTimerGet(pDevIns, pThis->hPmTimer);
    40984090    acpiR3PmTimerReset(pDevIns, pThis, pThis->u64PmTimerInitial);
    4099     PDMDevHlpTimerUnlock(pDevIns, pThis->hPmTimer);
     4091    PDMDevHlpTimerUnlockClock(pDevIns, pThis->hPmTimer);
    41004092
    41014093    /*
  • trunk/src/VBox/Devices/PC/DevHPET.cpp

    r81966 r82329  
    175175#define DEVHPET_LOCK_BOTH_RETURN(a_pDevIns, a_pThis, a_rcBusy)  \
    176176    do { \
    177         int rcLock = PDMDevHlpTimerLock((a_pDevIns), (a_pThis)->aTimers[0].hTimer, (a_rcBusy)); \
     177        VBOXSTRICTRC rcLock = PDMDevHlpTimerLockClock2((a_pDevIns), (a_pThis)->aTimers[0].hTimer, &(a_pThis)->CritSect, (a_rcBusy)); \
    178178        if (RT_LIKELY(rcLock == VINF_SUCCESS)) \
    179         { \
    180             rcLock = PDMDevHlpCritSectEnter((a_pDevIns), &(a_pThis)->CritSect, (a_rcBusy)); \
    181             if (RT_LIKELY(rcLock == VINF_SUCCESS)) \
    182                 break; /* likely */ \
    183             PDMDevHlpTimerUnlock((a_pDevIns), (a_pThis)->aTimers[0].hTimer); \
    184         } \
    185         return rcLock; \
     179        { /* likely */ } \
     180        else \
     181            return rcLock; \
    186182    } while (0)
    187183
     
    191187 */
    192188#define DEVHPET_UNLOCK_BOTH(a_pDevIns, a_pThis) \
    193     do { \
    194         PDMDevHlpCritSectLeave((a_pDevIns), &(a_pThis)->CritSect); \
    195         PDMDevHlpTimerUnlock((a_pDevIns), (a_pThis)->aTimers[0].hTimer); \
    196     } while (0)
     189        PDMDevHlpTimerUnlockClock2((a_pDevIns), (a_pThis)->aTimers[0].hTimer, &(a_pThis)->CritSect)
    197190
    198191
     
    685678 * @remarks The caller must not own the device lock if HPET_COUNTER is read.
    686679 */
    687 static int hpetConfigRegRead32(PPDMDEVINS pDevIns, PHPET pThis, uint32_t idxReg, uint32_t *pu32Value)
     680static VBOXSTRICTRC hpetConfigRegRead32(PPDMDEVINS pDevIns, PHPET pThis, uint32_t idxReg, uint32_t *pu32Value)
    688681{
    689682    Assert(!PDMDevHlpCritSectIsOwner(pDevIns, &pThis->CritSect) || (idxReg != HPET_COUNTER && idxReg != HPET_COUNTER + 4));
     
    13421335     * The timers first.
    13431336     */
    1344     PDMDevHlpTimerLock(pDevIns, pThis->aTimers[0].hTimer, VERR_IGNORED);
     1337    PDMDevHlpTimerLockClock(pDevIns, pThis->aTimers[0].hTimer, VERR_IGNORED);
    13451338    for (unsigned i = 0; i < RT_ELEMENTS(pThis->aTimers); i++)
    13461339    {
     
    13641357        pHpetTimer->u64Cmp     = hpetInvalidValue(pHpetTimer);
    13651358    }
    1366     PDMDevHlpTimerUnlock(pDevIns, pThis->aTimers[0].hTimer);
     1359    PDMDevHlpTimerUnlockClock(pDevIns, pThis->aTimers[0].hTimer);
    13671360
    13681361    /*
  • trunk/src/VBox/Devices/PC/DevPit-i8254.cpp

    r81945 r82329  
    124124#define DEVPIT_LOCK_BOTH_RETURN(a_pDevIns, a_pThis, a_rcBusy)  \
    125125    do { \
    126         int rcLock = PDMDevHlpTimerLock((a_pDevIns), (a_pThis)->channels[0].hTimer, (a_rcBusy)); \
    127         if (rcLock != VINF_SUCCESS) \
     126        VBOXSTRICTRC rcLock = PDMDevHlpTimerLockClock2((a_pDevIns), (a_pThis)->channels[0].hTimer, \
     127                                                       &(a_pThis)->CritSect, (a_rcBusy)); \
     128        if (RT_LIKELY(rcLock == VINF_SUCCESS)) \
     129        { /* likely */ } \
     130        else \
    128131            return rcLock; \
    129         rcLock = PDMDevHlpCritSectEnter((a_pDevIns), &(a_pThis)->CritSect, (a_rcBusy)); \
    130         if (rcLock != VINF_SUCCESS) \
    131         { \
    132             PDMDevHlpTimerUnlock((a_pDevIns), (a_pThis)->channels[0].hTimer); \
    133             return rcLock; \
    134         } \
    135132    } while (0)
    136133
     
    139136 * Acquires the TM lock and PIT lock, ignores failures.
    140137 */
    141 # define DEVPIT_R3_LOCK_BOTH(a_pDevIns, a_pThis)  \
    142     do { \
    143         PDMDevHlpTimerLock((a_pDevIns), (a_pThis)->channels[0].hTimer, VERR_IGNORED); \
    144         PDMDevHlpCritSectEnter((a_pDevIns), &(a_pThis)->CritSect, VERR_IGNORED); \
    145     } while (0)
     138# define DEVPIT_R3_LOCK_BOTH(a_pDevIns, a_pThis) \
     139    PDMDevHlpTimerLockClock2((a_pDevIns), (a_pThis)->channels[0].hTimer, &(a_pThis)->CritSect, VERR_IGNORED)
    146140#endif /* IN_RING3 */
    147141
     
    150144 */
    151145#define DEVPIT_UNLOCK_BOTH(a_pDevIns, a_pThis) \
    152     do { \
    153         PDMDevHlpCritSectLeave((a_pDevIns), &(a_pThis)->CritSect); \
    154         PDMDevHlpTimerUnlock((a_pDevIns), (a_pThis)->channels[0].hTimer); \
    155     } while (0)
     146    PDMDevHlpTimerUnlockClock2((a_pDevIns), (a_pThis)->channels[0].hTimer, &(a_pThis)->CritSect)
    156147
    157148
  • trunk/src/VBox/Devices/PC/DevRTC.cpp

    r81896 r82329  
    450450                   holding the device lock.*/
    451451                PDMDevHlpCritSectLeave(pDevIns, pDevIns->CTX_SUFF(pCritSectRo));
    452                 int rc1 = PDMDevHlpTimerLock(pDevIns, pThis->hPeriodicTimer, VINF_SUCCESS /* must get it */);
    453                 int rc2 = PDMDevHlpCritSectEnter(pDevIns, pDevIns->CTX_SUFF(pCritSectRo), VINF_SUCCESS /* must get it */);
    454                 AssertRCReturn(rc1, rc1);
    455                 AssertRCReturnStmt(rc2, PDMDevHlpTimerUnlock(pDevIns, pThis->hPeriodicTimer), rc2);
     452                VBOXSTRICTRC rc1 = PDMDevHlpTimerLockClock2(pDevIns, pThis->hPeriodicTimer, pDevIns->CTX_SUFF(pCritSectRo),
     453                                                            VINF_SUCCESS /* must get it */);
     454                AssertRCReturn(VBOXSTRICTRC_VAL(rc1), rc1);
    456455
    457456                if (idx == RTC_REG_A)
     
    482481                rtc_timer_update(pDevIns, pThis, PDMDevHlpTimerGet(pDevIns, pThis->hPeriodicTimer));
    483482
    484                 PDMDevHlpTimerUnlock(pDevIns, pThis->hPeriodicTimer);
     483                PDMDevHlpTimerUnlockClock(pDevIns, pThis->hPeriodicTimer);
    485484                /* the caller leaves the other lock. */
    486485                break;
     
    11751174    pThis->next_second_time = PDMDevHlpTimerGet(pDevIns, pThis->hSecondTimer2)
    11761175                            + (PDMDevHlpTimerGetFreq(pDevIns, pThis->hSecondTimer2) * 99) / 100;
    1177     rc = PDMDevHlpTimerLock(pDevIns, pThis->hSecondTimer2, VERR_IGNORED);
    1178     AssertRCReturn(rc, rc);
     1176    PDMDevHlpTimerLockClock(pDevIns, pThis->hSecondTimer2, VERR_IGNORED);
    11791177    rc = PDMDevHlpTimerSet(pDevIns, pThis->hSecondTimer2, pThis->next_second_time);
    1180     PDMDevHlpTimerUnlock(pDevIns, pThis->hSecondTimer2);
     1178    PDMDevHlpTimerUnlockClock(pDevIns, pThis->hSecondTimer2);
    11811179    AssertRCReturn(rc, rc);
    11821180
  • trunk/src/VBox/VMM/VMMAll/APICAll.cpp

    r82041 r82329  
    14151415    TMTIMERHANDLE   hTimer   = pApicCpu->hTimer;
    14161416
    1417     int rc = PDMDevHlpTimerLock(pDevIns, hTimer, rcBusy);
     1417    VBOXSTRICTRC rc = PDMDevHlpTimerLockClock(pDevIns, hTimer, rcBusy);
    14181418    if (rc == VINF_SUCCESS)
    14191419    {
     
    14231423        {
    14241424            uint64_t const cTicksElapsed = PDMDevHlpTimerGet(pDevIns, hTimer) - pApicCpu->u64TimerInitial;
    1425             PDMDevHlpTimerUnlock(pDevIns, hTimer);
     1425            PDMDevHlpTimerUnlockClock(pDevIns, hTimer);
    14261426            uint8_t  const uTimerShift   = apicGetTimerShift(pXApicPage);
    14271427            uint64_t const uDelta        = cTicksElapsed >> uTimerShift;
     
    14301430        }
    14311431        else
    1432             PDMDevHlpTimerUnlock(pDevIns, hTimer);
     1432            PDMDevHlpTimerUnlockClock(pDevIns, hTimer);
    14331433    }
    14341434    return rc;
     
    14671467     */
    14681468    TMTIMERHANDLE hTimer = pApicCpu->hTimer;
    1469     int rc = PDMDevHlpTimerLock(pDevIns, hTimer, rcBusy);
     1469    VBOXSTRICTRC rc = PDMDevHlpTimerLockClock(pDevIns, hTimer, rcBusy);
    14701470    if (rc == VINF_SUCCESS)
    14711471    {
     
    14761476        else
    14771477            apicStopTimer(pVCpu);
    1478         PDMDevHlpTimerUnlock(pDevIns, hTimer);
     1478        PDMDevHlpTimerUnlockClock(pDevIns, hTimer);
    14791479    }
    14801480    return rc;
  • trunk/src/VBox/VMM/VMMR0/PDMR0Device.cpp

    r82039 r82329  
    605605
    606606
    607 /** @interface_method_impl{PDMDEVHLPR0,pfnTimerLock} */
    608 static DECLCALLBACK(int) pdmR0DevHlp_TimerLock(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer, int rcBusy)
     607/** @interface_method_impl{PDMDEVHLPR0,pfnTimerLockClock} */
     608static DECLCALLBACK(VBOXSTRICTRC) pdmR0DevHlp_TimerLockClock(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer, int rcBusy)
    609609{
    610610    return TMTimerLock(pdmR0DevHlp_TimerToPtr(pDevIns, hTimer), rcBusy);
     611}
     612
     613
     614/** @interface_method_impl{PDMDEVHLPR0,pfnTimerLockClock2} */
     615static DECLCALLBACK(VBOXSTRICTRC) pdmR0DevHlp_TimerLockClock2(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer,
     616                                                              PPDMCRITSECT pCritSect, int rcBusy)
     617{
     618    VBOXSTRICTRC rc = TMTimerLock(pdmR0DevHlp_TimerToPtr(pDevIns, hTimer), rcBusy);
     619    if (rc == VINF_SUCCESS)
     620    {
     621        rc = PDMCritSectEnter(pCritSect, rcBusy);
     622        if (rc == VINF_SUCCESS)
     623            return rc;
     624        AssertRC(VBOXSTRICTRC_VAL(rc));
     625        TMTimerUnlock(pdmR0DevHlp_TimerToPtr(pDevIns, hTimer));
     626    }
     627    else
     628        AssertRC(VBOXSTRICTRC_VAL(rc));
     629    return rc;
    611630}
    612631
     
    661680
    662681
    663 /** @interface_method_impl{PDMDEVHLPR0,pfnTimerUnlock} */
    664 static DECLCALLBACK(void) pdmR0DevHlp_TimerUnlock(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer)
     682/** @interface_method_impl{PDMDEVHLPR0,pfnTimerUnlockClock} */
     683static DECLCALLBACK(void) pdmR0DevHlp_TimerUnlockClock(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer)
    665684{
    666685    TMTimerUnlock(pdmR0DevHlp_TimerToPtr(pDevIns, hTimer));
     686}
     687
     688
     689/** @interface_method_impl{PDMDEVHLPR0,pfnTimerUnlockClock2} */
     690static DECLCALLBACK(void) pdmR0DevHlp_TimerUnlockClock2(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer, PPDMCRITSECT pCritSect)
     691{
     692    TMTimerUnlock(pdmR0DevHlp_TimerToPtr(pDevIns, hTimer));
     693    int rc = PDMCritSectLeave(pCritSect);
     694    AssertRC(rc);
    667695}
    668696
     
    12991327    pdmR0DevHlp_TimerIsActive,
    13001328    pdmR0DevHlp_TimerIsLockOwner,
    1301     pdmR0DevHlp_TimerLock,
     1329    pdmR0DevHlp_TimerLockClock,
     1330    pdmR0DevHlp_TimerLockClock2,
    13021331    pdmR0DevHlp_TimerSet,
    13031332    pdmR0DevHlp_TimerSetFrequencyHint,
     
    13071336    pdmR0DevHlp_TimerSetRelative,
    13081337    pdmR0DevHlp_TimerStop,
    1309     pdmR0DevHlp_TimerUnlock,
     1338    pdmR0DevHlp_TimerUnlockClock,
     1339    pdmR0DevHlp_TimerUnlockClock2,
    13101340    pdmR0DevHlp_TMTimeVirtGet,
    13111341    pdmR0DevHlp_TMTimeVirtGetFreq,
  • trunk/src/VBox/VMM/VMMR3/PDMDevHlp.cpp

    r82316 r82329  
    518518
    519519
     520/** @interface_method_impl{PDMDEVHLPR3,pfnTimerLockClock} */
     521static DECLCALLBACK(VBOXSTRICTRC) pdmR3DevHlp_TimerLockClock(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer, int rcBusy)
     522{
     523    return TMTimerLock(pdmR3DevHlp_TimerToPtr(pDevIns, hTimer), rcBusy);
     524}
     525
     526
    520527/** @interface_method_impl{PDMDEVHLPR3,pfnTimerLock} */
    521 static DECLCALLBACK(int) pdmR3DevHlp_TimerLock(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer, int rcBusy)
    522 {
    523     return TMTimerLock(pdmR3DevHlp_TimerToPtr(pDevIns, hTimer), rcBusy);
     528static DECLCALLBACK(VBOXSTRICTRC) pdmR3DevHlp_TimerLockClock2(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer,
     529                                                              PPDMCRITSECT pCritSect, int rcBusy)
     530{
     531    VBOXSTRICTRC rc = TMTimerLock(pdmR3DevHlp_TimerToPtr(pDevIns, hTimer), rcBusy);
     532    if (rc == VINF_SUCCESS)
     533    {
     534        rc = PDMCritSectEnter(pCritSect, rcBusy);
     535        if (rc == VINF_SUCCESS)
     536            return rc;
     537        AssertRC(VBOXSTRICTRC_VAL(rc));
     538        TMTimerUnlock(pdmR3DevHlp_TimerToPtr(pDevIns, hTimer));
     539    }
     540    else
     541        AssertRC(VBOXSTRICTRC_VAL(rc));
     542    return rc;
    524543}
    525544
     
    574593
    575594
     595/** @interface_method_impl{PDMDEVHLPR3,pfnTimerUnlockClock} */
     596static DECLCALLBACK(void) pdmR3DevHlp_TimerUnlockClock(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer)
     597{
     598    TMTimerUnlock(pdmR3DevHlp_TimerToPtr(pDevIns, hTimer));
     599}
     600
     601
    576602/** @interface_method_impl{PDMDEVHLPR3,pfnTimerUnlock} */
    577 static DECLCALLBACK(void) pdmR3DevHlp_TimerUnlock(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer)
     603static DECLCALLBACK(void) pdmR3DevHlp_TimerUnlockClock2(PPDMDEVINS pDevIns, TMTIMERHANDLE hTimer, PPDMCRITSECT pCritSect)
    578604{
    579605    TMTimerUnlock(pdmR3DevHlp_TimerToPtr(pDevIns, hTimer));
     606    int rc = PDMCritSectLeave(pCritSect);
     607    AssertRC(rc);
    580608}
    581609
     
    39233951    pdmR3DevHlp_TimerIsActive,
    39243952    pdmR3DevHlp_TimerIsLockOwner,
    3925     pdmR3DevHlp_TimerLock,
     3953    pdmR3DevHlp_TimerLockClock,
     3954    pdmR3DevHlp_TimerLockClock2,
    39263955    pdmR3DevHlp_TimerSet,
    39273956    pdmR3DevHlp_TimerSetFrequencyHint,
     
    39313960    pdmR3DevHlp_TimerSetRelative,
    39323961    pdmR3DevHlp_TimerStop,
    3933     pdmR3DevHlp_TimerUnlock,
     3962    pdmR3DevHlp_TimerUnlockClock,
     3963    pdmR3DevHlp_TimerUnlockClock2,
    39343964    pdmR3DevHlp_TimerSetCritSect,
    39353965    pdmR3DevHlp_TimerSave,
     
    44054435    pdmR3DevHlp_TimerIsActive,
    44064436    pdmR3DevHlp_TimerIsLockOwner,
    4407     pdmR3DevHlp_TimerLock,
     4437    pdmR3DevHlp_TimerLockClock,
     4438    pdmR3DevHlp_TimerLockClock2,
    44084439    pdmR3DevHlp_TimerSet,
    44094440    pdmR3DevHlp_TimerSetFrequencyHint,
     
    44134444    pdmR3DevHlp_TimerSetRelative,
    44144445    pdmR3DevHlp_TimerStop,
    4415     pdmR3DevHlp_TimerUnlock,
     4446    pdmR3DevHlp_TimerUnlockClock,
     4447    pdmR3DevHlp_TimerUnlockClock2,
    44164448    pdmR3DevHlp_TimerSetCritSect,
    44174449    pdmR3DevHlp_TimerSave,
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