1 // SPDX-License-Identifier: GPL-2.0 2 /* 3 * Stack trace management functions 4 * 5 * Copyright IBM Corp. 2006 6 */ 7 8 #include <linux/perf_event.h> 9 #include <linux/stacktrace.h> 10 #include <linux/uaccess.h> 11 #include <linux/compat.h> 12 #include <asm/stacktrace.h> 13 #include <asm/unwind.h> 14 #include <asm/kprobes.h> 15 #include <asm/ptrace.h> 16 17 void arch_stack_walk(stack_trace_consume_fn consume_entry, void *cookie, 18 struct task_struct *task, struct pt_regs *regs) 19 { 20 struct unwind_state state; 21 unsigned long addr; 22 23 unwind_for_each_frame(&state, task, regs, 0) { 24 addr = unwind_get_return_address(&state); 25 if (!addr || !consume_entry(cookie, addr)) 26 break; 27 } 28 } 29 30 int arch_stack_walk_reliable(stack_trace_consume_fn consume_entry, 31 void *cookie, struct task_struct *task) 32 { 33 struct unwind_state state; 34 unsigned long addr; 35 36 unwind_for_each_frame(&state, task, NULL, 0) { 37 if (state.stack_info.type != STACK_TYPE_TASK) 38 return -EINVAL; 39 40 if (state.regs) 41 return -EINVAL; 42 43 addr = unwind_get_return_address(&state); 44 if (!addr) 45 return -EINVAL; 46 47 #ifdef CONFIG_RETHOOK 48 /* 49 * Mark stacktraces with krethook functions on them 50 * as unreliable. 51 */ 52 if (state.ip == (unsigned long)arch_rethook_trampoline) 53 return -EINVAL; 54 #endif 55 56 if (!consume_entry(cookie, addr)) 57 return -EINVAL; 58 } 59 60 /* Check for stack corruption */ 61 if (unwind_error(&state)) 62 return -EINVAL; 63 return 0; 64 } 65 66 static inline bool store_ip(stack_trace_consume_fn consume_entry, void *cookie, 67 struct perf_callchain_entry_ctx *entry, bool perf, 68 unsigned long ip) 69 { 70 #ifdef CONFIG_PERF_EVENTS 71 if (perf) { 72 if (perf_callchain_store(entry, ip)) 73 return false; 74 return true; 75 } 76 #endif 77 return consume_entry(cookie, ip); 78 } 79 80 void arch_stack_walk_user_common(stack_trace_consume_fn consume_entry, void *cookie, 81 struct perf_callchain_entry_ctx *entry, 82 const struct pt_regs *regs, bool perf) 83 { 84 struct stack_frame_user __user *sf; 85 unsigned long ip, sp; 86 bool first = true; 87 88 if (is_compat_task()) 89 return; 90 ip = instruction_pointer(regs); 91 if (!store_ip(consume_entry, cookie, entry, perf, ip)) 92 return; 93 sf = (void __user *)user_stack_pointer(regs); 94 pagefault_disable(); 95 while (1) { 96 if (__get_user(sp, &sf->back_chain)) 97 break; 98 if (__get_user(ip, &sf->gprs[8])) 99 break; 100 if (ip & 0x1) { 101 /* 102 * If the instruction address is invalid, and this 103 * is the first stack frame, assume r14 has not 104 * been written to the stack yet. Otherwise exit. 105 */ 106 if (first && !(regs->gprs[14] & 0x1)) 107 ip = regs->gprs[14]; 108 else 109 break; 110 } 111 if (!store_ip(consume_entry, cookie, entry, perf, ip)) 112 return; 113 /* Sanity check: ABI requires SP to be aligned 8 bytes. */ 114 if (!sp || sp & 0x7) 115 break; 116 sf = (void __user *)sp; 117 first = false; 118 } 119 pagefault_enable(); 120 } 121 122 void arch_stack_walk_user(stack_trace_consume_fn consume_entry, void *cookie, 123 const struct pt_regs *regs) 124 { 125 arch_stack_walk_user_common(consume_entry, cookie, NULL, regs, false); 126 } 127 128 unsigned long return_address(unsigned int n) 129 { 130 struct unwind_state state; 131 unsigned long addr; 132 133 /* Increment to skip current stack entry */ 134 n++; 135 136 unwind_for_each_frame(&state, NULL, NULL, 0) { 137 addr = unwind_get_return_address(&state); 138 if (!addr) 139 break; 140 if (!n--) 141 return addr; 142 } 143 return 0; 144 } 145 EXPORT_SYMBOL_GPL(return_address); 146