aboutsummaryrefslogtreecommitdiffstats
path: root/arch/nds32/kernel/traps.c
diff options
context:
space:
mode:
authorZong Li <zong@andestech.com>2018-08-15 11:05:40 +0800
committerGreentime Hu <greentime@andestech.com>2018-09-04 14:45:18 +0800
commit1e377ae9b04aef4dc531fa4c5f81b65d440ebcba (patch)
tree4a43286c98a7ba45a865f7a75364d651f1e9d65e /arch/nds32/kernel/traps.c
parentnds32/ftrace: Support dynamic function graph tracer (diff)
downloadlinux-dev-1e377ae9b04aef4dc531fa4c5f81b65d440ebcba.tar.xz
linux-dev-1e377ae9b04aef4dc531fa4c5f81b65d440ebcba.zip
nds32/stack: Get real return address by using ftrace_graph_ret_addr
Function graph tracer has modified the return address to 'return_to_handler' on stack, and provide the 'ftrace_graph_ret_addr' to get the real return address. Signed-off-by: Zong Li <zong@andestech.com> Acked-by: Greentime Hu <greentime@andestech.com> Signed-off-by: Greentime Hu <greentime@andestech.com>
Diffstat (limited to '')
-rw-r--r--arch/nds32/kernel/traps.c30
1 files changed, 6 insertions, 24 deletions
diff --git a/arch/nds32/kernel/traps.c b/arch/nds32/kernel/traps.c
index f0e974347c26..7684c8f597ed 100644
--- a/arch/nds32/kernel/traps.c
+++ b/arch/nds32/kernel/traps.c
@@ -8,6 +8,7 @@
#include <linux/kdebug.h>
#include <linux/sched/task_stack.h>
#include <linux/uaccess.h>
+#include <linux/ftrace.h>
#include <asm/proc-fns.h>
#include <asm/unistd.h>
@@ -94,28 +95,6 @@ static void dump_instr(struct pt_regs *regs)
set_fs(fs);
}
-#ifdef CONFIG_FUNCTION_GRAPH_TRACER
-#include <linux/ftrace.h>
-static void
-get_real_ret_addr(unsigned long *addr, struct task_struct *tsk, int *graph)
-{
- if (*addr == (unsigned long)return_to_handler) {
- int index = tsk->curr_ret_stack;
-
- if (tsk->ret_stack && index >= *graph) {
- index -= *graph;
- *addr = tsk->ret_stack[index].ret;
- (*graph)++;
- }
- }
-}
-#else
-static inline void
-get_real_ret_addr(unsigned long *addr, struct task_struct *tsk, int *graph)
-{
-}
-#endif
-
#define LOOP_TIMES (100)
static void __dump(struct task_struct *tsk, unsigned long *base_reg)
{
@@ -126,7 +105,8 @@ static void __dump(struct task_struct *tsk, unsigned long *base_reg)
while (!kstack_end(base_reg)) {
ret_addr = *base_reg++;
if (__kernel_text_address(ret_addr)) {
- get_real_ret_addr(&ret_addr, tsk, &graph);
+ ret_addr = ftrace_graph_ret_addr(
+ tsk, &graph, ret_addr, NULL);
print_ip_sym(ret_addr);
}
if (--cnt < 0)
@@ -145,7 +125,9 @@ static void __dump(struct task_struct *tsk, unsigned long *base_reg)
next_fp = base_reg[FP_OFFSET];
#endif
if (__kernel_text_address(ret_addr)) {
- get_real_ret_addr(&ret_addr, tsk, &graph);
+
+ ret_addr = ftrace_graph_ret_addr(
+ tsk, &graph, ret_addr, NULL);
print_ip_sym(ret_addr);
}
if (--cnt < 0)