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 if (!buf)
851 return 15;
852
853 rem_nsec = do_div(ts, 1000000000);
854 return sprintf(buf, "[%5lu.%06lu] ",
855 (unsigned long)ts, rem_nsec / 1000);
856}
857
858static size_t print_prefix(const struct log *msg, bool syslog, char *buf)
859{
860 size_t len = 0;
861 unsigned int prefix = (msg->facility << 3) | msg->level;
862
863 if (syslog) {
864 if (buf) {
865 len += sprintf(buf, "<%u>", prefix);
866 } else {
867 len += 3;
868 if (prefix > 999)
869 len += 3;
870 else if (prefix > 99)
871 len += 2;
872 else if (prefix > 9)
873 len++;
874 }
875 }
876
877 len += print_time(msg->ts_nsec, buf ? buf + len : NULL);
878 return len;
879}
880
881static size_t msg_print_text(const struct log *msg, enum log_flags prev,
882 bool syslog, char *buf, size_t size)
883{
884 const char *text = log_text(msg);
885 size_t text_size = msg->text_len;
886 bool prefix = true;
887 bool newline = true;
888 size_t len = 0;
889
890 if ((prev & LOG_CONT) && !(msg->flags & LOG_PREFIX))
891 prefix = false;
892
893 if (msg->flags & LOG_CONT) {
894 if ((prev & LOG_CONT) && !(prev & LOG_NEWLINE))
895 prefix = false;
896
897 if (!(msg->flags & LOG_NEWLINE))
898 newline = false;
899 }
900
901 do {
902 const char *next = memchr(text, '\n', text_size);
903 size_t text_len;
904
905 if (next) {
906 text_len = next - text;
907 next++;
908 text_size -= next - text;
909 } else {
910 text_len = text_size;
911 }
912
913 if (buf) {
914 if (print_prefix(msg, syslog, NULL) +
915 text_len + 1 >= size - len)
916 break;
917
918 if (prefix)
919 len += print_prefix(msg, syslog, buf + len);
920 memcpy(buf + len, text, text_len);
921 len += text_len;
922 if (next || newline)
923 buf[len++] = '\n';
924 } else {
925
926 if (prefix)
927 len += print_prefix(msg, syslog, NULL);
928 len += text_len;
929 if (next || newline)
930 len++;
931 }
932
933 prefix = true;
934 text = next;
935 } while (text);
936
937 return len;
938}
939
940static int syslog_print(char __user *buf, int size)
941{
942 char *text;
943 struct log *msg;
944 int len = 0;
945
946 text = kmalloc(LOG_LINE_MAX + PREFIX_MAX, GFP_KERNEL);
947 if (!text)
948 return -ENOMEM;
949
950 while (size > 0) {
951 size_t n;
952 size_t skip;
953
954 raw_spin_lock_irq(&logbuf_lock);
955 if (syslog_seq < log_first_seq) {
956
957 syslog_seq = log_first_seq;
958 syslog_idx = log_first_idx;
959 syslog_prev = 0;
960 syslog_partial = 0;
961 }
962 if (syslog_seq == log_next_seq) {
963 raw_spin_unlock_irq(&logbuf_lock);
964 break;
965 }
966
967 skip = syslog_partial;
968 msg = log_from_idx(syslog_idx);
969 n = msg_print_text(msg, syslog_prev, true, text,
970 LOG_LINE_MAX + PREFIX_MAX);
971 if (n - syslog_partial <= size) {
972
973 syslog_idx = log_next(syslog_idx);
974 syslog_seq++;
975 syslog_prev = msg->flags;
976 n -= syslog_partial;
977 syslog_partial = 0;
978 } else if (!len){
979
980 n = size;
981 syslog_partial += n;
982 } else
983 n = 0;
984 raw_spin_unlock_irq(&logbuf_lock);
985
986 if (!n)
987 break;
988
989 if (copy_to_user(buf, text + skip, n)) {
990 if (!len)
991 len = -EFAULT;
992 break;
993 }
994
995 len += n;
996 size -= n;
997 buf += n;
998 }
999
1000 kfree(text);
1001 return len;
1002}
1003
1004static int syslog_print_all(char __user *buf, int size, bool clear)
1005{
1006 char *text;
1007 int len = 0;
1008
1009 text = kmalloc(LOG_LINE_MAX + PREFIX_MAX, GFP_KERNEL);
1010 if (!text)
1011 return -ENOMEM;
1012
1013 raw_spin_lock_irq(&logbuf_lock);
1014 if (buf) {
1015 u64 next_seq;
1016 u64 seq;
1017 u32 idx;
1018 enum log_flags prev;
1019
1020 if (clear_seq < log_first_seq) {
1021
1022 clear_seq = log_first_seq;
1023 clear_idx = log_first_idx;
1024 }
1025
1026
1027
1028
1029
1030 seq = clear_seq;
1031 idx = clear_idx;
1032 prev = 0;
1033 while (seq < log_next_seq) {
1034 struct log *msg = log_from_idx(idx);
1035
1036 len += msg_print_text(msg, prev, true, NULL, 0);
1037 prev = msg->flags;
1038 idx = log_next(idx);
1039 seq++;
1040 }
1041
1042
1043 seq = clear_seq;
1044 idx = clear_idx;
1045 prev = 0;
1046 while (len > size && seq < log_next_seq) {
1047 struct log *msg = log_from_idx(idx);
1048
1049 len -= msg_print_text(msg, prev, true, NULL, 0);
1050 prev = msg->flags;
1051 idx = log_next(idx);
1052 seq++;
1053 }
1054
1055
1056 next_seq = log_next_seq;
1057
1058 len = 0;
1059 prev = 0;
1060 while (len >= 0 && seq < next_seq) {
1061 struct log *msg = log_from_idx(idx);
1062 int textlen;
1063
1064 textlen = msg_print_text(msg, prev, true, text,
1065 LOG_LINE_MAX + PREFIX_MAX);
1066 if (textlen < 0) {
1067 len = textlen;
1068 break;
1069 }
1070 idx = log_next(idx);
1071 seq++;
1072 prev = msg->flags;
1073
1074 raw_spin_unlock_irq(&logbuf_lock);
1075 if (copy_to_user(buf + len, text, textlen))
1076 len = -EFAULT;
1077 else
1078 len += textlen;
1079 raw_spin_lock_irq(&logbuf_lock);
1080
1081 if (seq < log_first_seq) {
1082
1083 seq = log_first_seq;
1084 idx = log_first_idx;
1085 prev = 0;
1086 }
1087 }
1088 }
1089
1090 if (clear) {
1091 clear_seq = log_next_seq;
1092 clear_idx = log_next_idx;
1093 }
1094 raw_spin_unlock_irq(&logbuf_lock);
1095
1096 kfree(text);
1097 return len;
1098}
1099
1100int do_syslog(int type, char __user *buf, int len, bool from_file)
1101{
1102 bool clear = false;
1103 static int saved_console_loglevel = -1;
1104 int error;
1105
1106 error = check_syslog_permissions(type, from_file);
1107 if (error)
1108 goto out;
1109
1110 error = security_syslog(type);
1111 if (error)
1112 return error;
1113
1114 switch (type) {
1115 case SYSLOG_ACTION_CLOSE:
1116 break;
1117 case SYSLOG_ACTION_OPEN:
1118 break;
1119 case SYSLOG_ACTION_READ:
1120 error = -EINVAL;
1121 if (!buf || len < 0)
1122 goto out;
1123 error = 0;
1124 if (!len)
1125 goto out;
1126 if (!access_ok(VERIFY_WRITE, buf, len)) {
1127 error = -EFAULT;
1128 goto out;
1129 }
1130 error = wait_event_interruptible(log_wait,
1131 syslog_seq != log_next_seq);
1132 if (error)
1133 goto out;
1134 error = syslog_print(buf, len);
1135 break;
1136
1137 case SYSLOG_ACTION_READ_CLEAR:
1138 clear = true;
1139
1140
1141 case SYSLOG_ACTION_READ_ALL:
1142 error = -EINVAL;
1143 if (!buf || len < 0)
1144 goto out;
1145 error = 0;
1146 if (!len)
1147 goto out;
1148 if (!access_ok(VERIFY_WRITE, buf, len)) {
1149 error = -EFAULT;
1150 goto out;
1151 }
1152 error = syslog_print_all(buf, len, clear);
1153 break;
1154
1155 case SYSLOG_ACTION_CLEAR:
1156 syslog_print_all(NULL, 0, true);
1157 break;
1158
1159 case SYSLOG_ACTION_CONSOLE_OFF:
1160 if (saved_console_loglevel == -1)
1161 saved_console_loglevel = console_loglevel;
1162 console_loglevel = minimum_console_loglevel;
1163 break;
1164
1165 case SYSLOG_ACTION_CONSOLE_ON:
1166 if (saved_console_loglevel != -1) {
1167 console_loglevel = saved_console_loglevel;
1168 saved_console_loglevel = -1;
1169 }
1170 break;
1171
1172 case SYSLOG_ACTION_CONSOLE_LEVEL:
1173 error = -EINVAL;
1174 if (len < 1 || len > 8)
1175 goto out;
1176 if (len < minimum_console_loglevel)
1177 len = minimum_console_loglevel;
1178 console_loglevel = len;
1179
1180 saved_console_loglevel = -1;
1181 error = 0;
1182 break;
1183
1184 case SYSLOG_ACTION_SIZE_UNREAD:
1185 raw_spin_lock_irq(&logbuf_lock);
1186 if (syslog_seq < log_first_seq) {
1187
1188 syslog_seq = log_first_seq;
1189 syslog_idx = log_first_idx;
1190 syslog_prev = 0;
1191 syslog_partial = 0;
1192 }
1193 if (from_file) {
1194
1195
1196
1197
1198
1199 error = log_next_idx - syslog_idx;
1200 } else {
1201 u64 seq = syslog_seq;
1202 u32 idx = syslog_idx;
1203 enum log_flags prev = syslog_prev;
1204
1205 error = 0;
1206 while (seq < log_next_seq) {
1207 struct log *msg = log_from_idx(idx);
1208
1209 error += msg_print_text(msg, prev, true, NULL, 0);
1210 idx = log_next(idx);
1211 seq++;
1212 prev = msg->flags;
1213 }
1214 error -= syslog_partial;
1215 }
1216 raw_spin_unlock_irq(&logbuf_lock);
1217 break;
1218
1219 case SYSLOG_ACTION_SIZE_BUFFER:
1220 error = log_buf_len;
1221 break;
1222 default:
1223 error = -EINVAL;
1224 break;
1225 }
1226out:
1227 return error;
1228}
1229
1230SYSCALL_DEFINE3(syslog, int, type, char __user *, buf, int, len)
1231{
1232 return do_syslog(type, buf, len, SYSLOG_FROM_CALL);
1233}
1234
1235static bool __read_mostly ignore_loglevel;
1236
1237static int __init ignore_loglevel_setup(char *str)
1238{
1239 ignore_loglevel = 1;
1240 printk(KERN_INFO "debug: ignoring loglevel setting.\n");
1241
1242 return 0;
1243}
1244
1245early_param("ignore_loglevel", ignore_loglevel_setup);
1246module_param(ignore_loglevel, bool, S_IRUGO | S_IWUSR);
1247MODULE_PARM_DESC(ignore_loglevel, "ignore loglevel setting, to"
1248 "print all kernel messages to the console.");
1249
1250
1251
1252
1253
1254
1255static void call_console_drivers(int level, const char *text, size_t len)
1256{
1257 struct console *con;
1258
1259 trace_console(text, 0, len, len);
1260
1261 if (level >= console_loglevel && !ignore_loglevel)
1262 return;
1263 if (!console_drivers)
1264 return;
1265
1266 for_each_console(con) {
1267 if (exclusive_console && con != exclusive_console)
1268 continue;
1269 if (!(con->flags & CON_ENABLED))
1270 continue;
1271 if (!con->write)
1272 continue;
1273 if (!cpu_online(smp_processor_id()) &&
1274 !(con->flags & CON_ANYTIME))
1275 continue;
1276 con->write(con, text, len);
1277 }
1278}
1279
1280
1281
1282
1283
1284
1285static void zap_locks(void)
1286{
1287 static unsigned long oops_timestamp;
1288
1289 if (time_after_eq(jiffies, oops_timestamp) &&
1290 !time_after(jiffies, oops_timestamp + 30 * HZ))
1291 return;
1292
1293 oops_timestamp = jiffies;
1294
1295 debug_locks_off();
1296
1297 raw_spin_lock_init(&logbuf_lock);
1298
1299 sema_init(&console_sem, 1);
1300}
1301
1302
1303static int have_callable_console(void)
1304{
1305 struct console *con;
1306
1307 for_each_console(con)
1308 if (con->flags & CON_ANYTIME)
1309 return 1;
1310
1311 return 0;
1312}
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322static inline int can_use_console(unsigned int cpu)
1323{
1324 return cpu_online(cpu) || have_callable_console();
1325}
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337static int console_trylock_for_printk(unsigned int cpu)
1338 __releases(&logbuf_lock)
1339{
1340 int retval = 0, wake = 0;
1341
1342 if (console_trylock()) {
1343 retval = 1;
1344
1345
1346
1347
1348
1349
1350
1351 if (!can_use_console(cpu)) {
1352 console_locked = 0;
1353 wake = 1;
1354 retval = 0;
1355 }
1356 }
1357 logbuf_cpu = UINT_MAX;
1358 if (wake)
1359 up(&console_sem);
1360 raw_spin_unlock(&logbuf_lock);
1361 return retval;
1362}
1363
1364int printk_delay_msec __read_mostly;
1365
1366static inline void printk_delay(void)
1367{
1368 if (unlikely(printk_delay_msec)) {
1369 int m = printk_delay_msec;
1370
1371 while (m--) {
1372 mdelay(1);
1373 touch_nmi_watchdog();
1374 }
1375 }
1376}
1377
1378
1379
1380
1381
1382
1383
1384static struct cont {
1385 char buf[LOG_LINE_MAX];
1386 size_t len;
1387 size_t cons;
1388 struct task_struct *owner;
1389 u64 ts_nsec;
1390 u8 level;
1391 u8 facility;
1392 enum log_flags flags;
1393 bool flushed:1;
1394} cont;
1395
1396static void cont_flush(enum log_flags flags)
1397{
1398 if (cont.flushed)
1399 return;
1400 if (cont.len == 0)
1401 return;
1402
1403 if (cont.cons) {
1404
1405
1406
1407
1408
1409 log_store(cont.facility, cont.level, flags | LOG_NOCONS,
1410 cont.ts_nsec, NULL, 0, cont.buf, cont.len);
1411 cont.flags = flags;
1412 cont.flushed = true;
1413 } else {
1414
1415
1416
1417
1418 log_store(cont.facility, cont.level, flags, 0,
1419 NULL, 0, cont.buf, cont.len);
1420 cont.len = 0;
1421 }
1422}
1423
1424static bool cont_add(int facility, int level, const char *text, size_t len)
1425{
1426 if (cont.len && cont.flushed)
1427 return false;
1428
1429 if (cont.len + len > sizeof(cont.buf)) {
1430
1431 cont_flush(LOG_CONT);
1432 return false;
1433 }
1434
1435 if (!cont.len) {
1436 cont.facility = facility;
1437 cont.level = level;
1438 cont.owner = current;
1439 cont.ts_nsec = local_clock();
1440 cont.flags = 0;
1441 cont.cons = 0;
1442 cont.flushed = false;
1443 }
1444
1445 memcpy(cont.buf + cont.len, text, len);
1446 cont.len += len;
1447
1448 if (cont.len > (sizeof(cont.buf) * 80) / 100)
1449 cont_flush(LOG_CONT);
1450
1451 return true;
1452}
1453
1454static size_t cont_print_text(char *text, size_t size)
1455{
1456 size_t textlen = 0;
1457 size_t len;
1458
1459 if (cont.cons == 0 && (console_prev & LOG_NEWLINE)) {
1460 textlen += print_time(cont.ts_nsec, text);
1461 size -= textlen;
1462 }
1463
1464 len = cont.len - cont.cons;
1465 if (len > 0) {
1466 if (len+1 > size)
1467 len = size-1;
1468 memcpy(text + textlen, cont.buf + cont.cons, len);
1469 textlen += len;
1470 cont.cons = cont.len;
1471 }
1472
1473 if (cont.flushed) {
1474 if (cont.flags & LOG_NEWLINE)
1475 text[textlen++] = '\n';
1476
1477 cont.len = 0;
1478 }
1479 return textlen;
1480}
1481
1482asmlinkage int vprintk_emit(int facility, int level,
1483 const char *dict, size_t dictlen,
1484 const char *fmt, va_list args)
1485{
1486 static int recursion_bug;
1487 static char textbuf[LOG_LINE_MAX];
1488 char *text = textbuf;
1489 size_t text_len;
1490 enum log_flags lflags = 0;
1491 unsigned long flags;
1492 int this_cpu;
1493 int printed_len = 0;
1494
1495 boot_delay_msec();
1496 printk_delay();
1497
1498
1499 local_irq_save(flags);
1500 this_cpu = smp_processor_id();
1501
1502
1503
1504
1505 if (unlikely(logbuf_cpu == this_cpu)) {
1506
1507
1508
1509
1510
1511
1512
1513 if (!oops_in_progress && !lockdep_recursing(current)) {
1514 recursion_bug = 1;
1515 goto out_restore_irqs;
1516 }
1517 zap_locks();
1518 }
1519
1520 lockdep_off();
1521 raw_spin_lock(&logbuf_lock);
1522 logbuf_cpu = this_cpu;
1523
1524 if (recursion_bug) {
1525 static const char recursion_msg[] =
1526 "BUG: recent printk recursion!";
1527
1528 recursion_bug = 0;
1529 printed_len += strlen(recursion_msg);
1530
1531 log_store(0, 2, LOG_PREFIX|LOG_NEWLINE, 0,
1532 NULL, 0, recursion_msg, printed_len);
1533 }
1534
1535
1536
1537
1538
1539 text_len = vscnprintf(text, sizeof(textbuf), fmt, args);
1540
1541
1542 if (text_len && text[text_len-1] == '\n') {
1543 text_len--;
1544 lflags |= LOG_NEWLINE;
1545 }
1546
1547
1548 if (facility == 0) {
1549 int kern_level = printk_get_level(text);
1550
1551 if (kern_level) {
1552 const char *end_of_header = printk_skip_level(text);
1553 switch (kern_level) {
1554 case '0' ... '7':
1555 if (level == -1)
1556 level = kern_level - '0';
1557 case 'd':
1558 lflags |= LOG_PREFIX;
1559 case 'c':
1560 break;
1561 }
1562 text_len -= end_of_header - text;
1563 text = (char *)end_of_header;
1564 }
1565 }
1566
1567 if (level == -1)
1568 level = default_message_loglevel;
1569
1570 if (dict)
1571 lflags |= LOG_PREFIX|LOG_NEWLINE;
1572
1573 if (!(lflags & LOG_NEWLINE)) {
1574
1575
1576
1577
1578 if (cont.len && (lflags & LOG_PREFIX || cont.owner != current))
1579 cont_flush(LOG_NEWLINE);
1580
1581
1582 if (!cont_add(facility, level, text, text_len))
1583 log_store(facility, level, lflags | LOG_CONT, 0,
1584 dict, dictlen, text, text_len);
1585 } else {
1586 bool stored = false;
1587
1588
1589
1590
1591
1592
1593
1594 if (cont.len && cont.owner == current) {
1595 if (!(lflags & LOG_PREFIX))
1596 stored = cont_add(facility, level, text, text_len);
1597 cont_flush(LOG_NEWLINE);
1598 }
1599
1600 if (!stored)
1601 log_store(facility, level, lflags, 0,
1602 dict, dictlen, text, text_len);
1603 }
1604 printed_len += text_len;
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614 if (console_trylock_for_printk(this_cpu))
1615 console_unlock();
1616
1617 lockdep_on();
1618out_restore_irqs:
1619 local_irq_restore(flags);
1620
1621 return printed_len;
1622}
1623EXPORT_SYMBOL(vprintk_emit);
1624
1625asmlinkage int vprintk(const char *fmt, va_list args)
1626{
1627 return vprintk_emit(0, -1, NULL, 0, fmt, args);
1628}
1629EXPORT_SYMBOL(vprintk);
1630
1631asmlinkage int printk_emit(int facility, int level,
1632 const char *dict, size_t dictlen,
1633 const char *fmt, ...)
1634{
1635 va_list args;
1636 int r;
1637
1638 va_start(args, fmt);
1639 r = vprintk_emit(facility, level, dict, dictlen, fmt, args);
1640 va_end(args);
1641
1642 return r;
1643}
1644EXPORT_SYMBOL(printk_emit);
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667asmlinkage int printk(const char *fmt, ...)
1668{
1669 va_list args;
1670 int r;
1671
1672#ifdef CONFIG_KGDB_KDB
1673 if (unlikely(kdb_trap_printk)) {
1674 va_start(args, fmt);
1675 r = vkdb_printf(fmt, args);
1676 va_end(args);
1677 return r;
1678 }
1679#endif
1680 va_start(args, fmt);
1681 r = vprintk_emit(0, -1, NULL, 0, fmt, args);
1682 va_end(args);
1683
1684 return r;
1685}
1686EXPORT_SYMBOL(printk);
1687
1688#else
1689
1690#define LOG_LINE_MAX 0
1691#define PREFIX_MAX 0
1692#define LOG_LINE_MAX 0
1693static u64 syslog_seq;
1694static u32 syslog_idx;
1695static u64 console_seq;
1696static u32 console_idx;
1697static enum log_flags syslog_prev;
1698static u64 log_first_seq;
1699static u32 log_first_idx;
1700static u64 log_next_seq;
1701static enum log_flags console_prev;
1702static struct cont {
1703 size_t len;
1704 size_t cons;
1705 u8 level;
1706 bool flushed:1;
1707} cont;
1708static struct log *log_from_idx(u32 idx) { return NULL; }
1709static u32 log_next(u32 idx) { return 0; }
1710static void call_console_drivers(int level, const char *text, size_t len) {}
1711static size_t msg_print_text(const struct log *msg, enum log_flags prev,
1712 bool syslog, char *buf, size_t size) { return 0; }
1713static size_t cont_print_text(char *text, size_t size) { return 0; }
1714
1715#endif
1716
1717static int __add_preferred_console(char *name, int idx, char *options,
1718 char *brl_options)
1719{
1720 struct console_cmdline *c;
1721 int i;
1722
1723
1724
1725
1726
1727 for (i = 0; i < MAX_CMDLINECONSOLES && console_cmdline[i].name[0]; i++)
1728 if (strcmp(console_cmdline[i].name, name) == 0 &&
1729 console_cmdline[i].index == idx) {
1730 if (!brl_options)
1731 selected_console = i;
1732 return 0;
1733 }
1734 if (i == MAX_CMDLINECONSOLES)
1735 return -E2BIG;
1736 if (!brl_options)
1737 selected_console = i;
1738 c = &console_cmdline[i];
1739 strlcpy(c->name, name, sizeof(c->name));
1740 c->options = options;
1741#ifdef CONFIG_A11Y_BRAILLE_CONSOLE
1742 c->brl_options = brl_options;
1743#endif
1744 c->index = idx;
1745 return 0;
1746}
1747
1748
1749
1750static int __init console_setup(char *str)
1751{
1752 char buf[sizeof(console_cmdline[0].name) + 4];
1753 char *s, *options, *brl_options = NULL;
1754 int idx;
1755
1756#ifdef CONFIG_A11Y_BRAILLE_CONSOLE
1757 if (!memcmp(str, "brl,", 4)) {
1758 brl_options = "";
1759 str += 4;
1760 } else if (!memcmp(str, "brl=", 4)) {
1761 brl_options = str + 4;
1762 str = strchr(brl_options, ',');
1763 if (!str) {
1764 printk(KERN_ERR "need port name after brl=\n");
1765 return 1;
1766 }
1767 *(str++) = 0;
1768 }
1769#endif
1770
1771
1772
1773
1774 if (str[0] >= '0' && str[0] <= '9') {
1775 strcpy(buf, "ttyS");
1776 strncpy(buf + 4, str, sizeof(buf) - 5);
1777 } else {
1778 strncpy(buf, str, sizeof(buf) - 1);
1779 }
1780 buf[sizeof(buf) - 1] = 0;
1781 if ((options = strchr(str, ',')) != NULL)
1782 *(options++) = 0;
1783#ifdef __sparc__
1784 if (!strcmp(str, "ttya"))
1785 strcpy(buf, "ttyS0");
1786 if (!strcmp(str, "ttyb"))
1787 strcpy(buf, "ttyS1");
1788#endif
1789 for (s = buf; *s; s++)
1790 if ((*s >= '0' && *s <= '9') || *s == ',')
1791 break;
1792 idx = simple_strtoul(s, NULL, 10);
1793 *s = 0;
1794
1795 __add_preferred_console(buf, idx, options, brl_options);
1796 console_set_on_cmdline = 1;
1797 return 1;
1798}
1799__setup("console=", console_setup);
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814int add_preferred_console(char *name, int idx, char *options)
1815{
1816 return __add_preferred_console(name, idx, options, NULL);
1817}
1818
1819int update_console_cmdline(char *name, int idx, char *name_new, int idx_new, char *options)
1820{
1821 struct console_cmdline *c;
1822 int i;
1823
1824 for (i = 0; i < MAX_CMDLINECONSOLES && console_cmdline[i].name[0]; i++)
1825 if (strcmp(console_cmdline[i].name, name) == 0 &&
1826 console_cmdline[i].index == idx) {
1827 c = &console_cmdline[i];
1828 strlcpy(c->name, name_new, sizeof(c->name));
1829 c->name[sizeof(c->name) - 1] = 0;
1830 c->options = options;
1831 c->index = idx_new;
1832 return i;
1833 }
1834
1835 return -1;
1836}
1837
1838bool console_suspend_enabled = 1;
1839EXPORT_SYMBOL(console_suspend_enabled);
1840
1841static int __init console_suspend_disable(char *str)
1842{
1843 console_suspend_enabled = 0;
1844 return 1;
1845}
1846__setup("no_console_suspend", console_suspend_disable);
1847module_param_named(console_suspend, console_suspend_enabled,
1848 bool, S_IRUGO | S_IWUSR);
1849MODULE_PARM_DESC(console_suspend, "suspend console during suspend"
1850 " and hibernate operations");
1851
1852
1853
1854
1855
1856
1857void suspend_console(void)
1858{
1859 if (!console_suspend_enabled)
1860 return;
1861 printk("Suspending console(s) (use no_console_suspend to debug)\n");
1862 console_lock();
1863 console_suspended = 1;
1864 up(&console_sem);
1865}
1866
1867void resume_console(void)
1868{
1869 if (!console_suspend_enabled)
1870 return;
1871 down(&console_sem);
1872 console_suspended = 0;
1873 console_unlock();
1874}
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887static int __cpuinit console_cpu_notify(struct notifier_block *self,
1888 unsigned long action, void *hcpu)
1889{
1890 switch (action) {
1891 case CPU_ONLINE:
1892 case CPU_DEAD:
1893 case CPU_DYING:
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