From 3f469f585e08802d4d4add549f34c1afb2ae3157 Mon Sep 17 00:00:00 2001 From: eric fang Date: Fri, 21 Feb 2020 09:01:02 +0000 Subject: [PATCH] runtime: handle linux/arm64 signal register Set sigpc and implement dumpregs for linux/arm64. Without this change, cmd/vet tool test will fail randomly. Updates golang/go#20931 Reviewed-on: https://go-review.googlesource.com/c/gofrontend/+/220543 --- gcc/go/gofrontend/MERGE | 2 +- libgo/runtime/go-signal.c | 63 ++++++++++++++------------------------- 2 files changed, 24 insertions(+), 41 deletions(-) diff --git a/gcc/go/gofrontend/MERGE b/gcc/go/gofrontend/MERGE index a62c8292e0a..6b4c21fabf5 100644 --- a/gcc/go/gofrontend/MERGE +++ b/gcc/go/gofrontend/MERGE @@ -1,4 +1,4 @@ -5fc21bb0d91d916940c21e6d4a3e10ad3f45343d +7a62a49e62c090118fa003d9265c5f5e2090c4f9 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 081604e1849..a07fdeafeb4 100644 --- a/libgo/runtime/go-signal.c +++ b/libgo/runtime/go-signal.c @@ -205,28 +205,18 @@ 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. -#ifdef __x86_64__ - #ifdef __linux__ +#if defined(__x86_64__) && defined(__linux__) ret.sigpc = ((ucontext_t*)(context))->uc_mcontext.gregs[REG_RIP]; - #endif -#endif -#ifdef __i386__ - #ifdef __linux__ +#elif defined(__i386__) && defined(__linux__) ret.sigpc = ((ucontext_t*)(context))->uc_mcontext.gregs[REG_EIP]; - #endif -#endif -#ifdef __alpha__ - #ifdef __linux__ +#elif defined(__alpha__) && defined(__linux__) ret.sigpc = ((ucontext_t*)(context))->uc_mcontext.sc_pc; - #endif -#endif -#ifdef __PPC__ - #ifdef __linux__ +#elif defined(__PPC__) && defined(__linux__) ret.sigpc = ((ucontext_t*)(context))->uc_mcontext.regs->nip; - #endif - #ifdef _AIX +#elif defined(__PPC__) && defined(_AIX) ret.sigpc = ((ucontext_t*)(context))->uc_mcontext.jmp_context.iar; - #endif +#elif defined(__aarch64__) && defined(__linux__) + ret.sigpc = ((ucontext_t*)(context))->uc_mcontext.pc; #endif if (ret.sigpc == 0) { @@ -250,8 +240,7 @@ void dumpregs(siginfo_t *, void *) void dumpregs(siginfo_t *info __attribute__((unused)), void *context __attribute__((unused))) { -#ifdef __x86_64__ - #ifdef __linux__ +#if defined(__x86_64__) && defined(__linux__) { mcontext_t *m = &((ucontext_t*)(context))->uc_mcontext; @@ -277,11 +266,7 @@ dumpregs(siginfo_t *info __attribute__((unused)), void *context __attribute__((u runtime_printf("fs %X\n", (m->gregs[REG_CSGSFS] >> 16) & 0xffff); runtime_printf("gs %X\n", (m->gregs[REG_CSGSFS] >> 32) & 0xffff); } - #endif -#endif - -#ifdef __i386__ - #ifdef __linux__ +#elif defined(__i386__) && defined(__linux__) { mcontext_t *m = &((ucontext_t*)(context))->uc_mcontext; @@ -299,11 +284,7 @@ dumpregs(siginfo_t *info __attribute__((unused)), void *context __attribute__((u runtime_printf("fs %x\n", m->gregs[REG_FS]); runtime_printf("gs %x\n", m->gregs[REG_GS]); } - #endif -#endif - -#ifdef __alpha__ - #ifdef __linux__ +#elif defined(__alpha__) && defined(__linux__) { mcontext_t *m = &((ucontext_t*)(context))->uc_mcontext; @@ -340,11 +321,7 @@ dumpregs(siginfo_t *info __attribute__((unused)), void *context __attribute__((u runtime_printf("sp %X\n", m->sc_regs[30]); runtime_printf("pc %X\n", m->sc_pc); } - #endif -#endif - -#if defined(__PPC__) && defined(__LITTLE_ENDIAN__) - #ifdef __linux__ +#elif defined(__PPC__) && defined(__LITTLE_ENDIAN__) && defined(__linux__) { mcontext_t *m = &((ucontext_t*)(context))->uc_mcontext; int i; @@ -358,11 +335,7 @@ dumpregs(siginfo_t *info __attribute__((unused)), void *context __attribute__((u runtime_printf("ctr %X\n", m->regs->ctr); runtime_printf("xer %X\n", m->regs->xer); } - #endif -#endif - -#ifdef __PPC__ - #ifdef _AIX +#elif defined(__PPC__) && defined(_AIX) { mcontext_t *m = &((ucontext_t*)(context))->uc_mcontext; int i; @@ -376,6 +349,16 @@ dumpregs(siginfo_t *info __attribute__((unused)), void *context __attribute__((u runtime_printf("ctr %p\n", m->jmp_context.ctr); runtime_printf("xer %x\n", m->jmp_context.xer); } - #endif +#elif defined(__aarch64__) && defined(__linux__) + { + mcontext_t *m = &((ucontext_t*)(context))->uc_mcontext; + int i; + + for (i = 0; i < 31; i++) + runtime_printf("x%d %X\n", i, m->regs[i]); + runtime_printf("sp %X\n", m->sp); + runtime_printf("pc %X\n", m->pc); + runtime_printf("pstate %X\n", m->pstate); + } #endif }