Loading kernel/panic.c +59 −52 Original line number Diff line number Diff line Loading @@ -8,19 +8,19 @@ * This function is used through-out the kernel (including mm and fs) * to indicate a major problem. */ #include <linux/debug_locks.h> #include <linux/interrupt.h> #include <linux/kallsyms.h> #include <linux/notifier.h> #include <linux/module.h> #include <linux/sched.h> #include <linux/delay.h> #include <linux/random.h> #include <linux/reboot.h> #include <linux/notifier.h> #include <linux/init.h> #include <linux/delay.h> #include <linux/kexec.h> #include <linux/sched.h> #include <linux/sysrq.h> #include <linux/interrupt.h> #include <linux/init.h> #include <linux/nmi.h> #include <linux/kexec.h> #include <linux/debug_locks.h> #include <linux/random.h> #include <linux/kallsyms.h> #include <linux/dmi.h> int panic_on_oops; Loading Loading @@ -52,19 +52,15 @@ EXPORT_SYMBOL(panic_blink); * * This function never returns. */ NORET_TYPE void panic(const char * fmt, ...) { long i; static char buf[1024]; va_list args; #if defined(CONFIG_S390) unsigned long caller = (unsigned long) __builtin_return_address(0); #endif long i; /* * It's possible to come here directly from a panic-assertion and not * have preempt disabled. Some functions called from here want * It's possible to come here directly from a panic-assertion and * not have preempt disabled. Some functions called from here want * preempt to be disabled. No point enabling it later though... */ preempt_disable(); Loading Loading @@ -100,16 +96,18 @@ NORET_TYPE void panic(const char * fmt, ...) if (panic_timeout > 0) { /* * Delay timeout seconds before rebooting the machine. * We can't use the "normal" timers since we just panicked.. * We can't use the "normal" timers since we just panicked. */ printk(KERN_EMERG "Rebooting in %d seconds..", panic_timeout); for (i = 0; i < panic_timeout*1000; ) { touch_nmi_watchdog(); i += panic_blink(i); mdelay(1); i++; } /* This will not be a clean reboot, with everything /* * This will not be a clean reboot, with everything * shutting down. But if there is a chance of * rebooting the system it will be rebooted. */ Loading @@ -124,7 +122,12 @@ NORET_TYPE void panic(const char * fmt, ...) } #endif #if defined(CONFIG_S390) { unsigned long caller; caller = (unsigned long)__builtin_return_address(0); disabled_wait(caller); } #endif local_irq_enable(); for (i = 0; ; ) { Loading Loading @@ -193,7 +196,8 @@ const char *print_tainted(void) *s = 0; } else snprintf(buf, sizeof(buf), "Not tainted"); return(buf); return buf; } int test_taint(unsigned flag) Loading @@ -209,7 +213,8 @@ unsigned long get_taint(void) void add_taint(unsigned flag) { debug_locks = 0; /* can't trust the integrity of the kernel anymore */ /* can't trust the integrity of the kernel anymore: */ debug_locks = 0; set_bit(flag, &tainted_mask); } EXPORT_SYMBOL(add_taint); Loading Loading @@ -264,8 +269,8 @@ static void do_oops_enter_exit(void) } /* * Return true if the calling CPU is allowed to print oops-related info. This * is a bit racy.. * Return true if the calling CPU is allowed to print oops-related info. * This is a bit racy.. */ int oops_may_print(void) { Loading @@ -274,20 +279,22 @@ int oops_may_print(void) /* * Called when the architecture enters its oops handler, before it prints * anything. If this is the first CPU to oops, and it's oopsing the first time * then let it proceed. * anything. If this is the first CPU to oops, and it's oopsing the first * time then let it proceed. * * This is all enabled by the pause_on_oops kernel boot option. We do all this * to ensure that oopses don't scroll off the screen. It has the side-effect * of preventing later-oopsing CPUs from mucking up the display, too. * This is all enabled by the pause_on_oops kernel boot option. We do all * this to ensure that oopses don't scroll off the screen. It has the * side-effect of preventing later-oopsing CPUs from mucking up the display, * too. * * It turns out that the CPU which is allowed to print ends up pausing for the * right duration, whereas all the other CPUs pause for twice as long: once in * oops_enter(), once in oops_exit(). * It turns out that the CPU which is allowed to print ends up pausing for * the right duration, whereas all the other CPUs pause for twice as long: * once in oops_enter(), once in oops_exit(). */ void oops_enter(void) { debug_locks_off(); /* can't trust the integrity of the kernel anymore */ /* can't trust the integrity of the kernel anymore: */ debug_locks_off(); do_oops_enter_exit(); } Loading Loading
kernel/panic.c +59 −52 Original line number Diff line number Diff line Loading @@ -8,19 +8,19 @@ * This function is used through-out the kernel (including mm and fs) * to indicate a major problem. */ #include <linux/debug_locks.h> #include <linux/interrupt.h> #include <linux/kallsyms.h> #include <linux/notifier.h> #include <linux/module.h> #include <linux/sched.h> #include <linux/delay.h> #include <linux/random.h> #include <linux/reboot.h> #include <linux/notifier.h> #include <linux/init.h> #include <linux/delay.h> #include <linux/kexec.h> #include <linux/sched.h> #include <linux/sysrq.h> #include <linux/interrupt.h> #include <linux/init.h> #include <linux/nmi.h> #include <linux/kexec.h> #include <linux/debug_locks.h> #include <linux/random.h> #include <linux/kallsyms.h> #include <linux/dmi.h> int panic_on_oops; Loading Loading @@ -52,19 +52,15 @@ EXPORT_SYMBOL(panic_blink); * * This function never returns. */ NORET_TYPE void panic(const char * fmt, ...) { long i; static char buf[1024]; va_list args; #if defined(CONFIG_S390) unsigned long caller = (unsigned long) __builtin_return_address(0); #endif long i; /* * It's possible to come here directly from a panic-assertion and not * have preempt disabled. Some functions called from here want * It's possible to come here directly from a panic-assertion and * not have preempt disabled. Some functions called from here want * preempt to be disabled. No point enabling it later though... */ preempt_disable(); Loading Loading @@ -100,16 +96,18 @@ NORET_TYPE void panic(const char * fmt, ...) if (panic_timeout > 0) { /* * Delay timeout seconds before rebooting the machine. * We can't use the "normal" timers since we just panicked.. * We can't use the "normal" timers since we just panicked. */ printk(KERN_EMERG "Rebooting in %d seconds..", panic_timeout); for (i = 0; i < panic_timeout*1000; ) { touch_nmi_watchdog(); i += panic_blink(i); mdelay(1); i++; } /* This will not be a clean reboot, with everything /* * This will not be a clean reboot, with everything * shutting down. But if there is a chance of * rebooting the system it will be rebooted. */ Loading @@ -124,7 +122,12 @@ NORET_TYPE void panic(const char * fmt, ...) } #endif #if defined(CONFIG_S390) { unsigned long caller; caller = (unsigned long)__builtin_return_address(0); disabled_wait(caller); } #endif local_irq_enable(); for (i = 0; ; ) { Loading Loading @@ -193,7 +196,8 @@ const char *print_tainted(void) *s = 0; } else snprintf(buf, sizeof(buf), "Not tainted"); return(buf); return buf; } int test_taint(unsigned flag) Loading @@ -209,7 +213,8 @@ unsigned long get_taint(void) void add_taint(unsigned flag) { debug_locks = 0; /* can't trust the integrity of the kernel anymore */ /* can't trust the integrity of the kernel anymore: */ debug_locks = 0; set_bit(flag, &tainted_mask); } EXPORT_SYMBOL(add_taint); Loading Loading @@ -264,8 +269,8 @@ static void do_oops_enter_exit(void) } /* * Return true if the calling CPU is allowed to print oops-related info. This * is a bit racy.. * Return true if the calling CPU is allowed to print oops-related info. * This is a bit racy.. */ int oops_may_print(void) { Loading @@ -274,20 +279,22 @@ int oops_may_print(void) /* * Called when the architecture enters its oops handler, before it prints * anything. If this is the first CPU to oops, and it's oopsing the first time * then let it proceed. * anything. If this is the first CPU to oops, and it's oopsing the first * time then let it proceed. * * This is all enabled by the pause_on_oops kernel boot option. We do all this * to ensure that oopses don't scroll off the screen. It has the side-effect * of preventing later-oopsing CPUs from mucking up the display, too. * This is all enabled by the pause_on_oops kernel boot option. We do all * this to ensure that oopses don't scroll off the screen. It has the * side-effect of preventing later-oopsing CPUs from mucking up the display, * too. * * It turns out that the CPU which is allowed to print ends up pausing for the * right duration, whereas all the other CPUs pause for twice as long: once in * oops_enter(), once in oops_exit(). * It turns out that the CPU which is allowed to print ends up pausing for * the right duration, whereas all the other CPUs pause for twice as long: * once in oops_enter(), once in oops_exit(). */ void oops_enter(void) { debug_locks_off(); /* can't trust the integrity of the kernel anymore */ /* can't trust the integrity of the kernel anymore: */ debug_locks_off(); do_oops_enter_exit(); } Loading