4 * Copyright (C) 1991, 1992 Linus Torvalds
8 * This function is used through-out the kernel (including mm and fs)
9 * to indicate a major problem.
11 #include <linux/config.h>
12 #include <linux/sched.h>
13 #include <linux/delay.h>
14 #include <linux/reboot.h>
15 #include <linux/notifier.h>
16 #include <linux/init.h>
17 #include <linux/sysrq.h>
18 #include <linux/interrupt.h>
20 asmlinkage
void sys_sync(void); /* it's really int */
21 extern void unblank_console(void);
25 struct notifier_block
*panic_notifier_list
= NULL
;
27 static int __init
panic_setup(char *str
)
29 panic_timeout
= simple_strtoul(str
, NULL
, 0);
33 __setup("panic=", panic_setup
);
36 * panic - halt the system
37 * @fmt: The text string to print
39 * Display a message, then unblank the console and perform
40 * cleanups. Functions in the panic notifier list are called
41 * after the filesystem cache is flushed (when possible).
43 * This function never returns.
46 NORET_TYPE
void panic(const char * fmt
, ...)
48 static char buf
[1024];
50 #if defined(CONFIG_ARCH_S390)
51 unsigned long caller
= (unsigned long) __builtin_return_address(0);
55 vsprintf(buf
, fmt
, args
);
57 printk(KERN_EMERG
"Kernel panic: %s\n",buf
);
59 printk(KERN_EMERG
"In interrupt handler - not syncing\n");
60 else if (!current
->pid
)
61 printk(KERN_EMERG
"In idle task - not syncing\n");
71 notifier_call_chain(&panic_notifier_list
, 0, NULL
);
73 if (panic_timeout
> 0)
76 * Delay timeout seconds before rebooting the machine.
77 * We can't use the "normal" timers since we just panicked..
79 printk(KERN_EMERG
"Rebooting in %d seconds..",panic_timeout
);
80 mdelay(panic_timeout
*1000);
82 * Should we run the reboot notifier. For the moment Im
83 * choosing not too. It might crash, be corrupt or do
84 * more harm than good for other reasons.
86 machine_restart(NULL
);
90 extern int stop_a_enabled
;
91 /* Make sure the user can actually press L1-A */
93 printk("Press L1-A to return to the boot prom\n");
96 #if defined(CONFIG_ARCH_S390)
97 disabled_wait(caller
);