1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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>
30#include <linux/delay.h>
31#include <linux/smp.h>
32#include <linux/security.h>
33#include <linux/bootmem.h>
34#include <linux/memblock.h>
35#include <linux/syscalls.h>
36#include <linux/kexec.h>
37#include <linux/kdb.h>
38#include <linux/ratelimit.h>
39#include <linux/kmsg_dump.h>
40#include <linux/syslog.h>
41#include <linux/cpu.h>
42#include <linux/notifier.h>
43#include <linux/rculist.h>
44#include <linux/poll.h>
45
46#include <asm/uaccess.h>
47
48#define CREATE_TRACE_POINTS
49#include <trace/events/printk.h>
50
51
52
53
54void asmlinkage __attribute__((weak)) early_printk(const char *fmt, ...)
55{
56}
57
58
59#define DEFAULT_MESSAGE_LOGLEVEL CONFIG_DEFAULT_MESSAGE_LOGLEVEL
60
61
62#define MINIMUM_CONSOLE_LOGLEVEL 1
63#define DEFAULT_CONSOLE_LOGLEVEL 7
64
65DECLARE_WAIT_QUEUE_HEAD(log_wait);
66
67int console_printk[4] = {
68 DEFAULT_CONSOLE_LOGLEVEL,
69 DEFAULT_MESSAGE_LOGLEVEL,
70 MINIMUM_CONSOLE_LOGLEVEL,
71 DEFAULT_CONSOLE_LOGLEVEL,
72};
73
74
75
76
77
78int oops_in_progress;
79EXPORT_SYMBOL(oops_in_progress);
80
81
82
83
84
85
86static DEFINE_SEMAPHORE(console_sem);
87struct console *console_drivers;
88EXPORT_SYMBOL_GPL(console_drivers);
89
90
91
92
93
94
95
96
97
98static int console_locked, console_suspended;
99
100
101
102
103static struct console *exclusive_console;
104
105
106
107
108struct console_cmdline
109{
110 char name[8];
111 int index;
112 char *options;
113#ifdef CONFIG_A11Y_BRAILLE_CONSOLE
114 char *brl_options;
115#endif
116};
117
118#define MAX_CMDLINECONSOLES 8
119
120static struct console_cmdline console_cmdline[MAX_CMDLINECONSOLES];
121static int selected_console = -1;
122static int preferred_console = -1;
123int console_set_on_cmdline;
124EXPORT_SYMBOL(console_set_on_cmdline);
125
126
127static int console_may_schedule;
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196enum log_flags {
197 LOG_NOCONS = 1,
198 LOG_NEWLINE = 2,
199 LOG_PREFIX = 4,
200 LOG_CONT = 8,
201};
202
203struct log {
204 u64 ts_nsec;
205 u16 len;
206 u16 text_len;
207 u16 dict_len;
208 u8 facility;
209 u8 flags:5;
210 u8 level:3;
211};
212
213
214
215
216
217static DEFINE_RAW_SPINLOCK(logbuf_lock);
218
219#ifdef CONFIG_PRINTK
220
221static u64 syslog_seq;
222static u32 syslog_idx;
223static enum log_flags syslog_prev;
224static size_t syslog_partial;
225
226
227static u64 log_first_seq;
228static u32 log_first_idx;
229
230
231static u64 log_next_seq;
232static u32 log_next_idx;
233
234
235static u64 console_seq;
236static u32 console_idx;
237static enum log_flags console_prev;
238
239
240static u64 clear_seq;
241static u32 clear_idx;
242
243#define PREFIX_MAX 32
244#define LOG_LINE_MAX 1024 - PREFIX_MAX
245
246
247#if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS)
248#define LOG_ALIGN 4
249#else
250#define LOG_ALIGN __alignof__(struct log)
251#endif
252#define __LOG_BUF_LEN (1 << CONFIG_LOG_BUF_SHIFT)
253static char __log_buf[__LOG_BUF_LEN] __aligned(LOG_ALIGN);
254static char *log_buf = __log_buf;
255static u32 log_buf_len = __LOG_BUF_LEN;
256
257
258static volatile unsigned int logbuf_cpu = UINT_MAX;
259
260
261static char *log_text(const struct log *msg)
262{
263 return (char *)msg + sizeof(struct log);
264}
265
266
267static char *log_dict(const struct log *msg)
268{
269 return (char *)msg + sizeof(struct log) + msg->text_len;
270}
271
272
273static struct log *log_from_idx(u32 idx)
274{
275 struct log *msg = (struct log *)(log_buf + idx);
276
277
278
279
280
281 if (!msg->len)
282 return (struct log *)log_buf;
283 return msg;
284}
285
286
287static u32 log_next(u32 idx)
288{
289 struct log *msg = (struct log *)(log_buf + idx);
290
291
292
293
294
295
296
297 if (!msg->len) {
298 msg = (struct log *)log_buf;
299 return msg->len;
300 }
301 return idx + msg->len;
302}
303
304
305static void log_store(int facility, int level,
306 enum log_flags flags, u64 ts_nsec,
307 const char *dict, u16 dict_len,
308 const char *text, u16 text_len)
309{
310 struct log *msg;
311 u32 size, pad_len;
312
313
314 size = sizeof(struct log) + text_len + dict_len;
315 pad_len = (-size) & (LOG_ALIGN - 1);
316 size += pad_len;
317
318 while (log_first_seq < log_next_seq) {
319 u32 free;
320
321 if (log_next_idx > log_first_idx)
322 free = max(log_buf_len - log_next_idx, log_first_idx);
323 else
324 free = log_first_idx - log_next_idx;
325
326 if (free > size + sizeof(struct log))
327 break;
328
329
330 log_first_idx = log_next(log_first_idx);
331 log_first_seq++;
332 }
333
334 if (log_next_idx + size + sizeof(struct log) >= log_buf_len) {
335
336
337
338
339
340 memset(log_buf + log_next_idx, 0, sizeof(struct log));
341 log_next_idx = 0;
342 }
343
344
345 msg = (struct log *)(log_buf + log_next_idx);
346 memcpy(log_text(msg), text, text_len);
347 msg->text_len = text_len;
348 memcpy(log_dict(msg), dict, dict_len);
349 msg->dict_len = dict_len;
350 msg->facility = facility;
351 msg->level = level & 7;
352 msg->flags = flags & 0x1f;
353 if (ts_nsec > 0)
354 msg->ts_nsec = ts_nsec;
355 else
356 msg->ts_nsec = local_clock();
357 memset(log_dict(msg) + dict_len, 0, pad_len);
358 msg->len = sizeof(struct log) + text_len + dict_len + pad_len;
359
360
361 log_next_idx += msg->len;
362 log_next_seq++;
363}
364
365
366struct devkmsg_user {
367 u64 seq;
368 u32 idx;
369 enum log_flags prev;
370 struct mutex lock;
371 char buf[8192];
372};
373
374static ssize_t devkmsg_writev(struct kiocb *iocb, const struct iovec *iv,
375 unsigned long count, loff_t pos)
376{
377 char *buf, *line;
378 int i;
379 int level = default_message_loglevel;
380 int facility = 1;
381 size_t len = iov_length(iv, count);
382 ssize_t ret = len;
383
384 if (len > LOG_LINE_MAX)
385 return -EINVAL;
386 buf = kmalloc(len+1, GFP_KERNEL);
387 if (buf == NULL)
388 return -ENOMEM;
389
390 line = buf;
391 for (i = 0; i < count; i++) {
392 if (copy_from_user(line, iv[i].iov_base, iv[i].iov_len)) {
393 ret = -EFAULT;
394 goto out;
395 }
396 line += iv[i].iov_len;
397 }
398
399
400
401
402
403
404
405
406
407
408 line = buf;
409 if (line[0] == '<') {
410 char *endp = NULL;
411
412 i = simple_strtoul(line+1, &endp, 10);
413 if (endp && endp[0] == '>') {
414 level = i & 7;
415 if (i >> 3)
416 facility = i >> 3;
417 endp++;
418 len -= endp - line;
419 line = endp;
420 }
421 }
422 line[len] = '\0';
423
424 printk_emit(facility, level, NULL, 0, "%s", line);
425out:
426 kfree(buf);
427 return ret;
428}
429
430static ssize_t devkmsg_read(struct file *file, char __user *buf,
431 size_t count, loff_t *ppos)
432{
433 struct devkmsg_user *user = file->private_data;
434 struct log *msg;
435 u64 ts_usec;
436 size_t i;
437 char cont = '-';
438 size_t len;
439 ssize_t ret;
440
441 if (!user)
442 return -EBADF;
443
444 ret = mutex_lock_interruptible(&user->lock);
445 if (ret)
446 return ret;
447 raw_spin_lock_irq(&logbuf_lock);
448 while (user->seq == log_next_seq) {
449 if (file->f_flags & O_NONBLOCK) {
450 ret = -EAGAIN;
451 raw_spin_unlock_irq(&logbuf_lock);
452 goto out;
453 }
454
455 raw_spin_unlock_irq(&logbuf_lock);
456 ret = wait_event_interruptible(log_wait,
457 user->seq != log_next_seq);
458 if (ret)
459 goto out;
460 raw_spin_lock_irq(&logbuf_lock);
461 }
462
463 if (user->seq < log_first_seq) {
464
465 user->idx = log_first_idx;
466 user->seq = log_first_seq;
467 ret = -EPIPE;
468 raw_spin_unlock_irq(&logbuf_lock);
469 goto out;
470 }
471
472 msg = log_from_idx(user->idx);
473 ts_usec = msg->ts_nsec;
474 do_div(ts_usec, 1000);
475
476
477
478
479
480
481
482
483
484 if (msg->flags & LOG_CONT && !(user->prev & LOG_CONT))
485 cont = 'c';
486 else if ((msg->flags & LOG_CONT) ||
487 ((user->prev & LOG_CONT) && !(msg->flags & LOG_PREFIX)))
488 cont = '+';
489
490 len = sprintf(user->buf, "%u,%llu,%llu,%c;",
491 (msg->facility << 3) | msg->level,
492 user->seq, ts_usec, cont);
493 user->prev = msg->flags;
494
495
496 for (i = 0; i < msg->text_len; i++) {
497 unsigned char c = log_text(msg)[i];
498
499 if (c < ' ' || c >= 127 || c == '\\')
500 len += sprintf(user->buf + len, "\\x%02x", c);
501 else
502 user->buf[len++] = c;
503 }
504 user->buf[len++] = '\n';
505
506 if (msg->dict_len) {
507 bool line = true;
508
509 for (i = 0; i < msg->dict_len; i++) {
510 unsigned char c = log_dict(msg)[i];
511
512 if (line) {
513 user->buf[len++] = ' ';
514 line = false;
515 }
516
517 if (c == '\0') {
518 user->buf[len++] = '\n';
519 line = true;
520 continue;
521 }
522
523 if (c < ' ' || c >= 127 || c == '\\') {
524 len += sprintf(user->buf + len, "\\x%02x", c);
525 continue;
526 }
527
528 user->buf[len++] = c;
529 }
530 user->buf[len++] = '\n';
531 }
532
533 user->idx = log_next(user->idx);
534 user->seq++;
535 raw_spin_unlock_irq(&logbuf_lock);
536
537 if (len > count) {
538 ret = -EINVAL;
539 goto out;
540 }
541
542 if (copy_to_user(buf, user->buf, len)) {
543 ret = -EFAULT;
544 goto out;
545 }
546 ret = len;
547out:
548 mutex_unlock(&user->lock);
549 return ret;
550}
551
552static loff_t devkmsg_llseek(struct file *file, loff_t offset, int whence)
553{
554 struct devkmsg_user *user = file->private_data;
555 loff_t ret = 0;
556
557 if (!user)
558 return -EBADF;
559 if (offset)
560 return -ESPIPE;
561
562 raw_spin_lock_irq(&logbuf_lock);
563 switch (whence) {
564 case SEEK_SET:
565
566 user->idx = log_first_idx;
567 user->seq = log_first_seq;
568 break;
569 case SEEK_DATA:
570
571
572
573
574
575 user->idx = clear_idx;
576 user->seq = clear_seq;
577 break;
578 case SEEK_END:
579
580 user->idx = log_next_idx;
581 user->seq = log_next_seq;
582 break;
583 default:
584 ret = -EINVAL;
585 }
586 raw_spin_unlock_irq(&logbuf_lock);
587 return ret;
588}
589
590static unsigned int devkmsg_poll(struct file *file, poll_table *wait)
591{
592 struct devkmsg_user *user = file->private_data;
593 int ret = 0;
594
595 if (!user)
596 return POLLERR|POLLNVAL;
597
598 poll_wait(file, &log_wait, wait);
599
600 raw_spin_lock_irq(&logbuf_lock);
601 if (user->seq < log_next_seq) {
602
603 if (user->seq < log_first_seq)
604 ret = POLLIN|POLLRDNORM|POLLERR|POLLPRI;
605 ret = POLLIN|POLLRDNORM;
606 }
607 raw_spin_unlock_irq(&logbuf_lock);
608
609 return ret;
610}
611
612static int devkmsg_open(struct inode *inode, struct file *file)
613{
614 struct devkmsg_user *user;
615 int err;
616
617
618 if ((file->f_flags & O_ACCMODE) == O_WRONLY)
619 return 0;
620
621 err = security_syslog(SYSLOG_ACTION_READ_ALL);
622 if (err)
623 return err;
624
625 user = kmalloc(sizeof(struct devkmsg_user), GFP_KERNEL);
626 if (!user)
627 return -ENOMEM;
628
629 mutex_init(&user->lock);
630
631 raw_spin_lock_irq(&logbuf_lock);
632 user->idx = log_first_idx;
633 user->seq = log_first_seq;
634 raw_spin_unlock_irq(&logbuf_lock);
635
636 file->private_data = user;
637 return 0;
638}
639
640static int devkmsg_release(struct inode *inode, struct file *file)
641{
642 struct devkmsg_user *user = file->private_data;
643
644 if (!user)
645 return 0;
646
647 mutex_destroy(&user->lock);
648 kfree(user);
649 return 0;
650}
651
652const struct file_operations kmsg_fops = {
653 .open = devkmsg_open,
654 .read = devkmsg_read,
655 .aio_write = devkmsg_writev,
656 .llseek = devkmsg_llseek,
657 .poll = devkmsg_poll,
658 .release = devkmsg_release,
659};
660
661#ifdef CONFIG_KEXEC
662
663
664
665
666
667
668
669
670void log_buf_kexec_setup(void)
671{
672 VMCOREINFO_SYMBOL(log_buf);
673 VMCOREINFO_SYMBOL(log_buf_len);
674 VMCOREINFO_SYMBOL(log_first_idx);
675 VMCOREINFO_SYMBOL(log_next_idx);
676
677
678
679
680 VMCOREINFO_STRUCT_SIZE(log);
681 VMCOREINFO_OFFSET(log, ts_nsec);
682 VMCOREINFO_OFFSET(log, len);
683 VMCOREINFO_OFFSET(log, text_len);
684 VMCOREINFO_OFFSET(log, dict_len);
685}
686#endif
687
688
689static unsigned long __initdata new_log_buf_len;
690
691
692static int __init log_buf_len_setup(char *str)
693{
694 unsigned size = memparse(str, &str);
695
696 if (size)
697 size = roundup_pow_of_two(size);
698 if (size > log_buf_len)
699 new_log_buf_len = size;
700
701 return 0;
702}
703early_param("log_buf_len", log_buf_len_setup);
704
705void __init setup_log_buf(int early)
706{
707 unsigned long flags;
708 char *new_log_buf;
709 int free;
710
711 if (!new_log_buf_len)
712 return;
713
714 if (early) {
715 unsigned long mem;
716
717 mem = memblock_alloc(new_log_buf_len, PAGE_SIZE);
718 if (!mem)
719 return;
720 new_log_buf = __va(mem);
721 } else {
722 new_log_buf = alloc_bootmem_nopanic(new_log_buf_len);
723 }
724
725 if (unlikely(!new_log_buf)) {
726 pr_err("log_buf_len: %ld bytes not available\n",
727 new_log_buf_len);
728 return;
729 }
730
731 raw_spin_lock_irqsave(&logbuf_lock, flags);
732 log_buf_len = new_log_buf_len;
733 log_buf = new_log_buf;
734 new_log_buf_len = 0;
735 free = __LOG_BUF_LEN - log_next_idx;
736 memcpy(log_buf, __log_buf, __LOG_BUF_LEN);
737 raw_spin_unlock_irqrestore(&logbuf_lock, flags);
738
739 pr_info("log_buf_len: %d\n", log_buf_len);
740 pr_info("early log buf free: %d(%d%%)\n",
741 free, (free * 100) / __LOG_BUF_LEN);
742}
743
744#ifdef CONFIG_BOOT_PRINTK_DELAY
745
746static int boot_delay;
747static unsigned long long loops_per_msec;
748
749static int __init boot_delay_setup(char *str)
750{
751 unsigned long lpj;
752
753 lpj = preset_lpj ? preset_lpj : 1000000;
754 loops_per_msec = (unsigned long long)lpj / 1000 * HZ;
755
756 get_option(&str, &boot_delay);
757 if (boot_delay > 10 * 1000)
758 boot_delay = 0;
759
760 pr_debug("boot_delay: %u, preset_lpj: %ld, lpj: %lu, "
761 "HZ: %d, loops_per_msec: %llu\n",
762 boot_delay, preset_lpj, lpj, HZ, loops_per_msec);
763 return 1;
764}
765__setup("boot_delay=", boot_delay_setup);
766
767static void boot_delay_msec(void)
768{
769 unsigned long long k;
770 unsigned long timeout;
771
772 if (boot_delay == 0 || system_state != SYSTEM_BOOTING)
773 return;
774
775 k = (unsigned long long)loops_per_msec * boot_delay;
776
777 timeout = jiffies + msecs_to_jiffies(boot_delay);
778 while (k) {
779 k--;
780 cpu_relax();
781
782
783
784
785
786 if (time_after(jiffies, timeout))
787 break;
788 touch_nmi_watchdog();
789 }
790}
791#else
792static inline void boot_delay_msec(void)
793{
794}
795#endif
796
797#ifdef CONFIG_SECURITY_DMESG_RESTRICT
798int dmesg_restrict = 1;
799#else
800int dmesg_restrict;
801#endif
802
803static int syslog_action_restricted(int type)
804{
805 if (dmesg_restrict)
806 return 1;
807
808 return type != SYSLOG_ACTION_READ_ALL && type != SYSLOG_ACTION_SIZE_BUFFER;
809}
810
811static int check_syslog_permissions(int type, bool from_file)
812{
813
814
815
816
817 if (from_file && type != SYSLOG_ACTION_OPEN)
818 return 0;
819
820 if (syslog_action_restricted(type)) {
821 if (capable(CAP_SYSLOG))
822 return 0;
823
824 if (capable(CAP_SYS_ADMIN)) {
825 printk_once(KERN_WARNING "%s (%d): "
826 "Attempt to access syslog with CAP_SYS_ADMIN "
827 "but no CAP_SYSLOG (deprecated).\n",
828 current->comm, task_pid_nr(current));
829 return 0;
830 }
831 return -EPERM;
832 }
833 return 0;
834}
835
836#if defined(CONFIG_PRINTK_TIME)
837static bool printk_time = 1;
838#else
839static bool printk_time;
840#endif
841module_param_named(time, printk_time, bool, S_IRUGO | S_IWUSR);
842
843static size_t print_time(u64 ts, char *buf)
844{
845 unsigned long rem_nsec;
846
847 if (!printk_time)
848 return 0;
849
850 rem_nsec = do_div(ts, 1000000000);
851
852 if (!buf)
853 return snprintf(NULL, 0, "[%5lu.000000] ", (unsigned long)ts);
854
855 return sprintf(buf, "[%5lu.%06lu] ",
856 (unsigned long)ts, rem_nsec / 1000);
857}
858
859static size_t print_prefix(const struct log *msg, bool syslog, char *buf)
860{
861 size_t len = 0;
862 unsigned int prefix = (msg->facility << 3) | msg->level;
863
864 if (syslog) {
865 if (buf) {
866 len += sprintf(buf, "<%u>", prefix);
867 } else {
868 len += 3;
869 if (prefix > 999)
870 len += 3;
871 else if (prefix > 99)
872 len += 2;
873 else if (prefix > 9)
874 len++;
875 }
876 }
877
878 len += print_time(msg->ts_nsec, buf ? buf + len : NULL);
879 return len;
880}
881
882static size_t msg_print_text(const struct log *msg, enum log_flags prev,
883 bool syslog, char *buf, size_t size)
884{
885 const char *text = log_text(msg);
886 size_t text_size = msg->text_len;
887 bool prefix = true;
888 bool newline = true;
889 size_t len = 0;
890
891 if ((prev & LOG_CONT) && !(msg->flags & LOG_PREFIX))
892 prefix = false;
893
894 if (msg->flags & LOG_CONT) {
895 if ((prev & LOG_CONT) && !(prev & LOG_NEWLINE))
896 prefix = false;
897
898 if (!(msg->flags & LOG_NEWLINE))
899 newline = false;
900 }
901
902 do {
903 const char *next = memchr(text, '\n', text_size);
904 size_t text_len;
905
906 if (next) {
907 text_len = next - text;
908 next++;
909 text_size -= next - text;
910 } else {
911 text_len = text_size;
912 }
913
914 if (buf) {
915 if (print_prefix(msg, syslog, NULL) +
916 text_len + 1 >= size - len)
917 break;
918
919 if (prefix)
920 len += print_prefix(msg, syslog, buf + len);
921 memcpy(buf + len, text, text_len);
922 len += text_len;
923 if (next || newline)
924 buf[len++] = '\n';
925 } else {
926
927 if (prefix)
928 len += print_prefix(msg, syslog, NULL);
929 len += text_len;
930 if (next || newline)
931 len++;
932 }
933
934 prefix = true;
935 text = next;
936 } while (text);
937
938 return len;
939}
940
941static int syslog_print(char __user *buf, int size)
942{
943 char *text;
944 struct log *msg;
945 int len = 0;
946
947 text = kmalloc(LOG_LINE_MAX + PREFIX_MAX, GFP_KERNEL);
948 if (!text)
949 return -ENOMEM;
950
951 while (size > 0) {
952 size_t n;
953 size_t skip;
954
955 raw_spin_lock_irq(&logbuf_lock);
956 if (syslog_seq < log_first_seq) {
957
958 syslog_seq = log_first_seq;
959 syslog_idx = log_first_idx;
960 syslog_prev = 0;
961 syslog_partial = 0;
962 }
963 if (syslog_seq == log_next_seq) {
964 raw_spin_unlock_irq(&logbuf_lock);
965 break;
966 }
967
968 skip = syslog_partial;
969 msg = log_from_idx(syslog_idx);
970 n = msg_print_text(msg, syslog_prev, true, text,
971 LOG_LINE_MAX + PREFIX_MAX);
972 if (n - syslog_partial <= size) {
973
974 syslog_idx = log_next(syslog_idx);
975 syslog_seq++;
976 syslog_prev = msg->flags;
977 n -= syslog_partial;
978 syslog_partial = 0;
979 } else if (!len){
980
981 n = size;
982 syslog_partial += n;
983 } else
984 n = 0;
985 raw_spin_unlock_irq(&logbuf_lock);
986
987 if (!n)
988 break;
989
990 if (copy_to_user(buf, text + skip, n)) {
991 if (!len)
992 len = -EFAULT;
993 break;
994 }
995
996 len += n;
997 size -= n;
998 buf += n;
999 }
1000
1001 kfree(text);
1002 return len;
1003}
1004
1005static int syslog_print_all(char __user *buf, int size, bool clear)
1006{
1007 char *text;
1008 int len = 0;
1009
1010 text = kmalloc(LOG_LINE_MAX + PREFIX_MAX, GFP_KERNEL);
1011 if (!text)
1012 return -ENOMEM;
1013
1014 raw_spin_lock_irq(&logbuf_lock);
1015 if (buf) {
1016 u64 next_seq;
1017 u64 seq;
1018 u32 idx;
1019 enum log_flags prev;
1020
1021 if (clear_seq < log_first_seq) {
1022
1023 clear_seq = log_first_seq;
1024 clear_idx = log_first_idx;
1025 }
1026
1027
1028
1029
1030
1031 seq = clear_seq;
1032 idx = clear_idx;
1033 prev = 0;
1034 while (seq < log_next_seq) {
1035 struct log *msg = log_from_idx(idx);
1036
1037 len += msg_print_text(msg, prev, true, NULL, 0);
1038 prev = msg->flags;
1039 idx = log_next(idx);
1040 seq++;
1041 }
1042
1043
1044 seq = clear_seq;
1045 idx = clear_idx;
1046 prev = 0;
1047 while (len > size && seq < log_next_seq) {
1048 struct log *msg = log_from_idx(idx);
1049
1050 len -= msg_print_text(msg, prev, true, NULL, 0);
1051 prev = msg->flags;
1052 idx = log_next(idx);
1053 seq++;
1054 }
1055
1056
1057 next_seq = log_next_seq;
1058
1059 len = 0;
1060 prev = 0;
1061 while (len >= 0 && seq < next_seq) {
1062 struct log *msg = log_from_idx(idx);
1063 int textlen;
1064
1065 textlen = msg_print_text(msg, prev, true, text,
1066 LOG_LINE_MAX + PREFIX_MAX);
1067 if (textlen < 0) {
1068 len = textlen;
1069 break;
1070 }
1071 idx = log_next(idx);
1072 seq++;
1073 prev = msg->flags;
1074
1075 raw_spin_unlock_irq(&logbuf_lock);
1076 if (copy_to_user(buf + len, text, textlen))
1077 len = -EFAULT;
1078 else
1079 len += textlen;
1080 raw_spin_lock_irq(&logbuf_lock);
1081
1082 if (seq < log_first_seq) {
1083
1084 seq = log_first_seq;
1085 idx = log_first_idx;
1086 prev = 0;
1087 }
1088 }
1089 }
1090
1091 if (clear) {
1092 clear_seq = log_next_seq;
1093 clear_idx = log_next_idx;
1094 }
1095 raw_spin_unlock_irq(&logbuf_lock);
1096
1097 kfree(text);
1098 return len;
1099}
1100
1101int do_syslog(int type, char __user *buf, int len, bool from_file)
1102{
1103 bool clear = false;
1104 static int saved_console_loglevel = -1;
1105 int error;
1106
1107 error = check_syslog_permissions(type, from_file);
1108 if (error)
1109 goto out;
1110
1111 error = security_syslog(type);
1112 if (error)
1113 return error;
1114
1115 switch (type) {
1116 case SYSLOG_ACTION_CLOSE:
1117 break;
1118 case SYSLOG_ACTION_OPEN:
1119 break;
1120 case SYSLOG_ACTION_READ:
1121 error = -EINVAL;
1122 if (!buf || len < 0)
1123 goto out;
1124 error = 0;
1125 if (!len)
1126 goto out;
1127 if (!access_ok(VERIFY_WRITE, buf, len)) {
1128 error = -EFAULT;
1129 goto out;
1130 }
1131 error = wait_event_interruptible(log_wait,
1132 syslog_seq != log_next_seq);
1133 if (error)
1134 goto out;
1135 error = syslog_print(buf, len);
1136 break;
1137
1138 case SYSLOG_ACTION_READ_CLEAR:
1139 clear = true;
1140
1141
1142 case SYSLOG_ACTION_READ_ALL:
1143 error = -EINVAL;
1144 if (!buf || len < 0)
1145 goto out;
1146 error = 0;
1147 if (!len)
1148 goto out;
1149 if (!access_ok(VERIFY_WRITE, buf, len)) {
1150 error = -EFAULT;
1151 goto out;
1152 }
1153 error = syslog_print_all(buf, len, clear);
1154 break;
1155
1156 case SYSLOG_ACTION_CLEAR:
1157 syslog_print_all(NULL, 0, true);
1158 break;
1159
1160 case SYSLOG_ACTION_CONSOLE_OFF:
1161 if (saved_console_loglevel == -1)
1162 saved_console_loglevel = console_loglevel;
1163 console_loglevel = minimum_console_loglevel;
1164 break;
1165
1166 case SYSLOG_ACTION_CONSOLE_ON:
1167 if (saved_console_loglevel != -1) {
1168 console_loglevel = saved_console_loglevel;
1169 saved_console_loglevel = -1;
1170 }
1171 break;
1172
1173 case SYSLOG_ACTION_CONSOLE_LEVEL:
1174 error = -EINVAL;
1175 if (len < 1 || len > 8)
1176 goto out;
1177 if (len < minimum_console_loglevel)
1178 len = minimum_console_loglevel;
1179 console_loglevel = len;
1180
1181 saved_console_loglevel = -1;
1182 error = 0;
1183 break;
1184
1185 case SYSLOG_ACTION_SIZE_UNREAD:
1186 raw_spin_lock_irq(&logbuf_lock);
1187 if (syslog_seq < log_first_seq) {
1188
1189 syslog_seq = log_first_seq;
1190 syslog_idx = log_first_idx;
1191 syslog_prev = 0;
1192 syslog_partial = 0;
1193 }
1194 if (from_file) {
1195
1196
1197
1198
1199
1200 error = log_next_idx - syslog_idx;
1201 } else {
1202 u64 seq = syslog_seq;
1203 u32 idx = syslog_idx;
1204 enum log_flags prev = syslog_prev;
1205
1206 error = 0;
1207 while (seq < log_next_seq) {
1208 struct log *msg = log_from_idx(idx);
1209
1210 error += msg_print_text(msg, prev, true, NULL, 0);
1211 idx = log_next(idx);
1212 seq++;
1213 prev = msg->flags;
1214 }
1215 error -= syslog_partial;
1216 }
1217 raw_spin_unlock_irq(&logbuf_lock);
1218 break;
1219
1220 case SYSLOG_ACTION_SIZE_BUFFER:
1221 error = log_buf_len;
1222 break;
1223 default:
1224 error = -EINVAL;
1225 break;
1226 }
1227out:
1228 return error;
1229}
1230
1231SYSCALL_DEFINE3(syslog, int, type, char __user *, buf, int, len)
1232{
1233 return do_syslog(type, buf, len, SYSLOG_FROM_CALL);
1234}
1235
1236static bool __read_mostly ignore_loglevel;
1237
1238static int __init ignore_loglevel_setup(char *str)
1239{
1240 ignore_loglevel = 1;
1241 printk(KERN_INFO "debug: ignoring loglevel setting.\n");
1242
1243 return 0;
1244}
1245
1246early_param("ignore_loglevel", ignore_loglevel_setup);
1247module_param(ignore_loglevel, bool, S_IRUGO | S_IWUSR);
1248MODULE_PARM_DESC(ignore_loglevel, "ignore loglevel setting, to"
1249 "print all kernel messages to the console.");
1250
1251
1252
1253
1254
1255
1256static void call_console_drivers(int level, const char *text, size_t len)
1257{
1258 struct console *con;
1259
1260 trace_console(text, 0, len, len);
1261
1262 if (level >= console_loglevel && !ignore_loglevel)
1263 return;
1264 if (!console_drivers)
1265 return;
1266
1267 for_each_console(con) {
1268 if (exclusive_console && con != exclusive_console)
1269 continue;
1270 if (!(con->flags & CON_ENABLED))
1271 continue;
1272 if (!con->write)
1273 continue;
1274 if (!cpu_online(smp_processor_id()) &&
1275 !(con->flags & CON_ANYTIME))
1276 continue;
1277 con->write(con, text, len);
1278 }
1279}
1280
1281
1282
1283
1284
1285
1286static void zap_locks(void)
1287{
1288 static unsigned long oops_timestamp;
1289
1290 if (time_after_eq(jiffies, oops_timestamp) &&
1291 !time_after(jiffies, oops_timestamp + 30 * HZ))
1292 return;
1293
1294 oops_timestamp = jiffies;
1295
1296 debug_locks_off();
1297
1298 raw_spin_lock_init(&logbuf_lock);
1299
1300 sema_init(&console_sem, 1);
1301}
1302
1303
1304static int have_callable_console(void)
1305{
1306 struct console *con;
1307
1308 for_each_console(con)
1309 if (con->flags & CON_ANYTIME)
1310 return 1;
1311
1312 return 0;
1313}
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323static inline int can_use_console(unsigned int cpu)
1324{
1325 return cpu_online(cpu) || have_callable_console();
1326}
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338static int console_trylock_for_printk(unsigned int cpu)
1339 __releases(&logbuf_lock)
1340{
1341 int retval = 0, wake = 0;
1342
1343 if (console_trylock()) {
1344 retval = 1;
1345
1346
1347
1348
1349
1350
1351
1352 if (!can_use_console(cpu)) {
1353 console_locked = 0;
1354 wake = 1;
1355 retval = 0;
1356 }
1357 }
1358 logbuf_cpu = UINT_MAX;
1359 if (wake)
1360 up(&console_sem);
1361 raw_spin_unlock(&logbuf_lock);
1362 return retval;
1363}
1364
1365int printk_delay_msec __read_mostly;
1366
1367static inline void printk_delay(void)
1368{
1369 if (unlikely(printk_delay_msec)) {
1370 int m = printk_delay_msec;
1371
1372 while (m--) {
1373 mdelay(1);
1374 touch_nmi_watchdog();
1375 }
1376 }
1377}
1378
1379
1380
1381
1382
1383
1384
1385static struct cont {
1386 char buf[LOG_LINE_MAX];
1387 size_t len;
1388 size_t cons;
1389 struct task_struct *owner;
1390 u64 ts_nsec;
1391 u8 level;
1392 u8 facility;
1393 enum log_flags flags;
1394 bool flushed:1;
1395} cont;
1396
1397static void cont_flush(enum log_flags flags)
1398{
1399 if (cont.flushed)
1400 return;
1401 if (cont.len == 0)
1402 return;
1403
1404 if (cont.cons) {
1405
1406
1407
1408
1409
1410 log_store(cont.facility, cont.level, flags | LOG_NOCONS,
1411 cont.ts_nsec, NULL, 0, cont.buf, cont.len);
1412 cont.flags = flags;
1413 cont.flushed = true;
1414 } else {
1415
1416
1417
1418
1419 log_store(cont.facility, cont.level, flags, 0,
1420 NULL, 0, cont.buf, cont.len);
1421 cont.len = 0;
1422 }
1423}
1424
1425static bool cont_add(int facility, int level, const char *text, size_t len)
1426{
1427 if (cont.len && cont.flushed)
1428 return false;
1429
1430 if (cont.len + len > sizeof(cont.buf)) {
1431
1432 cont_flush(LOG_CONT);
1433 return false;
1434 }
1435
1436 if (!cont.len) {
1437 cont.facility = facility;
1438 cont.level = level;
1439 cont.owner = current;
1440 cont.ts_nsec = local_clock();
1441 cont.flags = 0;
1442 cont.cons = 0;
1443 cont.flushed = false;
1444 }
1445
1446 memcpy(cont.buf + cont.len, text, len);
1447 cont.len += len;
1448
1449 if (cont.len > (sizeof(cont.buf) * 80) / 100)
1450 cont_flush(LOG_CONT);
1451
1452 return true;
1453}
1454
1455static size_t cont_print_text(char *text, size_t size)
1456{
1457 size_t textlen = 0;
1458 size_t len;
1459
1460 if (cont.cons == 0 && (console_prev & LOG_NEWLINE)) {
1461 textlen += print_time(cont.ts_nsec, text);
1462 size -= textlen;
1463 }
1464
1465 len = cont.len - cont.cons;
1466 if (len > 0) {
1467 if (len+1 > size)
1468 len = size-1;
1469 memcpy(text + textlen, cont.buf + cont.cons, len);
1470 textlen += len;
1471 cont.cons = cont.len;
1472 }
1473
1474 if (cont.flushed) {
1475 if (cont.flags & LOG_NEWLINE)
1476 text[textlen++] = '\n';
1477
1478 cont.len = 0;
1479 }
1480 return textlen;
1481}
1482
1483asmlinkage int vprintk_emit(int facility, int level,
1484 const char *dict, size_t dictlen,
1485 const char *fmt, va_list args)
1486{
1487 static int recursion_bug;
1488 static char textbuf[LOG_LINE_MAX];
1489 char *text = textbuf;
1490 size_t text_len;
1491 enum log_flags lflags = 0;
1492 unsigned long flags;
1493 int this_cpu;
1494 int printed_len = 0;
1495
1496 boot_delay_msec();
1497 printk_delay();
1498
1499
1500 local_irq_save(flags);
1501 this_cpu = smp_processor_id();
1502
1503
1504
1505
1506 if (unlikely(logbuf_cpu == this_cpu)) {
1507
1508
1509
1510
1511
1512
1513
1514 if (!oops_in_progress && !lockdep_recursing(current)) {
1515 recursion_bug = 1;
1516 goto out_restore_irqs;
1517 }
1518 zap_locks();
1519 }
1520
1521 lockdep_off();
1522 raw_spin_lock(&logbuf_lock);
1523 logbuf_cpu = this_cpu;
1524
1525 if (recursion_bug) {
1526 static const char recursion_msg[] =
1527 "BUG: recent printk recursion!";
1528
1529 recursion_bug = 0;
1530 printed_len += strlen(recursion_msg);
1531
1532 log_store(0, 2, LOG_PREFIX|LOG_NEWLINE, 0,
1533 NULL, 0, recursion_msg, printed_len);
1534 }
1535
1536
1537
1538
1539
1540 text_len = vscnprintf(text, sizeof(textbuf), fmt, args);
1541
1542
1543 if (text_len && text[text_len-1] == '\n') {
1544 text_len--;
1545 lflags |= LOG_NEWLINE;
1546 }
1547
1548
1549 if (facility == 0) {
1550 int kern_level = printk_get_level(text);
1551
1552 if (kern_level) {
1553 const char *end_of_header = printk_skip_level(text);
1554 switch (kern_level) {
1555 case '0' ... '7':
1556 if (level == -1)
1557 level = kern_level - '0';
1558 case 'd':
1559 lflags |= LOG_PREFIX;
1560 case 'c':
1561 break;
1562 }
1563 text_len -= end_of_header - text;
1564 text = (char *)end_of_header;
1565 }
1566 }
1567
1568 if (level == -1)
1569 level = default_message_loglevel;
1570
1571 if (dict)
1572 lflags |= LOG_PREFIX|LOG_NEWLINE;
1573
1574 if (!(lflags & LOG_NEWLINE)) {
1575
1576
1577
1578
1579 if (cont.len && (lflags & LOG_PREFIX || cont.owner != current))
1580 cont_flush(LOG_NEWLINE);
1581
1582
1583 if (!cont_add(facility, level, text, text_len))
1584 log_store(facility, level, lflags | LOG_CONT, 0,
1585 dict, dictlen, text, text_len);
1586 } else {
1587 bool stored = false;
1588
1589
1590
1591
1592
1593
1594
1595 if (cont.len && cont.owner == current) {
1596 if (!(lflags & LOG_PREFIX))
1597 stored = cont_add(facility, level, text, text_len);
1598 cont_flush(LOG_NEWLINE);
1599 }
1600
1601 if (!stored)
1602 log_store(facility, level, lflags, 0,
1603 dict, dictlen, text, text_len);
1604 }
1605 printed_len += text_len;
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615 if (console_trylock_for_printk(this_cpu))
1616 console_unlock();
1617
1618 lockdep_on();
1619out_restore_irqs:
1620 local_irq_restore(flags);
1621
1622 return printed_len;
1623}
1624EXPORT_SYMBOL(vprintk_emit);
1625
1626asmlinkage int vprintk(const char *fmt, va_list args)
1627{
1628 return vprintk_emit(0, -1, NULL, 0, fmt, args);
1629}
1630EXPORT_SYMBOL(vprintk);
1631
1632asmlinkage int printk_emit(int facility, int level,
1633 const char *dict, size_t dictlen,
1634 const char *fmt, ...)
1635{
1636 va_list args;
1637 int r;
1638
1639 va_start(args, fmt);
1640 r = vprintk_emit(facility, level, dict, dictlen, fmt, args);
1641 va_end(args);
1642
1643 return r;
1644}
1645EXPORT_SYMBOL(printk_emit);
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668asmlinkage int printk(const char *fmt, ...)
1669{
1670 va_list args;
1671 int r;
1672
1673#ifdef CONFIG_KGDB_KDB
1674 if (unlikely(kdb_trap_printk)) {
1675 va_start(args, fmt);
1676 r = vkdb_printf(fmt, args);
1677 va_end(args);
1678 return r;
1679 }
1680#endif
1681 va_start(args, fmt);
1682 r = vprintk_emit(0, -1, NULL, 0, fmt, args);
1683 va_end(args);
1684
1685 return r;
1686}
1687EXPORT_SYMBOL(printk);
1688
1689#else
1690
1691#define LOG_LINE_MAX 0
1692#define PREFIX_MAX 0
1693#define LOG_LINE_MAX 0
1694static u64 syslog_seq;
1695static u32 syslog_idx;
1696static u64 console_seq;
1697static u32 console_idx;
1698static enum log_flags syslog_prev;
1699static u64 log_first_seq;
1700static u32 log_first_idx;
1701static u64 log_next_seq;
1702static enum log_flags console_prev;
1703static struct cont {
1704 size_t len;
1705 size_t cons;
1706 u8 level;
1707 bool flushed:1;
1708} cont;
1709static struct log *log_from_idx(u32 idx) { return NULL; }
1710static u32 log_next(u32 idx) { return 0; }
1711static void call_console_drivers(int level, const char *text, size_t len) {}
1712static size_t msg_print_text(const struct log *msg, enum log_flags prev,
1713 bool syslog, char *buf, size_t size) { return 0; }
1714static size_t cont_print_text(char *text, size_t size) { return 0; }
1715
1716#endif
1717
1718static int __add_preferred_console(char *name, int idx, char *options,
1719 char *brl_options)
1720{
1721 struct console_cmdline *c;
1722 int i;
1723
1724
1725
1726
1727
1728 for (i = 0; i < MAX_CMDLINECONSOLES && console_cmdline[i].name[0]; i++)
1729 if (strcmp(console_cmdline[i].name, name) == 0 &&
1730 console_cmdline[i].index == idx) {
1731 if (!brl_options)
1732 selected_console = i;
1733 return 0;
1734 }
1735 if (i == MAX_CMDLINECONSOLES)
1736 return -E2BIG;
1737 if (!brl_options)
1738 selected_console = i;
1739 c = &console_cmdline[i];
1740 strlcpy(c->name, name, sizeof(c->name));
1741 c->options = options;
1742#ifdef CONFIG_A11Y_BRAILLE_CONSOLE
1743 c->brl_options = brl_options;
1744#endif
1745 c->index = idx;
1746 return 0;
1747}
1748
1749
1750
1751static int __init console_setup(char *str)
1752{
1753 char buf[sizeof(console_cmdline[0].name) + 4];
1754 char *s, *options, *brl_options = NULL;
1755 int idx;
1756
1757#ifdef CONFIG_A11Y_BRAILLE_CONSOLE
1758 if (!memcmp(str, "brl,", 4)) {
1759 brl_options = "";
1760 str += 4;
1761 } else if (!memcmp(str, "brl=", 4)) {
1762 brl_options = str + 4;
1763 str = strchr(brl_options, ',');
1764 if (!str) {
1765 printk(KERN_ERR "need port name after brl=\n");
1766 return 1;
1767 }
1768 *(str++) = 0;
1769 }
1770#endif
1771
1772
1773
1774
1775 if (str[0] >= '0' && str[0] <= '9') {
1776 strcpy(buf, "ttyS");
1777 strncpy(buf + 4, str, sizeof(buf) - 5);
1778 } else {
1779 strncpy(buf, str, sizeof(buf) - 1);
1780 }
1781 buf[sizeof(buf) - 1] = 0;
1782 if ((options = strchr(str, ',')) != NULL)
1783 *(options++) = 0;
1784#ifdef __sparc__
1785 if (!strcmp(str, "ttya"))
1786 strcpy(buf, "ttyS0");
1787 if (!strcmp(str, "ttyb"))
1788 strcpy(buf, "ttyS1");
1789#endif
1790 for (s = buf; *s; s++)
1791 if ((*s >= '0' && *s <= '9') || *s == ',')
1792 break;
1793 idx = simple_strtoul(s, NULL, 10);
1794 *s = 0;
1795
1796 __add_preferred_console(buf, idx, options, brl_options);
1797 console_set_on_cmdline = 1;
1798 return 1;
1799}
1800__setup("console=", console_setup);
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815int add_preferred_console(char *name, int idx, char *options)
1816{
1817 return __add_preferred_console(name, idx, options, NULL);
1818}
1819
1820int update_console_cmdline(char *name, int idx, char *name_new, int idx_new, char *options)
1821{
1822 struct console_cmdline *c;
1823 int i;
1824
1825 for (i = 0; i < MAX_CMDLINECONSOLES && console_cmdline[i].name[0]; i++)
1826 if (strcmp(console_cmdline[i].name, name) == 0 &&
1827 console_cmdline[i].index == idx) {
1828 c = &console_cmdline[i];
1829 strlcpy(c->name, name_new, sizeof(c->name));
1830 c->name[sizeof(c->name) - 1] = 0;
1831 c->options = options;
1832 c->index = idx_new;
1833 return i;
1834 }
1835
1836 return -1;
1837}
1838
1839bool console_suspend_enabled = 1;
1840EXPORT_SYMBOL(console_suspend_enabled);
1841
1842static int __init console_suspend_disable(char *str)
1843{
1844 console_suspend_enabled = 0;
1845 return 1;
1846}
1847__setup("no_console_suspend", console_suspend_disable);
1848module_param_named(console_suspend, console_suspend_enabled,
1849 bool, S_IRUGO | S_IWUSR);
1850MODULE_PARM_DESC(console_suspend, "suspend console during suspend"
1851 " and hibernate operations");
1852
1853
1854
1855
1856
1857
1858void suspend_console(void)
1859{
1860 if (!console_suspend_enabled)
1861 return;
1862 printk("Suspending console(s) (use no_console_suspend to debug)\n");
1863 console_lock();
1864 console_suspended = 1;
1865 up(&console_sem);
1866}
1867
1868void resume_console(void)
1869{
1870 if (!console_suspend_enabled)
1871 return;
1872 down(&console_sem);
1873 console_suspended = 0;
1874 console_unlock();
1875}
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888static int __cpuinit console_cpu_notify(struct notifier_block *self,
1889 unsigned long action, void *hcpu)
1890{
1891 switch (action) {
1892 case CPU_ONLINE:
1893 case CPU_DEAD:
1894 case CPU_DOWN_FAILED:
1895 case CPU_UP_CANCELED:
1896 console_lock();
1897 console_unlock();
1898 }
1899 return NOTIFY_OK;
1900}
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910void console_lock(void)
1911{
1912 BUG_ON(in_interrupt());
1913 down(&console_sem);
1914 if (console_suspended)
1915 return;
1916 console_locked = 1;
1917 console_may_schedule = 1;
1918}
1919EXPORT_SYMBOL(console_lock);
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929int console_trylock(void)
1930{
1931 if (down_trylock(&console_sem))
1932 return 0;
1933 if (console_suspended) {
1934 up(&console_sem);
1935 return 0;
1936 }
1937 console_locked = 1;
1938 console_may_schedule = 0;
1939 return 1;
1940}
1941EXPORT_SYMBOL(console_trylock);
1942
1943int is_console_locked(void)
1944{
1945 return console_locked;
1946}
1947
1948
1949
1950
1951#define PRINTK_BUF_SIZE 512
1952
1953#define PRINTK_PENDING_WAKEUP 0x01
1954#define PRINTK_PENDING_SCHED 0x02
1955
1956static DEFINE_PER_CPU(int, printk_pending);
1957static DEFINE_PER_CPU(char [PRINTK_BUF_SIZE], printk_sched_buf);
1958
1959void printk_tick(void)
1960{
1961 if (__this_cpu_read(printk_pending)) {
1962 int pending = __this_cpu_xchg(printk_pending, 0);
1963 if (pending & PRINTK_PENDING_SCHED) {
1964 char *buf = __get_cpu_var(printk_sched_buf);
1965 printk(KERN_WARNING "[sched_delayed] %s", buf);
1966 }
1967 if (pending & PRINTK_PENDING_WAKEUP)
1968 wake_up_interruptible(&log_wait);
1969 }
1970}
1971
1972int printk_needs_cpu(int cpu)
1973{
1974 if (cpu_is_offline(cpu))
1975 printk_tick();
1976 return __this_cpu_read(printk_pending);
1977}
1978
1979void wake_up_klogd(void)
1980{
1981 if (waitqueue_active(&log_wait))
1982 this_cpu_or(printk_pending, PRINTK_PENDING_WAKEUP);
1983}
1984
1985static void console_cont_flush(char *text, size_t size)
1986{
1987 unsigned long flags;
1988 size_t len;
1989
1990 raw_spin_lock_irqsave(&logbuf_lock, flags);
1991
1992 if (!cont.len)
1993 goto out;
1994
1995
1996
1997
1998
1999
2000 if (console_seq < log_next_seq && !cont.cons)
2001 goto out;
2002
2003 len = cont_print_text(text, size);
2004 raw_spin_unlock(&logbuf_lock);
2005 stop_critical_timings();
2006 call_console_drivers(cont.level, text, len);
2007 start_critical_timings();
2008 local_irq_restore(flags);
2009 return;
2010out:
2011 raw_spin_unlock_irqrestore(&logbuf_lock, flags);
2012}
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028void console_unlock(void)
2029{
2030 static char text[LOG_LINE_MAX + PREFIX_MAX];
2031 static u64 seen_seq;
2032 unsigned long flags;
2033 bool wake_klogd = false;
2034 bool retry;
2035
2036 if (console_suspended) {
2037 up(&console_sem);
2038 return;
2039 }
2040
2041 console_may_schedule = 0;
2042
2043
2044 console_cont_flush(text, sizeof(text));
2045again:
2046 for (;;) {
2047 struct log *msg;
2048 size_t len;
2049 int level;
2050
2051 raw_spin_lock_irqsave(&logbuf_lock, flags);
2052 if (seen_seq != log_next_seq) {
2053 wake_klogd = true;
2054 seen_seq = log_next_seq;
2055 }
2056
2057 if (console_seq < log_first_seq) {
2058
2059 console_seq = log_first_seq;
2060 console_idx = log_first_idx;
2061 console_prev = 0;
2062 }
2063skip:
2064 if (console_seq == log_next_seq)
2065 break;
2066
2067 msg = log_from_idx(console_idx);
2068 if (msg->flags & LOG_NOCONS) {
2069
2070
2071
2072
2073 console_idx = log_next(console_idx);
2074 console_seq++;
2075
2076
2077
2078
2079
2080 msg->flags &= ~LOG_NOCONS;
2081 console_prev = msg->flags;
2082 goto skip;
2083 }
2084
2085 level = msg->level;
2086 len = msg_print_text(msg, console_prev, false,
2087 text, sizeof(text));
2088 console_idx = log_next(console_idx);
2089 console_seq++;
2090 console_prev = msg->flags;
2091 raw_spin_unlock(&logbuf_lock);
2092
2093 stop_critical_timings();
2094 call_console_drivers(level, text, len);
2095 start_critical_timings();
2096 local_irq_restore(flags);
2097 }
2098 console_locked = 0;
2099
2100
2101 if (unlikely(exclusive_console))
2102 exclusive_console = NULL;
2103
2104 raw_spin_unlock(&logbuf_lock);
2105
2106 up(&console_sem);
2107
2108
2109
2110
2111
2112
2113
2114 raw_spin_lock(&logbuf_lock);
2115 retry = console_seq != log_next_seq;
2116 raw_spin_unlock_irqrestore(&logbuf_lock, flags);
2117
2118 if (retry && console_trylock())
2119 goto again;
2120
2121 if (wake_klogd)
2122 wake_up_klogd();
2123}
2124EXPORT_SYMBOL(console_unlock);
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135void __sched console_conditional_schedule(void)
2136{
2137 if (console_may_schedule)
2138 cond_resched();
2139}
2140EXPORT_SYMBOL(console_conditional_schedule);
2141
2142void console_unblank(void)
2143{
2144 struct console *c;
2145
2146
2147
2148
2149
2150 if (oops_in_progress) {
2151 if (down_trylock(&console_sem) != 0)
2152 return;
2153 } else
2154 console_lock();
2155
2156 console_locked = 1;
2157 console_may_schedule = 0;
2158 for_each_console(c)
2159 if ((c->flags & CON_ENABLED) && c->unblank)
2160 c->unblank();
2161 console_unlock();
2162}
2163
2164
2165
2166
2167struct tty_driver *console_device(int *index)
2168{
2169 struct console *c;
2170 struct tty_driver *driver = NULL;
2171
2172 console_lock();
2173 for_each_console(c) {
2174 if (!c->device)
2175 continue;
2176 driver = c->device(c, index);
2177 if (driver)
2178 break;
2179 }
2180 console_unlock();
2181 return driver;
2182}
2183
2184
2185
2186
2187
2188
2189void console_stop(struct console *console)
2190{
2191 console_lock();
2192 console->flags &= ~CON_ENABLED;
2193 console_unlock();
2194}
2195EXPORT_SYMBOL(console_stop);
2196
2197void console_start(struct console *console)
2198{
2199 console_lock();
2200 console->flags |= CON_ENABLED;
2201 console_unlock();
2202}
2203EXPORT_SYMBOL(console_start);
2204
2205static int __read_mostly keep_bootcon;
2206
2207static int __init keep_bootcon_setup(char *str)
2208{
2209 keep_bootcon = 1;
2210 printk(KERN_INFO "debug: skip boot console de-registration.\n");
2211
2212 return 0;
2213}
2214
2215early_param("keep_bootcon", keep_bootcon_setup);
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236void register_console(struct console *newcon)
2237{
2238 int i;
2239 unsigned long flags;
2240 struct console *bcon = NULL;
2241
2242
2243
2244
2245
2246 if (console_drivers && newcon->flags & CON_BOOT) {
2247
2248 for_each_console(bcon) {
2249 if (!(bcon->flags & CON_BOOT)) {
2250 printk(KERN_INFO "Too late to register bootconsole %s%d\n",
2251 newcon->name, newcon->index);
2252 return;
2253 }
2254 }
2255 }
2256
2257 if (console_drivers && console_drivers->flags & CON_BOOT)
2258 bcon = console_drivers;
2259
2260 if (preferred_console < 0 || bcon || !console_drivers)
2261 preferred_console = selected_console;
2262
2263 if (newcon->early_setup)
2264 newcon->early_setup();
2265
2266
2267
2268
2269
2270
2271 if (preferred_console < 0) {
2272 if (newcon->index < 0)
2273 newcon->index = 0;
2274 if (newcon->setup == NULL ||
2275 newcon->setup(newcon, NULL) == 0) {
2276 newcon->flags |= CON_ENABLED;
2277 if (newcon->device) {
2278 newcon->flags |= CON_CONSDEV;
2279 preferred_console = 0;
2280 }
2281 }
2282 }
2283
2284
2285
2286
2287
2288 for (i = 0; i < MAX_CMDLINECONSOLES && console_cmdline[i].name[0];
2289 i++) {
2290 if (strcmp(console_cmdline[i].name, newcon->name) != 0)
2291 continue;
2292 if (newcon->index >= 0 &&
2293 newcon->index != console_cmdline[i].index)
2294 continue;
2295 if (newcon->index < 0)
2296 newcon->index = console_cmdline[i].index;
2297#ifdef CONFIG_A11Y_BRAILLE_CONSOLE
2298 if (console_cmdline[i].brl_options) {
2299 newcon->flags |= CON_BRL;
2300 braille_register_console(newcon,
2301 console_cmdline[i].index,
2302 console_cmdline[i].options,
2303 console_cmdline[i].brl_options);
2304 return;
2305 }
2306#endif
2307 if (newcon->setup &&
2308 newcon->setup(newcon, console_cmdline[i].options) != 0)
2309 break;
2310 newcon->flags |= CON_ENABLED;
2311 newcon->index = console_cmdline[i].index;
2312 if (i == selected_console) {
2313 newcon->flags |= CON_CONSDEV;
2314 preferred_console = selected_console;
2315 }
2316 break;
2317 }
2318
2319 if (!(newcon->flags & CON_ENABLED))
2320 return;
2321
2322
2323
2324
2325
2326
2327
2328 if (bcon && ((newcon->flags & (CON_CONSDEV | CON_BOOT)) == CON_CONSDEV))
2329 newcon->flags &= ~CON_PRINTBUFFER;
2330
2331
2332
2333
2334
2335 console_lock();
2336 if ((newcon->flags & CON_CONSDEV) || console_drivers == NULL) {
2337 newcon->next = console_drivers;
2338 console_drivers = newcon;
2339 if (newcon->next)
2340 newcon->next->flags &= ~CON_CONSDEV;
2341 } else {
2342 newcon->next = console_drivers->next;
2343 console_drivers->next = newcon;
2344 }
2345 if (newcon->flags & CON_PRINTBUFFER) {
2346
2347
2348
2349
2350 raw_spin_lock_irqsave(&logbuf_lock, flags);
2351 console_seq = syslog_seq;
2352 console_idx = syslog_idx;
2353 console_prev = syslog_prev;
2354 raw_spin_unlock_irqrestore(&logbuf_lock, flags);
2355
2356
2357
2358
2359
2360 exclusive_console = newcon;
2361 }
2362 console_unlock();
2363 console_sysfs_notify();
2364
2365
2366
2367
2368
2369
2370
2371
2372 if (bcon &&
2373 ((newcon->flags & (CON_CONSDEV | CON_BOOT)) == CON_CONSDEV) &&
2374 !keep_bootcon) {
2375
2376
2377
2378 printk(KERN_INFO "console [%s%d] enabled, bootconsole disabled\n",
2379 newcon->name, newcon->index);
2380 for_each_console(bcon)
2381 if (bcon->flags & CON_BOOT)
2382 unregister_console(bcon);
2383 } else {
2384 printk(KERN_INFO "%sconsole [%s%d] enabled\n",
2385 (newcon->flags & CON_BOOT) ? "boot" : "" ,
2386 newcon->name, newcon->index);
2387 }
2388}
2389EXPORT_SYMBOL(register_console);
2390
2391int unregister_console(struct console *console)
2392{
2393 struct console *a, *b;
2394 int res = 1;
2395
2396#ifdef CONFIG_A11Y_BRAILLE_CONSOLE
2397 if (console->flags & CON_BRL)
2398 return braille_unregister_console(console);
2399#endif
2400
2401 console_lock();
2402 if (console_drivers == console) {
2403 console_drivers=console->next;
2404 res = 0;
2405 } else if (console_drivers) {
2406 for (a=console_drivers->next, b=console_drivers ;
2407 a; b=a, a=b->next) {
2408 if (a == console) {
2409 b->next = a->next;
2410 res = 0;
2411 break;
2412 }
2413 }
2414 }
2415
2416
2417
2418
2419
2420 if (console_drivers != NULL && console->flags & CON_CONSDEV)
2421 console_drivers->flags |= CON_CONSDEV;
2422
2423 console_unlock();
2424 console_sysfs_notify();
2425 return res;
2426}
2427EXPORT_SYMBOL(unregister_console);
2428
2429static int __init printk_late_init(void)
2430{
2431 struct console *con;
2432
2433 for_each_console(con) {
2434 if (!keep_bootcon && con->flags & CON_BOOT) {
2435 printk(KERN_INFO "turn off boot console %s%d\n",
2436 con->name, con->index);
2437 unregister_console(con);
2438 }
2439 }
2440 hotcpu_notifier(console_cpu_notify, 0);
2441 return 0;
2442}
2443late_initcall(printk_late_init);
2444
2445#if defined CONFIG_PRINTK
2446
2447int printk_sched(const char *fmt, ...)
2448{
2449 unsigned long flags;
2450 va_list args;
2451 char *buf;
2452 int r;
2453
2454 local_irq_save(flags);
2455 buf = __get_cpu_var(printk_sched_buf);
2456
2457 va_start(args, fmt);
2458 r = vsnprintf(buf, PRINTK_BUF_SIZE, fmt, args);
2459 va_end(args);
2460
2461 __this_cpu_or(printk_pending, PRINTK_PENDING_SCHED);
2462 local_irq_restore(flags);
2463
2464 return r;
2465}
2466
2467
2468
2469
2470
2471
2472
2473DEFINE_RATELIMIT_STATE(printk_ratelimit_state, 5 * HZ, 10);
2474
2475int __printk_ratelimit(const char *func)
2476{
2477 return ___ratelimit(&printk_ratelimit_state, func);
2478}
2479EXPORT_SYMBOL(__printk_ratelimit);
2480
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490bool printk_timed_ratelimit(unsigned long *caller_jiffies,
2491 unsigned int interval_msecs)
2492{
2493 if (*caller_jiffies == 0
2494 || !time_in_range(jiffies, *caller_jiffies,
2495 *caller_jiffies
2496 + msecs_to_jiffies(interval_msecs))) {
2497 *caller_jiffies = jiffies;
2498 return true;
2499 }
2500 return false;
2501}
2502EXPORT_SYMBOL(printk_timed_ratelimit);
2503
2504static DEFINE_SPINLOCK(dump_list_lock);
2505static LIST_HEAD(dump_list);
2506
2507
2508
2509
2510
2511
2512
2513
2514
2515int kmsg_dump_register(struct kmsg_dumper *dumper)
2516{
2517 unsigned long flags;
2518 int err = -EBUSY;
2519
2520
2521 if (!dumper->dump)
2522 return -EINVAL;
2523
2524 spin_lock_irqsave(&dump_list_lock, flags);
2525
2526 if (!dumper->registered) {
2527 dumper->registered = 1;
2528 list_add_tail_rcu(&dumper->list, &dump_list);
2529 err = 0;
2530 }
2531 spin_unlock_irqrestore(&dump_list_lock, flags);
2532
2533 return err;
2534}
2535EXPORT_SYMBOL_GPL(kmsg_dump_register);
2536
2537
2538
2539
2540
2541
2542
2543
2544int kmsg_dump_unregister(struct kmsg_dumper *dumper)
2545{
2546 unsigned long flags;
2547 int err = -EINVAL;
2548
2549 spin_lock_irqsave(&dump_list_lock, flags);
2550 if (dumper->registered) {
2551 dumper->registered = 0;
2552 list_del_rcu(&dumper->list);
2553 err = 0;
2554 }
2555 spin_unlock_irqrestore(&dump_list_lock, flags);
2556 synchronize_rcu();
2557
2558 return err;
2559}
2560EXPORT_SYMBOL_GPL(kmsg_dump_unregister);
2561
2562static bool always_kmsg_dump;
2563module_param_named(always_kmsg_dump, always_kmsg_dump, bool, S_IRUGO | S_IWUSR);
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573void kmsg_dump(enum kmsg_dump_reason reason)
2574{
2575 struct kmsg_dumper *dumper;
2576 unsigned long flags;
2577
2578 if ((reason > KMSG_DUMP_OOPS) && !always_kmsg_dump)
2579 return;
2580
2581 rcu_read_lock();
2582 list_for_each_entry_rcu(dumper, &dump_list, list) {
2583 if (dumper->max_reason && reason > dumper->max_reason)
2584 continue;
2585
2586
2587 dumper->active = true;
2588
2589 raw_spin_lock_irqsave(&logbuf_lock, flags);
2590 dumper->cur_seq = clear_seq;
2591 dumper->cur_idx = clear_idx;
2592 dumper->next_seq = log_next_seq;
2593 dumper->next_idx = log_next_idx;
2594 raw_spin_unlock_irqrestore(&logbuf_lock, flags);
2595
2596
2597 dumper->dump(dumper, reason);
2598
2599
2600 dumper->active = false;
2601 }
2602 rcu_read_unlock();
2603}
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624bool kmsg_dump_get_line_nolock(struct kmsg_dumper *dumper, bool syslog,
2625 char *line, size_t size, size_t *len)
2626{
2627 struct log *msg;
2628 size_t l = 0;
2629 bool ret = false;
2630
2631 if (!dumper->active)
2632 goto out;
2633
2634 if (dumper->cur_seq < log_first_seq) {
2635
2636 dumper->cur_seq = log_first_seq;
2637 dumper->cur_idx = log_first_idx;
2638 }
2639
2640
2641 if (dumper->cur_seq >= log_next_seq)
2642 goto out;
2643
2644 msg = log_from_idx(dumper->cur_idx);
2645 l = msg_print_text(msg, 0, syslog, line, size);
2646
2647 dumper->cur_idx = log_next(dumper->cur_idx);
2648 dumper->cur_seq++;
2649 ret = true;
2650out:
2651 if (len)
2652 *len = l;
2653 return ret;
2654}
2655
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673bool kmsg_dump_get_line(struct kmsg_dumper *dumper, bool syslog,
2674 char *line, size_t size, size_t *len)
2675{
2676 unsigned long flags;
2677 bool ret;
2678
2679 raw_spin_lock_irqsave(&logbuf_lock, flags);
2680 ret = kmsg_dump_get_line_nolock(dumper, syslog, line, size, len);
2681 raw_spin_unlock_irqrestore(&logbuf_lock, flags);
2682
2683 return ret;
2684}
2685EXPORT_SYMBOL_GPL(kmsg_dump_get_line);
2686
2687
2688
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706bool kmsg_dump_get_buffer(struct kmsg_dumper *dumper, bool syslog,
2707 char *buf, size_t size, size_t *len)
2708{
2709 unsigned long flags;
2710 u64 seq;
2711 u32 idx;
2712 u64 next_seq;
2713 u32 next_idx;
2714 enum log_flags prev;
2715 size_t l = 0;
2716 bool ret = false;
2717
2718 if (!dumper->active)
2719 goto out;
2720
2721 raw_spin_lock_irqsave(&logbuf_lock, flags);
2722 if (dumper->cur_seq < log_first_seq) {
2723
2724 dumper->cur_seq = log_first_seq;
2725 dumper->cur_idx = log_first_idx;
2726 }
2727
2728
2729 if (dumper->cur_seq >= dumper->next_seq) {
2730 raw_spin_unlock_irqrestore(&logbuf_lock, flags);
2731 goto out;
2732 }
2733
2734
2735 seq = dumper->cur_seq;
2736 idx = dumper->cur_idx;
2737 prev = 0;
2738 while (seq < dumper->next_seq) {
2739 struct log *msg = log_from_idx(idx);
2740
2741 l += msg_print_text(msg, prev, true, NULL, 0);
2742 idx = log_next(idx);
2743 seq++;
2744 prev = msg->flags;
2745 }
2746
2747
2748 seq = dumper->cur_seq;
2749 idx = dumper->cur_idx;
2750 prev = 0;
2751 while (l > size && seq < dumper->next_seq) {
2752 struct log *msg = log_from_idx(idx);
2753
2754 l -= msg_print_text(msg, prev, true, NULL, 0);
2755 idx = log_next(idx);
2756 seq++;
2757 prev = msg->flags;
2758 }
2759
2760
2761 next_seq = seq;
2762 next_idx = idx;
2763
2764 l = 0;
2765 prev = 0;
2766 while (seq < dumper->next_seq) {
2767 struct log *msg = log_from_idx(idx);
2768
2769 l += msg_print_text(msg, prev, syslog, buf + l, size - l);
2770 idx = log_next(idx);
2771 seq++;
2772 prev = msg->flags;
2773 }
2774
2775 dumper->next_seq = next_seq;
2776 dumper->next_idx = next_idx;
2777 ret = true;
2778 raw_spin_unlock_irqrestore(&logbuf_lock, flags);
2779out:
2780 if (len)
2781 *len = l;
2782 return ret;
2783}
2784EXPORT_SYMBOL_GPL(kmsg_dump_get_buffer);
2785
2786
2787
2788
2789
2790
2791
2792
2793
2794
2795
2796void kmsg_dump_rewind_nolock(struct kmsg_dumper *dumper)
2797{
2798 dumper->cur_seq = clear_seq;
2799 dumper->cur_idx = clear_idx;
2800 dumper->next_seq = log_next_seq;
2801 dumper->next_idx = log_next_idx;
2802}
2803
2804
2805
2806
2807
2808
2809
2810
2811
2812void kmsg_dump_rewind(struct kmsg_dumper *dumper)
2813{
2814 unsigned long flags;
2815
2816 raw_spin_lock_irqsave(&logbuf_lock, flags);
2817 kmsg_dump_rewind_nolock(dumper);
2818 raw_spin_unlock_irqrestore(&logbuf_lock, flags);
2819}
2820EXPORT_SYMBOL_GPL(kmsg_dump_rewind);
2821#endif
2822