diff options
author | Russell King <rmk@dyn-67.arm.linux.org.uk> | 2007-06-17 08:38:27 -0400 |
---|---|---|
committer | Russell King <rmk+kernel@arm.linux.org.uk> | 2007-06-17 08:40:39 -0400 |
commit | d9202429e60d16d39c427cd4e4408cf1827ab9e9 (patch) | |
tree | 2b080c06880cca1881b506b9436b01129b768724 /arch/arm/kernel/traps.c | |
parent | 188e1f81ba31af1b65a2f3611df4c670b092bbac (diff) |
[ARM] Add support for pause_on_oops and display preempt/smp options
Add calls to oops_enter() and oops_exit() to __die(), so that
things like lockdep know when an oops occurs.
Add suffixes to the oops report to indicate whether the running
kernel has been built with preempt or smp support.
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
Diffstat (limited to 'arch/arm/kernel/traps.c')
-rw-r--r-- | arch/arm/kernel/traps.c | 20 |
1 files changed, 19 insertions, 1 deletions
diff --git a/arch/arm/kernel/traps.c b/arch/arm/kernel/traps.c index 10ff36e4e414..1b68d365d0e1 100644 --- a/arch/arm/kernel/traps.c +++ b/arch/arm/kernel/traps.c | |||
@@ -204,12 +204,24 @@ void show_stack(struct task_struct *tsk, unsigned long *sp) | |||
204 | barrier(); | 204 | barrier(); |
205 | } | 205 | } |
206 | 206 | ||
207 | #ifdef CONFIG_PREEMPT | ||
208 | #define S_PREEMPT " PREEMPT" | ||
209 | #else | ||
210 | #define S_PREEMPT "" | ||
211 | #endif | ||
212 | #ifdef CONFIG_SMP | ||
213 | #define S_SMP " SMP" | ||
214 | #else | ||
215 | #define S_SMP "" | ||
216 | #endif | ||
217 | |||
207 | static void __die(const char *str, int err, struct thread_info *thread, struct pt_regs *regs) | 218 | static void __die(const char *str, int err, struct thread_info *thread, struct pt_regs *regs) |
208 | { | 219 | { |
209 | struct task_struct *tsk = thread->task; | 220 | struct task_struct *tsk = thread->task; |
210 | static int die_counter; | 221 | static int die_counter; |
211 | 222 | ||
212 | printk("Internal error: %s: %x [#%d]\n", str, err, ++die_counter); | 223 | printk("Internal error: %s: %x [#%d]" S_PREEMPT S_SMP "\n", |
224 | str, err, ++die_counter); | ||
213 | print_modules(); | 225 | print_modules(); |
214 | __show_regs(regs); | 226 | __show_regs(regs); |
215 | printk("Process %s (pid: %d, stack limit = 0x%p)\n", | 227 | printk("Process %s (pid: %d, stack limit = 0x%p)\n", |
@@ -232,6 +244,8 @@ NORET_TYPE void die(const char *str, struct pt_regs *regs, int err) | |||
232 | { | 244 | { |
233 | struct thread_info *thread = current_thread_info(); | 245 | struct thread_info *thread = current_thread_info(); |
234 | 246 | ||
247 | oops_enter(); | ||
248 | |||
235 | console_verbose(); | 249 | console_verbose(); |
236 | spin_lock_irq(&die_lock); | 250 | spin_lock_irq(&die_lock); |
237 | bust_spinlocks(1); | 251 | bust_spinlocks(1); |
@@ -239,9 +253,13 @@ NORET_TYPE void die(const char *str, struct pt_regs *regs, int err) | |||
239 | bust_spinlocks(0); | 253 | bust_spinlocks(0); |
240 | spin_unlock_irq(&die_lock); | 254 | spin_unlock_irq(&die_lock); |
241 | 255 | ||
256 | if (in_interrupt()) | ||
257 | panic("Fatal exception in interrupt"); | ||
258 | |||
242 | if (panic_on_oops) | 259 | if (panic_on_oops) |
243 | panic("Fatal exception"); | 260 | panic("Fatal exception"); |
244 | 261 | ||
262 | oops_exit(); | ||
245 | do_exit(SIGSEGV); | 263 | do_exit(SIGSEGV); |
246 | } | 264 | } |
247 | 265 | ||