1/* 2 * linux/kernel/panic.c 3 * 4 * Copyright (C) 1991, 1992 Linus Torvalds 5 */ 6 7/* 8 * This function is used through-out the kernel (including mm and fs) 9 * to indicate a major problem. 10 */ 11#include <linux/module.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> 19#include <linux/nmi.h> 20#include <linux/kexec.h> 21#include <linux/debug_locks.h> 22 23int panic_on_oops; 24int tainted; 25static int pause_on_oops; 26static int pause_on_oops_flag; 27static DEFINE_SPINLOCK(pause_on_oops_lock); 28 29int panic_timeout; 30 31ATOMIC_NOTIFIER_HEAD(panic_notifier_list); 32 33EXPORT_SYMBOL(panic_notifier_list); 34 35static int __init panic_setup(char *str) 36{ 37 panic_timeout = simple_strtoul(str, NULL, 0); 38 return 1; 39} 40__setup("panic=", panic_setup); 41 42static long no_blink(long time) 43{ 44 return 0; 45} 46 47/* Returns how long it waited in ms */ 48long (*panic_blink)(long time); 49EXPORT_SYMBOL(panic_blink); 50 51#ifdef CONFIG_CRASHLOG 52void nvram_store_crash(void); 53#endif 54 55/** 56 * panic - halt the system 57 * @fmt: The text string to print 58 * 59 * Display a message, then perform cleanups. 60 * 61 * This function never returns. 62 */ 63 64NORET_TYPE void panic(const char * fmt, ...) 65{ 66 long i; 67 static char buf[1024]; 68 va_list args; 69#if defined(CONFIG_S390) 70 unsigned long caller = (unsigned long) __builtin_return_address(0); 71#endif 72 73 /* 74 * It's possible to come here directly from a panic-assertion and not 75 * have preempt disabled. Some functions called from here want 76 * preempt to be disabled. No point enabling it later though... 77 */ 78 preempt_disable(); 79 80 bust_spinlocks(1); 81 va_start(args, fmt); 82 vsnprintf(buf, sizeof(buf), fmt, args); 83 va_end(args); 84 printk(KERN_EMERG "Kernel panic - not syncing: %s\n",buf); 85 bust_spinlocks(0); 86 87#ifdef CONFIG_CRASHLOG 88 nvram_store_crash(); 89#endif 90 /* 91 * If we have crashed and we have a crash kernel loaded let it handle 92 * everything else. 93 * Do we want to call this before we try to display a message? 94 */ 95 crash_kexec(NULL); 96 97#ifdef CONFIG_SMP 98 /* 99 * Note smp_send_stop is the usual smp shutdown function, which 100 * unfortunately means it may not be hardened to work in a panic 101 * situation. 102 */ 103 smp_send_stop(); 104#endif 105 106 atomic_notifier_call_chain(&panic_notifier_list, 0, buf); 107 108 if (!panic_blink) 109 panic_blink = no_blink; 110 111 if (panic_timeout > 0) { 112 /* 113 * Delay timeout seconds before rebooting the machine. 114 * We can't use the "normal" timers since we just panicked.. 115 */ 116 printk(KERN_EMERG "Rebooting in %d seconds..",panic_timeout); 117 for (i = 0; i < panic_timeout*1000; ) { 118 touch_nmi_watchdog(); 119 i += panic_blink(i); 120 mdelay(1); 121 i++; 122 } 123 /* This will not be a clean reboot, with everything 124 * shutting down. But if there is a chance of 125 * rebooting the system it will be rebooted. 126 */ 127 emergency_restart(); 128 } 129#ifdef __sparc__ 130 { 131 extern int stop_a_enabled; 132 /* Make sure the user can actually press Stop-A (L1-A) */ 133 stop_a_enabled = 1; 134 printk(KERN_EMERG "Press Stop-A (L1-A) to return to the boot prom\n"); 135 } 136#endif 137#if defined(CONFIG_S390) 138 disabled_wait(caller); 139#endif 140 local_irq_enable(); 141 for (i = 0;;) { 142 touch_softlockup_watchdog(); 143 i += panic_blink(i); 144 mdelay(1); 145 i++; 146 } 147} 148 149EXPORT_SYMBOL(panic); 150 151/** 152 * print_tainted - return a string to represent the kernel taint state. 153 * 154 * 'P' - Proprietary module has been loaded. 155 * 'F' - Module has been forcibly loaded. 156 * 'S' - SMP with CPUs not designed for SMP. 157 * 'R' - User forced a module unload. 158 * 'M' - Machine had a machine check experience. 159 * 'B' - System has hit bad_page. 160 * 'U' - Userspace-defined naughtiness. 161 * 162 * The string is overwritten by the next call to print_taint(). 163 */ 164 165const char *print_tainted(void) 166{ 167 static char buf[20]; 168 if (tainted) { 169 snprintf(buf, sizeof(buf), "Tainted: %c%c%c%c%c%c%c", 170 tainted & TAINT_PROPRIETARY_MODULE ? 'P' : 'G', 171 tainted & TAINT_FORCED_MODULE ? 'F' : ' ', 172 tainted & TAINT_UNSAFE_SMP ? 'S' : ' ', 173 tainted & TAINT_FORCED_RMMOD ? 'R' : ' ', 174 tainted & TAINT_MACHINE_CHECK ? 'M' : ' ', 175 tainted & TAINT_BAD_PAGE ? 'B' : ' ', 176 tainted & TAINT_USER ? 'U' : ' '); 177 } 178 else 179 snprintf(buf, sizeof(buf), "Not tainted"); 180 return(buf); 181} 182 183void add_taint(unsigned flag) 184{ 185 debug_locks = 0; /* can't trust the integrity of the kernel anymore */ 186 tainted |= flag; 187} 188EXPORT_SYMBOL(add_taint); 189 190static int __init pause_on_oops_setup(char *str) 191{ 192 pause_on_oops = simple_strtoul(str, NULL, 0); 193 return 1; 194} 195__setup("pause_on_oops=", pause_on_oops_setup); 196 197static void spin_msec(int msecs) 198{ 199 int i; 200 201 for (i = 0; i < msecs; i++) { 202 touch_nmi_watchdog(); 203 mdelay(1); 204 } 205} 206 207/* 208 * It just happens that oops_enter() and oops_exit() are identically 209 * implemented... 210 */ 211static void do_oops_enter_exit(void) 212{ 213 unsigned long flags; 214 static int spin_counter; 215 216 if (!pause_on_oops) 217 return; 218 219 spin_lock_irqsave(&pause_on_oops_lock, flags); 220 if (pause_on_oops_flag == 0) { 221 /* This CPU may now print the oops message */ 222 pause_on_oops_flag = 1; 223 } else { 224 /* We need to stall this CPU */ 225 if (!spin_counter) { 226 /* This CPU gets to do the counting */ 227 spin_counter = pause_on_oops; 228 do { 229 spin_unlock(&pause_on_oops_lock); 230 spin_msec(MSEC_PER_SEC); 231 spin_lock(&pause_on_oops_lock); 232 } while (--spin_counter); 233 pause_on_oops_flag = 0; 234 } else { 235 /* This CPU waits for a different one */ 236 while (spin_counter) { 237 spin_unlock(&pause_on_oops_lock); 238 spin_msec(1); 239 spin_lock(&pause_on_oops_lock); 240 } 241 } 242 } 243 spin_unlock_irqrestore(&pause_on_oops_lock, flags); 244} 245 246/* 247 * Return true if the calling CPU is allowed to print oops-related info. This 248 * is a bit racy.. 249 */ 250int oops_may_print(void) 251{ 252 return pause_on_oops_flag == 0; 253} 254 255/* 256 * Called when the architecture enters its oops handler, before it prints 257 * anything. If this is the first CPU to oops, and it's oopsing the first time 258 * then let it proceed. 259 * 260 * This is all enabled by the pause_on_oops kernel boot option. We do all this 261 * to ensure that oopses don't scroll off the screen. It has the side-effect 262 * of preventing later-oopsing CPUs from mucking up the display, too. 263 * 264 * It turns out that the CPU which is allowed to print ends up pausing for the 265 * right duration, whereas all the other CPUs pause for twice as long: once in 266 * oops_enter(), once in oops_exit(). 267 */ 268void oops_enter(void) 269{ 270 debug_locks_off(); /* can't trust the integrity of the kernel anymore */ 271 do_oops_enter_exit(); 272} 273 274/* 275 * Called when the architecture exits its oops handler, after printing 276 * everything. 277 */ 278void oops_exit(void) 279{ 280 do_oops_enter_exit(); 281} 282 283#ifdef CONFIG_CC_STACKPROTECTOR 284/* 285 * Called when gcc's -fstack-protector feature is used, and 286 * gcc detects corruption of the on-stack canary value 287 */ 288void __stack_chk_fail(void) 289{ 290 panic("stack-protector: Kernel stack is corrupted"); 291} 292EXPORT_SYMBOL(__stack_chk_fail); 293#endif 294