diff options
author | eric fang <eric.fang@arm.com> | 2020-02-21 09:01:02 +0000 |
---|---|---|
committer | Ian Lance Taylor <iant@golang.org> | 2020-02-28 12:24:21 -0800 |
commit | 3f469f585e08802d4d4add549f34c1afb2ae3157 (patch) | |
tree | 83335f91895786a27494abd16a0dd21955d7bcae /libgo | |
parent | 799270b430542572ddc859331e9e15311ce7ee2c (diff) | |
download | gcc-3f469f585e08802d4d4add549f34c1afb2ae3157.zip gcc-3f469f585e08802d4d4add549f34c1afb2ae3157.tar.gz gcc-3f469f585e08802d4d4add549f34c1afb2ae3157.tar.bz2 |
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
Diffstat (limited to 'libgo')
-rw-r--r-- | libgo/runtime/go-signal.c | 63 |
1 files changed, 23 insertions, 40 deletions
diff --git a/libgo/runtime/go-signal.c b/libgo/runtime/go-signal.c index 081604e..a07fdea 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 } |