1
2
3
4
5
6
7#include <linux/kernel.h>
8#include <linux/buildid.h>
9#include <linux/export.h>
10#include <linux/sched.h>
11#include <linux/sched/debug.h>
12#include <linux/smp.h>
13#include <linux/atomic.h>
14#include <linux/kexec.h>
15#include <linux/utsname.h>
16#include <linux/stop_machine.h>
17
18static char dump_stack_arch_desc_str[128];
19
20
21
22
23
24
25
26
27
28
29
30void __init dump_stack_set_arch_desc(const char *fmt, ...)
31{
32 va_list args;
33
34 va_start(args, fmt);
35 vsnprintf(dump_stack_arch_desc_str, sizeof(dump_stack_arch_desc_str),
36 fmt, args);
37 va_end(args);
38}
39
40#if IS_ENABLED(CONFIG_STACKTRACE_BUILD_ID)
41#define BUILD_ID_FMT " %20phN"
42#define BUILD_ID_VAL vmlinux_build_id
43#else
44#define BUILD_ID_FMT "%s"
45#define BUILD_ID_VAL ""
46#endif
47
48
49
50
51
52
53
54
55void dump_stack_print_info(const char *log_lvl)
56{
57 printk("%sCPU: %d PID: %d Comm: %.20s %s%s %s %.*s" BUILD_ID_FMT "\n",
58 log_lvl, raw_smp_processor_id(), current->pid, current->comm,
59 kexec_crash_loaded() ? "Kdump: loaded " : "",
60 print_tainted(),
61 init_utsname()->release,
62 (int)strcspn(init_utsname()->version, " "),
63 init_utsname()->version, BUILD_ID_VAL);
64
65 if (dump_stack_arch_desc_str[0] != '\0')
66 printk("%sHardware name: %s\n",
67 log_lvl, dump_stack_arch_desc_str);
68
69 print_worker_info(log_lvl, current);
70 print_stop_info(log_lvl, current);
71}
72
73
74
75
76
77
78
79
80void show_regs_print_info(const char *log_lvl)
81{
82 dump_stack_print_info(log_lvl);
83}
84
85static void __dump_stack(const char *log_lvl)
86{
87 dump_stack_print_info(log_lvl);
88 show_stack(NULL, NULL, log_lvl);
89}
90
91
92
93
94
95
96asmlinkage __visible void dump_stack_lvl(const char *log_lvl)
97{
98 unsigned long flags;
99
100
101
102
103
104 printk_cpu_lock_irqsave(flags);
105 __dump_stack(log_lvl);
106 printk_cpu_unlock_irqrestore(flags);
107}
108EXPORT_SYMBOL(dump_stack_lvl);
109
110asmlinkage __visible void dump_stack(void)
111{
112 dump_stack_lvl(KERN_DEFAULT);
113}
114EXPORT_SYMBOL(dump_stack);
115