diff options
Diffstat (limited to 'arch/arm/kernel/traps.c')
-rw-r--r-- | arch/arm/kernel/traps.c | 22 |
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 | ||
182 | void dump_stack(void) | 182 | void dump_stack(void) |
183 | { | 183 | { |
184 | #ifdef CONFIG_DEBUG_ERRORS | ||
185 | __backtrace(); | 184 | __backtrace(); |
186 | #endif | ||
187 | } | 185 | } |
188 | 186 | ||
189 | EXPORT_SYMBOL(dump_stack); | 187 | EXPORT_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 | |||
207 | static void __die(const char *str, int err, struct thread_info *thread, struct pt_regs *regs) | 216 | static 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 | ||