diff options
Diffstat (limited to 'sysdeps/powerpc/powerpc64/backtrace.c')
-rw-r--r-- | sysdeps/powerpc/powerpc64/backtrace.c | 21 |
1 files changed, 12 insertions, 9 deletions
diff --git a/sysdeps/powerpc/powerpc64/backtrace.c b/sysdeps/powerpc/powerpc64/backtrace.c index edd53bb619..c0c4b48262 100644 --- a/sysdeps/powerpc/powerpc64/backtrace.c +++ b/sysdeps/powerpc/powerpc64/backtrace.c @@ -1,5 +1,5 @@ /* Return backtrace of current program state. - Copyright (C) 1998-2016 Free Software Foundation, Inc. + Copyright (C) 1998-2018 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -16,10 +16,12 @@ License along with the GNU C Library; see the file COPYING.LIB. If not, see <http://www.gnu.org/licenses/>. */ -#include <execinfo.h> #include <stddef.h> #include <string.h> #include <signal.h> +#include <stdint.h> + +#include <execinfo.h> #include <libc-vdso.h> /* This is the stack layout we see with every stack frame. @@ -37,7 +39,7 @@ struct layout { struct layout *next; - long condition_register; + long int condition_register; void *return_address; }; @@ -47,16 +49,16 @@ struct layout dummy frame to make it look like it has a caller. */ struct signal_frame_64 { #define SIGNAL_FRAMESIZE 128 - char dummy[SIGNAL_FRAMESIZE]; - struct ucontext uc; + char dummy[SIGNAL_FRAMESIZE]; + ucontext_t uc; /* We don't care about the rest, since the IP value is at 'uc' field. */ }; static inline int -is_sigtramp_address (unsigned long nip) +is_sigtramp_address (void *nip) { #ifdef SHARED - if (nip == (unsigned long)__vdso_sigtramp_rt64) + if (nip == VDSO_SYMBOL (sigtramp_rt64)) return 1; #endif return 0; @@ -82,10 +84,11 @@ __backtrace (void **array, int size) /* Check if the symbol is the signal trampoline and get the interrupted * symbol address from the trampoline saved area. */ - if (is_sigtramp_address ((unsigned long)current->return_address)) + if (is_sigtramp_address (current->return_address)) { struct signal_frame_64 *sigframe = (struct signal_frame_64*) current; - array[++count] = (void*)sigframe->uc.uc_mcontext.gp_regs[PT_NIP]; + array[++count] = (void*) sigframe->uc.uc_mcontext.gp_regs[PT_NIP]; + current = (void*) sigframe->uc.uc_mcontext.gp_regs[PT_R1]; } } |