Get instruction pointer correctly on Darwin.

2.0
castano 17 years ago
parent 95332efaa2
commit 37d42d300b

@ -164,51 +164,48 @@ namespace
static void * callerAddress(void * secret) static void * callerAddress(void * secret)
{ {
# if NV_OS_DARWIN && NV_CPU_PPC # if NV_OS_DARWIN && NV_CPU_PPC
return NULL; ucontext_t * ucp = (ucontext_t *)secret;
return (void *) ucp->uc_mcontext->ss.srr0;
# elif NV_OS_DARWIN && NV_CPU_X86 # elif NV_OS_DARWIN && NV_CPU_X86
return NULL; ucontext_t * ucp = (ucontext_t *)secret;
return (void *) ucp->uc_mcontext->ss.eip;
# elif NV_CPU_X86_64 # elif NV_CPU_X86_64
ucontext_t * uc = (ucontext_t *)secret; // #define REG_RIP REG_INDEX(rip) // seems to be 16
return (void *)uc->uc_mcontext.gregs[REG_RIP]; ucontext_t * ucp = (ucontext_t *)secret;
return (void *)ucp->uc_mcontext.gregs[REG_RIP];
# elif NV_CPU_X86 # elif NV_CPU_X86
ucontext_t * uc = (ucontext_t *)secret; ucontext_t * ucp = (ucontext_t *)secret;
return (void *)uc->uc_mcontext.gregs[REG_EIP]; return (void *)ucp->uc_mcontext.gregs[REG_EIP]; // 14
# elif NV_CPU_PPC # elif NV_CPU_PPC
ucontext_t* uc = (ucontext_t*) secret; ucontext_t * ucp = (ucontext_t *)secret;
return (void*) uc->uc_mcontext.regs->nip; return (void *) ucp->uc_mcontext.regs->nip;
#else #else
return NULL; return NULL;
#endif #endif
// From http://www.miriamruiz.es/weblog/?p=14 // How to obtain the instruction pointers in different platforms, from mlton's source code.
// http://mlton.org/
// #elif defined(__hppa__) // OpenBSD && NetBSD
// ucontext_t* uc = (ucontext_t*) secret; // ucp->sc_eip
// pnt = (void*) uc->uc_mcontext.sc_iaoq[0] & ~0×3UL ; // FreeBSD:
// #elif defined(__sparc__) // ucp->uc_mcontext.mc_eip
// struct sigcontext* sc = (struct sigcontext*) secret; // HPUX:
// #if __WORDSIZE == 64 // ucp->uc_link
// pnt = (void*) scp->sigc_regs.tpc ; // Solaris:
// #else // ucp->uc_mcontext.gregs[REG_PC]
// pnt = (void*) scp->si_regs.pc ; // Linux hppa:
// #endif // uc->uc_mcontext.sc_iaoq[0] & ~0×3UL
// Linux sparc:
// ((struct sigcontext*) secret)->sigc_regs.tpc
// Linux sparc64:
// ((struct sigcontext*) secret)->si_regs.pc
// potentially correct for other archs: // potentially correct for other archs:
// alpha: ucp->m_context.sc_pc // Linux alpha: ucp->m_context.sc_pc
// arm: ucp->m_context.ctx.arm_pc // Linux arm: ucp->m_context.ctx.arm_pc
// ia64: ucp->m_context.sc_ip & ~0×3UL // Linux ia64: ucp->m_context.sc_ip & ~0×3UL
// mips: ucp->m_context.sc_pc // Linux mips: ucp->m_context.sc_pc
// s390: ucp->m_context.sregs->regs.psw.addr // Linux s390: ucp->m_context.sregs->regs.psw.addr
// #ifndef EIP
// #define EIP 14
// #endif
// #if (defined (__x86_64__))
// #ifndef REG_RIP
// #define REG_RIP REG_INDEX(rip) /* seems to be 16 */
// #endif
// #endif
} }
static void nvSigHandler(int sig, siginfo_t *info, void *secret) static void nvSigHandler(int sig, siginfo_t *info, void *secret)
@ -471,7 +468,7 @@ void debug::enableSigHandler()
struct sigaction sa; struct sigaction sa;
sa.sa_sigaction = nvSigHandler; sa.sa_sigaction = nvSigHandler;
sigemptyset (&sa.sa_mask); sigemptyset (&sa.sa_mask);
sa.sa_flags = SA_RESTART | SA_SIGINFO; sa.sa_flags = SA_ONSTACK | SA_RESTART | SA_SIGINFO;
sigaction(SIGSEGV, &sa, &s_old_sigsegv); sigaction(SIGSEGV, &sa, &s_old_sigsegv);
sigaction(SIGTRAP, &sa, &s_old_sigtrap); sigaction(SIGTRAP, &sa, &s_old_sigtrap);

Loading…
Cancel
Save