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