1 /* 1 2 * Stack trace utility for OpenRISC 3 * 4 * Copyright (C) 2017 Stafford Horne <shorne@g 5 * 6 * This file is licensed under the terms of th 7 * version 2. This program is licensed "as is 8 * kind, whether express or implied. 9 * 10 * Losely based on work from sh and powerpc. 11 */ 12 13 #include <linux/export.h> 14 #include <linux/sched.h> 15 #include <linux/sched/debug.h> 16 #include <linux/sched/task_stack.h> 17 #include <linux/stacktrace.h> 18 19 #include <asm/processor.h> 20 #include <asm/unwinder.h> 21 22 /* 23 * Save stack-backtrace addresses into a stack 24 */ 25 static void 26 save_stack_address(void *data, unsigned long a 27 { 28 struct stack_trace *trace = data; 29 30 if (!reliable) 31 return; 32 33 if (trace->skip > 0) { 34 trace->skip--; 35 return; 36 } 37 38 if (trace->nr_entries < trace->max_ent 39 trace->entries[trace->nr_entri 40 } 41 42 void save_stack_trace(struct stack_trace *trac 43 { 44 unwind_stack(trace, (unsigned long *) 45 } 46 EXPORT_SYMBOL_GPL(save_stack_trace); 47 48 static void 49 save_stack_address_nosched(void *data, unsigne 50 { 51 struct stack_trace *trace = (struct st 52 53 if (!reliable) 54 return; 55 56 if (in_sched_functions(addr)) 57 return; 58 59 if (trace->skip > 0) { 60 trace->skip--; 61 return; 62 } 63 64 if (trace->nr_entries < trace->max_ent 65 trace->entries[trace->nr_entri 66 } 67 68 void save_stack_trace_tsk(struct task_struct * 69 { 70 unsigned long *sp = NULL; 71 72 if (!try_get_task_stack(tsk)) 73 return; 74 75 if (tsk == current) 76 sp = (unsigned long *) &sp; 77 else { 78 unsigned long ksp; 79 80 /* Locate stack from kernel co 81 ksp = task_thread_info(tsk)->k 82 ksp += STACK_FRAME_OVERHEAD; 83 ksp += sizeof(struct pt_regs); 84 85 sp = (unsigned long *) ksp; 86 } 87 88 unwind_stack(trace, sp, save_stack_add 89 90 put_task_stack(tsk); 91 } 92 EXPORT_SYMBOL_GPL(save_stack_trace_tsk); 93 94 void 95 save_stack_trace_regs(struct pt_regs *regs, st 96 { 97 unwind_stack(trace, (unsigned long *) 98 save_stack_address_nosche 99 } 100 EXPORT_SYMBOL_GPL(save_stack_trace_regs); 101
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.