1 // SPDX-License-Identifier: GPL-2.0-only
3 * Stack trace management functions
5 * Copyright (C) 2009-2021 Helge Deller <deller@gmx.de>
6 * based on arch/x86/kernel/stacktrace.c by Ingo Molnar <mingo@redhat.com>
7 * and parisc unwind functions by Randolph Chung <tausq@debian.org>
9 * TODO: Userspace stacktrace (CONFIG_USER_STACKTRACE_SUPPORT)
11 #include <linux/kernel.h>
12 #include <linux/stacktrace.h>
14 #include <asm/unwind.h>
16 static void notrace
walk_stackframe(struct task_struct
*task
,
17 struct pt_regs
*regs
, bool (*fn
)(void *, unsigned long), void *cookie
)
19 struct unwind_frame_info info
;
21 unwind_frame_init_task(&info
, task
, NULL
);
23 if (unwind_once(&info
) < 0 || info
.ip
== 0)
26 if (__kernel_text_address(info
.ip
))
27 if (!fn(cookie
, info
.ip
))
32 void arch_stack_walk(stack_trace_consume_fn consume_entry
, void *cookie
,
33 struct task_struct
*task
, struct pt_regs
*regs
)
35 walk_stackframe(task
, regs
, consume_entry
, cookie
);
38 int arch_stack_walk_reliable(stack_trace_consume_fn consume_entry
, void *cookie
,
39 struct task_struct
*task
)
41 walk_stackframe(task
, NULL
, consume_entry
, cookie
);