stacktrace.c (1295B)
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 13void 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 26int 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_KPROBES 44 /* 45 * Mark stacktraces with kretprobed functions on them 46 * as unreliable. 47 */ 48 if (state.ip == (unsigned long)__kretprobe_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}