VirtualBox

Changeset 32670 in vbox


Ignore:
Timestamp:
Sep 21, 2010 4:21:55 PM (14 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
66085
Message:

timer-r0drv-linux.c: bug fixes. The ugly guest debugging tracking will be removed when fully debugged.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Runtime/r0drv/linux/timer-r0drv-linux.c

    r32648 r32670  
    209209#endif
    210210
     211#if 0
     212#define DEBUG_HACKING
     213#include <iprt/string.h>
     214#include <iprt/asm-amd64-x86.h>
     215static void myLogBackdoorPrintf(const char *pszFormat, ...)
     216{
     217    char        szTmp[256];
     218    va_list     args;
     219    size_t      cb;
     220
     221    cb = RTStrPrintf(szTmp, sizeof(szTmp) - 10, "%d: ", RTMpCpuId());
     222    va_start(args, pszFormat);
     223    cb += RTStrPrintfV(&szTmp[cb], sizeof(szTmp) - cb, pszFormat, args);
     224    va_end(args);
     225
     226    ASMOutStrU8(0x504, (uint8_t *)&szTmp[0], cb);
     227}
     228#define RTAssertMsg1Weak(pszExpr, uLine, pszFile, pszFunction) \
     229    myLogBackdoorPrintf("\n!!Guest Assertion failed!!\n%s(%d) %s\n%s\n", uLine, pszFile, pszFunction, (pszExpr))
     230#define RTAssertMsg2Weak myLogBackdoorPrintf
     231#define dprintf(a)          myLogBackdoorPrintf a
     232#else
     233#define dprintf(a)          do { } while (0)
     234#endif
    211235
    212236/**
     
    215239DECLINLINE(void) rtTimerLnxSetState(RTTIMERLNXSTATE volatile *penmState, RTTIMERLNXSTATE enmNewState)
    216240{
     241#ifdef DEBUG_HACKING
     242    dprintf(("set %d -> %d\n", *penmState, enmNewState));
     243#endif
    217244    ASMAtomicWriteU32((uint32_t volatile *)penmState, enmNewState);
    218245}
     
    225252 * @return false if xchg wasn't done.
    226253 */
    227 DECLINLINE(bool) rtTimerLnxCmpXchgState(RTTIMERLNXSTATE volatile *penmState, RTTIMERLNXSTATE enmNewState, RTTIMERLNXSTATE enmCurState)
     254#ifdef DEBUG_HACKING
     255#define rtTimerLnxCmpXchgState(penmState, enmNewState, enmCurState) rtTimerLnxCmpXchgStateDebug(penmState, enmNewState, enmCurState, __LINE__)
     256static bool rtTimerLnxCmpXchgStateDebug(RTTIMERLNXSTATE volatile *penmState, RTTIMERLNXSTATE enmNewState,
     257                                        RTTIMERLNXSTATE enmCurState, uint32_t uLine)
     258{
     259    RTTIMERLNXSTATE enmOldState = enmCurState;
     260    bool fRc = ASMAtomicCmpXchgExU32((uint32_t volatile *)penmState, enmNewState, enmCurState, (uint32_t *)&enmOldState);
     261    dprintf(("cxg %d -> %d - %d at %u\n", enmOldState, enmNewState, fRc, uLine));
     262    return fRc;
     263}
     264#else
     265DECLINLINE(bool) rtTimerLnxCmpXchgState(RTTIMERLNXSTATE volatile *penmState, RTTIMERLNXSTATE enmNewState,
     266                                        RTTIMERLNXSTATE enmCurState)
    228267{
    229268    return ASMAtomicCmpXchgU32((uint32_t volatile *)penmState, enmNewState, enmCurState);
    230269}
     270#endif
    231271
    232272
     
    312352        pSubTimer->u.Std.u64NextTS  = u64NextTS;
    313353    }
     354    dprintf(("startsubtimer %p\n", pSubTimer->pParent));
    314355
    315356    pSubTimer->iTick = 0;
     
    349390static void rtTimerLnxStopSubTimer(PRTTIMERLNXSUBTIMER pSubTimer, bool fHighRes)
    350391{
     392    dprintf(("stopsubtimer %p %d\n", pSubTimer->pParent, fHighRes));
    351393#ifdef RTTIMER_LINUX_WITH_HRTIMER
    352394    if (fHighRes)
     
    372414    RTSPINLOCK hSpinlock = pTimer->hSpinlock;
    373415    Assert(pTimer->fSuspended);
     416    dprintf(("destroyit %p\n", pTimer));
    374417
    375418    /*
     
    391434     */
    392435    ASMAtomicWriteU32(&pTimer->u32Magic, ~RTTIMER_MAGIC);
     436#if 0 /*fixme*/
     437    rtR0MemFreeNoCtxCheck(pTimer);
     438#else
    393439    RTMemFree(pTimer);
     440#endif
    394441    if (hSpinlock != NIL_RTSPINLOCK)
    395442        RTSpinlockDestroy(hSpinlock);
     
    548595
    549596
     597    dprintf(("hrcallback %p\n", pTimer));
    550598    if (RT_UNLIKELY(!rtTimerLnxChangeToCallbackState(pSubTimer)))
    551599        return HRTIMER_NORESTART;
     
    634682    PRTTIMER            pTimer    = pSubTimer->pParent;
    635683
     684    dprintf(("hrcallback %p\n", pTimer));
    636685    if (RT_UNLIKELY(!rtTimerLnxChangeToCallbackState(pSubTimer)))
    637686        return;
     
    10941143    if (!ASMAtomicUoReadBool(&pTimer->fSuspended))
    10951144        return VERR_TIMER_ACTIVE;
     1145    dprintf(("start %p\n", pTimer));
    10961146
    10971147    Args.u64First = u64First;
     
    11381188            case RTTIMERLNXSTATE_CALLBACK:
    11391189            case RTTIMERLNXSTATE_CB_STOPPING:
    1140                 if (rtTimerLnxCmpXchgState(&pTimer->aSubTimers[0].enmState, RTTIMERLNXSTATE_ACTIVE, enmState))
     1190                if (rtTimerLnxCmpXchgState(&pTimer->aSubTimers[0].enmState, RTTIMERLNXSTATE_CB_RESTARTING, enmState))
    11411191                {
    11421192                    ASMAtomicWriteBool(&pTimer->fSuspended, false);
     
    11641214static bool rtTimerLnxStop(PRTTIMER pTimer, bool fForDestroy)
    11651215{
     1216    dprintf(("lnxstop %p %d\n", pTimer, fForDestroy));
    11661217#ifdef CONFIG_SMP
    11671218    /*
     
    12281279    AssertPtrReturn(pTimer, VERR_INVALID_HANDLE);
    12291280    AssertReturn(pTimer->u32Magic == RTTIMER_MAGIC, VERR_INVALID_HANDLE);
     1281    dprintf(("stop %p\n", pTimer));
    12301282
    12311283    if (ASMAtomicUoReadBool(&pTimer->fSuspended))
     
    12461298    AssertReturn(pTimer->u32Magic == RTTIMER_MAGIC, VERR_INVALID_HANDLE);
    12471299    AssertReturn(u64NanoInterval, VERR_INVALID_PARAMETER);
     1300    dprintf(("change %p %llu\n", pTimer, u64NanoInterval));
    12481301
    12491302#ifdef RTTIMER_LINUX_WITH_HRTIMER
     
    12821335    AssertPtrReturn(pTimer, VERR_INVALID_HANDLE);
    12831336    AssertReturn(pTimer->u32Magic == RTTIMER_MAGIC, VERR_INVALID_HANDLE);
     1337    dprintf(("destroy %p\n", pTimer));
    12841338
    12851339    /*
     
    14391493#endif /* CONFIG_SMP */
    14401494
     1495    dprintf(("create %p\n", pTimer));
    14411496    *ppTimer = pTimer;
    14421497    return VINF_SUCCESS;
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