diff options
author | Dave Brolley <brolley@redhat.com> | 2009-12-17 16:59:26 -0500 |
---|---|---|
committer | Dave Brolley <brolley@redhat.com> | 2009-12-17 16:59:26 -0500 |
commit | 6dd4e32114264ccda20395cb07bb877de3c062b2 (patch) | |
tree | 6ea4eb4e631df7832c07eafeda2ca4031870b335 /runtime/stack-i386.c | |
parent | 089ed967ce3894c3569091db70db423a5316b04e (diff) | |
parent | 4180475982d87f720897baa6f988a48b4c654ee5 (diff) | |
download | systemtap-steved-6dd4e32114264ccda20395cb07bb877de3c062b2.tar.gz systemtap-steved-6dd4e32114264ccda20395cb07bb877de3c062b2.tar.xz systemtap-steved-6dd4e32114264ccda20395cb07bb877de3c062b2.zip |
Merge branch 'master' of ssh://sources.redhat.com/git/systemtap
Diffstat (limited to 'runtime/stack-i386.c')
-rw-r--r-- | runtime/stack-i386.c | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/runtime/stack-i386.c b/runtime/stack-i386.c index b447e495..4bd3cc53 100644 --- a/runtime/stack-i386.c +++ b/runtime/stack-i386.c @@ -31,7 +31,7 @@ static void _stp_stack_print_fallback(unsigned long stack, int verbose, int leve #endif static void __stp_stack_print (struct pt_regs *regs, int verbose, int levels, - struct task_struct *tsk) + struct task_struct *tsk, struct uretprobe_instance *ri) { unsigned long context = (unsigned long)®_SP(regs) & ~(THREAD_SIZE - 1); @@ -63,6 +63,17 @@ static void __stp_stack_print (struct pt_regs *regs, int verbose, int levels, while (levels && (tsk || !arch_unw_user_mode(&info))) { int ret = unwind(&info, tsk); +#if UPROBES_API_VERSION > 1 + unsigned long maybe_pc = 0; + if (ri) { + maybe_pc = uprobe_get_pc(ri, UNW_PC(&info), + UNW_SP(&info)); + if (!maybe_pc) + printk("SYSTEMTAP ERROR: uprobe_get_return returned 0\n"); + else + UNW_PC(&info) = maybe_pc; + } +#endif dbug_unwind(1, "ret=%d PC=%lx SP=%lx\n", ret, UNW_PC(&info), UNW_SP(&info)); if (ret == 0) { _stp_func_print(UNW_PC(&info), verbose, 1, tsk); |