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
744static bool __read_mostly ignore_loglevel;
745
746static int __init ignore_loglevel_setup(char *str)
747{
748 ignore_loglevel = 1;
749 printk(KERN_INFO "debug: ignoring loglevel setting.\n");
750
751 return 0;
752}
753
754early_param("ignore_loglevel", ignore_loglevel_setup);
755module_param(ignore_loglevel, bool, S_IRUGO | S_IWUSR);
756MODULE_PARM_DESC(ignore_loglevel, "ignore loglevel setting, to"
757 "print all kernel messages to the console.");
758
759#ifdef CONFIG_BOOT_PRINTK_DELAY
760
761static int boot_delay;
762static unsigned long long loops_per_msec;
763
764static int __init boot_delay_setup(char *str)
765{
766 unsigned long lpj;
767
768 lpj = preset_lpj ? preset_lpj : 1000000;
769 loops_per_msec = (unsigned long long)lpj / 1000 * HZ;
770
771 get_option(&str, &boot_delay);
772 if (boot_delay > 10 * 1000)
773 boot_delay = 0;
774
775 pr_debug("boot_delay: %u, preset_lpj: %ld, lpj: %lu, "
776 "HZ: %d, loops_per_msec: %llu\n",
777 boot_delay, preset_lpj, lpj, HZ, loops_per_msec);
778 return 1;
779}
780__setup("boot_delay=", boot_delay_setup);
781
782static void boot_delay_msec(int level)
783{
784 unsigned long long k;
785 unsigned long timeout;
786
787 if ((boot_delay == 0 || system_state != SYSTEM_BOOTING)
788 || (level >= console_loglevel && !ignore_loglevel)) {
789 return;
790 }
791
792 k = (unsigned long long)loops_per_msec * boot_delay;
793
794 timeout = jiffies + msecs_to_jiffies(boot_delay);
795 while (k) {
796 k--;
797 cpu_relax();
798
799
800
801
802
803 if (time_after(jiffies, timeout))
804 break;
805 touch_nmi_watchdog();
806 }
807}
808#else
809static inline void boot_delay_msec(int level)
810{
811}
812#endif
813
814#ifdef CONFIG_SECURITY_DMESG_RESTRICT
815int dmesg_restrict = 1;
816#else
817int dmesg_restrict;
818#endif
819
820static int syslog_action_restricted(int type)
821{
822 if (dmesg_restrict)
823 return 1;
824
825 return type != SYSLOG_ACTION_READ_ALL && type != SYSLOG_ACTION_SIZE_BUFFER;
826}
827
828static int check_syslog_permissions(int type, bool from_file)
829{
830
831
832
833
834 if (from_file && type != SYSLOG_ACTION_OPEN)
835 return 0;
836
837 if (syslog_action_restricted(type)) {
838 if (capable(CAP_SYSLOG))
839 return 0;
840
841 if (capable(CAP_SYS_ADMIN)) {
842 printk_once(KERN_WARNING "%s (%d): "
843 "Attempt to access syslog with CAP_SYS_ADMIN "
844 "but no CAP_SYSLOG (deprecated).\n",
845 current->comm, task_pid_nr(current));
846 return 0;
847 }
848 return -EPERM;
849 }
850 return 0;
851}
852
853#if defined(CONFIG_PRINTK_TIME)
854static bool printk_time = 1;
855#else
856static bool printk_time;
857#endif
858module_param_named(time, printk_time, bool, S_IRUGO | S_IWUSR);
859
860static size_t print_time(u64 ts, char *buf)
861{
862 unsigned long rem_nsec;
863
864 if (!printk_time)
865 return 0;
866
867 rem_nsec = do_div(ts, 1000000000);
868
869 if (!buf)
870 return snprintf(NULL, 0, "[%5lu.000000] ", (unsigned long)ts);
871
872 return sprintf(buf, "[%5lu.%06lu] ",
873 (unsigned long)ts, rem_nsec / 1000);
874}
875
876static size_t print_prefix(const struct log *msg, bool syslog, char *buf)
877{
878 size_t len = 0;
879 unsigned int prefix = (msg->facility << 3) | msg->level;
880
881 if (syslog) {
882 if (buf) {
883 len += sprintf(buf, "<%u>", prefix);
884 } else {
885 len += 3;
886 if (prefix > 999)
887 len += 3;
888 else if (prefix > 99)
889 len += 2;
890 else if (prefix > 9)
891 len++;
892 }
893 }
894
895 len += print_time(msg->ts_nsec, buf ? buf + len : NULL);
896 return len;
897}
898
899static size_t msg_print_text(const struct log *msg, enum log_flags prev,
900 bool syslog, char *buf, size_t size)
901{
902 const char *text = log_text(msg);
903 size_t text_size = msg->text_len;
904 bool prefix = true;
905 bool newline = true;
906 size_t len = 0;
907
908 if ((prev & LOG_CONT) && !(msg->flags & LOG_PREFIX))
909 prefix = false;
910
911 if (msg->flags & LOG_CONT) {
912 if ((prev & LOG_CONT) && !(prev & LOG_NEWLINE))
913 prefix = false;
914
915 if (!(msg->flags & LOG_NEWLINE))
916 newline = false;
917 }
918
919 do {
920 const char *next = memchr(text, '\n', text_size);
921 size_t text_len;
922
923 if (next) {
924 text_len = next - text;
925 next++;
926 text_size -= next - text;
927 } else {
928 text_len = text_size;
929 }
930
931 if (buf) {
932 if (print_prefix(msg, syslog, NULL) +
933 text_len + 1 >= size - len)
934 break;
935
936 if (prefix)
937 len += print_prefix(msg, syslog, buf + len);
938 memcpy(buf + len, text, text_len);
939 len += text_len;
940 if (next || newline)
941 buf[len++] = '\n';
942 } else {
943
944 if (prefix)
945 len += print_prefix(msg, syslog, NULL);
946 len += text_len;
947 if (next || newline)
948 len++;
949 }
950
951 prefix = true;
952 text = next;
953 } while (text);
954
955 return len;
956}
957
958static int syslog_print(char __user *buf, int size)
959{
960 char *text;
961 struct log *msg;
962 int len = 0;
963
964 text = kmalloc(LOG_LINE_MAX + PREFIX_MAX, GFP_KERNEL);
965 if (!text)
966 return -ENOMEM;
967
968 while (size > 0) {
969 size_t n;
970 size_t skip;
971
972 raw_spin_lock_irq(&logbuf_lock);
973 if (syslog_seq < log_first_seq) {
974
975 syslog_seq = log_first_seq;
976 syslog_idx = log_first_idx;
977 syslog_prev = 0;
978 syslog_partial = 0;
979 }
980 if (syslog_seq == log_next_seq) {
981 raw_spin_unlock_irq(&logbuf_lock);
982 break;
983 }
984
985 skip = syslog_partial;
986 msg = log_from_idx(syslog_idx);
987 n = msg_print_text(msg, syslog_prev, true, text,
988 LOG_LINE_MAX + PREFIX_MAX);
989 if (n - syslog_partial <= size) {
990
991 syslog_idx = log_next(syslog_idx);
992 syslog_seq++;
993 syslog_prev = msg->flags;
994 n -= syslog_partial;
995 syslog_partial = 0;
996 } else if (!len){
997
998 n = size;
999 syslog_partial += n;
1000 } else
1001 n = 0;
1002 raw_spin_unlock_irq(&logbuf_lock);
1003
1004 if (!n)
1005 break;
1006
1007 if (copy_to_user(buf, text + skip, n)) {
1008 if (!len)
1009 len = -EFAULT;
1010 break;
1011 }
1012
1013 len += n;
1014 size -= n;
1015 buf += n;
1016 }
1017
1018 kfree(text);
1019 return len;
1020}
1021
1022static int syslog_print_all(char __user *buf, int size, bool clear)
1023{
1024 char *text;
1025 int len = 0;
1026
1027 text = kmalloc(LOG_LINE_MAX + PREFIX_MAX, GFP_KERNEL);
1028 if (!text)
1029 return -ENOMEM;
1030
1031 raw_spin_lock_irq(&logbuf_lock);
1032 if (buf) {
1033 u64 next_seq;
1034 u64 seq;
1035 u32 idx;
1036 enum log_flags prev;
1037
1038 if (clear_seq < log_first_seq) {
1039
1040 clear_seq = log_first_seq;
1041 clear_idx = log_first_idx;
1042 }
1043
1044
1045
1046
1047
1048 seq = clear_seq;
1049 idx = clear_idx;
1050 prev = 0;
1051 while (seq < log_next_seq) {
1052 struct log *msg = log_from_idx(idx);
1053
1054 len += msg_print_text(msg, prev, true, NULL, 0);
1055 prev = msg->flags;
1056 idx = log_next(idx);
1057 seq++;
1058 }
1059
1060
1061 seq = clear_seq;
1062 idx = clear_idx;
1063 prev = 0;
1064 while (len > size && seq < log_next_seq) {
1065 struct log *msg = log_from_idx(idx);
1066
1067 len -= msg_print_text(msg, prev, true, NULL, 0);
1068 prev = msg->flags;
1069 idx = log_next(idx);
1070 seq++;
1071 }
1072
1073
1074 next_seq = log_next_seq;
1075
1076 len = 0;
1077 prev = 0;
1078 while (len >= 0 && seq < next_seq) {
1079 struct log *msg = log_from_idx(idx);
1080 int textlen;
1081
1082 textlen = msg_print_text(msg, prev, true, text,
1083 LOG_LINE_MAX + PREFIX_MAX);
1084 if (textlen < 0) {
1085 len = textlen;
1086 break;
1087 }
1088 idx = log_next(idx);
1089 seq++;
1090 prev = msg->flags;
1091
1092 raw_spin_unlock_irq(&logbuf_lock);
1093 if (copy_to_user(buf + len, text, textlen))
1094 len = -EFAULT;
1095 else
1096 len += textlen;
1097 raw_spin_lock_irq(&logbuf_lock);
1098
1099 if (seq < log_first_seq) {
1100
1101 seq = log_first_seq;
1102 idx = log_first_idx;
1103 prev = 0;
1104 }
1105 }
1106 }
1107
1108 if (clear) {
1109 clear_seq = log_next_seq;
1110 clear_idx = log_next_idx;
1111 }
1112 raw_spin_unlock_irq(&logbuf_lock);
1113
1114 kfree(text);
1115 return len;
1116}
1117
1118int do_syslog(int type, char __user *buf, int len, bool from_file)
1119{
1120 bool clear = false;
1121 static int saved_console_loglevel = -1;
1122 int error;
1123
1124 error = check_syslog_permissions(type, from_file);
1125 if (error)
1126 goto out;
1127
1128 error = security_syslog(type);
1129 if (error)
1130 return error;
1131
1132 switch (type) {
1133 case SYSLOG_ACTION_CLOSE:
1134 break;
1135 case SYSLOG_ACTION_OPEN:
1136 break;
1137 case SYSLOG_ACTION_READ:
1138 error = -EINVAL;
1139 if (!buf || len < 0)
1140 goto out;
1141 error = 0;
1142 if (!len)
1143 goto out;
1144 if (!access_ok(VERIFY_WRITE, buf, len)) {
1145 error = -EFAULT;
1146 goto out;
1147 }
1148 error = wait_event_interruptible(log_wait,
1149 syslog_seq != log_next_seq);
1150 if (error)
1151 goto out;
1152 error = syslog_print(buf, len);
1153 break;
1154
1155 case SYSLOG_ACTION_READ_CLEAR:
1156 clear = true;
1157
1158
1159 case SYSLOG_ACTION_READ_ALL:
1160 error = -EINVAL;
1161 if (!buf || len < 0)
1162 goto out;
1163 error = 0;
1164 if (!len)
1165 goto out;
1166 if (!access_ok(VERIFY_WRITE, buf, len)) {
1167 error = -EFAULT;
1168 goto out;
1169 }
1170 error = syslog_print_all(buf, len, clear);
1171 break;
1172
1173 case SYSLOG_ACTION_CLEAR:
1174 syslog_print_all(NULL, 0, true);
1175 break;
1176
1177 case SYSLOG_ACTION_CONSOLE_OFF:
1178 if (saved_console_loglevel == -1)
1179 saved_console_loglevel = console_loglevel;
1180 console_loglevel = minimum_console_loglevel;
1181 break;
1182
1183 case SYSLOG_ACTION_CONSOLE_ON:
1184 if (saved_console_loglevel != -1) {
1185 console_loglevel = saved_console_loglevel;
1186 saved_console_loglevel = -1;
1187 }
1188 break;
1189
1190 case SYSLOG_ACTION_CONSOLE_LEVEL:
1191 error = -EINVAL;
1192 if (len < 1 || len > 8)
1193 goto out;
1194 if (len < minimum_console_loglevel)
1195 len = minimum_console_loglevel;
1196 console_loglevel = len;
1197
1198 saved_console_loglevel = -1;
1199 error = 0;
1200 break;
1201
1202 case SYSLOG_ACTION_SIZE_UNREAD:
1203 raw_spin_lock_irq(&logbuf_lock);
1204 if (syslog_seq < log_first_seq) {
1205
1206 syslog_seq = log_first_seq;
1207 syslog_idx = log_first_idx;
1208 syslog_prev = 0;
1209 syslog_partial = 0;
1210 }
1211 if (from_file) {
1212
1213
1214
1215
1216
1217 error = log_next_idx - syslog_idx;
1218 } else {
1219 u64 seq = syslog_seq;
1220 u32 idx = syslog_idx;
1221 enum log_flags prev = syslog_prev;
1222
1223 error = 0;
1224 while (seq < log_next_seq) {
1225 struct log *msg = log_from_idx(idx);
1226
1227 error += msg_print_text(msg, prev, true, NULL, 0);
1228 idx = log_next(idx);
1229 seq++;
1230 prev = msg->flags;
1231 }
1232 error -= syslog_partial;
1233 }
1234 raw_spin_unlock_irq(&logbuf_lock);
1235 break;
1236
1237 case SYSLOG_ACTION_SIZE_BUFFER:
1238 error = log_buf_len;
1239 break;
1240 default:
1241 error = -EINVAL;
1242 break;
1243 }
1244out:
1245 return error;
1246}
1247
1248SYSCALL_DEFINE3(syslog, int, type, char __user *, buf, int, len)
1249{
1250 return do_syslog(type, buf, len, SYSLOG_FROM_CALL);
1251}
1252
1253
1254
1255
1256
1257
1258static void call_console_drivers(int level, const char *text, size_t len)
1259{
1260 struct console *con;
1261
1262 trace_console(text, 0, len, len);
1263
1264 if (level >= console_loglevel && !ignore_loglevel)
1265 return;
1266 if (!console_drivers)
1267 return;
1268
1269 for_each_console(con) {
1270 if (exclusive_console && con != exclusive_console)
1271 continue;
1272 if (!(con->flags & CON_ENABLED))
1273 continue;
1274 if (!con->write)
1275 continue;
1276 if (!cpu_online(smp_processor_id()) &&
1277 !(con->flags & CON_ANYTIME))
1278 continue;
1279 con->write(con, text, len);
1280 }
1281}
1282
1283
1284
1285
1286
1287
1288static void zap_locks(void)
1289{
1290 static unsigned long oops_timestamp;
1291
1292 if (time_after_eq(jiffies, oops_timestamp) &&
1293 !time_after(jiffies, oops_timestamp + 30 * HZ))
1294 return;
1295
1296 oops_timestamp = jiffies;
1297
1298 debug_locks_off();
1299
1300 raw_spin_lock_init(&logbuf_lock);
1301
1302 sema_init(&console_sem, 1);
1303}
1304
1305
1306static int have_callable_console(void)
1307{
1308 struct console *con;
1309
1310 for_each_console(con)
1311 if (con->flags & CON_ANYTIME)
1312 return 1;
1313
1314 return 0;
1315}
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325static inline int can_use_console(unsigned int cpu)
1326{
1327 return cpu_online(cpu) || have_callable_console();
1328}
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340static int console_trylock_for_printk(unsigned int cpu)
1341 __releases(&logbuf_lock)
1342{
1343 int retval = 0, wake = 0;
1344
1345 if (console_trylock()) {
1346 retval = 1;
1347
1348
1349
1350
1351
1352
1353
1354 if (!can_use_console(cpu)) {
1355 console_locked = 0;
1356 wake = 1;
1357 retval = 0;
1358 }
1359 }
1360 logbuf_cpu = UINT_MAX;
1361 if (wake)
1362 up(&console_sem);
1363 raw_spin_unlock(&logbuf_lock);
1364 return retval;
1365}
1366
1367int printk_delay_msec __read_mostly;
1368
1369static inline void printk_delay(void)
1370{
1371 if (unlikely(printk_delay_msec)) {
1372 int m = printk_delay_msec;
1373
1374 while (m--) {
1375 mdelay(1);
1376 touch_nmi_watchdog();
1377 }
1378 }
1379}
1380
1381
1382
1383
1384
1385
1386
1387static struct cont {
1388 char buf[LOG_LINE_MAX];
1389 size_t len;
1390 size_t cons;
1391 struct task_struct *owner;
1392 u64 ts_nsec;
1393 u8 level;
1394 u8 facility;
1395 enum log_flags flags;
1396 bool flushed:1;
1397} cont;
1398
1399static void cont_flush(enum log_flags flags)
1400{
1401 if (cont.flushed)
1402 return;
1403 if (cont.len == 0)
1404 return;
1405
1406 if (cont.cons) {
1407
1408
1409
1410
1411
1412 log_store(cont.facility, cont.level, flags | LOG_NOCONS,
1413 cont.ts_nsec, NULL, 0, cont.buf, cont.len);
1414 cont.flags = flags;
1415 cont.flushed = true;
1416 } else {
1417
1418
1419
1420
1421 log_store(cont.facility, cont.level, flags, 0,
1422 NULL, 0, cont.buf, cont.len);
1423 cont.len = 0;
1424 }
1425}
1426
1427static bool cont_add(int facility, int level, const char *text, size_t len)
1428{
1429 if (cont.len && cont.flushed)
1430 return false;
1431
1432 if (cont.len + len > sizeof(cont.buf)) {
1433
1434 cont_flush(LOG_CONT);
1435 return false;
1436 }
1437
1438 if (!cont.len) {
1439 cont.facility = facility;
1440 cont.level = level;
1441 cont.owner = current;
1442 cont.ts_nsec = local_clock();
1443 cont.flags = 0;
1444 cont.cons = 0;
1445 cont.flushed = false;
1446 }
1447
1448 memcpy(cont.buf + cont.len, text, len);
1449 cont.len += len;
1450
1451 if (cont.len > (sizeof(cont.buf) * 80) / 100)
1452 cont_flush(LOG_CONT);
1453
1454 return true;
1455}
1456
1457static size_t cont_print_text(char *text, size_t size)
1458{
1459 size_t textlen = 0;
1460 size_t len;
1461
1462 if (cont.cons == 0 && (console_prev & LOG_NEWLINE)) {
1463 textlen += print_time(cont.ts_nsec, text);
1464 size -= textlen;
1465 }
1466
1467 len = cont.len - cont.cons;
1468 if (len > 0) {
1469 if (len+1 > size)
1470 len = size-1;
1471 memcpy(text + textlen, cont.buf + cont.cons, len);
1472 textlen += len;
1473 cont.cons = cont.len;
1474 }
1475
1476 if (cont.flushed) {
1477 if (cont.flags & LOG_NEWLINE)
1478 text[textlen++] = '\n';
1479
1480 cont.len = 0;
1481 }
1482 return textlen;
1483}
1484
1485asmlinkage int vprintk_emit(int facility, int level,
1486 const char *dict, size_t dictlen,
1487 const char *fmt, va_list args)
1488{
1489 static int recursion_bug;
1490 static char textbuf[LOG_LINE_MAX];
1491 char *text = textbuf;
1492 size_t text_len;
1493 enum log_flags lflags = 0;
1494 unsigned long flags;
1495 int this_cpu;
1496 int printed_len = 0;
1497
1498 boot_delay_msec(level);
1499 printk_delay();
1500
1501
1502 local_irq_save(flags);
1503 this_cpu = smp_processor_id();
1504
1505
1506
1507
1508 if (unlikely(logbuf_cpu == this_cpu)) {
1509
1510
1511
1512
1513
1514
1515
1516 if (!oops_in_progress && !lockdep_recursing(current)) {
1517 recursion_bug = 1;
1518 goto out_restore_irqs;
1519 }
1520 zap_locks();
1521 }
1522
1523 lockdep_off();
1524 raw_spin_lock(&logbuf_lock);
1525 logbuf_cpu = this_cpu;
1526
1527 if (recursion_bug) {
1528 static const char recursion_msg[] =
1529 "BUG: recent printk recursion!";
1530
1531 recursion_bug = 0;
1532 printed_len += strlen(recursion_msg);
1533
1534 log_store(0, 2, LOG_PREFIX|LOG_NEWLINE, 0,
1535 NULL, 0, recursion_msg, printed_len);
1536 }
1537
1538
1539
1540
1541
1542 text_len = vscnprintf(text, sizeof(textbuf), fmt, args);
1543
1544
1545 if (text_len && text[text_len-1] == '\n') {
1546 text_len--;
1547 lflags |= LOG_NEWLINE;
1548 }
1549
1550
1551 if (facility == 0) {
1552 int kern_level = printk_get_level(text);
1553
1554 if (kern_level) {
1555 const char *end_of_header = printk_skip_level(text);
1556 switch (kern_level) {
1557 case '0' ... '7':
1558 if (level == -1)
1559 level = kern_level - '0';
1560 case 'd':
1561 lflags |= LOG_PREFIX;
1562 case 'c':
1563 break;
1564 }
1565 text_len -= end_of_header - text;
1566 text = (char *)end_of_header;
1567 }
1568 }
1569
1570 if (level == -1)
1571 level = default_message_loglevel;
1572
1573 if (dict)
1574 lflags |= LOG_PREFIX|LOG_NEWLINE;
1575
1576 if (!(lflags & LOG_NEWLINE)) {
1577
1578
1579
1580
1581 if (cont.len && (lflags & LOG_PREFIX || cont.owner != current))
1582 cont_flush(LOG_NEWLINE);
1583
1584
1585 if (!cont_add(facility, level, text, text_len))
1586 log_store(facility, level, lflags | LOG_CONT, 0,
1587 dict, dictlen, text, text_len);
1588 } else {
1589 bool stored = false;
1590
1591
1592
1593
1594
1595
1596
1597 if (cont.len && cont.owner == current) {
1598 if (!(lflags & LOG_PREFIX))
1599 stored = cont_add(facility, level, text, text_len);
1600 cont_flush(LOG_NEWLINE);
1601 }
1602
1603 if (!stored)
1604 log_store(facility, level, lflags, 0,
1605 dict, dictlen, text, text_len);
1606 }
1607 printed_len += text_len;
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617 if (console_trylock_for_printk(this_cpu))
1618 console_unlock();
1619
1620 lockdep_on();
1621out_restore_irqs:
1622 local_irq_restore(flags);
1623
1624 return printed_len;
1625}
1626EXPORT_SYMBOL(vprintk_emit);
1627
1628asmlinkage int vprintk(const char *fmt, va_list args)
1629{
1630 return vprintk_emit(0, -1, NULL, 0, fmt, args);
1631}
1632EXPORT_SYMBOL(vprintk);
1633
1634asmlinkage int printk_emit(int facility, int level,
1635 const char *dict, size_t dictlen,
1636 const char *fmt, ...)
1637{
1638 va_list args;
1639 int r;
1640
1641 va_start(args, fmt);
1642 r = vprintk_emit(facility, level, dict, dictlen, fmt, args);
1643 va_end(args);
1644
1645 return r;
1646}
1647EXPORT_SYMBOL(printk_emit);
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670asmlinkage int printk(const char *fmt, ...)
1671{
1672 va_list args;
1673 int r;
1674
1675#ifdef CONFIG_KGDB_KDB
1676 if (unlikely(kdb_trap_printk)) {
1677 va_start(args, fmt);
1678 r = vkdb_printf(fmt, args);
1679 va_end(args);
1680 return r;
1681 }
1682#endif
1683 va_start(args, fmt);
1684 r = vprintk_emit(0, -1, NULL, 0, fmt, args);
1685 va_end(args);
1686
1687 return r;
1688}
1689EXPORT_SYMBOL(printk);
1690
1691#else
1692
1693#define LOG_LINE_MAX 0
1694#define PREFIX_MAX 0
1695#define LOG_LINE_MAX 0
1696static u64 syslog_seq;
1697static u32 syslog_idx;
1698static u64 console_seq;
1699static u32 console_idx;
1700static enum log_flags syslog_prev;
1701static u64 log_first_seq;
1702static u32 log_first_idx;
1703static u64 log_next_seq;
1704static enum log_flags console_prev;
1705static struct cont {
1706 size_t len;
1707 size_t cons;
1708 u8 level;
1709 bool flushed:1;
1710} cont;
1711static struct log *log_from_idx(u32 idx) { return NULL; }
1712static u32 log_next(u32 idx) { return 0; }
1713static void call_console_drivers(int level, const char *text, size_t len) {}
1714static size_t msg_print_text(const struct log *msg, enum log_flags prev,
1715 bool syslog, char *buf, size_t size) { return 0; }
1716static size_t cont_print_text(char *text, size_t size) { return 0; }
1717
1718#endif
1719
1720static int __add_preferred_console(char *name, int idx, char *options,
1721 char *brl_options)
1722{
1723 struct console_cmdline *c;
1724 int i;
1725
1726
1727
1728
1729
1730 for (i = 0; i < MAX_CMDLINECONSOLES && console_cmdline[i].name[0]; i++)
1731 if (strcmp(console_cmdline[i].name, name) == 0 &&
1732 console_cmdline[i].index == idx) {
1733 if (!brl_options)
1734 selected_console = i;
1735 return 0;
1736 }
1737 if (i == MAX_CMDLINECONSOLES)
1738 return -E2BIG;
1739 if (!brl_options)
1740 selected_console = i;
1741 c = &console_cmdline[i];
1742 strlcpy(c->name, name, sizeof(c->name));
1743 c->options = options;
1744#ifdef CONFIG_A11Y_BRAILLE_CONSOLE
1745 c->brl_options = brl_options;
1746#endif
1747 c->index = idx;
1748 return 0;
1749}
1750
1751
1752
1753static int __init console_setup(char *str)
1754{
1755 char buf[sizeof(console_cmdline[0].name) + 4];
1756 char *s, *options, *brl_options = NULL;
1757 int idx;
1758
1759#ifdef CONFIG_A11Y_BRAILLE_CONSOLE
1760 if (!memcmp(str, "brl,", 4)) {
1761 brl_options = "";
1762 str += 4;
1763 } else if (!memcmp(str, "brl=", 4)) {
1764 brl_options = str + 4;
1765 str = strchr(brl_options, ',');
1766 if (!str) {
1767 printk(KERN_ERR "need port name after brl=\n");
1768 return 1;
1769 }
1770 *(str++) = 0;
1771 }
1772#endif
1773
1774
1775
1776
1777 if (str[0] >= '0' && str[0] <= '9') {
1778 strcpy(buf, "ttyS");
1779 strncpy(buf + 4, str, sizeof(buf) - 5);
1780 } else {
1781 strncpy(buf, str, sizeof(buf) - 1);
1782 }
1783 buf[sizeof(buf) - 1] = 0;
1784 if ((options = strchr(str, ',')) != NULL)
1785 *(options++) = 0;
1786#ifdef __sparc__
1787 if (!strcmp(str, "ttya"))
1788 strcpy(buf, "ttyS0");
1789 if (!strcmp(str, "ttyb"))
1790 strcpy(buf, "ttyS1");
1791#endif
1792 for (s = buf; *s; s++)
1793 if ((*s >= '0' && *s <= '9') || *s == ',')
1794 break;
1795 idx = simple_strtoul(s, NULL, 10);
1796 *s = 0;
1797
1798 __add_preferred_console(buf, idx, options, brl_options);
1799 console_set_on_cmdline = 1;
1800 return 1;
1801}
1802__setup("console=", console_setup);
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817int add_preferred_console(char *name, int idx, char *options)
1818{
1819 return __add_preferred_console(name, idx, options, NULL);
1820}
1821
1822int update_console_cmdline(char *name, int idx, char *name_new, int idx_new, char *options)
1823{
1824 struct console_cmdline *c;
1825 int i;
1826
1827 for (i = 0; i < MAX_CMDLINECONSOLES && console_cmdline[i].name[0]; i++)
1828 if (strcmp(console_cmdline[i].name, name) == 0 &&
1829 console_cmdline[i].index == idx) {
1830 c = &console_cmdline[i];
1831 strlcpy(c->name, name_new, sizeof(c->name));
1832 c->name[sizeof(c->name) - 1] = 0;
1833 c->options = options;
1834 c->index = idx_new;
1835 return i;
1836 }
1837
1838 return -1;
1839}
1840
1841bool console_suspend_enabled = 1;
1842EXPORT_SYMBOL(console_suspend_enabled);
1843
1844static int __init console_suspend_disable(char *str)
1845{
1846 console_suspend_enabled = 0;
1847 return 1;
1848}
1849__setup("no_console_suspend", console_suspend_disable);
1850module_param_named(console_suspend, console_suspend_enabled,
1851 bool, S_IRUGO | S_IWUSR);
1852MODULE_PARM_DESC(console_suspend, "suspend console during suspend"
1853 " and hibernate operations");
1854
1855
1856
1857
1858
1859
1860void suspend_console(void)
1861{
1862 if (!console_suspend_enabled)
1863 return;
1864 printk("Suspending console(s) (use no_console_suspend to debug)\n");
1865 console_lock();
1866 console_suspended = 1;
1867 up(&console_sem);
1868}
1869
1870void resume_console(void)
1871{
1872 if (!console_suspend_enabled)
1873 return;
1874 down(&console_sem);
1875 console_suspended = 0;
1876 console_unlock();
1877}
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890static int __cpuinit console_cpu_notify(struct notifier_block *self,
1891 unsigned long action, void *hcpu)
1892{
1893 switch (action) {
1894 case CPU_ONLINE:
1895 case CPU_DEAD:
1896 case CPU_DOWN_FAILED:
1897 case CPU_UP_CANCELED:
1898 console_lock();
1899 console_unlock();
1900 }
1901 return NOTIFY_OK;
1902}
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912void console_lock(void)
1913{
1914 might_sleep();
1915
1916 down(&console_sem);
1917 if (console_suspended)
1918 return;
1919 console_locked = 1;
1920 console_may_schedule = 1;
1921}
1922EXPORT_SYMBOL(console_lock);
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932int console_trylock(void)
1933{
1934 if (down_trylock(&console_sem))
1935 return 0;
1936 if (console_suspended) {
1937 up(&console_sem);
1938 return 0;
1939 }
1940 console_locked = 1;
1941 console_may_schedule = 0;
1942 return 1;
1943}
1944EXPORT_SYMBOL(console_trylock);
1945
1946int is_console_locked(void)
1947{
1948 return console_locked;
1949}
1950
1951
1952
1953
1954#define PRINTK_BUF_SIZE 512
1955
1956#define PRINTK_PENDING_WAKEUP 0x01
1957#define PRINTK_PENDING_SCHED 0x02
1958
1959static DEFINE_PER_CPU(int, printk_pending);
1960static DEFINE_PER_CPU(char [PRINTK_BUF_SIZE], printk_sched_buf);
1961
1962void printk_tick(void)
1963{
1964 if (__this_cpu_read(printk_pending)) {
1965 int pending = __this_cpu_xchg(printk_pending, 0);
1966 if (pending & PRINTK_PENDING_SCHED) {
1967 char *buf = __get_cpu_var(printk_sched_buf);
1968 printk(KERN_WARNING "[sched_delayed] %s", buf);
1969 }
1970 if (pending & PRINTK_PENDING_WAKEUP)
1971 wake_up_interruptible(&log_wait);
1972 }
1973}
1974
1975int printk_needs_cpu(int cpu)
1976{
1977 if (cpu_is_offline(cpu))
1978 printk_tick();
1979 return __this_cpu_read(printk_pending);
1980}
1981
1982void wake_up_klogd(void)
1983{
1984 if (waitqueue_active(&log_wait))
1985 this_cpu_or(printk_pending, PRINTK_PENDING_WAKEUP);
1986}
1987
1988static void console_cont_flush(char *text, size_t size)
1989{
1990 unsigned long flags;
1991 size_t len;
1992
1993 raw_spin_lock_irqsave(&logbuf_lock, flags);
1994
1995 if (!cont.len)
1996 goto out;
1997
1998
1999
2000
2001
2002
2003 if (console_seq < log_next_seq && !cont.cons)
2004 goto out;
2005
2006 len = cont_print_text(text, size);
2007 raw_spin_unlock(&logbuf_lock);
2008 stop_critical_timings();
2009 call_console_drivers(cont.level, text, len);
2010 start_critical_timings();
2011 local_irq_restore(flags);
2012 return;
2013out:
2014 raw_spin_unlock_irqrestore(&logbuf_lock, flags);
2015}
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031void console_unlock(void)
2032{
2033 static char text[LOG_LINE_MAX + PREFIX_MAX];
2034 static u64 seen_seq;
2035 unsigned long flags;
2036 bool wake_klogd = false;
2037 bool retry;
2038
2039 if (console_suspended) {
2040 up(&console_sem);
2041 return;
2042 }
2043
2044 console_may_schedule = 0;
2045
2046
2047 console_cont_flush(text, sizeof(text));
2048again:
2049 for (;;) {
2050 struct log *msg;
2051 size_t len;
2052 int level;
2053
2054 raw_spin_lock_irqsave(&logbuf_lock, flags);
2055 if (seen_seq != log_next_seq) {
2056 wake_klogd = true;
2057 seen_seq = log_next_seq;
2058 }
2059
2060 if (console_seq < log_first_seq) {
2061
2062 console_seq = log_first_seq;
2063 console_idx = log_first_idx;
2064 console_prev = 0;
2065 }
2066skip:
2067 if (console_seq == log_next_seq)
2068 break;
2069
2070 msg = log_from_idx(console_idx);
2071 if (msg->flags & LOG_NOCONS) {
2072
2073
2074
2075
2076 console_idx = log_next(console_idx);
2077 console_seq++;
2078
2079
2080
2081
2082
2083 msg->flags &= ~LOG_NOCONS;
2084 console_prev = msg->flags;
2085 goto skip;
2086 }
2087
2088 level = msg->level;
2089 len = msg_print_text(msg, console_prev, false,
2090 text, sizeof(text));
2091 console_idx = log_next(console_idx);
2092 console_seq++;
2093 console_prev = msg->flags;
2094 raw_spin_unlock(&logbuf_lock);
2095
2096 stop_critical_timings();
2097 call_console_drivers(level, text, len);
2098 start_critical_timings();
2099 local_irq_restore(flags);
2100 }
2101 console_locked = 0;
2102
2103
2104 if (unlikely(exclusive_console))
2105 exclusive_console = NULL;
2106
2107 raw_spin_unlock(&logbuf_lock);
2108
2109 up(&console_sem);
2110
2111
2112
2113
2114
2115
2116
2117 raw_spin_lock(&logbuf_lock);
2118 retry = console_seq != log_next_seq;
2119 raw_spin_unlock_irqrestore(&logbuf_lock, flags);
2120
2121 if (retry && console_trylock())
2122 goto again;
2123
2124 if (wake_klogd)
2125 wake_up_klogd();
2126}
2127EXPORT_SYMBOL(console_unlock);
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138void __sched console_conditional_schedule(void)
2139{
2140 if (console_may_schedule)
2141 cond_resched();
2142}
2143EXPORT_SYMBOL(console_conditional_schedule);
2144
2145void console_unblank(void)
2146{
2147 struct console *c;
2148
2149
2150
2151
2152
2153 if (oops_in_progress) {
2154 if (down_trylock(&console_sem) != 0)
2155 return;
2156 } else
2157 console_lock();
2158
2159 console_locked = 1;
2160 console_may_schedule = 0;
2161 for_each_console(c)
2162 if ((c->flags & CON_ENABLED) && c->unblank)
2163 c->unblank();
2164 console_unlock();
2165}
2166
2167
2168
2169
2170struct tty_driver *console_device(int *index)
2171{
2172 struct console *c;
2173 struct tty_driver *driver = NULL;
2174
2175 console_lock();
2176 for_each_console(c) {
2177 if (!c->device)
2178 continue;
2179 driver = c->device(c, index);
2180 if (driver)
2181 break;
2182 }
2183 console_unlock();
2184 return driver;
2185}
2186
2187
2188
2189
2190
2191
2192void console_stop(struct console *console)
2193{
2194 console_lock();
2195 console->flags &= ~CON_ENABLED;
2196 console_unlock();
2197}
2198EXPORT_SYMBOL(console_stop);
2199
2200void console_start(struct console *console)
2201{
2202 console_lock();
2203 console->flags |= CON_ENABLED;
2204 console_unlock();
2205}
2206EXPORT_SYMBOL(console_start);
2207
2208static int __read_mostly keep_bootcon;
2209
2210static int __init keep_bootcon_setup(char *str)
2211{
2212 keep_bootcon = 1;
2213 printk(KERN_INFO "debug: skip boot console de-registration.\n");
2214
2215 return 0;
2216}
2217
2218early_param("keep_bootcon", keep_bootcon_setup);
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239void register_console(struct console *newcon)
2240{
2241 int i;
2242 unsigned long flags;
2243 struct console *bcon = NULL;
2244
2245
2246
2247
2248
2249 if (console_drivers && newcon->flags & CON_BOOT) {
2250
2251 for_each_console(bcon) {
2252 if (!(bcon->flags & CON_BOOT)) {
2253 printk(KERN_INFO "Too late to register bootconsole %s%d\n",
2254 newcon->name, newcon->index);
2255 return;
2256 }
2257 }
2258 }
2259
2260 if (console_drivers && console_drivers->flags & CON_BOOT)
2261 bcon = console_drivers;
2262
2263 if (preferred_console < 0 || bcon || !console_drivers)
2264 preferred_console = selected_console;
2265
2266 if (newcon->early_setup)
2267 newcon->early_setup();
2268
2269
2270
2271
2272
2273
2274 if (preferred_console < 0) {
2275 if (newcon->index < 0)
2276 newcon->index = 0;
2277 if (newcon->setup == NULL ||
2278 newcon->setup(newcon, NULL) == 0) {
2279 newcon->flags |= CON_ENABLED;
2280 if (newcon->device) {
2281 newcon->flags |= CON_CONSDEV;
2282 preferred_console = 0;
2283 }
2284 }
2285 }
2286
2287
2288
2289
2290
2291 for (i = 0; i < MAX_CMDLINECONSOLES && console_cmdline[i].name[0];
2292 i++) {
2293 if (strcmp(console_cmdline[i].name, newcon->name) != 0)
2294 continue;
2295 if (newcon->index >= 0 &&
2296 newcon->index != console_cmdline[i].index)
2297 continue;
2298 if (newcon->index < 0)
2299 newcon->index = console_cmdline[i].index;
2300#ifdef CONFIG_A11Y_BRAILLE_CONSOLE
2301 if (console_cmdline[i].brl_options) {
2302 newcon->flags |= CON_BRL;
2303 braille_register_console(newcon,
2304 console_cmdline[i].index,
2305 console_cmdline[i].options,
2306 console_cmdline[i].brl_options);
2307 return;
2308 }
2309#endif
2310 if (newcon->setup &&
2311 newcon->setup(newcon, console_cmdline[i].options) != 0)
2312 break;
2313 newcon->flags |= CON_ENABLED;
2314 newcon->index = console_cmdline[i].index;
2315 if (i == selected_console) {
2316 newcon->flags |= CON_CONSDEV;
2317 preferred_console = selected_console;
2318 }
2319 break;
2320 }
2321
2322 if (!(newcon->flags & CON_ENABLED))
2323 return;
2324
2325
2326
2327
2328
2329
2330
2331 if (bcon && ((newcon->flags & (CON_CONSDEV | CON_BOOT)) == CON_CONSDEV))
2332 newcon->flags &= ~CON_PRINTBUFFER;
2333
2334
2335
2336
2337
2338 console_lock();
2339 if ((newcon->flags & CON_CONSDEV) || console_drivers == NULL) {
2340 newcon->next = console_drivers;
2341 console_drivers = newcon;
2342 if (newcon->next)
2343 newcon->next->flags &= ~CON_CONSDEV;
2344 } else {
2345 newcon->next = console_drivers->next;
2346 console_drivers->next = newcon;
2347 }
2348 if (newcon->flags & CON_PRINTBUFFER) {
2349
2350
2351
2352
2353 raw_spin_lock_irqsave(&logbuf_lock, flags);
2354 console_seq = syslog_seq;
2355 console_idx = syslog_idx;
2356 console_prev = syslog_prev;
2357 raw_spin_unlock_irqrestore(&logbuf_lock, flags);
2358
2359
2360
2361
2362
2363 exclusive_console = newcon;
2364 }
2365 console_unlock();
2366 console_sysfs_notify();
2367
2368
2369
2370
2371
2372
2373
2374
2375 if (bcon &&
2376 ((newcon->flags & (CON_CONSDEV | CON_BOOT)) == CON_CONSDEV) &&
2377 !keep_bootcon) {
2378
2379
2380
2381 printk(KERN_INFO "console [%s%d] enabled, bootconsole disabled\n",
2382 newcon->name, newcon->index);
2383 for_each_console(bcon)
2384 if (bcon->flags & CON_BOOT)
2385 unregister_console(bcon);
2386 } else {
2387 printk(KERN_INFO "%sconsole [%s%d] enabled\n",
2388 (newcon->flags & CON_BOOT) ? "boot" : "" ,
2389 newcon->name, newcon->index);
2390 }
2391}
2392EXPORT_SYMBOL(register_console);
2393
2394int unregister_console(struct console *console)
2395{
2396 struct console *a, *b;
2397 int res = 1;
2398
2399#ifdef CONFIG_A11Y_BRAILLE_CONSOLE
2400 if (console->flags & CON_BRL)
2401 return braille_unregister_console(console);
2402#endif
2403
2404 console_lock();
2405 if (console_drivers == console) {
2406 console_drivers=console->next;
2407 res = 0;
2408 } else if (console_drivers) {
2409 for (a=console_drivers->next, b=console_drivers ;
2410 a; b=a, a=b->next) {
2411 if (a == console) {
2412 b->next = a->next;
2413 res = 0;
2414 break;
2415 }
2416 }
2417 }
2418
2419
2420
2421
2422
2423 if (console_drivers != NULL && console->flags & CON_CONSDEV)
2424 console_drivers->flags |= CON_CONSDEV;
2425
2426 console_unlock();
2427 console_sysfs_notify();
2428 return res;
2429}
2430EXPORT_SYMBOL(unregister_console);
2431
2432static int __init printk_late_init(void)
2433{
2434 struct console *con;
2435
2436 for_each_console(con) {
2437 if (!keep_bootcon && con->flags & CON_BOOT) {
2438 printk(KERN_INFO "turn off boot console %s%d\n",
2439 con->name, con->index);
2440 unregister_console(con);
2441 }
2442 }
2443 hotcpu_notifier(console_cpu_notify, 0);
2444 return 0;
2445}
2446late_initcall(printk_late_init);
2447
2448#if defined CONFIG_PRINTK
2449
2450int printk_sched(const char *fmt, ...)
2451{
2452 unsigned long flags;
2453 va_list args;
2454 char *buf;
2455 int r;
2456
2457 local_irq_save(flags);
2458 buf = __get_cpu_var(printk_sched_buf);
2459
2460 va_start(args, fmt);
2461 r = vsnprintf(buf, PRINTK_BUF_SIZE, fmt, args);
2462 va_end(args);
2463
2464 __this_cpu_or(printk_pending, PRINTK_PENDING_SCHED);
2465 local_irq_restore(flags);
2466
2467 return r;
2468}
2469
2470
2471
2472
2473
2474
2475
2476DEFINE_RATELIMIT_STATE(printk_ratelimit_state, 5 * HZ, 10);
2477
2478int __printk_ratelimit(const char *func)
2479{
2480 return ___ratelimit(&printk_ratelimit_state, func);
2481}
2482EXPORT_SYMBOL(__printk_ratelimit);
2483
2484
2485
2486
2487
2488
2489
2490
2491
2492
2493bool printk_timed_ratelimit(unsigned long *caller_jiffies,
2494 unsigned int interval_msecs)
2495{
2496 if (*caller_jiffies == 0
2497 || !time_in_range(jiffies, *caller_jiffies,
2498 *caller_jiffies
2499 + msecs_to_jiffies(interval_msecs))) {
2500 *caller_jiffies = jiffies;
2501 return true;
2502 }
2503 return false;
2504}
2505EXPORT_SYMBOL(printk_timed_ratelimit);
2506
2507static DEFINE_SPINLOCK(dump_list_lock);
2508static LIST_HEAD(dump_list);
2509
2510
2511
2512
2513
2514
2515
2516
2517
2518int kmsg_dump_register(struct kmsg_dumper *dumper)
2519{
2520 unsigned long flags;
2521 int err = -EBUSY;
2522
2523
2524 if (!dumper->dump)
2525 return -EINVAL;
2526
2527 spin_lock_irqsave(&dump_list_lock, flags);
2528
2529 if (!dumper->registered) {
2530 dumper->registered = 1;
2531 list_add_tail_rcu(&dumper->list, &dump_list);
2532 err = 0;
2533 }
2534 spin_unlock_irqrestore(&dump_list_lock, flags);
2535
2536 return err;
2537}
2538EXPORT_SYMBOL_GPL(kmsg_dump_register);
2539
2540
2541
2542
2543
2544
2545
2546
2547int kmsg_dump_unregister(struct kmsg_dumper *dumper)
2548{
2549 unsigned long flags;
2550 int err = -EINVAL;
2551
2552 spin_lock_irqsave(&dump_list_lock, flags);
2553 if (dumper->registered) {
2554 dumper->registered = 0;
2555 list_del_rcu(&dumper->list);
2556 err = 0;
2557 }
2558 spin_unlock_irqrestore(&dump_list_lock, flags);
2559 synchronize_rcu();
2560
2561 return err;
2562}
2563EXPORT_SYMBOL_GPL(kmsg_dump_unregister);
2564
2565static bool always_kmsg_dump;
2566module_param_named(always_kmsg_dump, always_kmsg_dump, bool, S_IRUGO | S_IWUSR);
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576void kmsg_dump(enum kmsg_dump_reason reason)
2577{
2578 struct kmsg_dumper *dumper;
2579 unsigned long flags;
2580
2581 if ((reason > KMSG_DUMP_OOPS) && !always_kmsg_dump)
2582 return;
2583
2584 rcu_read_lock();
2585 list_for_each_entry_rcu(dumper, &dump_list, list) {
2586 if (dumper->max_reason && reason > dumper->max_reason)
2587 continue;
2588
2589
2590 dumper->active = true;
2591
2592 raw_spin_lock_irqsave(&logbuf_lock, flags);
2593 dumper->cur_seq = clear_seq;
2594 dumper->cur_idx = clear_idx;
2595 dumper->next_seq = log_next_seq;
2596 dumper->next_idx = log_next_idx;
2597 raw_spin_unlock_irqrestore(&logbuf_lock, flags);
2598
2599
2600 dumper->dump(dumper, reason);
2601
2602
2603 dumper->active = false;
2604 }
2605 rcu_read_unlock();
2606}
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624
2625
2626
2627bool kmsg_dump_get_line_nolock(struct kmsg_dumper *dumper, bool syslog,
2628 char *line, size_t size, size_t *len)
2629{
2630 struct log *msg;
2631 size_t l = 0;
2632 bool ret = false;
2633
2634 if (!dumper->active)
2635 goto out;
2636
2637 if (dumper->cur_seq < log_first_seq) {
2638
2639 dumper->cur_seq = log_first_seq;
2640 dumper->cur_idx = log_first_idx;
2641 }
2642
2643
2644 if (dumper->cur_seq >= log_next_seq)
2645 goto out;
2646
2647 msg = log_from_idx(dumper->cur_idx);
2648 l = msg_print_text(msg, 0, syslog, line, size);
2649
2650 dumper->cur_idx = log_next(dumper->cur_idx);
2651 dumper->cur_seq++;
2652 ret = true;
2653out:
2654 if (len)
2655 *len = l;
2656 return ret;
2657}
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676bool kmsg_dump_get_line(struct kmsg_dumper *dumper, bool syslog,
2677 char *line, size_t size, size_t *len)
2678{
2679 unsigned long flags;
2680 bool ret;
2681
2682 raw_spin_lock_irqsave(&logbuf_lock, flags);
2683 ret = kmsg_dump_get_line_nolock(dumper, syslog, line, size, len);
2684 raw_spin_unlock_irqrestore(&logbuf_lock, flags);
2685
2686 return ret;
2687}
2688EXPORT_SYMBOL_GPL(kmsg_dump_get_line);
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
2708
2709bool kmsg_dump_get_buffer(struct kmsg_dumper *dumper, bool syslog,
2710 char *buf, size_t size, size_t *len)
2711{
2712 unsigned long flags;
2713 u64 seq;
2714 u32 idx;
2715 u64 next_seq;
2716 u32 next_idx;
2717 enum log_flags prev;
2718 size_t l = 0;
2719 bool ret = false;
2720
2721 if (!dumper->active)
2722 goto out;
2723
2724 raw_spin_lock_irqsave(&logbuf_lock, flags);
2725 if (dumper->cur_seq < log_first_seq) {
2726
2727 dumper->cur_seq = log_first_seq;
2728 dumper->cur_idx = log_first_idx;
2729 }
2730
2731
2732 if (dumper->cur_seq >= dumper->next_seq) {
2733 raw_spin_unlock_irqrestore(&logbuf_lock, flags);
2734 goto out;
2735 }
2736
2737
2738 seq = dumper->cur_seq;
2739 idx = dumper->cur_idx;
2740 prev = 0;
2741 while (seq < dumper->next_seq) {
2742 struct log *msg = log_from_idx(idx);
2743
2744 l += msg_print_text(msg, prev, true, NULL, 0);
2745 idx = log_next(idx);
2746 seq++;
2747 prev = msg->flags;
2748 }
2749
2750
2751 seq = dumper->cur_seq;
2752 idx = dumper->cur_idx;
2753 prev = 0;
2754 while (l > size && seq < dumper->next_seq) {
2755 struct log *msg = log_from_idx(idx);
2756
2757 l -= msg_print_text(msg, prev, true, NULL, 0);
2758 idx = log_next(idx);
2759 seq++;
2760 prev = msg->flags;
2761 }
2762
2763
2764 next_seq = seq;
2765 next_idx = idx;
2766
2767 l = 0;
2768 prev = 0;
2769 while (seq < dumper->next_seq) {
2770 struct log *msg = log_from_idx(idx);
2771
2772 l += msg_print_text(msg, prev, syslog, buf + l, size - l);
2773 idx = log_next(idx);
2774 seq++;
2775 prev = msg->flags;
2776 }
2777
2778 dumper->next_seq = next_seq;
2779 dumper->next_idx = next_idx;
2780 ret = true;
2781 raw_spin_unlock_irqrestore(&logbuf_lock, flags);
2782out:
2783 if (len)
2784 *len = l;
2785 return ret;
2786}
2787EXPORT_SYMBOL_GPL(kmsg_dump_get_buffer);
2788
2789
2790
2791
2792
2793
2794
2795
2796
2797
2798
2799void kmsg_dump_rewind_nolock(struct kmsg_dumper *dumper)
2800{
2801 dumper->cur_seq = clear_seq;
2802 dumper->cur_idx = clear_idx;
2803 dumper->next_seq = log_next_seq;
2804 dumper->next_idx = log_next_idx;
2805}
2806
2807
2808
2809
2810
2811
2812
2813
2814
2815void kmsg_dump_rewind(struct kmsg_dumper *dumper)
2816{
2817 unsigned long flags;
2818
2819 raw_spin_lock_irqsave(&logbuf_lock, flags);
2820 kmsg_dump_rewind_nolock(dumper);
2821 raw_spin_unlock_irqrestore(&logbuf_lock, flags);
2822}
2823EXPORT_SYMBOL_GPL(kmsg_dump_rewind);
2824#endif
2825