diff options
Diffstat (limited to 'arch/i386/kernel/traps.c')
| -rw-r--r-- | arch/i386/kernel/traps.c | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/arch/i386/kernel/traps.c b/arch/i386/kernel/traps.c index 207ea8ba7169..e458463ebc05 100644 --- a/arch/i386/kernel/traps.c +++ b/arch/i386/kernel/traps.c | |||
| @@ -27,6 +27,7 @@ | |||
| 27 | #include <linux/ptrace.h> | 27 | #include <linux/ptrace.h> |
| 28 | #include <linux/utsname.h> | 28 | #include <linux/utsname.h> |
| 29 | #include <linux/kprobes.h> | 29 | #include <linux/kprobes.h> |
| 30 | #include <linux/kexec.h> | ||
| 30 | 31 | ||
| 31 | #ifdef CONFIG_EISA | 32 | #ifdef CONFIG_EISA |
| 32 | #include <linux/ioport.h> | 33 | #include <linux/ioport.h> |
| @@ -294,6 +295,9 @@ bug: | |||
| 294 | printk("Kernel BUG\n"); | 295 | printk("Kernel BUG\n"); |
| 295 | } | 296 | } |
| 296 | 297 | ||
| 298 | /* This is gone through when something in the kernel | ||
| 299 | * has done something bad and is about to be terminated. | ||
| 300 | */ | ||
| 297 | void die(const char * str, struct pt_regs * regs, long err) | 301 | void die(const char * str, struct pt_regs * regs, long err) |
| 298 | { | 302 | { |
| 299 | static struct { | 303 | static struct { |
| @@ -341,6 +345,10 @@ void die(const char * str, struct pt_regs * regs, long err) | |||
| 341 | bust_spinlocks(0); | 345 | bust_spinlocks(0); |
| 342 | die.lock_owner = -1; | 346 | die.lock_owner = -1; |
| 343 | spin_unlock_irq(&die.lock); | 347 | spin_unlock_irq(&die.lock); |
| 348 | |||
| 349 | if (kexec_should_crash(current)) | ||
| 350 | crash_kexec(regs); | ||
| 351 | |||
| 344 | if (in_interrupt()) | 352 | if (in_interrupt()) |
| 345 | panic("Fatal exception in interrupt"); | 353 | panic("Fatal exception in interrupt"); |
| 346 | 354 | ||
| @@ -570,6 +578,15 @@ void die_nmi (struct pt_regs *regs, const char *msg) | |||
| 570 | console_silent(); | 578 | console_silent(); |
| 571 | spin_unlock(&nmi_print_lock); | 579 | spin_unlock(&nmi_print_lock); |
| 572 | bust_spinlocks(0); | 580 | bust_spinlocks(0); |
| 581 | |||
| 582 | /* If we are in kernel we are probably nested up pretty bad | ||
| 583 | * and might aswell get out now while we still can. | ||
| 584 | */ | ||
| 585 | if (!user_mode(regs)) { | ||
| 586 | current->thread.trap_no = 2; | ||
| 587 | crash_kexec(regs); | ||
| 588 | } | ||
| 589 | |||
| 573 | do_exit(SIGSEGV); | 590 | do_exit(SIGSEGV); |
| 574 | } | 591 | } |
| 575 | 592 | ||
