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
:
42 static inline bool in_stack(unsigned long sp
, struct stack_info
*info
,
43 enum stack_type type
, unsigned long low
,
46 if (sp
< low
|| sp
>= high
)
54 static bool in_task_stack(unsigned long sp
, struct task_struct
*task
,
55 struct stack_info
*info
)
59 stack
= (unsigned long) task_stack_page(task
);
60 return in_stack(sp
, info
, STACK_TYPE_TASK
, stack
, stack
+ THREAD_SIZE
);
63 static bool in_irq_stack(unsigned long sp
, struct stack_info
*info
)
65 unsigned long frame_size
, top
;
67 frame_size
= STACK_FRAME_OVERHEAD
+ sizeof(struct pt_regs
);
68 top
= S390_lowcore
.async_stack
+ frame_size
;
69 return in_stack(sp
, info
, STACK_TYPE_IRQ
, top
- THREAD_SIZE
, top
);
72 static bool in_nodat_stack(unsigned long sp
, struct stack_info
*info
)
74 unsigned long frame_size
, top
;
76 frame_size
= STACK_FRAME_OVERHEAD
+ sizeof(struct pt_regs
);
77 top
= S390_lowcore
.nodat_stack
+ frame_size
;
78 return in_stack(sp
, info
, STACK_TYPE_NODAT
, top
- THREAD_SIZE
, top
);
81 static bool in_restart_stack(unsigned long sp
, struct stack_info
*info
)
83 unsigned long frame_size
, top
;
85 frame_size
= STACK_FRAME_OVERHEAD
+ sizeof(struct pt_regs
);
86 top
= S390_lowcore
.restart_stack
+ frame_size
;
87 return in_stack(sp
, info
, STACK_TYPE_RESTART
, top
- THREAD_SIZE
, top
);
90 int get_stack_info(unsigned long sp
, struct task_struct
*task
,
91 struct stack_info
*info
, unsigned long *visit_mask
)
96 task
= task
? : current
;
98 /* Check per-task stack */
99 if (in_task_stack(sp
, task
, info
))
100 goto recursion_check
;
105 /* Check per-cpu stacks */
106 if (!in_irq_stack(sp
, info
) &&
107 !in_nodat_stack(sp
, info
) &&
108 !in_restart_stack(sp
, info
))
113 * Make sure we don't iterate through any given stack more than once.
114 * If it comes up a second time then there's something wrong going on:
115 * just break out and report an unknown stack type.
117 if (*visit_mask
& (1UL << info
->type
)) {
118 printk_deferred_once(KERN_WARNING
119 "WARNING: stack recursion on stack type %d\n",
123 *visit_mask
|= 1UL << info
->type
;
126 info
->type
= STACK_TYPE_UNKNOWN
;
130 void show_stack(struct task_struct
*task
, unsigned long *stack
)
132 struct unwind_state state
;
134 printk("Call Trace:\n");
137 unwind_for_each_frame(&state
, task
, NULL
, (unsigned long) stack
)
138 printk(state
.reliable
? " [<%016lx>] %pSR \n" :
139 "([<%016lx>] %pSR)\n",
140 state
.ip
, (void *) state
.ip
);
141 debug_show_held_locks(task
? : current
);
144 static void show_last_breaking_event(struct pt_regs
*regs
)
146 printk("Last Breaking-Event-Address:\n");
147 printk(" [<%016lx>] %pSR\n", regs
->args
[0], (void *)regs
->args
[0]);
150 void show_registers(struct pt_regs
*regs
)
152 struct psw_bits
*psw
= &psw_bits(regs
->psw
);
155 mode
= user_mode(regs
) ? "User" : "Krnl";
156 printk("%s PSW : %px %px", mode
, (void *)regs
->psw
.mask
, (void *)regs
->psw
.addr
);
157 if (!user_mode(regs
))
158 pr_cont(" (%pSR)", (void *)regs
->psw
.addr
);
160 printk(" R:%x T:%x IO:%x EX:%x Key:%x M:%x W:%x "
161 "P:%x AS:%x CC:%x PM:%x", psw
->per
, psw
->dat
, psw
->io
, psw
->ext
,
162 psw
->key
, psw
->mcheck
, psw
->wait
, psw
->pstate
, psw
->as
, psw
->cc
, psw
->pm
);
163 pr_cont(" RI:%x EA:%x\n", psw
->ri
, psw
->eaba
);
164 printk("%s GPRS: %016lx %016lx %016lx %016lx\n", mode
,
165 regs
->gprs
[0], regs
->gprs
[1], regs
->gprs
[2], regs
->gprs
[3]);
166 printk(" %016lx %016lx %016lx %016lx\n",
167 regs
->gprs
[4], regs
->gprs
[5], regs
->gprs
[6], regs
->gprs
[7]);
168 printk(" %016lx %016lx %016lx %016lx\n",
169 regs
->gprs
[8], regs
->gprs
[9], regs
->gprs
[10], regs
->gprs
[11]);
170 printk(" %016lx %016lx %016lx %016lx\n",
171 regs
->gprs
[12], regs
->gprs
[13], regs
->gprs
[14], regs
->gprs
[15]);
175 void show_regs(struct pt_regs
*regs
)
177 show_regs_print_info(KERN_DEFAULT
);
178 show_registers(regs
);
179 /* Show stack backtrace if pt_regs is from kernel mode */
180 if (!user_mode(regs
))
181 show_stack(NULL
, (unsigned long *) regs
->gprs
[15]);
182 show_last_breaking_event(regs
);
185 static DEFINE_SPINLOCK(die_lock
);
187 void die(struct pt_regs
*regs
, const char *str
)
189 static int die_counter
;
195 spin_lock_irq(&die_lock
);
197 printk("%s: %04x ilc:%d [#%d] ", str
, regs
->int_code
& 0xffff,
198 regs
->int_code
>> 17, ++die_counter
);
199 #ifdef CONFIG_PREEMPT
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");