mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-29 10:01:25 +00:00
sparc64: Fix stack dumping and tracing when function graph is enabled.
Like x86, when the function graph tracer is enabled, emit the ftrace stub as well as the program counter it will be transformed back into. We duplicate a lot of similar stack walking logic in 3 or 4 spots, so eventually we should consolidate things like x86 does. Thanks to Frederic Weisbecker for pointing this out. Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
87e8f0e3e6
commit
667f0cee3e
3 changed files with 50 additions and 1 deletions
|
@ -1,6 +1,7 @@
|
|||
#include <linux/sched.h>
|
||||
#include <linux/stacktrace.h>
|
||||
#include <linux/thread_info.h>
|
||||
#include <linux/ftrace.h>
|
||||
#include <linux/module.h>
|
||||
#include <asm/ptrace.h>
|
||||
#include <asm/stacktrace.h>
|
||||
|
@ -12,6 +13,10 @@ static void __save_stack_trace(struct thread_info *tp,
|
|||
bool skip_sched)
|
||||
{
|
||||
unsigned long ksp, fp;
|
||||
#ifdef CONFIG_FUNCTION_GRAPH_TRACER
|
||||
struct task_struct *t;
|
||||
int graph = 0;
|
||||
#endif
|
||||
|
||||
if (tp == current_thread_info()) {
|
||||
stack_trace_flush();
|
||||
|
@ -21,6 +26,9 @@ static void __save_stack_trace(struct thread_info *tp,
|
|||
}
|
||||
|
||||
fp = ksp + STACK_BIAS;
|
||||
#ifdef CONFIG_FUNCTION_GRAPH_TRACER
|
||||
t = tp->task;
|
||||
#endif
|
||||
do {
|
||||
struct sparc_stackf *sf;
|
||||
struct pt_regs *regs;
|
||||
|
@ -44,8 +52,21 @@ static void __save_stack_trace(struct thread_info *tp,
|
|||
|
||||
if (trace->skip > 0)
|
||||
trace->skip--;
|
||||
else if (!skip_sched || !in_sched_functions(pc))
|
||||
else if (!skip_sched || !in_sched_functions(pc)) {
|
||||
trace->entries[trace->nr_entries++] = pc;
|
||||
#ifdef CONFIG_FUNCTION_GRAPH_TRACER
|
||||
if ((pc + 8UL) == (unsigned long) &return_to_handler) {
|
||||
int index = t->curr_ret_stack;
|
||||
if (t->ret_stack && index >= graph) {
|
||||
pc = t->ret_stack[index - graph].ret;
|
||||
if (trace->nr_entries <
|
||||
trace->max_entries)
|
||||
trace->entries[trace->nr_entries++] = pc;
|
||||
graph++;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
} while (trace->nr_entries < trace->max_entries);
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue