コード例 #1
0
RTDECL(void) RTSpinlockReleaseNoInts(RTSPINLOCK Spinlock)
{
#if 1
    if (RT_UNLIKELY(!(Spinlock->fFlags & RTSPINLOCK_FLAGS_INTERRUPT_SAFE)))
        RTAssertMsg2("RTSpinlockReleaseNoInts: %p (magic=%#x)\n", Spinlock, Spinlock->u32Magic);
#else
    AssertRelease(Spinlock->fFlags & RTSPINLOCK_FLAGS_INTERRUPT_SAFE);
#endif
    RTSpinlockRelease(Spinlock);
}
コード例 #2
0
ファイル: tstX86-1.cpp プロジェクト: jeppeter/vbox
static void sigHandler(int iSig, siginfo_t *pSigInfo, void *pvSigCtx)
{
    ucontext_t *pCtx = (ucontext_t *)pvSigCtx;
    NOREF(pSigInfo);

# if defined(RT_ARCH_AMD64) && defined(RT_OS_DARWIN)
    uintptr_t  *puPC    = (uintptr_t *)&pCtx->uc_mcontext->__ss.__rip;
    uintptr_t  *puSP    = (uintptr_t *)&pCtx->uc_mcontext->__ss.__rsp;
    uintptr_t   uTrapNo = pCtx->uc_mcontext->__es.__trapno;
    uintptr_t   uErr    = pCtx->uc_mcontext->__es.__err;
    uintptr_t   uCr2    = pCtx->uc_mcontext->__es.__faultvaddr;

# elif defined(RT_ARCH_AMD64) && defined(RT_OS_FREEBSD)
    uintptr_t  *puPC    = (uintptr_t *)&pCtx->uc_mcontext.mc_rip;
    uintptr_t  *puSP    = (uintptr_t *)&pCtx->uc_mcontext.mc_rsp;
    uintptr_t   uTrapNo = ~(uintptr_t)0;
    uintptr_t   uErr    = ~(uintptr_t)0;
    uintptr_t   uCr2    = ~(uintptr_t)0;

# elif defined(RT_ARCH_AMD64)
    uintptr_t  *puPC    = (uintptr_t *)&pCtx->uc_mcontext.gregs[REG_RIP];
    uintptr_t  *puSP    = (uintptr_t *)&pCtx->uc_mcontext.gregs[REG_RSP];
    uintptr_t   uTrapNo = pCtx->uc_mcontext.gregs[REG_TRAPNO];
    uintptr_t   uErr    = pCtx->uc_mcontext.gregs[REG_ERR];
    uintptr_t   uCr2    = pCtx->uc_mcontext.gregs[REG_CR2];

# elif defined(RT_ARCH_X86) && defined(RT_OS_DARWIN)
    uintptr_t  *puPC    = (uintptr_t *)&pCtx->uc_mcontext->__ss.__eip;
    uintptr_t  *puSP    = (uintptr_t *)&pCtx->uc_mcontext->__ss.__esp;
    uintptr_t   uTrapNo = pCtx->uc_mcontext->__es.__trapno;
    uintptr_t   uErr    = pCtx->uc_mcontext->__es.__err;
    uintptr_t   uCr2    = pCtx->uc_mcontext->__es.__faultvaddr;

# elif defined(RT_ARCH_X86) && defined(RT_OS_FREEBSD)
    uintptr_t  *puPC    = (uintptr_t *)&pCtx->uc_mcontext.mc_eip;
    uintptr_t  *puSP    = (uintptr_t *)&pCtx->uc_mcontext.mc_esp;
    uintptr_t   uTrapNo = ~(uintptr_t)0;
    uintptr_t   uErr    = ~(uintptr_t)0;
    uintptr_t   uCr2    = ~(uintptr_t)0;

# elif defined(RT_ARCH_X86)
    uintptr_t  *puPC    = (uintptr_t *)&pCtx->uc_mcontext.gregs[REG_EIP];
    uintptr_t  *puSP    = (uintptr_t *)&pCtx->uc_mcontext.gregs[REG_ESP];
    uintptr_t   uTrapNo = pCtx->uc_mcontext.gregs[REG_TRAPNO];
    uintptr_t   uErr    = pCtx->uc_mcontext.gregs[REG_ERR];
#  ifdef REG_CR2 /** @todo ... */
    uintptr_t   uCr2    = pCtx->uc_mcontext.gregs[REG_CR2];
#  else
    uintptr_t   uCr2    = ~(uintptr_t)0;
#  endif

# else
    uintptr_t  *puPC    = NULL;
    uintptr_t  *puSP    = NULL;
    uintptr_t   uTrapNo = ~(uintptr_t)0;
    uintptr_t   uErr    = ~(uintptr_t)0;
    uintptr_t   uCr2    = ~(uintptr_t)0;
# endif
    if (uTrapNo == X86_XCPT_PF)
        RTAssertMsg2("tstX86-1: Trap #%#04x err=%#06x at %p / %p\n", uTrapNo, uErr, *puPC, uCr2);
    else
        RTAssertMsg2("tstX86-1: Trap #%#04x err=%#06x at %p\n", uTrapNo, uErr, *puPC);

    PCTRAPINFO pTrapInfo = findTrapInfo(*puPC, *puSP);
    if (pTrapInfo)
    {
        if (pTrapInfo->u8Trap != uTrapNo && uTrapNo != ~(uintptr_t)0)
            RTAssertMsg2("tstX86-1: Expected #%#04x, got #%#04x\n", pTrapInfo->u8Trap, uTrapNo);
        else
        {
            if (*puPC != pTrapInfo->uTrapPC)
                *puSP += sizeof(uintptr_t);
            *puPC = pTrapInfo->uResumePC;
            return;
        }
    }
    else
        RTAssertMsg2("tstX86-1: Unexpected trap!\n");

    /* die */
    signal(iSig, SIG_IGN);
}