~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/arch/sparc/kernel/stacktrace.c

Version: ~ [ linux-5.5-rc1 ] ~ [ linux-5.4.2 ] ~ [ linux-5.3.15 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.88 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.158 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.206 ] ~ [ linux-4.8.17 ] ~ [ linux-4.7.10 ] ~ [ linux-4.6.7 ] ~ [ linux-4.5.7 ] ~ [ linux-4.4.206 ] ~ [ linux-4.3.6 ] ~ [ linux-4.2.8 ] ~ [ linux-4.1.52 ] ~ [ linux-4.0.9 ] ~ [ linux-3.19.8 ] ~ [ linux-3.18.140 ] ~ [ linux-3.17.8 ] ~ [ linux-3.16.78 ] ~ [ linux-3.15.10 ] ~ [ linux-3.14.79 ] ~ [ linux-3.13.11 ] ~ [ linux-3.12.74 ] ~ [ linux-3.11.10 ] ~ [ linux-3.10.108 ] ~ [ linux-3.9.11 ] ~ [ linux-3.8.13 ] ~ [ linux-3.7.10 ] ~ [ linux-3.6.11 ] ~ [ linux-3.5.7 ] ~ [ linux-3.4.113 ] ~ [ linux-3.3.8 ] ~ [ linux-3.2.102 ] ~ [ linux-3.1.10 ] ~ [ linux-3.0.101 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.5 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 #include <linux/sched.h>
  2 #include <linux/sched/debug.h>
  3 #include <linux/stacktrace.h>
  4 #include <linux/thread_info.h>
  5 #include <linux/ftrace.h>
  6 #include <linux/export.h>
  7 #include <asm/ptrace.h>
  8 #include <asm/stacktrace.h>
  9 
 10 #include "kstack.h"
 11 
 12 static void __save_stack_trace(struct thread_info *tp,
 13                                struct stack_trace *trace,
 14                                bool skip_sched)
 15 {
 16         unsigned long ksp, fp;
 17 #ifdef CONFIG_FUNCTION_GRAPH_TRACER
 18         struct task_struct *t;
 19         int graph = 0;
 20 #endif
 21 
 22         if (tp == current_thread_info()) {
 23                 stack_trace_flush();
 24                 __asm__ __volatile__("mov %%fp, %0" : "=r" (ksp));
 25         } else {
 26                 ksp = tp->ksp;
 27         }
 28 
 29         fp = ksp + STACK_BIAS;
 30 #ifdef CONFIG_FUNCTION_GRAPH_TRACER
 31         t = tp->task;
 32 #endif
 33         do {
 34                 struct sparc_stackf *sf;
 35                 struct pt_regs *regs;
 36                 unsigned long pc;
 37 
 38                 if (!kstack_valid(tp, fp))
 39                         break;
 40 
 41                 sf = (struct sparc_stackf *) fp;
 42                 regs = (struct pt_regs *) (sf + 1);
 43 
 44                 if (kstack_is_trap_frame(tp, regs)) {
 45                         if (!(regs->tstate & TSTATE_PRIV))
 46                                 break;
 47                         pc = regs->tpc;
 48                         fp = regs->u_regs[UREG_I6] + STACK_BIAS;
 49                 } else {
 50                         pc = sf->callers_pc;
 51                         fp = (unsigned long)sf->fp + STACK_BIAS;
 52                 }
 53 
 54                 if (trace->skip > 0)
 55                         trace->skip--;
 56                 else if (!skip_sched || !in_sched_functions(pc)) {
 57                         trace->entries[trace->nr_entries++] = pc;
 58 #ifdef CONFIG_FUNCTION_GRAPH_TRACER
 59                         if ((pc + 8UL) == (unsigned long) &return_to_handler) {
 60                                 int index = t->curr_ret_stack;
 61                                 if (t->ret_stack && index >= graph) {
 62                                         pc = t->ret_stack[index - graph].ret;
 63                                         if (trace->nr_entries <
 64                                             trace->max_entries)
 65                                                 trace->entries[trace->nr_entries++] = pc;
 66                                         graph++;
 67                                 }
 68                         }
 69 #endif
 70                 }
 71         } while (trace->nr_entries < trace->max_entries);
 72 }
 73 
 74 void save_stack_trace(struct stack_trace *trace)
 75 {
 76         __save_stack_trace(current_thread_info(), trace, false);
 77 }
 78 EXPORT_SYMBOL_GPL(save_stack_trace);
 79 
 80 void save_stack_trace_tsk(struct task_struct *tsk, struct stack_trace *trace)
 81 {
 82         struct thread_info *tp = task_thread_info(tsk);
 83 
 84         __save_stack_trace(tp, trace, true);
 85 }
 86 EXPORT_SYMBOL_GPL(save_stack_trace_tsk);
 87 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | Wiki (Japanese) | Wiki (English) | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

osdn.jp