Ian Lance Taylor <i...@golang.org> wrote:
> What I was hoping from my earlier question was that you could tell me
> the exact lines to write in the current sources that will compile on
> MUSL. Don't include <asm/ptrace.h>, don't refer to earlier patches as
> that is what I tried to do earlier but failed, don't add new #define
> macros, just add #ifdef and appropriate lines.  Thanks.  If the new
> lines also work on glibc using register indexes rather than names,
> that would be a bonus.

Sorry, may bad. Here you go:

diff --git a/libgo/runtime/go-signal.c b/libgo/runtime/go-signal.c
index 9c919e15..454da75e 100644
--- a/libgo/runtime/go-signal.c
+++ b/libgo/runtime/go-signal.c
@@ -233,8 +233,11 @@ getSiginfo(siginfo_t *info, void *context 
__attribute__((unused)))
 #elif defined(__PPC__) && defined(__linux__)
        // For some reason different libc implementations use
        // different names.
-#if defined(__PPC64__) || defined(__GLIBC__)
+#if defined(__GLIBC__)
        ret.sigpc = ((ucontext_t*)(context))->uc_mcontext.regs->nip;
+#elif defined(__PPC64__)
+       // Assumed to be ppc64 musl.
+       ret.sigpc = ((ucontext_t*)(context))->uc_mcontext.gp_regs[32];
 #else
        // Assumed to be ppc32 musl.
        ret.sigpc = ((ucontext_t*)(context))->uc_mcontext.gregs[32];
@@ -354,7 +357,7 @@ dumpregs(siginfo_t *info __attribute__((unused)), void 
*context __attribute__((u
                mcontext_t *m = &((ucontext_t*)(context))->uc_mcontext;
                int i;
 
-#if defined(__PPC64__) || defined(__GLIBC__)
+#if defined(__GLIBC__)
                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);
@@ -363,6 +366,15 @@ dumpregs(siginfo_t *info __attribute__((unused)), void 
*context __attribute__((u
                runtime_printf("lr  %X\n", m->regs->link);
                runtime_printf("ctr %X\n", m->regs->ctr);
                runtime_printf("xer %X\n", m->regs->xer);
+#elif defined(__PPC64__)
+               for (i = 0; i < 32; i++)
+                       runtime_printf("r%d %X\n", i, m->gp_regs[i]);
+               runtime_printf("pc  %X\n", m->gp_regs[32]);
+               runtime_printf("msr %X\n", m->gp_regs[33]);
+               runtime_printf("cr  %X\n", m->gp_regs[38]);
+               runtime_printf("lr  %X\n", m->gp_regs[36]);
+               runtime_printf("ctr %X\n", m->gp_regs[35]);
+               runtime_printf("xer %X\n", m->gp_regs[37]);
 #else
                for (i = 0; i < 32; i++)
                        runtime_printf("r%d %X\n", i, m->gregs[i]);

Reply via email to