aboutsummaryrefslogtreecommitdiffstats
path: root/arch/i386/kernel
diff options
context:
space:
mode:
authorGeorge Anzinger <george@mvista.com>2005-09-03 18:56:48 -0400
committerLinus Torvalds <torvalds@evo.osdl.org>2005-09-05 03:06:13 -0400
commit748f2edb52712aa3d926470a888608dc500d17e8 (patch)
tree9fb37795934642e11bad0d747d1271df393a993d /arch/i386/kernel
parentf2f30ebca6c0c95e987cb9a1fd1495770a75432e (diff)
[PATCH] x86 NMI: better support for debuggers
This patch adds a notify to the die_nmi notify that the system is about to be taken down. If the notify is handled with a NOTIFY_STOP return, the system is given a new lease on life. We also change the nmi watchdog to carry on if die_nmi returns. This give debug code a chance to a) catch watchdog timeouts and b) possibly allow the system to continue, realizing that the time out may be due to debugger activities such as single stepping which is usually done with "other" cpus held. Signed-off-by: George Anzinger<george@mvista.com> Cc: Keith Owens <kaos@ocs.com.au> Signed-off-by: George Anzinger <george@mvista.com> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'arch/i386/kernel')
-rw-r--r--arch/i386/kernel/nmi.c5
-rw-r--r--arch/i386/kernel/traps.c4
2 files changed, 8 insertions, 1 deletions
diff --git a/arch/i386/kernel/nmi.c b/arch/i386/kernel/nmi.c
index 8c242bb1ef45..8bbdbda07a2d 100644
--- a/arch/i386/kernel/nmi.c
+++ b/arch/i386/kernel/nmi.c
@@ -501,8 +501,11 @@ void nmi_watchdog_tick (struct pt_regs * regs)
501 */ 501 */
502 alert_counter[cpu]++; 502 alert_counter[cpu]++;
503 if (alert_counter[cpu] == 5*nmi_hz) 503 if (alert_counter[cpu] == 5*nmi_hz)
504 /*
505 * die_nmi will return ONLY if NOTIFY_STOP happens..
506 */
504 die_nmi(regs, "NMI Watchdog detected LOCKUP"); 507 die_nmi(regs, "NMI Watchdog detected LOCKUP");
505 } else { 508
506 last_irq_sums[cpu] = sum; 509 last_irq_sums[cpu] = sum;
507 alert_counter[cpu] = 0; 510 alert_counter[cpu] = 0;
508 } 511 }
diff --git a/arch/i386/kernel/traps.c b/arch/i386/kernel/traps.c
index b2b4bb890bb7..54629bb5893a 100644
--- a/arch/i386/kernel/traps.c
+++ b/arch/i386/kernel/traps.c
@@ -565,6 +565,10 @@ static DEFINE_SPINLOCK(nmi_print_lock);
565 565
566void die_nmi (struct pt_regs *regs, const char *msg) 566void die_nmi (struct pt_regs *regs, const char *msg)
567{ 567{
568 if (notify_die(DIE_NMIWATCHDOG, msg, regs, 0, 0, SIGINT) ==
569 NOTIFY_STOP)
570 return;
571
568 spin_lock(&nmi_print_lock); 572 spin_lock(&nmi_print_lock);
569 /* 573 /*
570 * We are in trouble anyway, lets at least try 574 * We are in trouble anyway, lets at least try