diff options
author | hunt <hunt> | 2007-07-02 07:14:36 +0000 |
---|---|---|
committer | hunt <hunt> | 2007-07-02 07:14:36 +0000 |
commit | 8885da7591dad014c6815e25729d93c40624d7f1 (patch) | |
tree | e343e310fdc74572b418e425d7f83da99606b455 /runtime/stack-i386.c | |
parent | b5f107a1a125e58385341e2da7030bd73e92a922 (diff) | |
download | systemtap-steved-8885da7591dad014c6815e25729d93c40624d7f1.tar.gz systemtap-steved-8885da7591dad014c6815e25729d93c40624d7f1.tar.xz systemtap-steved-8885da7591dad014c6815e25729d93c40624d7f1.zip |
2007-07-02 Martin Hunt <hunt@redhat.com>
* sym.c (_stp_kallsyms_lookup): Improve heuristic
for determining when a pointer is in a function.
(_stp_func_print): New function.
* stack-i386.c, stack-x86_64.c: Remove obsolete
unwind code. Use _stp_func_print().
Diffstat (limited to 'runtime/stack-i386.c')
-rw-r--r-- | runtime/stack-i386.c | 63 |
1 files changed, 2 insertions, 61 deletions
diff --git a/runtime/stack-i386.c b/runtime/stack-i386.c index 161e22ee..a80de048 100644 --- a/runtime/stack-i386.c +++ b/runtime/stack-i386.c @@ -7,37 +7,6 @@ * Public License (GPL); either version 2, or (at your option) any * later version. */ -#ifdef CONFIG_STACK_UNWIND -#include <linux/unwind.h> - -static inline int _stp_valid_stack_ptr_info(struct unwind_frame_info *info) -{ - unsigned long context = (unsigned long)UNW_SP(info) & ~(THREAD_SIZE - 1); - unsigned long p = UNW_PC(info); - return p > context && p < context + THREAD_SIZE - 3; -} - -static int -_stp_show_trace_unwind(struct unwind_frame_info *info, int verbose) -{ - int n = 0; - - while (unwind(info) == 0 && UNW_PC(info)) { - if (_stp_valid_stack_ptr_info(info)) - break; - n++; - if (verbose) { - _stp_print_char (' '); - _stp_symbol_print (UNW_PC(info)); - _stp_print_char ('\n'); - } else - _stp_printf ("0x%08lx ", UNW_PC(info)); - if (arch_unw_user_mode(info)) - break; - } - return n; -} -#endif /* CONFIG_STACK_UNWIND */ static inline int _stp_valid_stack_ptr(unsigned long context, unsigned long p) { @@ -49,31 +18,14 @@ static void __stp_stack_print (struct pt_regs *regs, int verbose, int levels) unsigned long *stack = (unsigned long *)®_SP(regs); unsigned long context = (unsigned long)stack & ~(THREAD_SIZE - 1); unsigned long addr; - int uw_ret = 0; - -#ifdef CONFIG_STACK_UNWIND - struct unwind_frame_info info; - if (unwind_init_frame_info(&info, current, regs) == 0) - uw_ret = _stp_show_trace_unwind(&info, verbose); - stack = (void *)UNW_SP(&info); -#endif - - if (uw_ret == 0) - _stp_print("Inexact backtrace:\n"); #ifdef CONFIG_FRAME_POINTER { - unsigned long ebp; - /* Grab ebp right from our regs.*/ - asm ("movl %%ebp, %0" : "=r" (ebp) : ); + unsigned long ebp = regs->ebp; while (_stp_valid_stack_ptr(context, (unsigned long)ebp)) { addr = *(unsigned long *)(ebp + 4); if (verbose) { - if (uw_ret) { - uw_ret = 0; - _stp_print("Leftover inexact backtrace:\n"); - } _stp_print_char(' '); _stp_symbol_print (addr); _stp_print_char('\n'); @@ -85,18 +37,7 @@ static void __stp_stack_print (struct pt_regs *regs, int verbose, int levels) #else while (_stp_valid_stack_ptr(context, (unsigned long)stack)) { addr = *stack++; - if (_stp_kta(addr)) { - if (verbose) { - if (uw_ret) { - uw_ret = 0; - _stp_print("Leftover inexact backtrace:\n"); - } - _stp_print_char(' '); - _stp_symbol_print(addr); - _stp_print_char('\n'); - } else - _stp_printf ("0x%08lx ", addr); - } + _stp_func_print(addr, verbose); } #endif } |