1 | /* SPDX-License-Identifier: GPL-2.0-or-later */ |
2 | /* |
3 | * internal.h - printk internal definitions |
4 | */ |
5 | #include <linux/percpu.h> |
6 | #include <linux/console.h> |
7 | #include "printk_ringbuffer.h" |
8 | |
9 | #if defined(CONFIG_PRINTK) && defined(CONFIG_SYSCTL) |
10 | void __init printk_sysctl_init(void); |
11 | int devkmsg_sysctl_set_loglvl(struct ctl_table *table, int write, |
12 | void *buffer, size_t *lenp, loff_t *ppos); |
13 | #else |
14 | #define printk_sysctl_init() do { } while (0) |
15 | #endif |
16 | |
17 | #define con_printk(lvl, con, fmt, ...) \ |
18 | printk(lvl pr_fmt("%s%sconsole [%s%d] " fmt), \ |
19 | (con->flags & CON_NBCON) ? "" : "legacy ", \ |
20 | (con->flags & CON_BOOT) ? "boot" : "", \ |
21 | con->name, con->index, ##__VA_ARGS__) |
22 | |
23 | #ifdef CONFIG_PRINTK |
24 | |
25 | #ifdef CONFIG_PRINTK_CALLER |
26 | #define PRINTK_PREFIX_MAX 48 |
27 | #else |
28 | #define PRINTK_PREFIX_MAX 32 |
29 | #endif |
30 | |
31 | /* |
32 | * the maximum size of a formatted record (i.e. with prefix added |
33 | * per line and dropped messages or in extended message format) |
34 | */ |
35 | #define PRINTK_MESSAGE_MAX 2048 |
36 | |
37 | /* the maximum size allowed to be reserved for a record */ |
38 | #define PRINTKRB_RECORD_MAX 1024 |
39 | |
40 | /* Flags for a single printk record. */ |
41 | enum printk_info_flags { |
42 | LOG_NEWLINE = 2, /* text ended with a newline */ |
43 | LOG_CONT = 8, /* text is a fragment of a continuation line */ |
44 | }; |
45 | |
46 | extern struct printk_ringbuffer *prb; |
47 | |
48 | __printf(4, 0) |
49 | int vprintk_store(int facility, int level, |
50 | const struct dev_printk_info *dev_info, |
51 | const char *fmt, va_list args); |
52 | |
53 | __printf(1, 0) int vprintk_default(const char *fmt, va_list args); |
54 | __printf(1, 0) int vprintk_deferred(const char *fmt, va_list args); |
55 | |
56 | bool printk_percpu_data_ready(void); |
57 | |
58 | #define printk_safe_enter_irqsave(flags) \ |
59 | do { \ |
60 | local_irq_save(flags); \ |
61 | __printk_safe_enter(); \ |
62 | } while (0) |
63 | |
64 | #define printk_safe_exit_irqrestore(flags) \ |
65 | do { \ |
66 | __printk_safe_exit(); \ |
67 | local_irq_restore(flags); \ |
68 | } while (0) |
69 | |
70 | void defer_console_output(void); |
71 | |
72 | u16 printk_parse_prefix(const char *text, int *level, |
73 | enum printk_info_flags *flags); |
74 | |
75 | u64 nbcon_seq_read(struct console *con); |
76 | void nbcon_seq_force(struct console *con, u64 seq); |
77 | bool nbcon_alloc(struct console *con); |
78 | void nbcon_init(struct console *con); |
79 | void nbcon_free(struct console *con); |
80 | |
81 | #else |
82 | |
83 | #define PRINTK_PREFIX_MAX 0 |
84 | #define PRINTK_MESSAGE_MAX 0 |
85 | #define PRINTKRB_RECORD_MAX 0 |
86 | |
87 | /* |
88 | * In !PRINTK builds we still export console_sem |
89 | * semaphore and some of console functions (console_unlock()/etc.), so |
90 | * printk-safe must preserve the existing local IRQ guarantees. |
91 | */ |
92 | #define printk_safe_enter_irqsave(flags) local_irq_save(flags) |
93 | #define printk_safe_exit_irqrestore(flags) local_irq_restore(flags) |
94 | |
95 | static inline bool printk_percpu_data_ready(void) { return false; } |
96 | static inline u64 nbcon_seq_read(struct console *con) { return 0; } |
97 | static inline void nbcon_seq_force(struct console *con, u64 seq) { } |
98 | static inline bool nbcon_alloc(struct console *con) { return false; } |
99 | static inline void nbcon_init(struct console *con) { } |
100 | static inline void nbcon_free(struct console *con) { } |
101 | |
102 | #endif /* CONFIG_PRINTK */ |
103 | |
104 | extern struct printk_buffers printk_shared_pbufs; |
105 | |
106 | /** |
107 | * struct printk_buffers - Buffers to read/format/output printk messages. |
108 | * @outbuf: After formatting, contains text to output. |
109 | * @scratchbuf: Used as temporary ringbuffer reading and string-print space. |
110 | */ |
111 | struct printk_buffers { |
112 | char outbuf[PRINTK_MESSAGE_MAX]; |
113 | char scratchbuf[PRINTKRB_RECORD_MAX]; |
114 | }; |
115 | |
116 | /** |
117 | * struct printk_message - Container for a prepared printk message. |
118 | * @pbufs: printk buffers used to prepare the message. |
119 | * @outbuf_len: The length of prepared text in @pbufs->outbuf to output. This |
120 | * does not count the terminator. A value of 0 means there is |
121 | * nothing to output and this record should be skipped. |
122 | * @seq: The sequence number of the record used for @pbufs->outbuf. |
123 | * @dropped: The number of dropped records from reading @seq. |
124 | */ |
125 | struct printk_message { |
126 | struct printk_buffers *pbufs; |
127 | unsigned int outbuf_len; |
128 | u64 seq; |
129 | unsigned long dropped; |
130 | }; |
131 | |
132 | bool other_cpu_in_panic(void); |
133 | bool printk_get_next_message(struct printk_message *pmsg, u64 seq, |
134 | bool is_extended, bool may_supress); |
135 | |
136 | #ifdef CONFIG_PRINTK |
137 | void console_prepend_dropped(struct printk_message *pmsg, unsigned long dropped); |
138 | #endif |
139 | |