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(const 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