summaryrefslogtreecommitdiffstats
path: root/arch/loongarch/kernel/unwind_guess.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/loongarch/kernel/unwind_guess.c')
-rw-r--r--arch/loongarch/kernel/unwind_guess.c11
1 files changed, 4 insertions, 7 deletions
diff --git a/arch/loongarch/kernel/unwind_guess.c b/arch/loongarch/kernel/unwind_guess.c
index 9ef5f2a47f88..e7e637bdba17 100644
--- a/arch/loongarch/kernel/unwind_guess.c
+++ b/arch/loongarch/kernel/unwind_guess.c
@@ -11,10 +11,8 @@ unsigned long unwind_get_return_address(struct unwind_state *state)
{
if (unwind_done(state))
return 0;
- else if (state->first)
- return state->pc;
- return *(unsigned long *)(state->sp);
+ return state->pc;
}
EXPORT_SYMBOL_GPL(unwind_get_return_address);
@@ -36,7 +34,7 @@ void unwind_start(struct unwind_state *state, struct task_struct *task,
state->task = task;
state->first = true;
-
+ state->pc = unwind_graph_addr(state, state->pc, state->sp);
get_stack_info(state->sp, state->task, &state->stack_info);
if (!unwind_done(state) && !__kernel_text_address(state->pc))
@@ -60,9 +58,8 @@ bool unwind_next_frame(struct unwind_state *state)
state->sp < info->end;
state->sp += sizeof(unsigned long)) {
addr = *(unsigned long *)(state->sp);
- state->pc = ftrace_graph_ret_addr(state->task, &state->graph_idx,
- addr, (unsigned long *)(state->sp - GRAPH_FAKE_OFFSET));
- if (__kernel_text_address(addr))
+ state->pc = unwind_graph_addr(state, addr, state->sp + 8);
+ if (__kernel_text_address(state->pc))
return true;
}