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); }
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); }