123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960 |
- // SPDX-License-Identifier: GPL-2.0
- /*
- * Stack trace management functions
- *
- * Copyright IBM Corp. 2006
- */
- #include <linux/stacktrace.h>
- #include <asm/stacktrace.h>
- #include <asm/unwind.h>
- #include <asm/kprobes.h>
- void arch_stack_walk(stack_trace_consume_fn consume_entry, void *cookie,
- struct task_struct *task, struct pt_regs *regs)
- {
- struct unwind_state state;
- unsigned long addr;
- unwind_for_each_frame(&state, task, regs, 0) {
- addr = unwind_get_return_address(&state);
- if (!addr || !consume_entry(cookie, addr))
- break;
- }
- }
- int arch_stack_walk_reliable(stack_trace_consume_fn consume_entry,
- void *cookie, struct task_struct *task)
- {
- struct unwind_state state;
- unsigned long addr;
- unwind_for_each_frame(&state, task, NULL, 0) {
- if (state.stack_info.type != STACK_TYPE_TASK)
- return -EINVAL;
- if (state.regs)
- return -EINVAL;
- addr = unwind_get_return_address(&state);
- if (!addr)
- return -EINVAL;
- #ifdef CONFIG_KPROBES
- /*
- * Mark stacktraces with kretprobed functions on them
- * as unreliable.
- */
- if (state.ip == (unsigned long)__kretprobe_trampoline)
- return -EINVAL;
- #endif
- if (!consume_entry(cookie, addr))
- return -EINVAL;
- }
- /* Check for stack corruption */
- if (unwind_error(&state))
- return -EINVAL;
- return 0;
- }
|