#include <linux/sysrq.h>
#include <linux/interrupt.h>
#include <linux/nmi.h>
-#ifdef CONFIG_KEXEC
#include <linux/kexec.h>
-#endif
+#include <linux/crash_dump.h>
int panic_timeout = 900;
int panic_on_oops = 1;
int tainted;
-void (*dump_function_ptr)(const char *, const struct pt_regs *) = 0;
+unsigned int crashed;
+int crash_dump_on;
EXPORT_SYMBOL(panic_timeout);
-EXPORT_SYMBOL(dump_function_ptr);
struct notifier_block *panic_notifier_list;
* panic - halt the system
* @fmt: The text string to print
*
- * Display a message, then perform cleanups. Functions in the panic
- * notifier list are called after the filesystem cache is flushed (when possible).
+ * Display a message, then perform cleanups.
*
* This function never returns.
*/
vsnprintf(buf, sizeof(buf), fmt, args);
va_end(args);
printk(KERN_EMERG "Kernel panic - not syncing: %s\n",buf);
+ dump_stack();
if (crashdump_func())
BUG();
bust_spinlocks(0);
- notifier_call_chain(&panic_notifier_list, 0, buf);
-
+ /* If we have crashed, perform a kexec reboot, for dump write-out */
+ crash_machine_kexec();
+
#ifdef CONFIG_SMP
smp_send_stop();
#endif
* We can't use the "normal" timers since we just panicked..
*/
printk(KERN_EMERG "Rebooting in %d seconds..",panic_timeout);
-#ifdef CONFIG_KEXEC
- {
- struct kimage *image;
- image = xchg(&kexec_image, 0);
- if (image) {
- printk(KERN_EMERG "by starting a new kernel ..\n");
- mdelay(panic_timeout*1000);
- machine_kexec(image);
- }
- }
-#endif
for (i = 0; i < panic_timeout*1000; ) {
touch_nmi_watchdog();
i += panic_blink(i);
#ifdef __sparc__
{
extern int stop_a_enabled;
- /* Make sure the user can actually press L1-A */
+ /* Make sure the user can actually press Stop-A (L1-A) */
stop_a_enabled = 1;
- printk(KERN_EMERG "Press L1-A to return to the boot prom\n");
+ printk(KERN_EMERG "Press Stop-A (L1-A) to return to the boot prom\n");
}
#endif
#if defined(CONFIG_ARCH_S390)
snprintf(buf, sizeof(buf), "Not tainted");
return(buf);
}
+EXPORT_SYMBOL(print_tainted);
void add_taint(unsigned flag)
{
tainted |= flag;
}
EXPORT_SYMBOL(add_taint);
+
+int check_tainted(void)
+{
+ return tainted;
+}
+EXPORT_SYMBOL_GPL(check_tainted);
+