.. | .. |
---|
| 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(4, 0) |
---|
| 18 | +int vprintk_store(int facility, int level, |
---|
| 19 | + const struct dev_printk_info *dev_info, |
---|
| 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 */ |
---|