From 450f20a89930fedc2a48d255dd43623440aa6904 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Wed, 16 Aug 2017 19:04:00 +0000 Subject: [PATCH] runtime: improvements for signal registers Fix dumpregs on i386, implement dumpregs for PPC Linux/AIX, get PC on AIX. Reviewed-on: https://go-review.googlesource.com/56170 From-SVN: r251127 --- gcc/go/gofrontend/MERGE | 2 +- libgo/runtime/go-signal.c | 62 +++++++++++++++++++++++++++++++-------- 2 files changed, 50 insertions(+), 14 deletions(-) diff --git a/gcc/go/gofrontend/MERGE b/gcc/go/gofrontend/MERGE index c5ecb102c7e..52fe0646c9d 100644 --- a/gcc/go/gofrontend/MERGE +++ b/gcc/go/gofrontend/MERGE @@ -1,4 +1,4 @@ -480fdfa9dd416bd17115a94fa6021c4dd805fc39 +f02183eb66f5718769f3f6541dcc6744ae1771c0 The first line of this file holds the git revision number of the last merge done from the gofrontend repository. diff --git a/libgo/runtime/go-signal.c b/libgo/runtime/go-signal.c index a5a7cb8080a..e175fe66bee 100644 --- a/libgo/runtime/go-signal.c +++ b/libgo/runtime/go-signal.c @@ -224,6 +224,9 @@ getSiginfo(siginfo_t *info, void *context __attribute__((unused))) #ifdef __linux__ ret.sigpc = ((ucontext_t*)(context))->uc_mcontext.regs->nip; #endif + #ifdef _AIX + ret.sigpc = ((ucontext_t*)(context))->uc_mcontext.jmp_context.iar; + #endif #endif if (ret.sigpc == 0) { @@ -282,19 +285,19 @@ dumpregs(siginfo_t *info __attribute__((unused)), void *context __attribute__((u { mcontext_t *m = &((ucontext_t*)(context))->uc_mcontext; - runtime_printf("eax %X\n", m->gregs[REG_EAX]); - runtime_printf("ebx %X\n", m->gregs[REG_EBX]); - runtime_printf("ecx %X\n", m->gregs[REG_ECX]); - runtime_printf("edx %X\n", m->gregs[REG_EDX]); - runtime_printf("edi %X\n", m->gregs[REG_EDI]); - runtime_printf("esi %X\n", m->gregs[REG_ESI]); - runtime_printf("ebp %X\n", m->gregs[REG_EBP]); - runtime_printf("esp %X\n", m->gregs[REG_ESP]); - runtime_printf("eip %X\n", m->gregs[REG_EIP]); - runtime_printf("eflags %X\n", m->gregs[REG_EFL]); - 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]); + runtime_printf("eax %x\n", m->gregs[REG_EAX]); + runtime_printf("ebx %x\n", m->gregs[REG_EBX]); + runtime_printf("ecx %x\n", m->gregs[REG_ECX]); + runtime_printf("edx %x\n", m->gregs[REG_EDX]); + runtime_printf("edi %x\n", m->gregs[REG_EDI]); + runtime_printf("esi %x\n", m->gregs[REG_ESI]); + runtime_printf("ebp %x\n", m->gregs[REG_EBP]); + runtime_printf("esp %x\n", m->gregs[REG_ESP]); + runtime_printf("eip %x\n", m->gregs[REG_EIP]); + runtime_printf("eflags %x\n", m->gregs[REG_EFL]); + 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 #endif @@ -339,4 +342,37 @@ dumpregs(siginfo_t *info __attribute__((unused)), void *context __attribute__((u } #endif #endif + +#ifdef __PPC__ + #ifdef __linux__ + { + mcontext_t *m = &((ucontext_t*)(context))->uc_mcontext; + int i; + + for (i = 0; i < 32; i++) + runtime_printf("r%d %X\n", i, m->regs->gpr[i]); + runtime_printf("pc %X\n", m->regs->nip); + runtime_printf("msr %X\n", m->regs->msr); + runtime_printf("cr %X\n", m->regs->ccr); + runtime_printf("lr %X\n", m->regs->link); + runtime_printf("ctr %X\n", m->regs->ctr); + runtime_printf("xer %X\n", m->regs->xer); + } + #endif + #ifdef _AIX + { + mcontext_t *m = &((ucontext_t*)(context))->uc_mcontext; + int i; + + for (i = 0; i < 32; i++) + runtime_printf("r%d %p\n", i, m->jmp_context.gpr[i]); + runtime_printf("pc %p\n", m->jmp_context.iar); + runtime_printf("msr %p\n", m->jmp_context.msr); + runtime_printf("cr %x\n", m->jmp_context.cr); + runtime_printf("lr %p\n", m->jmp_context.lr); + runtime_printf("ctr %p\n", m->jmp_context.ctr); + runtime_printf("xer %x\n", m->jmp_context.xer); + } + #endif +#endif } -- 2.30.2