[PATCH] Disable a.out for AMD64
[linux-2.6/history.git] / kernel / printk.c
blob830b690f96928890a944790037cda5f4f641196a
1 /*
2 * linux/kernel/printk.c
4 * Copyright (C) 1991, 1992 Linus Torvalds
6 * Modified to make sys_syslog() more flexible: added commands to
7 * return the last 4k of kernel messages, regardless of whether
8 * they've been read or not. Added option to suppress kernel printk's
9 * to the console. Added hook for sending the console messages
10 * elsewhere, in preparation for a serial line console (someday).
11 * Ted Ts'o, 2/11/93.
12 * Modified for sysctl support, 1/8/97, Chris Horn.
13 * Fixed SMP synchronization, 08/08/99, Manfred Spraul
14 * manfreds@colorfullife.com
15 * Rewrote bits to get rid of console_lock
16 * 01Mar01 Andrew Morton <andrewm@uow.edu.au>
19 #include <linux/kernel.h>
20 #include <linux/mm.h>
21 #include <linux/tty.h>
22 #include <linux/tty_driver.h>
23 #include <linux/smp_lock.h>
24 #include <linux/console.h>
25 #include <linux/init.h>
26 #include <linux/module.h>
27 #include <linux/interrupt.h> /* For in_interrupt() */
28 #include <linux/config.h>
29 #include <linux/delay.h>
30 #include <linux/smp.h>
31 #include <linux/security.h>
33 #include <asm/uaccess.h>
35 #define LOG_BUF_LEN (1 << CONFIG_LOG_BUF_SHIFT)
36 #define LOG_BUF_MASK (LOG_BUF_LEN-1)
38 /* printk's without a loglevel use this.. */
39 #define DEFAULT_MESSAGE_LOGLEVEL 4 /* KERN_WARNING */
41 /* We show everything that is MORE important than this.. */
42 #define MINIMUM_CONSOLE_LOGLEVEL 1 /* Minimum loglevel we let people use */
43 #define DEFAULT_CONSOLE_LOGLEVEL 7 /* anything MORE serious than KERN_DEBUG */
45 DECLARE_WAIT_QUEUE_HEAD(log_wait);
47 int console_printk[4] = {
48 DEFAULT_CONSOLE_LOGLEVEL, /* console_loglevel */
49 DEFAULT_MESSAGE_LOGLEVEL, /* default_message_loglevel */
50 MINIMUM_CONSOLE_LOGLEVEL, /* minimum_console_loglevel */
51 DEFAULT_CONSOLE_LOGLEVEL, /* default_console_loglevel */
54 int oops_in_progress;
57 * console_sem protects the console_drivers list, and also
58 * provides serialisation for access to the entire console
59 * driver system.
61 static DECLARE_MUTEX(console_sem);
62 struct console *console_drivers;
65 * logbuf_lock protects log_buf, log_start, log_end, con_start and logged_chars
66 * It is also used in interesting ways to provide interlocking in
67 * release_console_sem().
69 static spinlock_t logbuf_lock = SPIN_LOCK_UNLOCKED;
71 static char log_buf[LOG_BUF_LEN];
72 #define LOG_BUF(idx) (log_buf[(idx) & LOG_BUF_MASK])
75 * The indices into log_buf are not constrained to LOG_BUF_LEN - they
76 * must be masked before subscripting
78 static unsigned long log_start; /* Index into log_buf: next char to be read by syslog() */
79 static unsigned long con_start; /* Index into log_buf: next char to be sent to consoles */
80 static unsigned long log_end; /* Index into log_buf: most-recently-written-char + 1 */
81 static unsigned long logged_chars; /* Number of chars produced since last read+clear operation */
83 struct console_cmdline console_cmdline[MAX_CMDLINECONSOLES];
84 static int preferred_console = -1;
86 /* Flag: console code may call schedule() */
87 static int console_may_schedule;
90 * Setup a list of consoles. Called from init/main.c
92 static int __init console_setup(char *str)
94 struct console_cmdline *c;
95 char name[sizeof(c->name)];
96 char *s, *options;
97 int i, idx;
100 * Decode str into name, index, options.
102 if (str[0] >= '0' && str[0] <= '9') {
103 strcpy(name, "ttyS");
104 strncpy(name + 4, str, sizeof(name) - 5);
105 } else
106 strncpy(name, str, sizeof(name) - 1);
107 name[sizeof(name) - 1] = 0;
108 if ((options = strchr(str, ',')) != NULL)
109 *(options++) = 0;
110 #ifdef __sparc__
111 if (!strcmp(str, "ttya"))
112 strcpy(name, "ttyS0");
113 if (!strcmp(str, "ttyb"))
114 strcpy(name, "ttyS1");
115 #endif
116 for(s = name; *s; s++)
117 if (*s >= '0' && *s <= '9')
118 break;
119 idx = simple_strtoul(s, NULL, 10);
120 *s = 0;
123 * See if this tty is not yet registered, and
124 * if we have a slot free.
126 for(i = 0; i < MAX_CMDLINECONSOLES && console_cmdline[i].name[0]; i++)
127 if (strcmp(console_cmdline[i].name, name) == 0 &&
128 console_cmdline[i].index == idx) {
129 preferred_console = i;
130 return 1;
132 if (i == MAX_CMDLINECONSOLES)
133 return 1;
134 preferred_console = i;
135 c = &console_cmdline[i];
136 memcpy(c->name, name, sizeof(c->name));
137 c->options = options;
138 c->index = idx;
139 return 1;
142 __setup("console=", console_setup);
145 * Commands to do_syslog:
147 * 0 -- Close the log. Currently a NOP.
148 * 1 -- Open the log. Currently a NOP.
149 * 2 -- Read from the log.
150 * 3 -- Read all messages remaining in the ring buffer.
151 * 4 -- Read and clear all messages remaining in the ring buffer
152 * 5 -- Clear ring buffer.
153 * 6 -- Disable printk's to console
154 * 7 -- Enable printk's to console
155 * 8 -- Set level of messages printed to console
156 * 9 -- Return number of unread characters in the log buffer
158 int do_syslog(int type, char __user * buf, int len)
160 unsigned long i, j, limit, count;
161 int do_clear = 0;
162 char c;
163 int error = 0;
165 error = security_syslog(type);
166 if (error)
167 return error;
169 switch (type) {
170 case 0: /* Close log */
171 break;
172 case 1: /* Open log */
173 break;
174 case 2: /* Read from log */
175 error = -EINVAL;
176 if (!buf || len < 0)
177 goto out;
178 error = 0;
179 if (!len)
180 goto out;
181 error = verify_area(VERIFY_WRITE,buf,len);
182 if (error)
183 goto out;
184 error = wait_event_interruptible(log_wait, (log_start - log_end));
185 if (error)
186 goto out;
187 i = 0;
188 spin_lock_irq(&logbuf_lock);
189 while (!error && (log_start != log_end) && i < len) {
190 c = LOG_BUF(log_start);
191 log_start++;
192 spin_unlock_irq(&logbuf_lock);
193 error = __put_user(c,buf);
194 buf++;
195 i++;
196 spin_lock_irq(&logbuf_lock);
198 spin_unlock_irq(&logbuf_lock);
199 if (!error)
200 error = i;
201 break;
202 case 4: /* Read/clear last kernel messages */
203 do_clear = 1;
204 /* FALL THRU */
205 case 3: /* Read last kernel messages */
206 error = -EINVAL;
207 if (!buf || len < 0)
208 goto out;
209 error = 0;
210 if (!len)
211 goto out;
212 error = verify_area(VERIFY_WRITE,buf,len);
213 if (error)
214 goto out;
215 count = len;
216 if (count > LOG_BUF_LEN)
217 count = LOG_BUF_LEN;
218 spin_lock_irq(&logbuf_lock);
219 if (count > logged_chars)
220 count = logged_chars;
221 if (do_clear)
222 logged_chars = 0;
223 limit = log_end;
225 * __put_user() could sleep, and while we sleep
226 * printk() could overwrite the messages
227 * we try to copy to user space. Therefore
228 * the messages are copied in reverse. <manfreds>
230 for(i = 0; i < count && !error; i++) {
231 j = limit-1-i;
232 if (j+LOG_BUF_LEN < log_end)
233 break;
234 c = LOG_BUF(j);
235 spin_unlock_irq(&logbuf_lock);
236 error = __put_user(c,&buf[count-1-i]);
237 spin_lock_irq(&logbuf_lock);
239 spin_unlock_irq(&logbuf_lock);
240 if (error)
241 break;
242 error = i;
243 if(i != count) {
244 int offset = count-error;
245 /* buffer overflow during copy, correct user buffer. */
246 for(i=0;i<error;i++) {
247 if (__get_user(c,&buf[i+offset]) ||
248 __put_user(c,&buf[i])) {
249 error = -EFAULT;
250 break;
254 break;
255 case 5: /* Clear ring buffer */
256 logged_chars = 0;
257 break;
258 case 6: /* Disable logging to console */
259 console_loglevel = minimum_console_loglevel;
260 break;
261 case 7: /* Enable logging to console */
262 console_loglevel = default_console_loglevel;
263 break;
264 case 8: /* Set level of messages printed to console */
265 error = -EINVAL;
266 if (len < 1 || len > 8)
267 goto out;
268 if (len < minimum_console_loglevel)
269 len = minimum_console_loglevel;
270 console_loglevel = len;
271 error = 0;
272 break;
273 case 9: /* Number of chars in the log buffer */
274 error = log_end - log_start;
275 break;
276 default:
277 error = -EINVAL;
278 break;
280 out:
281 return error;
284 asmlinkage long sys_syslog(int type, char __user * buf, int len)
286 return do_syslog(type, buf, len);
290 * Call the console drivers on a range of log_buf
292 static void __call_console_drivers(unsigned long start, unsigned long end)
294 struct console *con;
296 for (con = console_drivers; con; con = con->next) {
297 if ((con->flags & CON_ENABLED) && con->write)
298 con->write(con, &LOG_BUF(start), end - start);
303 * Write out chars from start to end - 1 inclusive
305 static void _call_console_drivers(unsigned long start, unsigned long end, int msg_log_level)
307 if (msg_log_level < console_loglevel && console_drivers && start != end) {
308 if ((start & LOG_BUF_MASK) > (end & LOG_BUF_MASK)) {
309 /* wrapped write */
310 __call_console_drivers(start & LOG_BUF_MASK, LOG_BUF_LEN);
311 __call_console_drivers(0, end & LOG_BUF_MASK);
312 } else {
313 __call_console_drivers(start, end);
319 * Call the console drivers, asking them to write out
320 * log_buf[start] to log_buf[end - 1].
321 * The console_sem must be held.
323 static void call_console_drivers(unsigned long start, unsigned long end)
325 unsigned long cur_index, start_print;
326 static int msg_level = -1;
328 if (((long)(start - end)) > 0)
329 BUG();
331 cur_index = start;
332 start_print = start;
333 while (cur_index != end) {
334 if ( msg_level < 0 &&
335 ((end - cur_index) > 2) &&
336 LOG_BUF(cur_index + 0) == '<' &&
337 LOG_BUF(cur_index + 1) >= '0' &&
338 LOG_BUF(cur_index + 1) <= '7' &&
339 LOG_BUF(cur_index + 2) == '>')
341 msg_level = LOG_BUF(cur_index + 1) - '0';
342 cur_index += 3;
343 start_print = cur_index;
345 while (cur_index != end) {
346 char c = LOG_BUF(cur_index);
347 cur_index++;
349 if (c == '\n') {
350 if (msg_level < 0) {
352 * printk() has already given us loglevel tags in
353 * the buffer. This code is here in case the
354 * log buffer has wrapped right round and scribbled
355 * on those tags
357 msg_level = default_message_loglevel;
359 _call_console_drivers(start_print, cur_index, msg_level);
360 msg_level = -1;
361 start_print = cur_index;
362 break;
366 _call_console_drivers(start_print, end, msg_level);
369 static void emit_log_char(char c)
371 LOG_BUF(log_end) = c;
372 log_end++;
373 if (log_end - log_start > LOG_BUF_LEN)
374 log_start = log_end - LOG_BUF_LEN;
375 if (log_end - con_start > LOG_BUF_LEN)
376 con_start = log_end - LOG_BUF_LEN;
377 if (logged_chars < LOG_BUF_LEN)
378 logged_chars++;
382 * This is printk. It can be called from any context. We want it to work.
384 * We try to grab the console_sem. If we succeed, it's easy - we log the output and
385 * call the console drivers. If we fail to get the semaphore we place the output
386 * into the log buffer and return. The current holder of the console_sem will
387 * notice the new output in release_console_sem() and will send it to the
388 * consoles before releasing the semaphore.
390 * One effect of this deferred printing is that code which calls printk() and
391 * then changes console_loglevel may break. This is because console_loglevel
392 * is inspected when the actual printing occurs.
394 asmlinkage int printk(const char *fmt, ...)
396 va_list args;
397 unsigned long flags;
398 int printed_len;
399 char *p;
400 static char printk_buf[1024];
401 static int log_level_unknown = 1;
403 if (oops_in_progress) {
404 /* If a crash is occurring, make sure we can't deadlock */
405 spin_lock_init(&logbuf_lock);
406 /* And make sure that we print immediately */
407 init_MUTEX(&console_sem);
410 /* This stops the holder of console_sem just where we want him */
411 spin_lock_irqsave(&logbuf_lock, flags);
413 /* Emit the output into the temporary buffer */
414 va_start(args, fmt);
415 printed_len = vsnprintf(printk_buf, sizeof(printk_buf), fmt, args);
416 va_end(args);
419 * Copy the output into log_buf. If the caller didn't provide
420 * appropriate log level tags, we insert them here
422 for (p = printk_buf; *p; p++) {
423 if (log_level_unknown) {
424 if (p[0] != '<' || p[1] < '0' || p[1] > '7' || p[2] != '>') {
425 emit_log_char('<');
426 emit_log_char(default_message_loglevel + '0');
427 emit_log_char('>');
429 log_level_unknown = 0;
431 emit_log_char(*p);
432 if (*p == '\n')
433 log_level_unknown = 1;
436 if (!cpu_online(smp_processor_id())) {
438 * Some console drivers may assume that per-cpu resources have
439 * been allocated. So don't allow them to be called by this
440 * CPU until it is officially up. We shouldn't be calling into
441 * random console drivers on a CPU which doesn't exist yet..
443 spin_unlock_irqrestore(&logbuf_lock, flags);
444 goto out;
446 if (!down_trylock(&console_sem)) {
448 * We own the drivers. We can drop the spinlock and let
449 * release_console_sem() print the text
451 spin_unlock_irqrestore(&logbuf_lock, flags);
452 console_may_schedule = 0;
453 release_console_sem();
454 } else {
456 * Someone else owns the drivers. We drop the spinlock, which
457 * allows the semaphore holder to proceed and to call the
458 * console drivers with the output which we just produced.
460 spin_unlock_irqrestore(&logbuf_lock, flags);
462 out:
463 return printed_len;
465 EXPORT_SYMBOL(printk);
468 * acquire_console_sem - lock the console system for exclusive use.
470 * Acquires a semaphore which guarantees that the caller has
471 * exclusive access to the console system and the console_drivers list.
473 * Can sleep, returns nothing.
475 void acquire_console_sem(void)
477 if (in_interrupt())
478 BUG();
479 down(&console_sem);
480 console_may_schedule = 1;
482 EXPORT_SYMBOL(acquire_console_sem);
485 * release_console_sem - unlock the console system
487 * Releases the semaphore which the caller holds on the console system
488 * and the console driver list.
490 * While the semaphore was held, console output may have been buffered
491 * by printk(). If this is the case, release_console_sem() emits
492 * the output prior to releasing the semaphore.
494 * If there is output waiting for klogd, we wake it up.
496 * release_console_sem() may be called from any context.
498 void release_console_sem(void)
500 unsigned long flags;
501 unsigned long _con_start, _log_end;
502 unsigned long wake_klogd = 0;
504 for ( ; ; ) {
505 spin_lock_irqsave(&logbuf_lock, flags);
506 wake_klogd |= log_start - log_end;
507 if (con_start == log_end)
508 break; /* Nothing to print */
509 _con_start = con_start;
510 _log_end = log_end;
511 con_start = log_end; /* Flush */
512 spin_unlock_irqrestore(&logbuf_lock, flags);
513 call_console_drivers(_con_start, _log_end);
515 console_may_schedule = 0;
516 up(&console_sem);
517 spin_unlock_irqrestore(&logbuf_lock, flags);
518 if (wake_klogd && !oops_in_progress && waitqueue_active(&log_wait))
519 wake_up_interruptible(&log_wait);
522 /** console_conditional_schedule - yield the CPU if required
524 * If the console code is currently allowed to sleep, and
525 * if this CPU should yield the CPU to another task, do
526 * so here.
528 * Must be called within acquire_console_sem().
530 void console_conditional_schedule(void)
532 if (console_may_schedule && need_resched()) {
533 set_current_state(TASK_RUNNING);
534 schedule();
537 EXPORT_SYMBOL(console_conditional_schedule);
539 void console_print(const char *s)
541 printk(KERN_EMERG "%s", s);
543 EXPORT_SYMBOL(console_print);
545 void console_unblank(void)
547 struct console *c;
550 * Try to get the console semaphore. If someone else owns it
551 * we have to return without unblanking because console_unblank
552 * may be called in interrupt context.
554 if (down_trylock(&console_sem) != 0)
555 return;
556 console_may_schedule = 0;
557 for (c = console_drivers; c != NULL; c = c->next)
558 if ((c->flags & CON_ENABLED) && c->unblank)
559 c->unblank();
560 release_console_sem();
562 EXPORT_SYMBOL(console_unblank);
565 * The console driver calls this routine during kernel initialization
566 * to register the console printing procedure with printk() and to
567 * print any messages that were printed by the kernel before the
568 * console driver was initialized.
570 void register_console(struct console * console)
572 int i;
573 unsigned long flags;
576 * See if we want to use this console driver. If we
577 * didn't select a console we take the first one
578 * that registers here.
580 if (preferred_console < 0) {
581 if (console->index < 0)
582 console->index = 0;
583 if (console->setup == NULL ||
584 console->setup(console, NULL) == 0) {
585 console->flags |= CON_ENABLED | CON_CONSDEV;
586 preferred_console = 0;
591 * See if this console matches one we selected on
592 * the command line.
594 for(i = 0; i < MAX_CMDLINECONSOLES && console_cmdline[i].name[0]; i++) {
595 if (strcmp(console_cmdline[i].name, console->name) != 0)
596 continue;
597 if (console->index >= 0 &&
598 console->index != console_cmdline[i].index)
599 continue;
600 if (console->index < 0)
601 console->index = console_cmdline[i].index;
602 if (console->setup &&
603 console->setup(console, console_cmdline[i].options) != 0)
604 break;
605 console->flags |= CON_ENABLED;
606 console->index = console_cmdline[i].index;
607 if (i == preferred_console)
608 console->flags |= CON_CONSDEV;
609 break;
612 if (!(console->flags & CON_ENABLED))
613 return;
616 * Put this console in the list - keep the
617 * preferred driver at the head of the list.
619 acquire_console_sem();
620 if ((console->flags & CON_CONSDEV) || console_drivers == NULL) {
621 console->next = console_drivers;
622 console_drivers = console;
623 } else {
624 console->next = console_drivers->next;
625 console_drivers->next = console;
627 if (console->flags & CON_PRINTBUFFER) {
629 * release_console_sem() will print out the buffered messages
630 * for us.
632 spin_lock_irqsave(&logbuf_lock, flags);
633 con_start = log_start;
634 spin_unlock_irqrestore(&logbuf_lock, flags);
636 release_console_sem();
638 EXPORT_SYMBOL(register_console);
640 int unregister_console(struct console * console)
642 struct console *a,*b;
643 int res = 1;
645 acquire_console_sem();
646 if (console_drivers == console) {
647 console_drivers=console->next;
648 res = 0;
649 } else {
650 for (a=console_drivers->next, b=console_drivers ;
651 a; b=a, a=b->next) {
652 if (a == console) {
653 b->next = a->next;
654 res = 0;
655 break;
660 /* If last console is removed, we re-enable picking the first
661 * one that gets registered. Without that, pmac early boot console
662 * would prevent fbcon from taking over.
664 if (console_drivers == NULL)
665 preferred_console = -1;
668 release_console_sem();
669 return res;
671 EXPORT_SYMBOL(unregister_console);
674 * tty_write_message - write a message to a certain tty, not just the console.
676 * This is used for messages that need to be redirected to a specific tty.
677 * We don't put it into the syslog queue right now maybe in the future if
678 * really needed.
680 void tty_write_message(struct tty_struct *tty, char *msg)
682 if (tty && tty->driver->write)
683 tty->driver->write(tty, 0, msg, strlen(msg));
684 return;