748f2edb52
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>
58 lines
1.0 KiB
C
58 lines
1.0 KiB
C
#ifndef _I386_KDEBUG_H
|
|
#define _I386_KDEBUG_H 1
|
|
|
|
/*
|
|
* Aug-05 2004 Ported by Prasanna S Panchamukhi <prasanna@in.ibm.com>
|
|
* from x86_64 architecture.
|
|
*/
|
|
#include <linux/notifier.h>
|
|
|
|
struct pt_regs;
|
|
|
|
struct die_args {
|
|
struct pt_regs *regs;
|
|
const char *str;
|
|
long err;
|
|
int trapnr;
|
|
int signr;
|
|
};
|
|
|
|
/* Note - you should never unregister because that can race with NMIs.
|
|
If you really want to do it first unregister - then synchronize_sched - then free.
|
|
*/
|
|
int register_die_notifier(struct notifier_block *nb);
|
|
extern struct notifier_block *i386die_chain;
|
|
|
|
|
|
/* Grossly misnamed. */
|
|
enum die_val {
|
|
DIE_OOPS = 1,
|
|
DIE_INT3,
|
|
DIE_DEBUG,
|
|
DIE_PANIC,
|
|
DIE_NMI,
|
|
DIE_DIE,
|
|
DIE_NMIWATCHDOG,
|
|
DIE_KERNELDEBUG,
|
|
DIE_TRAP,
|
|
DIE_GPF,
|
|
DIE_CALL,
|
|
DIE_NMI_IPI,
|
|
DIE_PAGE_FAULT,
|
|
};
|
|
|
|
static inline int notify_die(enum die_val val, const char *str,
|
|
struct pt_regs *regs, long err, int trap, int sig)
|
|
{
|
|
struct die_args args = {
|
|
.regs = regs,
|
|
.str = str,
|
|
.err = err,
|
|
.trapnr = trap,
|
|
.signr = sig
|
|
};
|
|
return notifier_call_chain(&i386die_chain, val, &args);
|
|
}
|
|
|
|
#endif
|