patch-2_6_7-vs1_9_1_12
[linux-2.6.git] / kernel / printk.c
1 /*
2  *  linux/kernel/printk.c
3  *
4  *  Copyright (C) 1991, 1992  Linus Torvalds
5  *
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>
17  */
18
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>
32 #include <linux/bootmem.h>
33 #include <linux/vs_base.h>
34
35 #include <asm/uaccess.h>
36
37 #define __LOG_BUF_LEN   (1 << CONFIG_LOG_BUF_SHIFT)
38
39 /* printk's without a loglevel use this.. */
40 #define DEFAULT_MESSAGE_LOGLEVEL 4 /* KERN_WARNING */
41
42 /* We show everything that is MORE important than this.. */
43 #define MINIMUM_CONSOLE_LOGLEVEL 1 /* Minimum loglevel we let people use */
44 #define DEFAULT_CONSOLE_LOGLEVEL 7 /* anything MORE serious than KERN_DEBUG */
45
46 DECLARE_WAIT_QUEUE_HEAD(log_wait);
47
48 int console_printk[4] = {
49         DEFAULT_CONSOLE_LOGLEVEL,       /* console_loglevel */
50         DEFAULT_MESSAGE_LOGLEVEL,       /* default_message_loglevel */
51         MINIMUM_CONSOLE_LOGLEVEL,       /* minimum_console_loglevel */
52         DEFAULT_CONSOLE_LOGLEVEL,       /* default_console_loglevel */
53 };
54
55 EXPORT_SYMBOL(console_printk);
56
57 int oops_in_progress;
58
59 /*
60  * console_sem protects the console_drivers list, and also
61  * provides serialisation for access to the entire console
62  * driver system.
63  */
64 static DECLARE_MUTEX(console_sem);
65 struct console *console_drivers;
66 /*
67  * This is used for debugging the mess that is the VT code by
68  * keeping track if we have the console semaphore held. It's
69  * definitely not the perfect debug tool (we don't know if _WE_
70  * hold it are racing, but it helps tracking those weird code
71  * path in the console code where we end up in places I want
72  * locked without the console sempahore held
73  */
74 static int console_locked;
75
76 /*
77  * logbuf_lock protects log_buf, log_start, log_end, con_start and logged_chars
78  * It is also used in interesting ways to provide interlocking in
79  * release_console_sem().
80  */
81 static spinlock_t logbuf_lock = SPIN_LOCK_UNLOCKED;
82
83 static char __log_buf[__LOG_BUF_LEN];
84 static char *log_buf = __log_buf;
85 static int log_buf_len = __LOG_BUF_LEN;
86
87 #define LOG_BUF_MASK    (log_buf_len-1)
88 #define LOG_BUF(idx) (log_buf[(idx) & LOG_BUF_MASK])
89
90 /*
91  * The indices into log_buf are not constrained to log_buf_len - they
92  * must be masked before subscripting
93  */
94 static unsigned long log_start; /* Index into log_buf: next char to be read by syslog() */
95 static unsigned long con_start; /* Index into log_buf: next char to be sent to consoles */
96 static unsigned long log_end;   /* Index into log_buf: most-recently-written-char + 1 */
97 static unsigned long logged_chars; /* Number of chars produced since last read+clear operation */
98
99 /*
100  *      Array of consoles built from command line options (console=)
101  */
102 struct console_cmdline
103 {
104         char    name[8];                        /* Name of the driver       */
105         int     index;                          /* Minor dev. to use        */
106         char    *options;                       /* Options for the driver   */
107 };
108
109 #define MAX_CMDLINECONSOLES 8
110
111 static struct console_cmdline console_cmdline[MAX_CMDLINECONSOLES];
112 static int preferred_console = -1;
113
114 /* Flag: console code may call schedule() */
115 static int console_may_schedule;
116
117 /*
118  *      Setup a list of consoles. Called from init/main.c
119  */
120 static int __init console_setup(char *str)
121 {
122         char name[sizeof(console_cmdline[0].name)];
123         char *s, *options;
124         int idx;
125
126         /*
127          *      Decode str into name, index, options.
128          */
129         if (str[0] >= '0' && str[0] <= '9') {
130                 strcpy(name, "ttyS");
131                 strncpy(name + 4, str, sizeof(name) - 5);
132         } else
133                 strncpy(name, str, sizeof(name) - 1);
134         name[sizeof(name) - 1] = 0;
135         if ((options = strchr(str, ',')) != NULL)
136                 *(options++) = 0;
137 #ifdef __sparc__
138         if (!strcmp(str, "ttya"))
139                 strcpy(name, "ttyS0");
140         if (!strcmp(str, "ttyb"))
141                 strcpy(name, "ttyS1");
142 #endif
143         for(s = name; *s; s++)
144                 if (*s >= '0' && *s <= '9')
145                         break;
146         idx = simple_strtoul(s, NULL, 10);
147         *s = 0;
148
149         add_preferred_console(name, idx, options);
150         return 1;
151 }
152
153 __setup("console=", console_setup);
154
155 /**
156  * add_preferred_console - add a device to the list of preferred consoles.
157  *
158  * The last preferred console added will be used for kernel messages
159  * and stdin/out/err for init.  Normally this is used by console_setup
160  * above to handle user-supplied console arguments; however it can also
161  * be used by arch-specific code either to override the user or more
162  * commonly to provide a default console (ie from PROM variables) when
163  * the user has not supplied one.
164  */
165 int __init add_preferred_console(char *name, int idx, char *options)
166 {
167         struct console_cmdline *c;
168         int i;
169
170         /*
171          *      See if this tty is not yet registered, and
172          *      if we have a slot free.
173          */
174         for(i = 0; i < MAX_CMDLINECONSOLES && console_cmdline[i].name[0]; i++)
175                 if (strcmp(console_cmdline[i].name, name) == 0 &&
176                           console_cmdline[i].index == idx) {
177                                 preferred_console = i;
178                                 return 0;
179                 }
180         if (i == MAX_CMDLINECONSOLES)
181                 return -E2BIG;
182         preferred_console = i;
183         c = &console_cmdline[i];
184         memcpy(c->name, name, sizeof(c->name));
185         c->name[sizeof(c->name) - 1] = 0;
186         c->options = options;
187         c->index = idx;
188         return 0;
189 }
190
191 static int __init log_buf_len_setup(char *str)
192 {
193         unsigned long size = memparse(str, &str);
194         unsigned long flags;
195
196         if (size > log_buf_len) {
197                 unsigned long start, dest_idx, offset;
198                 char * new_log_buf;
199
200                 new_log_buf = alloc_bootmem(size);
201                 if (!new_log_buf) {
202                         printk("log_buf_len: allocation failed\n");
203                         goto out;
204                 }
205
206                 spin_lock_irqsave(&logbuf_lock, flags);
207                 log_buf_len = size;
208                 log_buf = new_log_buf;
209
210                 offset = start = min(con_start, log_start);
211                 dest_idx = 0;
212                 while (start != log_end) {
213                         log_buf[dest_idx] = __log_buf[start & (__LOG_BUF_LEN - 1)];
214                         start++;
215                         dest_idx++;
216                 }
217                 log_start -= offset;
218                 con_start -= offset;
219                 log_end -= offset;
220                 spin_unlock_irqrestore(&logbuf_lock, flags);
221
222                 printk("log_buf_len: %d\n", log_buf_len);
223         }
224 out:
225
226         return 1;
227 }
228
229 __setup("log_buf_len=", log_buf_len_setup);
230
231 /*
232  * Commands to do_syslog:
233  *
234  *      0 -- Close the log.  Currently a NOP.
235  *      1 -- Open the log. Currently a NOP.
236  *      2 -- Read from the log.
237  *      3 -- Read all messages remaining in the ring buffer.
238  *      4 -- Read and clear all messages remaining in the ring buffer
239  *      5 -- Clear ring buffer.
240  *      6 -- Disable printk's to console
241  *      7 -- Enable printk's to console
242  *      8 -- Set level of messages printed to console
243  *      9 -- Return number of unread characters in the log buffer
244  *     10 -- Return size of the log buffer
245  */
246 int do_syslog(int type, char __user * buf, int len)
247 {
248         unsigned long i, j, limit, count;
249         int do_clear = 0;
250         char c;
251         int error = -EPERM;
252
253         if (!vx_check(0, VX_ADMIN|VX_WATCH))
254                 return error;
255
256         error = security_syslog(type);
257         if (error)
258                 return error;
259
260         switch (type) {
261         case 0:         /* Close log */
262                 break;
263         case 1:         /* Open log */
264                 break;
265         case 2:         /* Read from log */
266                 error = -EINVAL;
267                 if (!buf || len < 0)
268                         goto out;
269                 error = 0;
270                 if (!len)
271                         goto out;
272                 error = verify_area(VERIFY_WRITE,buf,len);
273                 if (error)
274                         goto out;
275                 error = wait_event_interruptible(log_wait, (log_start - log_end));
276                 if (error)
277                         goto out;
278                 i = 0;
279                 spin_lock_irq(&logbuf_lock);
280                 while (!error && (log_start != log_end) && i < len) {
281                         c = LOG_BUF(log_start);
282                         log_start++;
283                         spin_unlock_irq(&logbuf_lock);
284                         error = __put_user(c,buf);
285                         buf++;
286                         i++;
287                         spin_lock_irq(&logbuf_lock);
288                 }
289                 spin_unlock_irq(&logbuf_lock);
290                 if (!error)
291                         error = i;
292                 break;
293         case 4:         /* Read/clear last kernel messages */
294                 do_clear = 1; 
295                 /* FALL THRU */
296         case 3:         /* Read last kernel messages */
297                 error = -EINVAL;
298                 if (!buf || len < 0)
299                         goto out;
300                 error = 0;
301                 if (!len)
302                         goto out;
303                 error = verify_area(VERIFY_WRITE,buf,len);
304                 if (error)
305                         goto out;
306                 count = len;
307                 if (count > log_buf_len)
308                         count = log_buf_len;
309                 spin_lock_irq(&logbuf_lock);
310                 if (count > logged_chars)
311                         count = logged_chars;
312                 if (do_clear)
313                         logged_chars = 0;
314                 limit = log_end;
315                 /*
316                  * __put_user() could sleep, and while we sleep
317                  * printk() could overwrite the messages 
318                  * we try to copy to user space. Therefore
319                  * the messages are copied in reverse. <manfreds>
320                  */
321                 for(i = 0; i < count && !error; i++) {
322                         j = limit-1-i;
323                         if (j + log_buf_len < log_end)
324                                 break;
325                         c = LOG_BUF(j);
326                         spin_unlock_irq(&logbuf_lock);
327                         error = __put_user(c,&buf[count-1-i]);
328                         spin_lock_irq(&logbuf_lock);
329                 }
330                 spin_unlock_irq(&logbuf_lock);
331                 if (error)
332                         break;
333                 error = i;
334                 if(i != count) {
335                         int offset = count-error;
336                         /* buffer overflow during copy, correct user buffer. */
337                         for(i=0;i<error;i++) {
338                                 if (__get_user(c,&buf[i+offset]) ||
339                                     __put_user(c,&buf[i])) {
340                                         error = -EFAULT;
341                                         break;
342                                 }
343                         }
344                 }
345                 break;
346         case 5:         /* Clear ring buffer */
347                 logged_chars = 0;
348                 break;
349         case 6:         /* Disable logging to console */
350                 console_loglevel = minimum_console_loglevel;
351                 break;
352         case 7:         /* Enable logging to console */
353                 console_loglevel = default_console_loglevel;
354                 break;
355         case 8:         /* Set level of messages printed to console */
356                 error = -EINVAL;
357                 if (len < 1 || len > 8)
358                         goto out;
359                 if (len < minimum_console_loglevel)
360                         len = minimum_console_loglevel;
361                 console_loglevel = len;
362                 error = 0;
363                 break;
364         case 9:         /* Number of chars in the log buffer */
365                 error = log_end - log_start;
366                 break;
367         case 10:        /* Size of the log buffer */
368                 error = log_buf_len;
369                 break;
370         default:
371                 error = -EINVAL;
372                 break;
373         }
374 out:
375         return error;
376 }
377
378 asmlinkage long sys_syslog(int type, char __user * buf, int len)
379 {
380         return do_syslog(type, buf, len);
381 }
382
383 /*
384  * Call the console drivers on a range of log_buf
385  */
386 static void __call_console_drivers(unsigned long start, unsigned long end)
387 {
388         struct console *con;
389
390         for (con = console_drivers; con; con = con->next) {
391                 if ((con->flags & CON_ENABLED) && con->write)
392                         con->write(con, &LOG_BUF(start), end - start);
393         }
394 }
395
396 /*
397  * Write out chars from start to end - 1 inclusive
398  */
399 static void _call_console_drivers(unsigned long start,
400                                 unsigned long end, int msg_log_level)
401 {
402         if (msg_log_level < console_loglevel &&
403                         console_drivers && start != end) {
404                 if ((start & LOG_BUF_MASK) > (end & LOG_BUF_MASK)) {
405                         /* wrapped write */
406                         __call_console_drivers(start & LOG_BUF_MASK,
407                                                 log_buf_len);
408                         __call_console_drivers(0, end & LOG_BUF_MASK);
409                 } else {
410                         __call_console_drivers(start, end);
411                 }
412         }
413 }
414
415 /*
416  * Call the console drivers, asking them to write out
417  * log_buf[start] to log_buf[end - 1].
418  * The console_sem must be held.
419  */
420 static void call_console_drivers(unsigned long start, unsigned long end)
421 {
422         unsigned long cur_index, start_print;
423         static int msg_level = -1;
424
425         if (((long)(start - end)) > 0)
426                 BUG();
427
428         cur_index = start;
429         start_print = start;
430         while (cur_index != end) {
431                 if (    msg_level < 0 &&
432                         ((end - cur_index) > 2) &&
433                         LOG_BUF(cur_index + 0) == '<' &&
434                         LOG_BUF(cur_index + 1) >= '0' &&
435                         LOG_BUF(cur_index + 1) <= '7' &&
436                         LOG_BUF(cur_index + 2) == '>')
437                 {
438                         msg_level = LOG_BUF(cur_index + 1) - '0';
439                         cur_index += 3;
440                         start_print = cur_index;
441                 }
442                 while (cur_index != end) {
443                         char c = LOG_BUF(cur_index);
444                         cur_index++;
445
446                         if (c == '\n') {
447                                 if (msg_level < 0) {
448                                         /*
449                                          * printk() has already given us loglevel tags in
450                                          * the buffer.  This code is here in case the
451                                          * log buffer has wrapped right round and scribbled
452                                          * on those tags
453                                          */
454                                         msg_level = default_message_loglevel;
455                                 }
456                                 _call_console_drivers(start_print, cur_index, msg_level);
457                                 msg_level = -1;
458                                 start_print = cur_index;
459                                 break;
460                         }
461                 }
462         }
463         _call_console_drivers(start_print, end, msg_level);
464 }
465
466 static void emit_log_char(char c)
467 {
468         LOG_BUF(log_end) = c;
469         log_end++;
470         if (log_end - log_start > log_buf_len)
471                 log_start = log_end - log_buf_len;
472         if (log_end - con_start > log_buf_len)
473                 con_start = log_end - log_buf_len;
474         if (logged_chars < log_buf_len)
475                 logged_chars++;
476 }
477
478 /*
479  * Zap console related locks when oopsing. Only zap at most once
480  * every 10 seconds, to leave time for slow consoles to print a
481  * full oops.
482  */
483 static void zap_locks(void)
484 {
485         static unsigned long oops_timestamp;
486
487         if (time_after_eq(jiffies, oops_timestamp) &&
488                         !time_after(jiffies, oops_timestamp + 30*HZ))
489                 return;
490
491         oops_timestamp = jiffies;
492
493         /* If a crash is occurring, make sure we can't deadlock */
494         spin_lock_init(&logbuf_lock);
495         /* And make sure that we print immediately */
496         init_MUTEX(&console_sem);
497 }
498
499 /*
500  * This is printk.  It can be called from any context.  We want it to work.
501  * 
502  * We try to grab the console_sem.  If we succeed, it's easy - we log the output and
503  * call the console drivers.  If we fail to get the semaphore we place the output
504  * into the log buffer and return.  The current holder of the console_sem will
505  * notice the new output in release_console_sem() and will send it to the
506  * consoles before releasing the semaphore.
507  *
508  * One effect of this deferred printing is that code which calls printk() and
509  * then changes console_loglevel may break. This is because console_loglevel
510  * is inspected when the actual printing occurs.
511  */
512 asmlinkage int printk(const char *fmt, ...)
513 {
514         va_list args;
515         unsigned long flags;
516         int printed_len;
517         char *p;
518         static char printk_buf[1024];
519         static int log_level_unknown = 1;
520
521         if (unlikely(oops_in_progress))
522                 zap_locks();
523
524         /* This stops the holder of console_sem just where we want him */
525         spin_lock_irqsave(&logbuf_lock, flags);
526
527         /* Emit the output into the temporary buffer */
528         va_start(args, fmt);
529         printed_len = vscnprintf(printk_buf, sizeof(printk_buf), fmt, args);
530         va_end(args);
531
532         /*
533          * Copy the output into log_buf.  If the caller didn't provide
534          * appropriate log level tags, we insert them here
535          */
536         for (p = printk_buf; *p; p++) {
537                 if (log_level_unknown) {
538                         if (p[0] != '<' || p[1] < '0' || p[1] > '7' || p[2] != '>') {
539                                 emit_log_char('<');
540                                 emit_log_char(default_message_loglevel + '0');
541                                 emit_log_char('>');
542                         }
543                         log_level_unknown = 0;
544                 }
545                 emit_log_char(*p);
546                 if (*p == '\n')
547                         log_level_unknown = 1;
548         }
549
550         if (!cpu_online(smp_processor_id()) &&
551             system_state != SYSTEM_RUNNING) {
552                 /*
553                  * Some console drivers may assume that per-cpu resources have
554                  * been allocated.  So don't allow them to be called by this
555                  * CPU until it is officially up.  We shouldn't be calling into
556                  * random console drivers on a CPU which doesn't exist yet..
557                  */
558                 spin_unlock_irqrestore(&logbuf_lock, flags);
559                 goto out;
560         }
561         if (!down_trylock(&console_sem)) {
562                 console_locked = 1;
563                 /*
564                  * We own the drivers.  We can drop the spinlock and let
565                  * release_console_sem() print the text
566                  */
567                 spin_unlock_irqrestore(&logbuf_lock, flags);
568                 console_may_schedule = 0;
569                 release_console_sem();
570         } else {
571                 /*
572                  * Someone else owns the drivers.  We drop the spinlock, which
573                  * allows the semaphore holder to proceed and to call the
574                  * console drivers with the output which we just produced.
575                  */
576                 spin_unlock_irqrestore(&logbuf_lock, flags);
577         }
578 out:
579         return printed_len;
580 }
581 EXPORT_SYMBOL(printk);
582
583 /**
584  * acquire_console_sem - lock the console system for exclusive use.
585  *
586  * Acquires a semaphore which guarantees that the caller has
587  * exclusive access to the console system and the console_drivers list.
588  *
589  * Can sleep, returns nothing.
590  */
591 void acquire_console_sem(void)
592 {
593         if (in_interrupt())
594                 BUG();
595         down(&console_sem);
596         console_locked = 1;
597         console_may_schedule = 1;
598 }
599 EXPORT_SYMBOL(acquire_console_sem);
600
601 int is_console_locked(void)
602 {
603         return console_locked;
604 }
605 EXPORT_SYMBOL(is_console_locked);
606
607 /**
608  * release_console_sem - unlock the console system
609  *
610  * Releases the semaphore which the caller holds on the console system
611  * and the console driver list.
612  *
613  * While the semaphore was held, console output may have been buffered
614  * by printk().  If this is the case, release_console_sem() emits
615  * the output prior to releasing the semaphore.
616  *
617  * If there is output waiting for klogd, we wake it up.
618  *
619  * release_console_sem() may be called from any context.
620  */
621 void release_console_sem(void)
622 {
623         unsigned long flags;
624         unsigned long _con_start, _log_end;
625         unsigned long wake_klogd = 0;
626
627         for ( ; ; ) {
628                 spin_lock_irqsave(&logbuf_lock, flags);
629                 wake_klogd |= log_start - log_end;
630                 if (con_start == log_end)
631                         break;                  /* Nothing to print */
632                 _con_start = con_start;
633                 _log_end = log_end;
634                 con_start = log_end;            /* Flush */
635                 spin_unlock_irqrestore(&logbuf_lock, flags);
636                 call_console_drivers(_con_start, _log_end);
637         }
638         console_locked = 0;
639         console_may_schedule = 0;
640         up(&console_sem);
641         spin_unlock_irqrestore(&logbuf_lock, flags);
642         if (wake_klogd && !oops_in_progress && waitqueue_active(&log_wait))
643                 wake_up_interruptible(&log_wait);
644 }
645 EXPORT_SYMBOL(release_console_sem);
646
647 /** console_conditional_schedule - yield the CPU if required
648  *
649  * If the console code is currently allowed to sleep, and
650  * if this CPU should yield the CPU to another task, do
651  * so here.
652  *
653  * Must be called within acquire_console_sem().
654  */
655 void console_conditional_schedule(void)
656 {
657         if (console_may_schedule && need_resched()) {
658                 set_current_state(TASK_RUNNING);
659                 schedule();
660         }
661 }
662 EXPORT_SYMBOL(console_conditional_schedule);
663
664 void console_print(const char *s)
665 {
666         printk(KERN_EMERG "%s", s);
667 }
668 EXPORT_SYMBOL(console_print);
669
670 void console_unblank(void)
671 {
672         struct console *c;
673
674         /*
675          * Try to get the console semaphore. If someone else owns it
676          * we have to return without unblanking because console_unblank
677          * may be called in interrupt context.
678          */
679         if (down_trylock(&console_sem) != 0)
680                 return;
681         console_locked = 1;
682         console_may_schedule = 0;
683         for (c = console_drivers; c != NULL; c = c->next)
684                 if ((c->flags & CON_ENABLED) && c->unblank)
685                         c->unblank();
686         release_console_sem();
687 }
688 EXPORT_SYMBOL(console_unblank);
689
690 /*
691  * The console driver calls this routine during kernel initialization
692  * to register the console printing procedure with printk() and to
693  * print any messages that were printed by the kernel before the
694  * console driver was initialized.
695  */
696 void register_console(struct console * console)
697 {
698         int     i;
699         unsigned long flags;
700
701         /*
702          *      See if we want to use this console driver. If we
703          *      didn't select a console we take the first one
704          *      that registers here.
705          */
706         if (preferred_console < 0) {
707                 if (console->index < 0)
708                         console->index = 0;
709                 if (console->setup == NULL ||
710                     console->setup(console, NULL) == 0) {
711                         console->flags |= CON_ENABLED | CON_CONSDEV;
712                         preferred_console = 0;
713                 }
714         }
715
716         /*
717          *      See if this console matches one we selected on
718          *      the command line.
719          */
720         for(i = 0; i < MAX_CMDLINECONSOLES && console_cmdline[i].name[0]; i++) {
721                 if (strcmp(console_cmdline[i].name, console->name) != 0)
722                         continue;
723                 if (console->index >= 0 &&
724                     console->index != console_cmdline[i].index)
725                         continue;
726                 if (console->index < 0)
727                         console->index = console_cmdline[i].index;
728                 if (console->setup &&
729                     console->setup(console, console_cmdline[i].options) != 0)
730                         break;
731                 console->flags |= CON_ENABLED;
732                 console->index = console_cmdline[i].index;
733                 if (i == preferred_console)
734                         console->flags |= CON_CONSDEV;
735                 break;
736         }
737
738         if (!(console->flags & CON_ENABLED))
739                 return;
740
741         /*
742          *      Put this console in the list - keep the
743          *      preferred driver at the head of the list.
744          */
745         acquire_console_sem();
746         if ((console->flags & CON_CONSDEV) || console_drivers == NULL) {
747                 console->next = console_drivers;
748                 console_drivers = console;
749         } else {
750                 console->next = console_drivers->next;
751                 console_drivers->next = console;
752         }
753         if (console->flags & CON_PRINTBUFFER) {
754                 /*
755                  * release_console_sem() will print out the buffered messages
756                  * for us.
757                  */
758                 spin_lock_irqsave(&logbuf_lock, flags);
759                 con_start = log_start;
760                 spin_unlock_irqrestore(&logbuf_lock, flags);
761         }
762         release_console_sem();
763 }
764 EXPORT_SYMBOL(register_console);
765
766 int unregister_console(struct console * console)
767 {
768         struct console *a,*b;
769         int res = 1;
770
771         acquire_console_sem();
772         if (console_drivers == console) {
773                 console_drivers=console->next;
774                 res = 0;
775         } else {
776                 for (a=console_drivers->next, b=console_drivers ;
777                      a; b=a, a=b->next) {
778                         if (a == console) {
779                                 b->next = a->next;
780                                 res = 0;
781                                 break;
782                         }  
783                 }
784         }
785         
786         /* If last console is removed, we re-enable picking the first
787          * one that gets registered. Without that, pmac early boot console
788          * would prevent fbcon from taking over.
789          */
790         if (console_drivers == NULL)
791                 preferred_console = -1;
792                 
793
794         release_console_sem();
795         return res;
796 }
797 EXPORT_SYMBOL(unregister_console);
798         
799 /**
800  * tty_write_message - write a message to a certain tty, not just the console.
801  *
802  * This is used for messages that need to be redirected to a specific tty.
803  * We don't put it into the syslog queue right now maybe in the future if
804  * really needed.
805  */
806 void tty_write_message(struct tty_struct *tty, char *msg)
807 {
808         if (tty && tty->driver->write)
809                 tty->driver->write(tty, 0, msg, strlen(msg));
810         return;
811 }
812
813 /*
814  * printk rate limiting, lifted from the networking subsystem.
815  *
816  * This enforces a rate limit: not more than one kernel message
817  * every printk_ratelimit_jiffies to make a denial-of-service
818  * attack impossible.
819  */
820 int __printk_ratelimit(int ratelimit_jiffies, int ratelimit_burst)
821 {
822         static spinlock_t ratelimit_lock = SPIN_LOCK_UNLOCKED;
823         static unsigned long toks = 10*5*HZ;
824         static unsigned long last_msg;
825         static int missed;
826         unsigned long flags;
827         unsigned long now = jiffies;
828
829         spin_lock_irqsave(&ratelimit_lock, flags);
830         toks += now - last_msg;
831         last_msg = now;
832         if (toks > (ratelimit_burst * ratelimit_jiffies))
833                 toks = ratelimit_burst * ratelimit_jiffies;
834         if (toks >= ratelimit_jiffies) {
835                 int lost = missed;
836                 missed = 0;
837                 toks -= ratelimit_jiffies;
838                 spin_unlock_irqrestore(&ratelimit_lock, flags);
839                 if (lost)
840                         printk(KERN_WARNING "printk: %d messages suppressed.\n", lost);
841                 return 1;
842         }
843         missed++;
844         spin_unlock_irqrestore(&ratelimit_lock, flags);
845         return 0;
846 }
847 EXPORT_SYMBOL(__printk_ratelimit);
848
849 /* minimum time in jiffies between messages */
850 int printk_ratelimit_jiffies = 5*HZ;
851
852 /* number of messages we send before ratelimiting */
853 int printk_ratelimit_burst = 10;
854
855 int printk_ratelimit(void)
856 {
857         return __printk_ratelimit(printk_ratelimit_jiffies,
858                                 printk_ratelimit_burst);
859 }
860 EXPORT_SYMBOL(printk_ratelimit);