diff options
Diffstat (limited to 'arch/nds32/kernel/stacktrace.c')
-rw-r--r-- | arch/nds32/kernel/stacktrace.c | 6 |
1 files changed, 5 insertions, 1 deletions
diff --git a/arch/nds32/kernel/stacktrace.c b/arch/nds32/kernel/stacktrace.c index 8b231e910ea6..d974c0c1c65f 100644 --- a/arch/nds32/kernel/stacktrace.c +++ b/arch/nds32/kernel/stacktrace.c | |||
@@ -4,6 +4,7 @@ | |||
4 | #include <linux/sched/debug.h> | 4 | #include <linux/sched/debug.h> |
5 | #include <linux/sched/task_stack.h> | 5 | #include <linux/sched/task_stack.h> |
6 | #include <linux/stacktrace.h> | 6 | #include <linux/stacktrace.h> |
7 | #include <linux/ftrace.h> | ||
7 | 8 | ||
8 | void save_stack_trace(struct stack_trace *trace) | 9 | void save_stack_trace(struct stack_trace *trace) |
9 | { | 10 | { |
@@ -16,6 +17,7 @@ void save_stack_trace_tsk(struct task_struct *tsk, struct stack_trace *trace) | |||
16 | unsigned long *fpn; | 17 | unsigned long *fpn; |
17 | int skip = trace->skip; | 18 | int skip = trace->skip; |
18 | int savesched; | 19 | int savesched; |
20 | int graph_idx = 0; | ||
19 | 21 | ||
20 | if (tsk == current) { | 22 | if (tsk == current) { |
21 | __asm__ __volatile__("\tori\t%0, $fp, #0\n":"=r"(fpn)); | 23 | __asm__ __volatile__("\tori\t%0, $fp, #0\n":"=r"(fpn)); |
@@ -29,10 +31,12 @@ void save_stack_trace_tsk(struct task_struct *tsk, struct stack_trace *trace) | |||
29 | && (fpn >= (unsigned long *)TASK_SIZE)) { | 31 | && (fpn >= (unsigned long *)TASK_SIZE)) { |
30 | unsigned long lpp, fpp; | 32 | unsigned long lpp, fpp; |
31 | 33 | ||
32 | lpp = fpn[-1]; | 34 | lpp = fpn[LP_OFFSET]; |
33 | fpp = fpn[FP_OFFSET]; | 35 | fpp = fpn[FP_OFFSET]; |
34 | if (!__kernel_text_address(lpp)) | 36 | if (!__kernel_text_address(lpp)) |
35 | break; | 37 | break; |
38 | else | ||
39 | lpp = ftrace_graph_ret_addr(tsk, &graph_idx, lpp, NULL); | ||
36 | 40 | ||
37 | if (savesched || !in_sched_functions(lpp)) { | 41 | if (savesched || !in_sched_functions(lpp)) { |
38 | if (skip) { | 42 | if (skip) { |