public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
From: soeren@soeren-tempel.net
To: gcc-patches@gcc.gnu.org
Cc: iant@golang.org, gofrontend-dev@googlegroups.com,
	schwab@linux-m68k.org, dalias@libc.org
Subject: [PATCH v4] libgo: Don't use pt_regs member in mcontext_t
Date: Fri, 11 Mar 2022 08:34:06 +0100	[thread overview]
Message-ID: <20220311073406.26722-1-soeren@soeren-tempel.net> (raw)
In-Reply-To: <20220309115236.GU7074@brightrain.aerifal.cx>

From: Sören Tempel <soeren@soeren-tempel.net>

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 <soeren@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	other threads:[~2022-03-11  7:34 UTC|newest]

Thread overview: 25+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-01-02 16:37 [PATCH] libgo: include asm/ptrace.h for pt_regs definition on PowerPC soeren
2022-02-20 10:43 ` Sören Tempel
2022-02-21 17:25   ` [gofrontend-dev] " Ian Lance Taylor
2022-03-06 12:49     ` Sören Tempel
2022-03-06 15:22     ` Rich Felker
2022-03-06 16:59       ` Rich Felker
2022-02-20 11:01 ` Andreas Schwab
2022-03-06 18:59 ` [PATCH v2] libgo: Don't use pt_regs member in mcontext_t soeren
2022-03-06 21:21   ` Rich Felker
2022-03-07  7:09     ` [PATCH v3] " soeren
2022-03-07 22:59       ` Ian Lance Taylor
2022-03-08 13:23         ` Rich Felker
2022-03-09  7:26         ` Sören Tempel
2022-03-09 11:52           ` Rich Felker
2022-03-11  7:34             ` soeren [this message]
2022-03-31 16:41               ` [PATCH v4] " Sören Tempel
2022-03-31 20:26                 ` Ian Lance Taylor
2022-04-02  8:21                   ` Sören Tempel
2022-04-03  2:02                     ` Ian Lance Taylor
2022-04-03  9:28                       ` Sören Tempel
2022-04-11 17:25                         ` Sören Tempel
2022-04-11 17:35                           ` Ian Lance Taylor
2022-04-11 18:28                             ` Sören Tempel
2022-04-14 22:15                               ` Ian Lance Taylor
2022-04-21  0:50                                 ` Ian Lance Taylor

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20220311073406.26722-1-soeren@soeren-tempel.net \
    --to=soeren@soeren-tempel.net \
    --cc=dalias@libc.org \
    --cc=gcc-patches@gcc.gnu.org \
    --cc=gofrontend-dev@googlegroups.com \
    --cc=iant@golang.org \
    --cc=schwab@linux-m68k.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).