aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/kernel/traps.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/arm/kernel/traps.c')
-rw-r--r--arch/arm/kernel/traps.c22
1 files changed, 19 insertions, 3 deletions
diff --git a/arch/arm/kernel/traps.c b/arch/arm/kernel/traps.c
index 10ff36e4e414..237f4999b9a1 100644
--- a/arch/arm/kernel/traps.c
+++ b/arch/arm/kernel/traps.c
@@ -181,9 +181,7 @@ static void dump_backtrace(struct pt_regs *regs, struct task_struct *tsk)
181 181
182void dump_stack(void) 182void dump_stack(void)
183{ 183{
184#ifdef CONFIG_DEBUG_ERRORS
185 __backtrace(); 184 __backtrace();
186#endif
187} 185}
188 186
189EXPORT_SYMBOL(dump_stack); 187EXPORT_SYMBOL(dump_stack);
@@ -204,12 +202,24 @@ void show_stack(struct task_struct *tsk, unsigned long *sp)
204 barrier(); 202 barrier();
205} 203}
206 204
205#ifdef CONFIG_PREEMPT
206#define S_PREEMPT " PREEMPT"
207#else
208#define S_PREEMPT ""
209#endif
210#ifdef CONFIG_SMP
211#define S_SMP " SMP"
212#else
213#define S_SMP ""
214#endif
215
207static void __die(const char *str, int err, struct thread_info *thread, struct pt_regs *regs) 216static void __die(const char *str, int err, struct thread_info *thread, struct pt_regs *regs)
208{ 217{
209 struct task_struct *tsk = thread->task; 218 struct task_struct *tsk = thread->task;
210 static int die_counter; 219 static int die_counter;
211 220
212 printk("Internal error: %s: %x [#%d]\n", str, err, ++die_counter); 221 printk("Internal error: %s: %x [#%d]" S_PREEMPT S_SMP "\n",
222 str, err, ++die_counter);
213 print_modules(); 223 print_modules();
214 __show_regs(regs); 224 __show_regs(regs);
215 printk("Process %s (pid: %d, stack limit = 0x%p)\n", 225 printk("Process %s (pid: %d, stack limit = 0x%p)\n",
@@ -232,6 +242,8 @@ NORET_TYPE void die(const char *str, struct pt_regs *regs, int err)
232{ 242{
233 struct thread_info *thread = current_thread_info(); 243 struct thread_info *thread = current_thread_info();
234 244
245 oops_enter();
246
235 console_verbose(); 247 console_verbose();
236 spin_lock_irq(&die_lock); 248 spin_lock_irq(&die_lock);
237 bust_spinlocks(1); 249 bust_spinlocks(1);
@@ -239,9 +251,13 @@ NORET_TYPE void die(const char *str, struct pt_regs *regs, int err)
239 bust_spinlocks(0); 251 bust_spinlocks(0);
240 spin_unlock_irq(&die_lock); 252 spin_unlock_irq(&die_lock);
241 253
254 if (in_interrupt())
255 panic("Fatal exception in interrupt");
256
242 if (panic_on_oops) 257 if (panic_on_oops)
243 panic("Fatal exception"); 258 panic("Fatal exception");
244 259
260 oops_exit();
245 do_exit(SIGSEGV); 261 do_exit(SIGSEGV);
246} 262}
247 263