| .. | .. |
|---|
| 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 */ |
|---|