linux/kernel/printk.c
<<
>>
Prefs
   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 *     manfred@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/console.h>
  24#include <linux/init.h>
  25#include <linux/jiffies.h>
  26#include <linux/nmi.h>
  27#include <linux/module.h>
  28#include <linux/moduleparam.h>
  29#include <linux/interrupt.h>                    /* For in_interrupt() */
  30#include <linux/delay.h>
  31#include <linux/smp.h>
  32#include <linux/security.h>
  33#include <linux/bootmem.h>
  34#include <linux/syscalls.h>
  35
  36#include <asm/uaccess.h>
  37
  38/*
  39 * Architectures can override it:
  40 */
  41void __attribute__((weak)) early_printk(const char *fmt, ...)
  42{
  43}
  44
  45#define __LOG_BUF_LEN   (1 << CONFIG_LOG_BUF_SHIFT)
  46
  47/* printk's without a loglevel use this.. */
  48#define DEFAULT_MESSAGE_LOGLEVEL 4 /* KERN_WARNING */
  49
  50/* We show everything that is MORE important than this.. */
  51#define MINIMUM_CONSOLE_LOGLEVEL 1 /* Minimum loglevel we let people use */
  52#define DEFAULT_CONSOLE_LOGLEVEL 7 /* anything MORE serious than KERN_DEBUG */
  53
  54DECLARE_WAIT_QUEUE_HEAD(log_wait);
  55
  56int console_printk[4] = {
  57        DEFAULT_CONSOLE_LOGLEVEL,       /* console_loglevel */
  58        DEFAULT_MESSAGE_LOGLEVEL,       /* default_message_loglevel */
  59        MINIMUM_CONSOLE_LOGLEVEL,       /* minimum_console_loglevel */
  60        DEFAULT_CONSOLE_LOGLEVEL,       /* default_console_loglevel */
  61};
  62
  63/*
  64 * Low level drivers may need that to know if they can schedule in
  65 * their unblank() callback or not. So let's export it.
  66 */
  67int oops_in_progress;
  68EXPORT_SYMBOL(oops_in_progress);
  69
  70/*
  71 * console_sem protects the console_drivers list, and also
  72 * provides serialisation for access to the entire console
  73 * driver system.
  74 */
  75static DECLARE_MUTEX(console_sem);
  76static DECLARE_MUTEX(secondary_console_sem);
  77struct console *console_drivers;
  78/*
  79 * This is used for debugging the mess that is the VT code by
  80 * keeping track if we have the console semaphore held. It's
  81 * definitely not the perfect debug tool (we don't know if _WE_
  82 * hold it are racing, but it helps tracking those weird code
  83 * path in the console code where we end up in places I want
  84 * locked without the console sempahore held
  85 */
  86static int console_locked, console_suspended;
  87
  88/*
  89 * logbuf_lock protects log_buf, log_start, log_end, con_start and logged_chars
  90 * It is also used in interesting ways to provide interlocking in
  91 * release_console_sem().
  92 */
  93static DEFINE_SPINLOCK(logbuf_lock);
  94
  95#define LOG_BUF_MASK (log_buf_len-1)
  96#define LOG_BUF(idx) (log_buf[(idx) & LOG_BUF_MASK])
  97
  98/*
  99 * The indices into log_buf are not constrained to log_buf_len - they
 100 * must be masked before subscripting
 101 */
 102static unsigned log_start;      /* Index into log_buf: next char to be read by syslog() */
 103static unsigned con_start;      /* Index into log_buf: next char to be sent to consoles */
 104static unsigned log_end;        /* Index into log_buf: most-recently-written-char + 1 */
 105
 106/*
 107 *      Array of consoles built from command line options (console=)
 108 */
 109struct console_cmdline
 110{
 111        char    name[8];                        /* Name of the driver       */
 112        int     index;                          /* Minor dev. to use        */
 113        char    *options;                       /* Options for the driver   */
 114#ifdef CONFIG_A11Y_BRAILLE_CONSOLE
 115        char    *brl_options;                   /* Options for braille driver */
 116#endif
 117};
 118
 119#define MAX_CMDLINECONSOLES 8
 120
 121static struct console_cmdline console_cmdline[MAX_CMDLINECONSOLES];
 122static int selected_console = -1;
 123static int preferred_console = -1;
 124
 125/* Flag: console code may call schedule() */
 126static int console_may_schedule;
 127
 128#ifdef CONFIG_PRINTK
 129
 130static char __log_buf[__LOG_BUF_LEN];
 131static char *log_buf = __log_buf;
 132static int log_buf_len = __LOG_BUF_LEN;
 133static unsigned logged_chars; /* Number of chars produced since last read+clear operation */
 134
 135static int __init log_buf_len_setup(char *str)
 136{
 137        unsigned size = memparse(str, &str);
 138        unsigned long flags;
 139
 140        if (size)
 141                size = roundup_pow_of_two(size);
 142        if (size > log_buf_len) {
 143                unsigned start, dest_idx, offset;
 144                char *new_log_buf;
 145
 146                new_log_buf = alloc_bootmem(size);
 147                if (!new_log_buf) {
 148                        printk(KERN_WARNING "log_buf_len: allocation failed\n");
 149                        goto out;
 150                }
 151
 152                spin_lock_irqsave(&logbuf_lock, flags);
 153                log_buf_len = size;
 154                log_buf = new_log_buf;
 155
 156                offset = start = min(con_start, log_start);
 157                dest_idx = 0;
 158                while (start != log_end) {
 159                        log_buf[dest_idx] = __log_buf[start & (__LOG_BUF_LEN - 1)];
 160                        start++;
 161                        dest_idx++;
 162                }
 163                log_start -= offset;
 164                con_start -= offset;
 165                log_end -= offset;
 166                spin_unlock_irqrestore(&logbuf_lock, flags);
 167
 168                printk(KERN_NOTICE "log_buf_len: %d\n", log_buf_len);
 169        }
 170out:
 171        return 1;
 172}
 173
 174__setup("log_buf_len=", log_buf_len_setup);
 175
 176#ifdef CONFIG_BOOT_PRINTK_DELAY
 177
 178static unsigned int boot_delay; /* msecs delay after each printk during bootup */
 179static unsigned long long printk_delay_msec; /* per msec, based on boot_delay */
 180
 181static int __init boot_delay_setup(char *str)
 182{
 183        unsigned long lpj;
 184        unsigned long long loops_per_msec;
 185
 186        lpj = preset_lpj ? preset_lpj : 1000000;        /* some guess */
 187        loops_per_msec = (unsigned long long)lpj / 1000 * HZ;
 188
 189        get_option(&str, &boot_delay);
 190        if (boot_delay > 10 * 1000)
 191                boot_delay = 0;
 192
 193        printk_delay_msec = loops_per_msec;
 194        printk(KERN_DEBUG "boot_delay: %u, preset_lpj: %ld, lpj: %lu, "
 195                "HZ: %d, printk_delay_msec: %llu\n",
 196                boot_delay, preset_lpj, lpj, HZ, printk_delay_msec);
 197        return 1;
 198}
 199__setup("boot_delay=", boot_delay_setup);
 200
 201static void boot_delay_msec(void)
 202{
 203        unsigned long long k;
 204        unsigned long timeout;
 205
 206        if (boot_delay == 0 || system_state != SYSTEM_BOOTING)
 207                return;
 208
 209        k = (unsigned long long)printk_delay_msec * boot_delay;
 210
 211        timeout = jiffies + msecs_to_jiffies(boot_delay);
 212        while (k) {
 213                k--;
 214                cpu_relax();
 215                /*
 216                 * use (volatile) jiffies to prevent
 217                 * compiler reduction; loop termination via jiffies
 218                 * is secondary and may or may not happen.
 219                 */
 220                if (time_after(jiffies, timeout))
 221                        break;
 222                touch_nmi_watchdog();
 223        }
 224}
 225#else
 226static inline void boot_delay_msec(void)
 227{
 228}
 229#endif
 230
 231/*
 232 * Return the number of unread characters in the log buffer.
 233 */
 234int log_buf_get_len(void)
 235{
 236        return logged_chars;
 237}
 238
 239/*
 240 * Copy a range of characters from the log buffer.
 241 */
 242int log_buf_copy(char *dest, int idx, int len)
 243{
 244        int ret, max;
 245        bool took_lock = false;
 246
 247        if (!oops_in_progress) {
 248                spin_lock_irq(&logbuf_lock);
 249                took_lock = true;
 250        }
 251
 252        max = log_buf_get_len();
 253        if (idx < 0 || idx >= max) {
 254                ret = -1;
 255        } else {
 256                if (len > max)
 257                        len = max;
 258                ret = len;
 259                idx += (log_end - max);
 260                while (len-- > 0)
 261                        dest[len] = LOG_BUF(idx + len);
 262        }
 263
 264        if (took_lock)
 265                spin_unlock_irq(&logbuf_lock);
 266
 267        return ret;
 268}
 269
 270/*
 271 * Extract a single character from the log buffer.
 272 */
 273int log_buf_read(int idx)
 274{
 275        char ret;
 276
 277        if (log_buf_copy(&ret, idx, 1) == 1)
 278                return ret;
 279        else
 280                return -1;
 281}
 282
 283/*
 284 * Commands to do_syslog:
 285 *
 286 *      0 -- Close the log.  Currently a NOP.
 287 *      1 -- Open the log. Currently a NOP.
 288 *      2 -- Read from the log.
 289 *      3 -- Read all messages remaining in the ring buffer.
 290 *      4 -- Read and clear all messages remaining in the ring buffer
 291 *      5 -- Clear ring buffer.
 292 *      6 -- Disable printk's to console
 293 *      7 -- Enable printk's to console
 294 *      8 -- Set level of messages printed to console
 295 *      9 -- Return number of unread characters in the log buffer
 296 *     10 -- Return size of the log buffer
 297 */
 298int do_syslog(int type, char __user *buf, int len)
 299{
 300        unsigned i, j, limit, count;
 301        int do_clear = 0;
 302        char c;
 303        int error = 0;
 304
 305        error = security_syslog(type);
 306        if (error)
 307                return error;
 308
 309        switch (type) {
 310        case 0:         /* Close log */
 311                break;
 312        case 1:         /* Open log */
 313                break;
 314        case 2:         /* Read from log */
 315                error = -EINVAL;
 316                if (!buf || len < 0)
 317                        goto out;
 318                error = 0;
 319                if (!len)
 320                        goto out;
 321                if (!access_ok(VERIFY_WRITE, buf, len)) {
 322                        error = -EFAULT;
 323                        goto out;
 324                }
 325                error = wait_event_interruptible(log_wait,
 326                                                        (log_start - log_end));
 327                if (error)
 328                        goto out;
 329                i = 0;
 330                spin_lock_irq(&logbuf_lock);
 331                while (!error && (log_start != log_end) && i < len) {
 332                        c = LOG_BUF(log_start);
 333                        log_start++;
 334                        spin_unlock_irq(&logbuf_lock);
 335                        error = __put_user(c,buf);
 336                        buf++;
 337                        i++;
 338                        cond_resched();
 339                        spin_lock_irq(&logbuf_lock);
 340                }
 341                spin_unlock_irq(&logbuf_lock);
 342                if (!error)
 343                        error = i;
 344                break;
 345        case 4:         /* Read/clear last kernel messages */
 346                do_clear = 1;
 347                /* FALL THRU */
 348        case 3:         /* Read last kernel messages */
 349                error = -EINVAL;
 350                if (!buf || len < 0)
 351                        goto out;
 352                error = 0;
 353                if (!len)
 354                        goto out;
 355                if (!access_ok(VERIFY_WRITE, buf, len)) {
 356                        error = -EFAULT;
 357                        goto out;
 358                }
 359                count = len;
 360                if (count > log_buf_len)
 361                        count = log_buf_len;
 362                spin_lock_irq(&logbuf_lock);
 363                if (count > logged_chars)
 364                        count = logged_chars;
 365                if (do_clear)
 366                        logged_chars = 0;
 367                limit = log_end;
 368                /*
 369                 * __put_user() could sleep, and while we sleep
 370                 * printk() could overwrite the messages
 371                 * we try to copy to user space. Therefore
 372                 * the messages are copied in reverse. <manfreds>
 373                 */
 374                for (i = 0; i < count && !error; i++) {
 375                        j = limit-1-i;
 376                        if (j + log_buf_len < log_end)
 377                                break;
 378                        c = LOG_BUF(j);
 379                        spin_unlock_irq(&logbuf_lock);
 380                        error = __put_user(c,&buf[count-1-i]);
 381                        cond_resched();
 382                        spin_lock_irq(&logbuf_lock);
 383                }
 384                spin_unlock_irq(&logbuf_lock);
 385                if (error)
 386                        break;
 387                error = i;
 388                if (i != count) {
 389                        int offset = count-error;
 390                        /* buffer overflow during copy, correct user buffer. */
 391                        for (i = 0; i < error; i++) {
 392                                if (__get_user(c,&buf[i+offset]) ||
 393                                    __put_user(c,&buf[i])) {
 394                                        error = -EFAULT;
 395                                        break;
 396                                }
 397                                cond_resched();
 398                        }
 399                }
 400                break;
 401        case 5:         /* Clear ring buffer */
 402                logged_chars = 0;
 403                break;
 404        case 6:         /* Disable logging to console */
 405                console_loglevel = minimum_console_loglevel;
 406                break;
 407        case 7:         /* Enable logging to console */
 408                console_loglevel = default_console_loglevel;
 409                break;
 410        case 8:         /* Set level of messages printed to console */
 411                error = -EINVAL;
 412                if (len < 1 || len > 8)
 413                        goto out;
 414                if (len < minimum_console_loglevel)
 415                        len = minimum_console_loglevel;
 416                console_loglevel = len;
 417                error = 0;
 418                break;
 419        case 9:         /* Number of chars in the log buffer */
 420                error = log_end - log_start;
 421                break;
 422        case 10:        /* Size of the log buffer */
 423                error = log_buf_len;
 424                break;
 425        default:
 426                error = -EINVAL;
 427                break;
 428        }
 429out:
 430        return error;
 431}
 432
 433asmlinkage long sys_syslog(int type, char __user *buf, int len)
 434{
 435        return do_syslog(type, buf, len);
 436}
 437
 438/*
 439 * Call the console drivers on a range of log_buf
 440 */
 441static void __call_console_drivers(unsigned start, unsigned end)
 442{
 443        struct console *con;
 444
 445        for (con = console_drivers; con; con = con->next) {
 446                if ((con->flags & CON_ENABLED) && con->write &&
 447                                (cpu_online(smp_processor_id()) ||
 448                                (con->flags & CON_ANYTIME)))
 449                        con->write(con, &LOG_BUF(start), end - start);
 450        }
 451}
 452
 453static int __read_mostly ignore_loglevel;
 454
 455static int __init ignore_loglevel_setup(char *str)
 456{
 457        ignore_loglevel = 1;
 458        printk(KERN_INFO "debug: ignoring loglevel setting.\n");
 459
 460        return 0;
 461}
 462
 463early_param("ignore_loglevel", ignore_loglevel_setup);
 464
 465/*
 466 * Write out chars from start to end - 1 inclusive
 467 */
 468static void _call_console_drivers(unsigned start,
 469                                unsigned end, int msg_log_level)
 470{
 471        if ((msg_log_level < console_loglevel || ignore_loglevel) &&
 472                        console_drivers && start != end) {
 473                if ((start & LOG_BUF_MASK) > (end & LOG_BUF_MASK)) {
 474                        /* wrapped write */
 475                        __call_console_drivers(start & LOG_BUF_MASK,
 476                                                log_buf_len);
 477                        __call_console_drivers(0, end & LOG_BUF_MASK);
 478                } else {
 479                        __call_console_drivers(start, end);
 480                }
 481        }
 482}
 483
 484/*
 485 * Call the console drivers, asking them to write out
 486 * log_buf[start] to log_buf[end - 1].
 487 * The console_sem must be held.
 488 */
 489static void call_console_drivers(unsigned start, unsigned end)
 490{
 491        unsigned cur_index, start_print;
 492        static int msg_level = -1;
 493
 494        BUG_ON(((int)(start - end)) > 0);
 495
 496        cur_index = start;
 497        start_print = start;
 498        while (cur_index != end) {
 499                if (msg_level < 0 && ((end - cur_index) > 2) &&
 500                                LOG_BUF(cur_index + 0) == '<' &&
 501                                LOG_BUF(cur_index + 1) >= '0' &&
 502                                LOG_BUF(cur_index + 1) <= '7' &&
 503                                LOG_BUF(cur_index + 2) == '>') {
 504                        msg_level = LOG_BUF(cur_index + 1) - '0';
 505                        cur_index += 3;
 506                        start_print = cur_index;
 507                }
 508                while (cur_index != end) {
 509                        char c = LOG_BUF(cur_index);
 510
 511                        cur_index++;
 512                        if (c == '\n') {
 513                                if (msg_level < 0) {
 514                                        /*
 515                                         * printk() has already given us loglevel tags in
 516                                         * the buffer.  This code is here in case the
 517                                         * log buffer has wrapped right round and scribbled
 518                                         * on those tags
 519                                         */
 520                                        msg_level = default_message_loglevel;
 521                                }
 522                                _call_console_drivers(start_print, cur_index, msg_level);
 523                                msg_level = -1;
 524                                start_print = cur_index;
 525                                break;
 526                        }
 527                }
 528        }
 529        _call_console_drivers(start_print, end, msg_level);
 530}
 531
 532static void emit_log_char(char c)
 533{
 534        LOG_BUF(log_end) = c;
 535        log_end++;
 536        if (log_end - log_start > log_buf_len)
 537                log_start = log_end - log_buf_len;
 538        if (log_end - con_start > log_buf_len)
 539                con_start = log_end - log_buf_len;
 540        if (logged_chars < log_buf_len)
 541                logged_chars++;
 542}
 543
 544/*
 545 * Zap console related locks when oopsing. Only zap at most once
 546 * every 10 seconds, to leave time for slow consoles to print a
 547 * full oops.
 548 */
 549static void zap_locks(void)
 550{
 551        static unsigned long oops_timestamp;
 552
 553        if (time_after_eq(jiffies, oops_timestamp) &&
 554                        !time_after(jiffies, oops_timestamp + 30 * HZ))
 555                return;
 556
 557        oops_timestamp = jiffies;
 558
 559        /* If a crash is occurring, make sure we can't deadlock */
 560        spin_lock_init(&logbuf_lock);
 561        /* And make sure that we print immediately */
 562        init_MUTEX(&console_sem);
 563}
 564
 565#if defined(CONFIG_PRINTK_TIME)
 566static int printk_time = 1;
 567#else
 568static int printk_time = 0;
 569#endif
 570module_param_named(time, printk_time, bool, S_IRUGO | S_IWUSR);
 571
 572/* Check if we have any console registered that can be called early in boot. */
 573static int have_callable_console(void)
 574{
 575        struct console *con;
 576
 577        for (con = console_drivers; con; con = con->next)
 578                if (con->flags & CON_ANYTIME)
 579                        return 1;
 580
 581        return 0;
 582}
 583
 584/**
 585 * printk - print a kernel message
 586 * @fmt: format string
 587 *
 588 * This is printk().  It can be called from any context.  We want it to work.
 589 * Be aware of the fact that if oops_in_progress is not set, we might try to
 590 * wake klogd up which could deadlock on runqueue lock if printk() is called
 591 * from scheduler code.
 592 *
 593 * We try to grab the console_sem.  If we succeed, it's easy - we log the output and
 594 * call the console drivers.  If we fail to get the semaphore we place the output
 595 * into the log buffer and return.  The current holder of the console_sem will
 596 * notice the new output in release_console_sem() and will send it to the
 597 * consoles before releasing the semaphore.
 598 *
 599 * One effect of this deferred printing is that code which calls printk() and
 600 * then changes console_loglevel may break. This is because console_loglevel
 601 * is inspected when the actual printing occurs.
 602 *
 603 * See also:
 604 * printf(3)
 605 */
 606
 607asmlinkage int printk(const char *fmt, ...)
 608{
 609        va_list args;
 610        int r;
 611
 612        va_start(args, fmt);
 613        r = vprintk(fmt, args);
 614        va_end(args);
 615
 616        return r;
 617}
 618
 619/* cpu currently holding logbuf_lock */
 620static volatile unsigned int printk_cpu = UINT_MAX;
 621
 622/*
 623 * Can we actually use the console at this time on this cpu?
 624 *
 625 * Console drivers may assume that per-cpu resources have
 626 * been allocated. So unless they're explicitly marked as
 627 * being able to cope (CON_ANYTIME) don't call them until
 628 * this CPU is officially up.
 629 */
 630static inline int can_use_console(unsigned int cpu)
 631{
 632        return cpu_online(cpu) || have_callable_console();
 633}
 634
 635/*
 636 * Try to get console ownership to actually show the kernel
 637 * messages from a 'printk'. Return true (and with the
 638 * console_semaphore held, and 'console_locked' set) if it
 639 * is successful, false otherwise.
 640 *
 641 * This gets called with the 'logbuf_lock' spinlock held and
 642 * interrupts disabled. It should return with 'lockbuf_lock'
 643 * released but interrupts still disabled.
 644 */
 645static int acquire_console_semaphore_for_printk(unsigned int cpu)
 646{
 647        int retval = 0;
 648
 649        if (!try_acquire_console_sem()) {
 650                retval = 1;
 651
 652                /*
 653                 * If we can't use the console, we need to release
 654                 * the console semaphore by hand to avoid flushing
 655                 * the buffer. We need to hold the console semaphore
 656                 * in order to do this test safely.
 657                 */
 658                if (!can_use_console(cpu)) {
 659                        console_locked = 0;
 660                        up(&console_sem);
 661                        retval = 0;
 662                }
 663        }
 664        printk_cpu = UINT_MAX;
 665        spin_unlock(&logbuf_lock);
 666        return retval;
 667}
 668
 669static const char printk_recursion_bug_msg [] =
 670                        KERN_CRIT "BUG: recent printk recursion!\n";
 671static int printk_recursion_bug;
 672
 673asmlinkage int vprintk(const char *fmt, va_list args)
 674{
 675        static int log_level_unknown = 1;
 676        static char printk_buf[1024];
 677
 678        unsigned long flags;
 679        int printed_len = 0;
 680        int this_cpu;
 681        char *p;
 682
 683        boot_delay_msec();
 684
 685        preempt_disable();
 686        /* This stops the holder of console_sem just where we want him */
 687        raw_local_irq_save(flags);
 688        this_cpu = smp_processor_id();
 689
 690        /*
 691         * Ouch, printk recursed into itself!
 692         */
 693        if (unlikely(printk_cpu == this_cpu)) {
 694                /*
 695                 * If a crash is occurring during printk() on this CPU,
 696                 * then try to get the crash message out but make sure
 697                 * we can't deadlock. Otherwise just return to avoid the
 698                 * recursion and return - but flag the recursion so that
 699                 * it can be printed at the next appropriate moment:
 700                 */
 701                if (!oops_in_progress) {
 702                        printk_recursion_bug = 1;
 703                        goto out_restore_irqs;
 704                }
 705                zap_locks();
 706        }
 707
 708        lockdep_off();
 709        spin_lock(&logbuf_lock);
 710        printk_cpu = this_cpu;
 711
 712        if (printk_recursion_bug) {
 713                printk_recursion_bug = 0;
 714                strcpy(printk_buf, printk_recursion_bug_msg);
 715                printed_len = sizeof(printk_recursion_bug_msg);
 716        }
 717        /* Emit the output into the temporary buffer */
 718        printed_len += vscnprintf(printk_buf + printed_len,
 719                                  sizeof(printk_buf) - printed_len, fmt, args);
 720
 721        /*
 722         * Copy the output into log_buf.  If the caller didn't provide
 723         * appropriate log level tags, we insert them here
 724         */
 725        for (p = printk_buf; *p; p++) {
 726                if (log_level_unknown) {
 727                        /* log_level_unknown signals the start of a new line */
 728                        if (printk_time) {
 729                                int loglev_char;
 730                                char tbuf[50], *tp;
 731                                unsigned tlen;
 732                                unsigned long long t;
 733                                unsigned long nanosec_rem;
 734
 735                                /*
 736                                 * force the log level token to be
 737                                 * before the time output.
 738                                 */
 739                                if (p[0] == '<' && p[1] >='0' &&
 740                                   p[1] <= '7' && p[2] == '>') {
 741                                        loglev_char = p[1];
 742                                        p += 3;
 743                                        printed_len -= 3;
 744                                } else {
 745                                        loglev_char = default_message_loglevel
 746                                                + '0';
 747                                }
 748                                t = cpu_clock(printk_cpu);
 749                                nanosec_rem = do_div(t, 1000000000);
 750                                tlen = sprintf(tbuf,
 751                                                "<%c>[%5lu.%06lu] ",
 752                                                loglev_char,
 753                                                (unsigned long)t,
 754                                                nanosec_rem/1000);
 755
 756                                for (tp = tbuf; tp < tbuf + tlen; tp++)
 757                                        emit_log_char(*tp);
 758                                printed_len += tlen;
 759                        } else {
 760                                if (p[0] != '<' || p[1] < '0' ||
 761                                   p[1] > '7' || p[2] != '>') {
 762                                        emit_log_char('<');
 763                                        emit_log_char(default_message_loglevel
 764                                                + '0');
 765                                        emit_log_char('>');
 766                                        printed_len += 3;
 767                                }
 768                        }
 769                        log_level_unknown = 0;
 770                        if (!*p)
 771                                break;
 772                }
 773                emit_log_char(*p);
 774                if (*p == '\n')
 775                        log_level_unknown = 1;
 776        }
 777
 778        /*
 779         * Try to acquire and then immediately release the
 780         * console semaphore. The release will do all the
 781         * actual magic (print out buffers, wake up klogd,
 782         * etc). 
 783         *
 784         * The acquire_console_semaphore_for_printk() function
 785         * will release 'logbuf_lock' regardless of whether it
 786         * actually gets the semaphore or not.
 787         */
 788        if (acquire_console_semaphore_for_printk(this_cpu))
 789                release_console_sem();
 790
 791        lockdep_on();
 792out_restore_irqs:
 793        raw_local_irq_restore(flags);
 794
 795        preempt_enable();
 796        return printed_len;
 797}
 798EXPORT_SYMBOL(printk);
 799EXPORT_SYMBOL(vprintk);
 800
 801#else
 802
 803asmlinkage long sys_syslog(int type, char __user *buf, int len)
 804{
 805        return -ENOSYS;
 806}
 807
 808static void call_console_drivers(unsigned start, unsigned end)
 809{
 810}
 811
 812#endif
 813
 814static int __add_preferred_console(char *name, int idx, char *options,
 815                                   char *brl_options)
 816{
 817        struct console_cmdline *c;
 818        int i;
 819
 820        /*
 821         *      See if this tty is not yet registered, and
 822         *      if we have a slot free.
 823         */
 824        for (i = 0; i < MAX_CMDLINECONSOLES && console_cmdline[i].name[0]; i++)
 825                if (strcmp(console_cmdline[i].name, name) == 0 &&
 826                          console_cmdline[i].index == idx) {
 827                                if (!brl_options)
 828                                        selected_console = i;
 829                                return 0;
 830                }
 831        if (i == MAX_CMDLINECONSOLES)
 832                return -E2BIG;
 833        if (!brl_options)
 834                selected_console = i;
 835        c = &console_cmdline[i];
 836        strlcpy(c->name, name, sizeof(c->name));
 837        c->options = options;
 838#ifdef CONFIG_A11Y_BRAILLE_CONSOLE
 839        c->brl_options = brl_options;
 840#endif
 841        c->index = idx;
 842        return 0;
 843}
 844/*
 845 * Set up a list of consoles.  Called from init/main.c
 846 */
 847static int __init console_setup(char *str)
 848{
 849        char buf[sizeof(console_cmdline[0].name) + 4]; /* 4 for index */
 850        char *s, *options, *brl_options = NULL;
 851        int idx;
 852
 853#ifdef CONFIG_A11Y_BRAILLE_CONSOLE
 854        if (!memcmp(str, "brl,", 4)) {
 855                brl_options = "";
 856                str += 4;
 857        } else if (!memcmp(str, "brl=", 4)) {
 858                brl_options = str + 4;
 859                str = strchr(brl_options, ',');
 860                if (!str) {
 861                        printk(KERN_ERR "need port name after brl=\n");
 862                        return 1;
 863                }
 864                *(str++) = 0;
 865        }
 866#endif
 867
 868        /*
 869         * Decode str into name, index, options.
 870         */
 871        if (str[0] >= '0' && str[0] <= '9') {
 872                strcpy(buf, "ttyS");
 873                strncpy(buf + 4, str, sizeof(buf) - 5);
 874        } else {
 875                strncpy(buf, str, sizeof(buf) - 1);
 876        }
 877        buf[sizeof(buf) - 1] = 0;
 878        if ((options = strchr(str, ',')) != NULL)
 879                *(options++) = 0;
 880#ifdef __sparc__
 881        if (!strcmp(str, "ttya"))
 882                strcpy(buf, "ttyS0");
 883        if (!strcmp(str, "ttyb"))
 884                strcpy(buf, "ttyS1");
 885#endif
 886        for (s = buf; *s; s++)
 887                if ((*s >= '0' && *s <= '9') || *s == ',')
 888                        break;
 889        idx = simple_strtoul(s, NULL, 10);
 890        *s = 0;
 891
 892        __add_preferred_console(buf, idx, options, brl_options);
 893        return 1;
 894}
 895__setup("console=", console_setup);
 896
 897/**
 898 * add_preferred_console - add a device to the list of preferred consoles.
 899 * @name: device name
 900 * @idx: device index
 901 * @options: options for this console
 902 *
 903 * The last preferred console added will be used for kernel messages
 904 * and stdin/out/err for init.  Normally this is used by console_setup
 905 * above to handle user-supplied console arguments; however it can also
 906 * be used by arch-specific code either to override the user or more
 907 * commonly to provide a default console (ie from PROM variables) when
 908 * the user has not supplied one.
 909 */
 910int add_preferred_console(char *name, int idx, char *options)
 911{
 912        return __add_preferred_console(name, idx, options, NULL);
 913}
 914
 915int update_console_cmdline(char *name, int idx, char *name_new, int idx_new, char *options)
 916{
 917        struct console_cmdline *c;
 918        int i;
 919
 920        for (i = 0; i < MAX_CMDLINECONSOLES && console_cmdline[i].name[0]; i++)
 921                if (strcmp(console_cmdline[i].name, name) == 0 &&
 922                          console_cmdline[i].index == idx) {
 923                                c = &console_cmdline[i];
 924                                strlcpy(c->name, name_new, sizeof(c->name));
 925                                c->name[sizeof(c->name) - 1] = 0;
 926                                c->options = options;
 927                                c->index = idx_new;
 928                                return i;
 929                }
 930        /* not found */
 931        return -1;
 932}
 933
 934int console_suspend_enabled = 1;
 935EXPORT_SYMBOL(console_suspend_enabled);
 936
 937static int __init console_suspend_disable(char *str)
 938{
 939        console_suspend_enabled = 0;
 940        return 1;
 941}
 942__setup("no_console_suspend", console_suspend_disable);
 943
 944/**
 945 * suspend_console - suspend the console subsystem
 946 *
 947 * This disables printk() while we go into suspend states
 948 */
 949void suspend_console(void)
 950{
 951        if (!console_suspend_enabled)
 952                return;
 953        printk("Suspending console(s)\n");
 954        acquire_console_sem();
 955        console_suspended = 1;
 956}
 957
 958void resume_console(void)
 959{
 960        if (!console_suspend_enabled)
 961                return;
 962        console_suspended = 0;
 963        release_console_sem();
 964}
 965
 966/**
 967 * acquire_console_sem - lock the console system for exclusive use.
 968 *
 969 * Acquires a semaphore which guarantees that the caller has
 970 * exclusive access to the console system and the console_drivers list.
 971 *
 972 * Can sleep, returns nothing.
 973 */
 974void acquire_console_sem(void)
 975{
 976        BUG_ON(in_interrupt());
 977        if (console_suspended) {
 978                down(&secondary_console_sem);
 979                return;
 980        }
 981        down(&console_sem);
 982        console_locked = 1;
 983        console_may_schedule = 1;
 984}
 985EXPORT_SYMBOL(acquire_console_sem);
 986
 987int try_acquire_console_sem(void)
 988{
 989        if (down_trylock(&console_sem))
 990                return -1;
 991        console_locked = 1;
 992        console_may_schedule = 0;
 993        return 0;
 994}
 995EXPORT_SYMBOL(try_acquire_console_sem);
 996
 997int is_console_locked(void)
 998{
 999        return console_locked;
1000}
1001
1002void wake_up_klogd(void)
1003{
1004        if (!oops_in_progress && waitqueue_active(&log_wait))
1005                wake_up_interruptible(&log_wait);
1006}
1007
1008/**
1009 * release_console_sem - unlock the console system
1010 *
1011 * Releases the semaphore which the caller holds on the console system
1012 * and the console driver list.
1013 *
1014 * While the semaphore was held, console output may have been buffered
1015 * by printk().  If this is the case, release_console_sem() emits
1016 * the output prior to releasing the semaphore.
1017 *
1018 * If there is output waiting for klogd, we wake it up.
1019 *
1020 * release_console_sem() may be called from any context.
1021 */
1022void release_console_sem(void)
1023{
1024        unsigned long flags;
1025        unsigned _con_start, _log_end;
1026        unsigned wake_klogd = 0;
1027
1028        if (console_suspended) {
1029                up(&secondary_console_sem);
1030                return;
1031        }
1032
1033        console_may_schedule = 0;
1034
1035        for ( ; ; ) {
1036                spin_lock_irqsave(&logbuf_lock, flags);
1037                wake_klogd |= log_start - log_end;
1038                if (con_start == log_end)
1039                        break;                  /* Nothing to print */
1040                _con_start = con_start;
1041                _log_end = log_end;
1042                con_start = log_end;            /* Flush */
1043                spin_unlock(&logbuf_lock);
1044                call_console_drivers(_con_start, _log_end);
1045                local_irq_restore(flags);
1046        }
1047        console_locked = 0;
1048        up(&console_sem);
1049        spin_unlock_irqrestore(&logbuf_lock, flags);
1050        if (wake_klogd)
1051                wake_up_klogd();
1052}
1053EXPORT_SYMBOL(release_console_sem);
1054
1055/**
1056 * console_conditional_schedule - yield the CPU if required
1057 *
1058 * If the console code is currently allowed to sleep, and
1059 * if this CPU should yield the CPU to another task, do
1060 * so here.
1061 *
1062 * Must be called within acquire_console_sem().
1063 */
1064void __sched console_conditional_schedule(void)
1065{
1066        if (console_may_schedule)
1067                cond_resched();
1068}
1069EXPORT_SYMBOL(console_conditional_schedule);
1070
1071void console_print(const char *s)
1072{
1073        printk(KERN_EMERG "%s", s);
1074}
1075EXPORT_SYMBOL(console_print);
1076
1077void console_unblank(void)
1078{
1079        struct console *c;
1080
1081        /*
1082         * console_unblank can no longer be called in interrupt context unless
1083         * oops_in_progress is set to 1..
1084         */
1085        if (oops_in_progress) {
1086                if (down_trylock(&console_sem) != 0)
1087                        return;
1088        } else
1089                acquire_console_sem();
1090
1091        console_locked = 1;
1092        console_may_schedule = 0;
1093        for (c = console_drivers; c != NULL; c = c->next)
1094                if ((c->flags & CON_ENABLED) && c->unblank)
1095                        c->unblank();
1096        release_console_sem();
1097}
1098
1099/*
1100 * Return the console tty driver structure and its associated index
1101 */
1102struct tty_driver *console_device(int *index)
1103{
1104        struct console *c;
1105        struct tty_driver *driver = NULL;
1106
1107        acquire_console_sem();
1108        for (c = console_drivers; c != NULL; c = c->next) {
1109                if (!c->device)
1110                        continue;
1111                driver = c->device(c, index);
1112                if (driver)
1113                        break;
1114        }
1115        release_console_sem();
1116        return driver;
1117}
1118
1119/*
1120 * Prevent further output on the passed console device so that (for example)
1121 * serial drivers can disable console output before suspending a port, and can
1122 * re-enable output afterwards.
1123 */
1124void console_stop(struct console *console)
1125{
1126        acquire_console_sem();
1127        console->flags &= ~CON_ENABLED;
1128        release_console_sem();
1129}
1130EXPORT_SYMBOL(console_stop);
1131
1132void console_start(struct console *console)
1133{
1134        acquire_console_sem();
1135        console->flags |= CON_ENABLED;
1136        release_console_sem();
1137}
1138EXPORT_SYMBOL(console_start);
1139
1140/*
1141 * The console driver calls this routine during kernel initialization
1142 * to register the console printing procedure with printk() and to
1143 * print any messages that were printed by the kernel before the
1144 * console driver was initialized.
1145 */
1146void register_console(struct console *console)
1147{
1148        int i;
1149        unsigned long flags;
1150        struct console *bootconsole = NULL;
1151
1152        if (console_drivers) {
1153                if (console->flags & CON_BOOT)
1154                        return;
1155                if (console_drivers->flags & CON_BOOT)
1156                        bootconsole = console_drivers;
1157        }
1158
1159        if (preferred_console < 0 || bootconsole || !console_drivers)
1160                preferred_console = selected_console;
1161
1162        if (console->early_setup)
1163                console->early_setup();
1164
1165        /*
1166         *      See if we want to use this console driver. If we
1167         *      didn't select a console we take the first one
1168         *      that registers here.
1169         */
1170        if (preferred_console < 0) {
1171                if (console->index < 0)
1172                        console->index = 0;
1173                if (console->setup == NULL ||
1174                    console->setup(console, NULL) == 0) {
1175                        console->flags |= CON_ENABLED | CON_CONSDEV;
1176                        preferred_console = 0;
1177                }
1178        }
1179
1180        /*
1181         *      See if this console matches one we selected on
1182         *      the command line.
1183         */
1184        for (i = 0; i < MAX_CMDLINECONSOLES && console_cmdline[i].name[0];
1185                        i++) {
1186                if (strcmp(console_cmdline[i].name, console->name) != 0)
1187                        continue;
1188                if (console->index >= 0 &&
1189                    console->index != console_cmdline[i].index)
1190                        continue;
1191                if (console->index < 0)
1192                        console->index = console_cmdline[i].index;
1193#ifdef CONFIG_A11Y_BRAILLE_CONSOLE
1194                if (console_cmdline[i].brl_options) {
1195                        console->flags |= CON_BRL;
1196                        braille_register_console(console,
1197                                        console_cmdline[i].index,
1198                                        console_cmdline[i].options,
1199                                        console_cmdline[i].brl_options);
1200                        return;
1201                }
1202#endif
1203                if (console->setup &&
1204                    console->setup(console, console_cmdline[i].options) != 0)
1205                        break;
1206                console->flags |= CON_ENABLED;
1207                console->index = console_cmdline[i].index;
1208                if (i == selected_console) {
1209                        console->flags |= CON_CONSDEV;
1210                        preferred_console = selected_console;
1211                }
1212                break;
1213        }
1214
1215        if (!(console->flags & CON_ENABLED))
1216                return;
1217
1218        if (bootconsole && (console->flags & CON_CONSDEV)) {
1219                printk(KERN_INFO "console handover: boot [%s%d] -> real [%s%d]\n",
1220                       bootconsole->name, bootconsole->index,
1221                       console->name, console->index);
1222                unregister_console(bootconsole);
1223                console->flags &= ~CON_PRINTBUFFER;
1224        } else {
1225                printk(KERN_INFO "console [%s%d] enabled\n",
1226                       console->name, console->index);
1227        }
1228
1229        /*
1230         *      Put this console in the list - keep the
1231         *      preferred driver at the head of the list.
1232         */
1233        acquire_console_sem();
1234        if ((console->flags & CON_CONSDEV) || console_drivers == NULL) {
1235                console->next = console_drivers;
1236                console_drivers = console;
1237                if (console->next)
1238                        console->next->flags &= ~CON_CONSDEV;
1239        } else {
1240                console->next = console_drivers->next;
1241                console_drivers->next = console;
1242        }
1243        if (console->flags & CON_PRINTBUFFER) {
1244                /*
1245                 * release_console_sem() will print out the buffered messages
1246                 * for us.
1247                 */
1248                spin_lock_irqsave(&logbuf_lock, flags);
1249                con_start = log_start;
1250                spin_unlock_irqrestore(&logbuf_lock, flags);
1251        }
1252        release_console_sem();
1253}
1254EXPORT_SYMBOL(register_console);
1255
1256int unregister_console(struct console *console)
1257{
1258        struct console *a, *b;
1259        int res = 1;
1260
1261#ifdef CONFIG_A11Y_BRAILLE_CONSOLE
1262        if (console->flags & CON_BRL)
1263                return braille_unregister_console(console);
1264#endif
1265
1266        acquire_console_sem();
1267        if (console_drivers == console) {
1268                console_drivers=console->next;
1269                res = 0;
1270        } else if (console_drivers) {
1271                for (a=console_drivers->next, b=console_drivers ;
1272                     a; b=a, a=b->next) {
1273                        if (a == console) {
1274                                b->next = a->next;
1275                                res = 0;
1276                                break;
1277                        }
1278                }
1279        }
1280
1281        /*
1282         * If this isn't the last console and it has CON_CONSDEV set, we
1283         * need to set it on the next preferred console.
1284         */
1285        if (console_drivers != NULL && console->flags & CON_CONSDEV)
1286                console_drivers->flags |= CON_CONSDEV;
1287
1288        release_console_sem();
1289        return res;
1290}
1291EXPORT_SYMBOL(unregister_console);
1292
1293static int __init disable_boot_consoles(void)
1294{
1295        if (console_drivers != NULL) {
1296                if (console_drivers->flags & CON_BOOT) {
1297                        printk(KERN_INFO "turn off boot console %s%d\n",
1298                                console_drivers->name, console_drivers->index);
1299                        return unregister_console(console_drivers);
1300                }
1301        }
1302        return 0;
1303}
1304late_initcall(disable_boot_consoles);
1305
1306/**
1307 * tty_write_message - write a message to a certain tty, not just the console.
1308 * @tty: the destination tty_struct
1309 * @msg: the message to write
1310 *
1311 * This is used for messages that need to be redirected to a specific tty.
1312 * We don't put it into the syslog queue right now maybe in the future if
1313 * really needed.
1314 */
1315void tty_write_message(struct tty_struct *tty, char *msg)
1316{
1317        if (tty && tty->ops->write)
1318                tty->ops->write(tty, msg, strlen(msg));
1319        return;
1320}
1321
1322#if defined CONFIG_PRINTK
1323/*
1324 * printk rate limiting, lifted from the networking subsystem.
1325 *
1326 * This enforces a rate limit: not more than one kernel message
1327 * every printk_ratelimit_jiffies to make a denial-of-service
1328 * attack impossible.
1329 */
1330int __printk_ratelimit(int ratelimit_jiffies, int ratelimit_burst)
1331{
1332        return __ratelimit(ratelimit_jiffies, ratelimit_burst);
1333}
1334EXPORT_SYMBOL(__printk_ratelimit);
1335
1336/* minimum time in jiffies between messages */
1337int printk_ratelimit_jiffies = 5 * HZ;
1338
1339/* number of messages we send before ratelimiting */
1340int printk_ratelimit_burst = 10;
1341
1342int printk_ratelimit(void)
1343{
1344        return __printk_ratelimit(printk_ratelimit_jiffies,
1345                                printk_ratelimit_burst);
1346}
1347EXPORT_SYMBOL(printk_ratelimit);
1348
1349/**
1350 * printk_timed_ratelimit - caller-controlled printk ratelimiting
1351 * @caller_jiffies: pointer to caller's state
1352 * @interval_msecs: minimum interval between prints
1353 *
1354 * printk_timed_ratelimit() returns true if more than @interval_msecs
1355 * milliseconds have elapsed since the last time printk_timed_ratelimit()
1356 * returned true.
1357 */
1358bool printk_timed_ratelimit(unsigned long *caller_jiffies,
1359                        unsigned int interval_msecs)
1360{
1361        if (*caller_jiffies == 0 || time_after(jiffies, *caller_jiffies)) {
1362                *caller_jiffies = jiffies + msecs_to_jiffies(interval_msecs);
1363                return true;
1364        }
1365        return false;
1366}
1367EXPORT_SYMBOL(printk_timed_ratelimit);
1368#endif
1369
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.