MOXA linux-2.6.x / linux-2.6.9-uc0 from sdlinux-moxaart.tgz
[linux-2.6.9-moxart.git] / kernel / panic.c
blobb3abe97f88a69588b7b00d61a56b24ed18dcf6de
1 /*
2 * linux/kernel/panic.c
4 * Copyright (C) 1991, 1992 Linus Torvalds
5 */
7 /*
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/module.h>
13 #include <linux/sched.h>
14 #include <linux/delay.h>
15 #include <linux/reboot.h>
16 #include <linux/notifier.h>
17 #include <linux/init.h>
18 #include <linux/sysrq.h>
19 #include <linux/syscalls.h>
20 #include <linux/interrupt.h>
21 #include <linux/nmi.h>
23 int panic_timeout;
24 int panic_on_oops;
25 int tainted;
27 EXPORT_SYMBOL(panic_timeout);
29 struct notifier_block *panic_notifier_list;
31 EXPORT_SYMBOL(panic_notifier_list);
33 static int __init panic_setup(char *str)
35 panic_timeout = simple_strtoul(str, NULL, 0);
36 return 1;
38 __setup("panic=", panic_setup);
40 /**
41 * panic - halt the system
42 * @fmt: The text string to print
44 * Display a message, then perform cleanups. Functions in the panic
45 * notifier list are called after the filesystem cache is flushed (when possible).
47 * This function never returns.
50 NORET_TYPE void panic(const char * fmt, ...)
52 static char buf[1024];
53 va_list args;
54 #if defined(CONFIG_ARCH_S390)
55 unsigned long caller = (unsigned long) __builtin_return_address(0);
56 #endif
58 bust_spinlocks(1);
59 va_start(args, fmt);
60 vsnprintf(buf, sizeof(buf), fmt, args);
61 va_end(args);
62 printk(KERN_EMERG "Kernel panic - not syncing: %s\n",buf);
63 bust_spinlocks(0);
65 #ifdef CONFIG_SMP
66 smp_send_stop();
67 #endif
69 notifier_call_chain(&panic_notifier_list, 0, buf);
71 if (panic_timeout > 0)
73 int i;
75 * Delay timeout seconds before rebooting the machine.
76 * We can't use the "normal" timers since we just panicked..
78 printk(KERN_EMERG "Rebooting in %d seconds..",panic_timeout);
79 for (i = 0; i < panic_timeout; i++) {
80 touch_nmi_watchdog();
81 mdelay(1000);
84 * Should we run the reboot notifier. For the moment Im
85 * choosing not too. It might crash, be corrupt or do
86 * more harm than good for other reasons.
88 machine_restart(NULL);
90 #ifdef __sparc__
92 extern int stop_a_enabled;
93 /* Make sure the user can actually press L1-A */
94 stop_a_enabled = 1;
95 printk(KERN_EMERG "Press L1-A to return to the boot prom\n");
97 #endif
98 #if defined(CONFIG_ARCH_S390)
99 disabled_wait(caller);
100 #endif
101 local_irq_enable();
102 for (;;)
106 EXPORT_SYMBOL(panic);
109 * print_tainted - return a string to represent the kernel taint state.
111 * 'P' - Proprietary module has been loaded.
112 * 'F' - Module has been forcibly loaded.
113 * 'S' - SMP with CPUs not designed for SMP.
115 * The string is overwritten by the next call to print_taint().
118 const char *print_tainted(void)
120 static char buf[20];
121 if (tainted) {
122 snprintf(buf, sizeof(buf), "Tainted: %c%c%c",
123 tainted & TAINT_PROPRIETARY_MODULE ? 'P' : 'G',
124 tainted & TAINT_FORCED_MODULE ? 'F' : ' ',
125 tainted & TAINT_UNSAFE_SMP ? 'S' : ' ');
127 else
128 snprintf(buf, sizeof(buf), "Not tainted");
129 return(buf);