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