xref: /openbmc/linux/kernel/printk/internal.h (revision acd46a6b)
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 /*
3  * internal.h - printk internal definitions
4  */
5 #include <linux/percpu.h>
6 
7 #ifdef CONFIG_PRINTK
8 
9 #define PRINTK_SAFE_CONTEXT_MASK	0x007ffffff
10 #define PRINTK_NMI_DIRECT_CONTEXT_MASK	0x008000000
11 #define PRINTK_NMI_CONTEXT_MASK		0xff0000000
12 
13 #define PRINTK_NMI_CONTEXT_OFFSET	0x010000000
14 
15 extern raw_spinlock_t logbuf_lock;
16 
17 __printf(5, 0)
18 int vprintk_store(int facility, int level,
19 		  const char *dict, size_t dictlen,
20 		  const char *fmt, va_list args);
21 
22 __printf(1, 0) int vprintk_default(const char *fmt, va_list args);
23 __printf(1, 0) int vprintk_deferred(const char *fmt, va_list args);
24 __printf(1, 0) int vprintk_func(const char *fmt, va_list args);
25 void __printk_safe_enter(void);
26 void __printk_safe_exit(void);
27 
28 void printk_safe_init(void);
29 bool printk_percpu_data_ready(void);
30 
31 #define printk_safe_enter_irqsave(flags)	\
32 	do {					\
33 		local_irq_save(flags);		\
34 		__printk_safe_enter();		\
35 	} while (0)
36 
37 #define printk_safe_exit_irqrestore(flags)	\
38 	do {					\
39 		__printk_safe_exit();		\
40 		local_irq_restore(flags);	\
41 	} while (0)
42 
43 #define printk_safe_enter_irq()		\
44 	do {					\
45 		local_irq_disable();		\
46 		__printk_safe_enter();		\
47 	} while (0)
48 
49 #define printk_safe_exit_irq()			\
50 	do {					\
51 		__printk_safe_exit();		\
52 		local_irq_enable();		\
53 	} while (0)
54 
55 void defer_console_output(void);
56 
57 #else
58 
59 __printf(1, 0) int vprintk_func(const char *fmt, va_list args) { return 0; }
60 
61 /*
62  * In !PRINTK builds we still export logbuf_lock spin_lock, console_sem
63  * semaphore and some of console functions (console_unlock()/etc.), so
64  * printk-safe must preserve the existing local IRQ guarantees.
65  */
66 #define printk_safe_enter_irqsave(flags) local_irq_save(flags)
67 #define printk_safe_exit_irqrestore(flags) local_irq_restore(flags)
68 
69 #define printk_safe_enter_irq() local_irq_disable()
70 #define printk_safe_exit_irq() local_irq_enable()
71 
72 static inline void printk_safe_init(void) { }
73 static inline bool printk_percpu_data_ready(void) { return false; }
74 #endif /* CONFIG_PRINTK */
75