1 // SPDX-License-Identifier: GPL-2.0
3 * Stack dumping functions
5 * Copyright IBM Corp. 1999, 2013
8 #include <linux/kallsyms.h>
9 #include <linux/hardirq.h>
10 #include <linux/kprobes.h>
11 #include <linux/utsname.h>
12 #include <linux/export.h>
13 #include <linux/kdebug.h>
14 #include <linux/ptrace.h>
16 #include <linux/module.h>
17 #include <linux/sched.h>
18 #include <linux/sched/debug.h>
19 #include <linux/sched/task_stack.h>
20 #include <asm/processor.h>
21 #include <asm/debug.h>
24 #include <asm/unwind.h>
26 const char *stack_type_name(enum stack_type type
)
33 case STACK_TYPE_NODAT
:
35 case STACK_TYPE_RESTART
:
41 EXPORT_SYMBOL_GPL(stack_type_name
);
43 static inline bool in_stack(unsigned long sp
, struct stack_info
*info
,
44 enum stack_type type
, unsigned long low
,
47 if (sp
< low
|| sp
>= high
)
55 static bool in_task_stack(unsigned long sp
, struct task_struct
*task
,
56 struct stack_info
*info
)
60 stack
= (unsigned long) task_stack_page(task
);
61 return in_stack(sp
, info
, STACK_TYPE_TASK
, stack
, stack
+ THREAD_SIZE
);
64 static bool in_irq_stack(unsigned long sp
, struct stack_info
*info
)
66 unsigned long frame_size
, top
;
68 frame_size
= STACK_FRAME_OVERHEAD
+ sizeof(struct pt_regs
);
69 top
= S390_lowcore
.async_stack
+ frame_size
;
70 return in_stack(sp
, info
, STACK_TYPE_IRQ
, top
- THREAD_SIZE
, top
);
73 static bool in_nodat_stack(unsigned long sp
, struct stack_info
*info
)
75 unsigned long frame_size
, top
;
77 frame_size
= STACK_FRAME_OVERHEAD
+ sizeof(struct pt_regs
);
78 top
= S390_lowcore
.nodat_stack
+ frame_size
;
79 return in_stack(sp
, info
, STACK_TYPE_NODAT
, top
- THREAD_SIZE
, top
);
82 static bool in_restart_stack(unsigned long sp
, struct stack_info
*info
)
84 unsigned long frame_size
, top
;
86 frame_size
= STACK_FRAME_OVERHEAD
+ sizeof(struct pt_regs
);
87 top
= S390_lowcore
.restart_stack
+ frame_size
;
88 return in_stack(sp
, info
, STACK_TYPE_RESTART
, top
- THREAD_SIZE
, top
);
91 int get_stack_info(unsigned long sp
, struct task_struct
*task
,
92 struct stack_info
*info
, unsigned long *visit_mask
)
97 /* Sanity check: ABI requires SP to be aligned 8 bytes. */
101 /* Check per-task stack */
102 if (in_task_stack(sp
, task
, info
))
103 goto recursion_check
;
108 /* Check per-cpu stacks */
109 if (!in_irq_stack(sp
, info
) &&
110 !in_nodat_stack(sp
, info
) &&
111 !in_restart_stack(sp
, info
))
116 * Make sure we don't iterate through any given stack more than once.
117 * If it comes up a second time then there's something wrong going on:
118 * just break out and report an unknown stack type.
120 if (*visit_mask
& (1UL << info
->type
))
122 *visit_mask
|= 1UL << info
->type
;
125 info
->type
= STACK_TYPE_UNKNOWN
;
129 void show_stack(struct task_struct
*task
, unsigned long *stack
,
132 struct unwind_state state
;
134 printk("%sCall Trace:\n", loglvl
);
135 unwind_for_each_frame(&state
, task
, NULL
, (unsigned long) stack
)
136 printk(state
.reliable
? "%s [<%016lx>] %pSR \n" :
137 "%s([<%016lx>] %pSR)\n",
138 loglvl
, state
.ip
, (void *) state
.ip
);
139 debug_show_held_locks(task
? : current
);
142 static void show_last_breaking_event(struct pt_regs
*regs
)
144 printk("Last Breaking-Event-Address:\n");
145 printk(" [<%016lx>] %pSR\n", regs
->args
[0], (void *)regs
->args
[0]);
148 void show_registers(struct pt_regs
*regs
)
150 struct psw_bits
*psw
= &psw_bits(regs
->psw
);
153 mode
= user_mode(regs
) ? "User" : "Krnl";
154 printk("%s PSW : %px %px", mode
, (void *)regs
->psw
.mask
, (void *)regs
->psw
.addr
);
155 if (!user_mode(regs
))
156 pr_cont(" (%pSR)", (void *)regs
->psw
.addr
);
158 printk(" R:%x T:%x IO:%x EX:%x Key:%x M:%x W:%x "
159 "P:%x AS:%x CC:%x PM:%x", psw
->per
, psw
->dat
, psw
->io
, psw
->ext
,
160 psw
->key
, psw
->mcheck
, psw
->wait
, psw
->pstate
, psw
->as
, psw
->cc
, psw
->pm
);
161 pr_cont(" RI:%x EA:%x\n", psw
->ri
, psw
->eaba
);
162 printk("%s GPRS: %016lx %016lx %016lx %016lx\n", mode
,
163 regs
->gprs
[0], regs
->gprs
[1], regs
->gprs
[2], regs
->gprs
[3]);
164 printk(" %016lx %016lx %016lx %016lx\n",
165 regs
->gprs
[4], regs
->gprs
[5], regs
->gprs
[6], regs
->gprs
[7]);
166 printk(" %016lx %016lx %016lx %016lx\n",
167 regs
->gprs
[8], regs
->gprs
[9], regs
->gprs
[10], regs
->gprs
[11]);
168 printk(" %016lx %016lx %016lx %016lx\n",
169 regs
->gprs
[12], regs
->gprs
[13], regs
->gprs
[14], regs
->gprs
[15]);
173 void show_regs(struct pt_regs
*regs
)
175 show_regs_print_info(KERN_DEFAULT
);
176 show_registers(regs
);
177 /* Show stack backtrace if pt_regs is from kernel mode */
178 if (!user_mode(regs
))
179 show_stack(NULL
, (unsigned long *) regs
->gprs
[15], KERN_DEFAULT
);
180 show_last_breaking_event(regs
);
183 static DEFINE_SPINLOCK(die_lock
);
185 void die(struct pt_regs
*regs
, const char *str
)
187 static int die_counter
;
193 spin_lock_irq(&die_lock
);
195 printk("%s: %04x ilc:%d [#%d] ", str
, regs
->int_code
& 0xffff,
196 regs
->int_code
>> 17, ++die_counter
);
197 #ifdef CONFIG_PREEMPT
199 #elif defined(CONFIG_PREEMPT_RT)
200 pr_cont("PREEMPT_RT ");
203 if (debug_pagealloc_enabled())
204 pr_cont("DEBUG_PAGEALLOC");
206 notify_die(DIE_OOPS
, str
, regs
, 0, regs
->int_code
& 0xffff, SIGSEGV
);
210 add_taint(TAINT_DIE
, LOCKDEP_NOW_UNRELIABLE
);
211 spin_unlock_irq(&die_lock
);
213 panic("Fatal exception in interrupt");
215 panic("Fatal exception: panic_on_oops");