Merge branch 'ras-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git...
[sfrench/cifs-2.6.git] / arch / x86 / kernel / dumpstack_32.c
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  *  Copyright (C) 1991, 1992  Linus Torvalds
4  *  Copyright (C) 2000, 2001, 2002 Andi Kleen, SuSE Labs
5  */
6 #include <linux/sched/debug.h>
7 #include <linux/kallsyms.h>
8 #include <linux/kprobes.h>
9 #include <linux/uaccess.h>
10 #include <linux/hardirq.h>
11 #include <linux/kdebug.h>
12 #include <linux/export.h>
13 #include <linux/ptrace.h>
14 #include <linux/kexec.h>
15 #include <linux/sysfs.h>
16 #include <linux/bug.h>
17 #include <linux/nmi.h>
18
19 #include <asm/stacktrace.h>
20
21 const char *stack_type_name(enum stack_type type)
22 {
23         if (type == STACK_TYPE_IRQ)
24                 return "IRQ";
25
26         if (type == STACK_TYPE_SOFTIRQ)
27                 return "SOFTIRQ";
28
29         if (type == STACK_TYPE_ENTRY)
30                 return "ENTRY_TRAMPOLINE";
31
32         return NULL;
33 }
34
35 static bool in_hardirq_stack(unsigned long *stack, struct stack_info *info)
36 {
37         unsigned long *begin = (unsigned long *)this_cpu_read(hardirq_stack);
38         unsigned long *end   = begin + (THREAD_SIZE / sizeof(long));
39
40         /*
41          * This is a software stack, so 'end' can be a valid stack pointer.
42          * It just means the stack is empty.
43          */
44         if (stack <= begin || stack > end)
45                 return false;
46
47         info->type      = STACK_TYPE_IRQ;
48         info->begin     = begin;
49         info->end       = end;
50
51         /*
52          * See irq_32.c -- the next stack pointer is stored at the beginning of
53          * the stack.
54          */
55         info->next_sp   = (unsigned long *)*begin;
56
57         return true;
58 }
59
60 static bool in_softirq_stack(unsigned long *stack, struct stack_info *info)
61 {
62         unsigned long *begin = (unsigned long *)this_cpu_read(softirq_stack);
63         unsigned long *end   = begin + (THREAD_SIZE / sizeof(long));
64
65         /*
66          * This is a software stack, so 'end' can be a valid stack pointer.
67          * It just means the stack is empty.
68          */
69         if (stack <= begin || stack > end)
70                 return false;
71
72         info->type      = STACK_TYPE_SOFTIRQ;
73         info->begin     = begin;
74         info->end       = end;
75
76         /*
77          * The next stack pointer is stored at the beginning of the stack.
78          * See irq_32.c.
79          */
80         info->next_sp   = (unsigned long *)*begin;
81
82         return true;
83 }
84
85 int get_stack_info(unsigned long *stack, struct task_struct *task,
86                    struct stack_info *info, unsigned long *visit_mask)
87 {
88         if (!stack)
89                 goto unknown;
90
91         task = task ? : current;
92
93         if (in_task_stack(stack, task, info))
94                 goto recursion_check;
95
96         if (task != current)
97                 goto unknown;
98
99         if (in_entry_stack(stack, info))
100                 goto recursion_check;
101
102         if (in_hardirq_stack(stack, info))
103                 goto recursion_check;
104
105         if (in_softirq_stack(stack, info))
106                 goto recursion_check;
107
108         goto unknown;
109
110 recursion_check:
111         /*
112          * Make sure we don't iterate through any given stack more than once.
113          * If it comes up a second time then there's something wrong going on:
114          * just break out and report an unknown stack type.
115          */
116         if (visit_mask) {
117                 if (*visit_mask & (1UL << info->type)) {
118                         printk_deferred_once(KERN_WARNING "WARNING: stack recursion on stack type %d\n", info->type);
119                         goto unknown;
120                 }
121                 *visit_mask |= 1UL << info->type;
122         }
123
124         return 0;
125
126 unknown:
127         info->type = STACK_TYPE_UNKNOWN;
128         return -EINVAL;
129 }
130
131 void show_regs(struct pt_regs *regs)
132 {
133         int i;
134
135         show_regs_print_info(KERN_EMERG);
136         __show_regs(regs, !user_mode(regs));
137
138         /*
139          * When in-kernel, we also print out the stack and code at the
140          * time of the fault..
141          */
142         if (!user_mode(regs)) {
143                 unsigned int code_prologue = code_bytes * 43 / 64;
144                 unsigned int code_len = code_bytes;
145                 unsigned char c;
146                 u8 *ip;
147
148                 show_trace_log_lvl(current, regs, NULL, KERN_EMERG);
149
150                 pr_emerg("Code:");
151
152                 ip = (u8 *)regs->ip - code_prologue;
153                 if (ip < (u8 *)PAGE_OFFSET || probe_kernel_address(ip, c)) {
154                         /* try starting at IP */
155                         ip = (u8 *)regs->ip;
156                         code_len = code_len - code_prologue + 1;
157                 }
158                 for (i = 0; i < code_len; i++, ip++) {
159                         if (ip < (u8 *)PAGE_OFFSET ||
160                                         probe_kernel_address(ip, c)) {
161                                 pr_cont("  Bad EIP value.");
162                                 break;
163                         }
164                         if (ip == (u8 *)regs->ip)
165                                 pr_cont(" <%02x>", c);
166                         else
167                                 pr_cont(" %02x", c);
168                 }
169         }
170         pr_cont("\n");
171 }