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
pull/62/merge
Ian Lance Taylor 2024-04-28 13:30:39 -07:00
parent 678dc5e850
commit a05efc8bf5
2 changed files with 60 additions and 5 deletions

View File

@ -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.

View File

@ -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
}