Ping.

Would be nice to get this integrated since this one of the changes needed to
make gccgo work with musl libc. Let me know if the patch needs to be revised
further.

Sören Tempel <soe...@soeren-tempel.net> wrote:
> The .regs member is primarily intended to be used in conjunction with
> ptrace. Since this code is not using ptrace, using .regs is a bad idea.
> Furthermore, the code currently fails to compile on musl since the
> pt_regs type (used by .regs) is in an incomplete type which has to be
> completed by inclusion of the asm/ptrace.h Kernel header. Contrary to
> glibc, this header is not indirectly included by musl through other
> header files.
> 
> This patch fixes compilation of this code with musl libc by accessing
> the register values via .gp_regs/.gregs (depending on 32-bit or 64-bit
> PowerPC) instead of using .regs. For more details, see
> https://gcc.gnu.org/pipermail/gcc-patches/2022-March/591261.html
> 
> For the offsets in gp_regs refer to the Kernel asm/ptrace.h header.
> 
> This patch has been tested on Alpine Linux ppc64le (uses musl libc).
> 
> Signed-off-by: Sören Tempel <soe...@soeren-tempel.net>
> 
> ChangeLog:
> 
>       * libgo/runtime/go-signal.c (defined): Use .gp_regs/.gregs
>         to access ppc64/ppc32 registers.
>       (dumpregs): Ditto.
> ---
> Changes since v3: Add special handling for 32-bit PowerPC with glibc,
> also avoid use of gregs_t type since glibc does not seem to define
> it on PowerPC.
> 
> This version of the patch introduces a new macro (PPC_GPREGS) to access
> these registers to special case musl/glibc handling in a central place
> once instead of duplicating it twice.
> 
>  libgo/runtime/go-signal.c | 32 ++++++++++++++++++++++++--------
>  1 file changed, 24 insertions(+), 8 deletions(-)
> 
> diff --git a/libgo/runtime/go-signal.c b/libgo/runtime/go-signal.c
> index d30d1603adc..3255046260d 100644
> --- a/libgo/runtime/go-signal.c
> +++ b/libgo/runtime/go-signal.c
> @@ -16,6 +16,21 @@
>    #define SA_RESTART 0
>  #endif
>  
> +// The PowerPC API for accessing gregs/gp_regs differs greatly across
> +// different libc implementations (musl and glibc).  To workaround that,
> +// define the canonical way to access these registers once here.
> +//
> +// See https://gcc.gnu.org/pipermail/gcc-patches/2022-March/591360.html
> +#ifdef __PPC__
> +#if defined(__PPC64__)   /* ppc64 glibc & musl */
> +#define PPC_GPREGS(MCTX) (MCTX)->gp_regs
> +#elif defined(__GLIBC__) /* ppc32 glibc */
> +#define PPC_GPREGS(MCTX) (MCTX)->uc_regs->gregs
> +#else                    /* ppc32 musl */
> +#define PPC_GPREGS(MCTX) (MCTX)->gregs
> +#endif /* __PPC64__ */
> +#endif /* __PPC__ */
> +
>  #ifdef USING_SPLIT_STACK
>  
>  extern void __splitstack_getcontext(void *context[10]);
> @@ -224,7 +239,8 @@ getSiginfo(siginfo_t *info, void *context 
> __attribute__((unused)))
>  #elif defined(__alpha__) && defined(__linux__)
>       ret.sigpc = ((ucontext_t*)(context))->uc_mcontext.sc_pc;
>  #elif defined(__PPC__) && defined(__linux__)
> -     ret.sigpc = ((ucontext_t*)(context))->uc_mcontext.regs->nip;
> +     mcontext_t *m = &((ucontext_t*)(context))->uc_mcontext;
> +     ret.sigpc = PPC_GPREGS(m)[32];
>  #elif defined(__PPC__) && defined(_AIX)
>       ret.sigpc = ((ucontext_t*)(context))->uc_mcontext.jmp_context.iar;
>  #elif defined(__aarch64__) && defined(__linux__)
> @@ -341,13 +357,13 @@ dumpregs(siginfo_t *info __attribute__((unused)), void 
> *context __attribute__((u
>               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);
> +                     runtime_printf("r%d %X\n", i, PPC_GPREGS(m)[i]);
> +             runtime_printf("pc  %X\n", PPC_GPREGS(m)[32]);
> +             runtime_printf("msr %X\n", PPC_GPREGS(m)[33]);
> +             runtime_printf("cr  %X\n", PPC_GPREGS(m)[38]);
> +             runtime_printf("lr  %X\n", PPC_GPREGS(m)[36]);
> +             runtime_printf("ctr %X\n", PPC_GPREGS(m)[35]);
> +             runtime_printf("xer %X\n", PPC_GPREGS(m)[37]);
>         }
>  #elif defined(__PPC__) && defined(_AIX)
>         {
> 

Reply via email to