diff options
Diffstat (limited to 'arch/arm/oprofile/backtrace.c')
| -rw-r--r-- | arch/arm/oprofile/backtrace.c | 14 |
1 files changed, 8 insertions, 6 deletions
diff --git a/arch/arm/oprofile/backtrace.c b/arch/arm/oprofile/backtrace.c index cefc21c2eee4..d805a52b5032 100644 --- a/arch/arm/oprofile/backtrace.c +++ b/arch/arm/oprofile/backtrace.c | |||
| @@ -18,15 +18,14 @@ | |||
| 18 | #include <linux/mm.h> | 18 | #include <linux/mm.h> |
| 19 | #include <linux/uaccess.h> | 19 | #include <linux/uaccess.h> |
| 20 | #include <asm/ptrace.h> | 20 | #include <asm/ptrace.h> |
| 21 | 21 | #include <asm/stacktrace.h> | |
| 22 | #include "../kernel/stacktrace.h" | ||
| 23 | 22 | ||
| 24 | static int report_trace(struct stackframe *frame, void *d) | 23 | static int report_trace(struct stackframe *frame, void *d) |
| 25 | { | 24 | { |
| 26 | unsigned int *depth = d; | 25 | unsigned int *depth = d; |
| 27 | 26 | ||
| 28 | if (*depth) { | 27 | if (*depth) { |
| 29 | oprofile_add_trace(frame->lr); | 28 | oprofile_add_trace(frame->pc); |
| 30 | (*depth)--; | 29 | (*depth)--; |
| 31 | } | 30 | } |
| 32 | 31 | ||
| @@ -70,9 +69,12 @@ void arm_backtrace(struct pt_regs * const regs, unsigned int depth) | |||
| 70 | struct frame_tail *tail = ((struct frame_tail *) regs->ARM_fp) - 1; | 69 | struct frame_tail *tail = ((struct frame_tail *) regs->ARM_fp) - 1; |
| 71 | 70 | ||
| 72 | if (!user_mode(regs)) { | 71 | if (!user_mode(regs)) { |
| 73 | unsigned long base = ((unsigned long)regs) & ~(THREAD_SIZE - 1); | 72 | struct stackframe frame; |
| 74 | walk_stackframe(regs->ARM_fp, base, base + THREAD_SIZE, | 73 | frame.fp = regs->ARM_fp; |
| 75 | report_trace, &depth); | 74 | frame.sp = regs->ARM_sp; |
| 75 | frame.lr = regs->ARM_lr; | ||
| 76 | frame.pc = regs->ARM_pc; | ||
| 77 | walk_stackframe(&frame, report_trace, &depth); | ||
| 76 | return; | 78 | return; |
| 77 | } | 79 | } |
| 78 | 80 | ||
