summaryrefslogtreecommitdiffstats
path: root/runtime/stack.c
diff options
context:
space:
mode:
authorMartin Hunt <hunt@redhat.com>2008-03-28 16:20:02 -0400
committerMartin Hunt <hunt@redhat.com>2008-03-28 16:20:02 -0400
commit614ead2b7dd8ac70cd89d018b09a397be7ade371 (patch)
tree11dfb318caa7c636cd2d933905810ca5a634115e /runtime/stack.c
parentfd2ef8221625866219d6fc8e99ac36520ac6017b (diff)
downloadsystemtap-steved-614ead2b7dd8ac70cd89d018b09a397be7ade371.tar.gz
systemtap-steved-614ead2b7dd8ac70cd89d018b09a397be7ade371.tar.xz
systemtap-steved-614ead2b7dd8ac70cd89d018b09a397be7ade371.zip
kretprobe trampoline fixes
Recognize when a kretprobe trampoline was hit and continue with inexact stack dump. Also some testsuite changes.
Diffstat (limited to 'runtime/stack.c')
-rw-r--r--runtime/stack.c22
1 files changed, 12 insertions, 10 deletions
diff --git a/runtime/stack.c b/runtime/stack.c
index e338f587..eefdf715 100644
--- a/runtime/stack.c
+++ b/runtime/stack.c
@@ -58,12 +58,15 @@ void _stp_stack_print(struct pt_regs *regs, int verbose, struct kretprobe_instan
_stp_symbol_print((unsigned long)_stp_ret_addr_r(pi));
} else {
_stp_print_char(' ');
- _stp_symbol_print (REG_IP(regs));
+ _stp_symbol_print(REG_IP(regs));
}
_stp_print_char('\n');
- } else
- _stp_printf ("%p ", (int64_t)REG_IP(regs));
- __stp_stack_print (regs, verbose, 0);
+ } else if (pi)
+ _stp_printf("%p %p ", (int64_t) _stp_ret_addr_r(pi), (int64_t) REG_IP(regs));
+ else
+ _stp_printf("%p ", (int64_t) REG_IP(regs));
+
+ __stp_stack_print(regs, verbose, 0);
}
/** Writes stack backtrace to a string
@@ -72,7 +75,7 @@ void _stp_stack_print(struct pt_regs *regs, int verbose, struct kretprobe_instan
* @param regs A pointer to the struct pt_regs.
* @returns void
*/
-void _stp_stack_snprint (char *str, int size, struct pt_regs *regs, int verbose, struct kretprobe_instance *pi)
+void _stp_stack_snprint(char *str, int size, struct pt_regs *regs, int verbose, struct kretprobe_instance *pi)
{
/* To get a string, we use a simple trick. First flush the print buffer, */
/* then call _stp_stack_print, then copy the result into the output string */
@@ -84,19 +87,18 @@ void _stp_stack_snprint (char *str, int size, struct pt_regs *regs, int verbose,
pb->len = 0;
}
-
/** Prints the user stack backtrace
* @param str string
* @returns Same string as was input with trace info appended,
* @note Currently limited to a depth of two. Works from jprobes and kprobes.
*/
#if 0
-void _stp_ustack_print (char *str)
+void _stp_ustack_print(char *str)
{
- struct pt_regs *nregs = ((struct pt_regs *) (THREAD_SIZE + (unsigned long) current->thread_info)) - 1;
- _stp_printf ("%p : [user]\n", (int64_t)REG_IP(nregs));
+ struct pt_regs *nregs = ((struct pt_regs *)(THREAD_SIZE + (unsigned long)current->thread_info)) - 1;
+ _stp_printf("%p : [user]\n", (int64_t) REG_IP(nregs));
if (REG_SP(nregs))
- _stp_printf ("%p : [user]\n", (int64_t)(*(unsigned long *)REG_SP(nregs)));
+ _stp_printf("%p : [user]\n", (int64_t) (*(unsigned long *)REG_SP(nregs)));
}
#endif /* 0 */