1 // SPDX-License-Identifier: GPL-2.0 2 /* 3 * Stack trace management functions 4 * 5 * Copyright IBM Corp. 2006 6 */ 7 8 #include <linux/stacktrace.h> 9 #include <asm/stacktrace.h> 10 #include <asm/unwind.h> 11 #include <asm/kprobes.h> 12 13 void arch_stack_walk(stack_trace_consume_fn consume_entry, void *cookie, 14 struct task_struct *task, struct pt_regs *regs) 15 { 16 struct unwind_state state; 17 unsigned long addr; 18 19 unwind_for_each_frame(&state, task, regs, 0) { 20 addr = unwind_get_return_address(&state); 21 if (!addr || !consume_entry(cookie, addr)) 22 break; 23 } 24 } 25 26 int arch_stack_walk_reliable(stack_trace_consume_fn consume_entry, 27 void *cookie, struct task_struct *task) 28 { 29 struct unwind_state state; 30 unsigned long addr; 31 32 unwind_for_each_frame(&state, task, NULL, 0) { 33 if (state.stack_info.type != STACK_TYPE_TASK) 34 return -EINVAL; 35 36 if (state.regs) 37 return -EINVAL; 38 39 addr = unwind_get_return_address(&state); 40 if (!addr) 41 return -EINVAL; 42 43 #ifdef CONFIG_RETHOOK 44 /* 45 * Mark stacktraces with krethook functions on them 46 * as unreliable. 47 */ 48 if (state.ip == (unsigned long)arch_rethook_trampoline) 49 return -EINVAL; 50 #endif 51 52 if (!consume_entry(cookie, addr)) 53 return -EINVAL; 54 } 55 56 /* Check for stack corruption */ 57 if (unwind_error(&state)) 58 return -EINVAL; 59 return 0; 60 } 61