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