runtime: dump registers on Solaris
Patch by Rainer Orth <ro@gcc.gnu.org>. Fixes PR go/106813 Reviewed-on: https://go-review.googlesource.com/c/gofrontend/+/581724
This commit is contained in:
parent
678dc5e850
commit
a05efc8bf5
2 changed files with 60 additions and 5 deletions
|
@ -1,4 +1,4 @@
|
|||
1f0c8364cd35026a647aa4e66ee4d8563c8a5d27
|
||||
60f985a7852632834936b4b859aa75d9df88f038
|
||||
|
||||
The first line of this file holds the git revision number of the last
|
||||
merge done from the gofrontend repository.
|
||||
|
|
|
@ -216,6 +216,10 @@ getSiginfoCode(siginfo_t *info)
|
|||
return (uintptr)(info->si_code);
|
||||
}
|
||||
|
||||
#if defined(__sparc__) && defined(__arch64__) && defined(__linux__)
|
||||
#define gregs mc_gregs
|
||||
#endif
|
||||
|
||||
struct getSiginfoRet {
|
||||
uintptr sigaddr;
|
||||
uintptr sigpc;
|
||||
|
@ -242,9 +246,9 @@ getSiginfo(siginfo_t *info, void *context __attribute__((unused)))
|
|||
// Use unportable code to pull it from context, and if that fails
|
||||
// try a stack backtrace across the signal handler.
|
||||
|
||||
#if defined(__x86_64__) && defined(__linux__)
|
||||
#if defined(__x86_64__) && (defined(__linux__) || (defined(__sun__) && defined(__svr4__)))
|
||||
ret.sigpc = ((ucontext_t*)(context))->uc_mcontext.gregs[REG_RIP];
|
||||
#elif defined(__i386__) && defined(__linux__)
|
||||
#elif defined(__i386__) && (defined(__linux__) || (defined(__sun__) && defined(__svr4__)))
|
||||
ret.sigpc = ((ucontext_t*)(context))->uc_mcontext.gregs[REG_EIP];
|
||||
#elif defined(__alpha__) && defined(__linux__)
|
||||
ret.sigpc = ((ucontext_t*)(context))->uc_mcontext.sc_pc;
|
||||
|
@ -263,6 +267,9 @@ getSiginfo(siginfo_t *info, void *context __attribute__((unused)))
|
|||
#elif defined(__NetBSD__)
|
||||
ret.sigpc = _UC_MACHINE_PC(((ucontext_t*)(context)));
|
||||
#endif
|
||||
#if defined(__sparc__) && (defined(__linux__) || (defined(__sun__) && defined(__svr4__)))
|
||||
ret.sigpc = ((ucontext_t*)(context))->uc_mcontext.gregs[REG_PC];
|
||||
#endif
|
||||
|
||||
if (ret.sigpc == 0) {
|
||||
// Skip getSiginfo/sighandler/sigtrampgo/sigtramp/handler.
|
||||
|
@ -285,7 +292,7 @@ void dumpregs(siginfo_t *, void *)
|
|||
void
|
||||
dumpregs(siginfo_t *info __attribute__((unused)), void *context __attribute__((unused)))
|
||||
{
|
||||
#if defined(__x86_64__) && defined(__linux__)
|
||||
#if defined(__x86_64__) && (defined(__linux__) || (defined(__sun__) && defined(__svr4__)))
|
||||
{
|
||||
mcontext_t *m = &((ucontext_t*)(context))->uc_mcontext;
|
||||
|
||||
|
@ -306,12 +313,22 @@ dumpregs(siginfo_t *info __attribute__((unused)), void *context __attribute__((u
|
|||
runtime_printf("r14 %X\n", m->gregs[REG_R14]);
|
||||
runtime_printf("r15 %X\n", m->gregs[REG_R15]);
|
||||
runtime_printf("rip %X\n", m->gregs[REG_RIP]);
|
||||
#if defined(REG_EFL)
|
||||
runtime_printf("rflags %X\n", m->gregs[REG_EFL]);
|
||||
#elif defined(REG_RFL)
|
||||
runtime_printf("rflags %X\n", m->gregs[REG_RFL]);
|
||||
#endif
|
||||
#if defined(REG_CSGSFS)
|
||||
runtime_printf("cs %X\n", m->gregs[REG_CSGSFS] & 0xffff);
|
||||
runtime_printf("fs %X\n", (m->gregs[REG_CSGSFS] >> 16) & 0xffff);
|
||||
runtime_printf("gs %X\n", (m->gregs[REG_CSGSFS] >> 32) & 0xffff);
|
||||
#elif defined(REG_CS) && defined(REG_FS) && defined(REG_GS)
|
||||
runtime_printf("cs %X\n", m->gregs[REG_CS]);
|
||||
runtime_printf("fs %X\n", m->gregs[REG_FS]);
|
||||
runtime_printf("gs %X\n", m->gregs[REG_GS]);
|
||||
#endif
|
||||
}
|
||||
#elif defined(__i386__) && defined(__linux__)
|
||||
#elif defined(__i386__) && (defined(__linux__) || (defined(__sun__) && defined(__svr4__)))
|
||||
{
|
||||
mcontext_t *m = &((ucontext_t*)(context))->uc_mcontext;
|
||||
|
||||
|
@ -423,5 +440,43 @@ dumpregs(siginfo_t *info __attribute__((unused)), void *context __attribute__((u
|
|||
runtime_printf("pc %X\n", m->pc);
|
||||
runtime_printf("pstate %X\n", m->pstate);
|
||||
}
|
||||
#elif defined(__sparc__) && (defined(__linux__) || (defined(__sun__) && defined(__svr4__)))
|
||||
{
|
||||
mcontext_t *m = &((ucontext_t*)(context))->uc_mcontext;
|
||||
|
||||
#ifdef __sparcv9
|
||||
#define REG_FMT "%X"
|
||||
#else
|
||||
#define REG_FMT "%x"
|
||||
#endif
|
||||
|
||||
#ifdef REG_CCR
|
||||
runtime_printf("ccr " REG_FMT "\n", m->gregs[REG_CCR]);
|
||||
#else
|
||||
runtime_printf("psr " REG_FMT "\n", m->gregs[REG_PSR]);
|
||||
#endif
|
||||
runtime_printf("pc " REG_FMT "\n", m->gregs[REG_PC]);
|
||||
runtime_printf("npc " REG_FMT "\n", m->gregs[REG_nPC]);
|
||||
runtime_printf("y " REG_FMT "\n", m->gregs[REG_Y]);
|
||||
runtime_printf("g1 " REG_FMT "\n", m->gregs[REG_G1]);
|
||||
runtime_printf("g2 " REG_FMT "\n", m->gregs[REG_G2]);
|
||||
runtime_printf("g3 " REG_FMT "\n", m->gregs[REG_G3]);
|
||||
runtime_printf("g4 " REG_FMT "\n", m->gregs[REG_G4]);
|
||||
runtime_printf("g5 " REG_FMT "\n", m->gregs[REG_G5]);
|
||||
runtime_printf("g6 " REG_FMT "\n", m->gregs[REG_G6]);
|
||||
runtime_printf("g7 " REG_FMT "\n", m->gregs[REG_G7]);
|
||||
runtime_printf("o0 " REG_FMT "\n", m->gregs[REG_O0]);
|
||||
runtime_printf("o1 " REG_FMT "\n", m->gregs[REG_O1]);
|
||||
runtime_printf("o2 " REG_FMT "\n", m->gregs[REG_O2]);
|
||||
runtime_printf("o3 " REG_FMT "\n", m->gregs[REG_O3]);
|
||||
runtime_printf("o4 " REG_FMT "\n", m->gregs[REG_O4]);
|
||||
runtime_printf("o5 " REG_FMT "\n", m->gregs[REG_O5]);
|
||||
runtime_printf("o6 " REG_FMT "\n", m->gregs[REG_O6]);
|
||||
runtime_printf("o7 " REG_FMT "\n", m->gregs[REG_O7]);
|
||||
#if defined(REG_ASI) && defined(REG_FPRS) && !defined(__linux__)
|
||||
runtime_printf("asi " REG_FMT "\n", m->gregs[REG_ASI]);
|
||||
runtime_printf("fprs " REG_FMT "\n", m->gregs[REG_FPRS]);
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue