You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
612 lines
18 KiB
612 lines
18 KiB
#ifndef __KERNEL_PRINTK__ |
|
#define __KERNEL_PRINTK__ |
|
|
|
#include <stdarg.h> |
|
#include <linux/init.h> |
|
#include <linux/kern_levels.h> |
|
#include <linux/linkage.h> |
|
#include <linux/cache.h> |
|
|
|
extern const char linux_banner[]; |
|
extern const char linux_proc_banner[]; |
|
|
|
extern char *log_buf_addr_get(void); |
|
extern u32 log_buf_len_get(void); |
|
extern int printk_disable_uart; |
|
extern bool mt_get_uartlog_status(void); |
|
extern void set_uartlog_status(bool value); |
|
|
|
|
|
#ifdef CONFIG_MTK_PRINTK_UART_CONSOLE |
|
void mt_disable_uart(void); |
|
void mt_enable_uart(void); |
|
extern int mt_need_uart_console; |
|
#endif |
|
|
|
#ifdef CONFIG_MTK_AEE_FEATURE |
|
extern void aee_wdt_zap_locks(void); |
|
#endif |
|
|
|
#if defined(CONFIG_MTK_ENG_BUILD) && defined(CONFIG_PRINTK_MT_PREFIX) |
|
#define KLOG_MODNAME "[name:"KBUILD_MODNAME"&]" |
|
#else |
|
#define KLOG_MODNAME "" |
|
#endif |
|
|
|
void set_detect_count(int count); |
|
int get_detect_count(void); |
|
void set_logtoomuch_enable(int value); |
|
int get_logtoomuch_enable(void); |
|
|
|
static inline int printk_get_level(const char *buffer) |
|
{ |
|
if (buffer[0] == KERN_SOH_ASCII && buffer[1]) { |
|
switch (buffer[1]) { |
|
case '0' ... '7': |
|
case 'd': /* KERN_DEFAULT */ |
|
return buffer[1]; |
|
} |
|
} |
|
return 0; |
|
} |
|
|
|
static inline const char *printk_skip_level(const char *buffer) |
|
{ |
|
if (printk_get_level(buffer)) |
|
return buffer + 2; |
|
|
|
return buffer; |
|
} |
|
|
|
#define CONSOLE_EXT_LOG_MAX 8192 |
|
|
|
/* printk's without a loglevel use this.. */ |
|
#define MESSAGE_LOGLEVEL_DEFAULT CONFIG_MESSAGE_LOGLEVEL_DEFAULT |
|
|
|
/* We show everything that is MORE important than this.. */ |
|
#define CONSOLE_LOGLEVEL_SILENT 0 /* Mum's the word */ |
|
#define CONSOLE_LOGLEVEL_MIN 1 /* Minimum loglevel we let people use */ |
|
#define CONSOLE_LOGLEVEL_QUIET 4 /* Shhh ..., when booted with "quiet" */ |
|
#define CONSOLE_LOGLEVEL_DEFAULT 7 /* anything MORE serious than KERN_DEBUG */ |
|
#define CONSOLE_LOGLEVEL_DEBUG 10 /* issue debug messages */ |
|
#define CONSOLE_LOGLEVEL_MOTORMOUTH 15 /* You can't shut this one up */ |
|
|
|
extern int console_printk[]; |
|
|
|
#define console_loglevel (console_printk[0]) |
|
#define default_message_loglevel (console_printk[1]) |
|
#define minimum_console_loglevel (console_printk[2]) |
|
#define default_console_loglevel (console_printk[3]) |
|
|
|
static inline void console_silent(void) |
|
{ |
|
console_loglevel = CONSOLE_LOGLEVEL_SILENT; |
|
} |
|
|
|
static inline void console_verbose(void) |
|
{ |
|
if (console_loglevel) |
|
console_loglevel = CONSOLE_LOGLEVEL_MOTORMOUTH; |
|
} |
|
|
|
struct va_format { |
|
const char *fmt; |
|
va_list *va; |
|
}; |
|
|
|
/* |
|
* FW_BUG |
|
* Add this to a message where you are sure the firmware is buggy or behaves |
|
* really stupid or out of spec. Be aware that the responsible BIOS developer |
|
* should be able to fix this issue or at least get a concrete idea of the |
|
* problem by reading your message without the need of looking at the kernel |
|
* code. |
|
* |
|
* Use it for definite and high priority BIOS bugs. |
|
* |
|
* FW_WARN |
|
* Use it for not that clear (e.g. could the kernel messed up things already?) |
|
* and medium priority BIOS bugs. |
|
* |
|
* FW_INFO |
|
* Use this one if you want to tell the user or vendor about something |
|
* suspicious, but generally harmless related to the firmware. |
|
* |
|
* Use it for information or very low priority BIOS bugs. |
|
*/ |
|
#define FW_BUG "[Firmware Bug]: " |
|
#define FW_WARN "[Firmware Warn]: " |
|
#define FW_INFO "[Firmware Info]: " |
|
|
|
/* |
|
* HW_ERR |
|
* Add this to a message for hardware errors, so that user can report |
|
* it to hardware vendor instead of LKML or software vendor. |
|
*/ |
|
#define HW_ERR "[Hardware Error]: " |
|
|
|
/* |
|
* DEPRECATED |
|
* Add this to a message whenever you want to warn user space about the use |
|
* of a deprecated aspect of an API so they can stop using it |
|
*/ |
|
#define DEPRECATED "[Deprecated]: " |
|
|
|
/* |
|
* Dummy printk for disabled debugging statements to use whilst maintaining |
|
* gcc's format and side-effect checking. |
|
*/ |
|
static inline __printf(1, 2) |
|
int no_printk(const char *fmt, ...) |
|
{ |
|
return 0; |
|
} |
|
|
|
#ifdef CONFIG_EARLY_PRINTK |
|
extern asmlinkage __printf(1, 2) |
|
void early_printk(const char *fmt, ...); |
|
#else |
|
static inline __printf(1, 2) __cold |
|
void early_printk(const char *s, ...) { } |
|
#endif |
|
|
|
typedef __printf(1, 0) int (*printk_func_t)(const char *fmt, va_list args); |
|
|
|
#ifdef CONFIG_PRINTK |
|
asmlinkage __printf(5, 0) |
|
int vprintk_emit(int facility, int level, |
|
const char *dict, size_t dictlen, |
|
const char *fmt, va_list args); |
|
|
|
asmlinkage __printf(1, 0) |
|
int vprintk(const char *fmt, va_list args); |
|
|
|
asmlinkage __printf(5, 6) __cold |
|
int printk_emit(int facility, int level, |
|
const char *dict, size_t dictlen, |
|
const char *fmt, ...); |
|
|
|
asmlinkage __printf(1, 2) __cold |
|
int printk(const char *fmt, ...); |
|
|
|
/* |
|
* Special printk facility for scheduler/timekeeping use only, _DO_NOT_USE_ ! |
|
*/ |
|
__printf(1, 2) __cold int printk_deferred(const char *fmt, ...); |
|
|
|
/* |
|
* Please don't use printk_ratelimit(), because it shares ratelimiting state |
|
* with all other unrelated printk_ratelimit() callsites. Instead use |
|
* printk_ratelimited() or plain old __ratelimit(). |
|
*/ |
|
extern int __printk_ratelimit(const char *func); |
|
#define printk_ratelimit() __printk_ratelimit(__func__) |
|
extern bool printk_timed_ratelimit(unsigned long *caller_jiffies, |
|
unsigned int interval_msec); |
|
|
|
extern int printk_delay_msec; |
|
extern int dmesg_restrict; |
|
extern int kptr_restrict; |
|
|
|
extern void wake_up_klogd(void); |
|
|
|
char *log_buf_addr_get(void); |
|
u32 log_buf_len_get(void); |
|
void log_buf_kexec_setup(void); |
|
void __init setup_log_buf(int early); |
|
__printf(1, 2) void dump_stack_set_arch_desc(const char *fmt, ...); |
|
void dump_stack_print_info(const char *log_lvl); |
|
void show_regs_print_info(const char *log_lvl); |
|
#else |
|
static inline __printf(1, 0) |
|
int vprintk(const char *s, va_list args) |
|
{ |
|
return 0; |
|
} |
|
static inline __printf(1, 2) __cold |
|
int printk(const char *s, ...) |
|
{ |
|
return 0; |
|
} |
|
static inline __printf(1, 2) __cold |
|
int printk_deferred(const char *s, ...) |
|
{ |
|
return 0; |
|
} |
|
static inline int printk_ratelimit(void) |
|
{ |
|
return 0; |
|
} |
|
static inline bool printk_timed_ratelimit(unsigned long *caller_jiffies, |
|
unsigned int interval_msec) |
|
{ |
|
return false; |
|
} |
|
|
|
static inline void wake_up_klogd(void) |
|
{ |
|
} |
|
|
|
static inline char *log_buf_addr_get(void) |
|
{ |
|
return NULL; |
|
} |
|
|
|
static inline u32 log_buf_len_get(void) |
|
{ |
|
return 0; |
|
} |
|
|
|
static inline void log_buf_kexec_setup(void) |
|
{ |
|
} |
|
|
|
static inline void setup_log_buf(int early) |
|
{ |
|
} |
|
|
|
static inline __printf(1, 2) void dump_stack_set_arch_desc(const char *fmt, ...) |
|
{ |
|
} |
|
|
|
static inline void dump_stack_print_info(const char *log_lvl) |
|
{ |
|
} |
|
|
|
static inline void show_regs_print_info(const char *log_lvl) |
|
{ |
|
} |
|
#endif |
|
|
|
extern asmlinkage void dump_stack(void) __cold; |
|
|
|
#ifndef pr_fmt |
|
#define pr_fmt(fmt) fmt |
|
#endif |
|
|
|
/* |
|
* These can be used to print at the various log levels. |
|
* All of these will print unconditionally, although note that pr_debug() |
|
* and other debug macros are compiled out unless either DEBUG is defined |
|
* or CONFIG_DYNAMIC_DEBUG is set. |
|
*/ |
|
|
|
/* -------printk too much patch------ */ |
|
#if defined CONFIG_MTK_ENG_BUILD && defined CONFIG_PRINTK_MT_PREFIX && defined CONFIG_DYNAMIC_DEBUG |
|
#define pr_emerg(fmt, ...) \ |
|
({ \ |
|
static bool __print_once __read_mostly; \ |
|
if (!__print_once) { \ |
|
DEFINE_DYNAMIC_DEBUG_METADATA(descriptor, KLOG_MODNAME fmt); \ |
|
if (unlikely(descriptor.flags & _DPRINTK_FLAGS_PRINT)) \ |
|
barrier(); \ |
|
__print_once = true; \ |
|
printk(KERN_EMERG KLOG_MODNAME pr_fmt(fmt), ##__VA_ARGS__); \ |
|
} else \ |
|
printk(KERN_EMERG KLOG_MODNAME pr_fmt(fmt), ##__VA_ARGS__); \ |
|
}) |
|
|
|
|
|
#define pr_alert(fmt, ...) \ |
|
({ \ |
|
static bool __print_once __read_mostly; \ |
|
if (!__print_once) { \ |
|
DEFINE_DYNAMIC_DEBUG_METADATA(descriptor, KLOG_MODNAME fmt); \ |
|
if (unlikely(descriptor.flags & _DPRINTK_FLAGS_PRINT)) \ |
|
barrier(); \ |
|
__print_once = true; \ |
|
printk(KERN_ALERT KLOG_MODNAME pr_fmt(fmt), ##__VA_ARGS__); \ |
|
} else \ |
|
printk(KERN_ALERT KLOG_MODNAME pr_fmt(fmt), ##__VA_ARGS__); \ |
|
}) |
|
|
|
#define pr_crit(fmt, ...) \ |
|
({ \ |
|
static bool __print_once __read_mostly; \ |
|
if (!__print_once) { \ |
|
DEFINE_DYNAMIC_DEBUG_METADATA(descriptor, KLOG_MODNAME fmt); \ |
|
if (unlikely(descriptor.flags & _DPRINTK_FLAGS_PRINT)) \ |
|
barrier(); \ |
|
__print_once = true; \ |
|
printk(KERN_CRIT KLOG_MODNAME pr_fmt(fmt), ##__VA_ARGS__); \ |
|
} else \ |
|
printk(KERN_CRIT KLOG_MODNAME pr_fmt(fmt), ##__VA_ARGS__); \ |
|
}) |
|
|
|
|
|
#define pr_err(fmt, ...) \ |
|
({ \ |
|
static bool __print_once __read_mostly; \ |
|
if (!__print_once) { \ |
|
DEFINE_DYNAMIC_DEBUG_METADATA(descriptor, KLOG_MODNAME fmt); \ |
|
if (unlikely(descriptor.flags & _DPRINTK_FLAGS_PRINT)) \ |
|
barrier(); \ |
|
__print_once = true; \ |
|
printk(KERN_ERR KLOG_MODNAME pr_fmt(fmt), ##__VA_ARGS__); \ |
|
} else \ |
|
printk(KERN_ERR KLOG_MODNAME pr_fmt(fmt), ##__VA_ARGS__); \ |
|
}) |
|
|
|
#define pr_warning(fmt, ...) \ |
|
({ \ |
|
static bool __print_once __read_mostly; \ |
|
if (!__print_once) { \ |
|
DEFINE_DYNAMIC_DEBUG_METADATA(descriptor, KLOG_MODNAME fmt); \ |
|
if (unlikely(descriptor.flags & _DPRINTK_FLAGS_PRINT)) \ |
|
barrier(); \ |
|
__print_once = true; \ |
|
printk(KERN_WARNING KLOG_MODNAME pr_fmt(fmt), ##__VA_ARGS__); \ |
|
} else \ |
|
printk(KERN_WARNING KLOG_MODNAME pr_fmt(fmt), ##__VA_ARGS__); \ |
|
}) |
|
|
|
#define pr_warn pr_warning |
|
#define pr_notice(fmt, ...) \ |
|
({ \ |
|
static bool __print_once __read_mostly; \ |
|
if (!__print_once) { \ |
|
DEFINE_DYNAMIC_DEBUG_METADATA(descriptor, KLOG_MODNAME fmt); \ |
|
if (unlikely(descriptor.flags & _DPRINTK_FLAGS_PRINT)) \ |
|
barrier(); \ |
|
__print_once = true; \ |
|
printk(KERN_NOTICE KLOG_MODNAME pr_fmt(fmt), ##__VA_ARGS__); \ |
|
} else \ |
|
printk(KERN_NOTICE KLOG_MODNAME pr_fmt(fmt), ##__VA_ARGS__); \ |
|
}) |
|
|
|
#define pr_info(fmt, ...) \ |
|
({ \ |
|
static bool __print_once __read_mostly; \ |
|
if (!__print_once) { \ |
|
DEFINE_DYNAMIC_DEBUG_METADATA(descriptor, KLOG_MODNAME fmt); \ |
|
if (unlikely(descriptor.flags & _DPRINTK_FLAGS_PRINT)) \ |
|
barrier(); \ |
|
__print_once = true; \ |
|
printk(KERN_INFO KLOG_MODNAME pr_fmt(fmt), ##__VA_ARGS__); \ |
|
} else \ |
|
printk(KERN_INFO KLOG_MODNAME pr_fmt(fmt), ##__VA_ARGS__); \ |
|
}) |
|
|
|
#define pr_cont(fmt, ...) \ |
|
({ \ |
|
static bool __print_once __read_mostly; \ |
|
if (!__print_once) { \ |
|
DEFINE_DYNAMIC_DEBUG_METADATA(descriptor, KLOG_MODNAME fmt); \ |
|
if (unlikely(descriptor.flags & _DPRINTK_FLAGS_PRINT)) \ |
|
barrier(); \ |
|
__print_once = true; \ |
|
printk(KERN_CONT KLOG_MODNAME pr_fmt(fmt), ##__VA_ARGS__); \ |
|
} else \ |
|
printk(KERN_CONT KLOG_MODNAME pr_fmt(fmt), ##__VA_ARGS__); \ |
|
}) |
|
#else |
|
#define pr_emerg(fmt, ...) \ |
|
printk(KERN_EMERG pr_fmt(fmt), ##__VA_ARGS__) |
|
#define pr_alert(fmt, ...) \ |
|
printk(KERN_ALERT pr_fmt(fmt), ##__VA_ARGS__) |
|
#define pr_crit(fmt, ...) \ |
|
printk(KERN_CRIT pr_fmt(fmt), ##__VA_ARGS__) |
|
#define pr_err(fmt, ...) \ |
|
printk(KERN_ERR pr_fmt(fmt), ##__VA_ARGS__) |
|
#define pr_warning(fmt, ...) \ |
|
printk(KERN_WARNING pr_fmt(fmt), ##__VA_ARGS__) |
|
#define pr_warn pr_warning |
|
#define pr_notice(fmt, ...) \ |
|
printk(KERN_NOTICE pr_fmt(fmt), ##__VA_ARGS__) |
|
#define pr_info(fmt, ...) \ |
|
printk(KERN_INFO pr_fmt(fmt), ##__VA_ARGS__) |
|
/* |
|
* Like KERN_CONT, pr_cont() should only be used when continuing |
|
* a line with no newline ('\n') enclosed. Otherwise it defaults |
|
* back to KERN_DEFAULT. |
|
*/ |
|
#define pr_cont(fmt, ...) \ |
|
printk(KERN_CONT fmt, ##__VA_ARGS__) |
|
#endif |
|
|
|
/* pr_devel() should produce zero code unless DEBUG is defined */ |
|
#ifdef DEBUG |
|
#define pr_devel(fmt, ...) \ |
|
printk(KERN_DEBUG KLOG_MODNAME pr_fmt(fmt), ##__VA_ARGS__) |
|
#else |
|
#define pr_devel(fmt, ...) \ |
|
no_printk(KERN_DEBUG KLOG_MODNAME pr_fmt(fmt), ##__VA_ARGS__) |
|
#endif |
|
|
|
#include <linux/dynamic_debug.h> |
|
|
|
/* If you are writing a driver, please use dev_dbg instead */ |
|
#if defined(CONFIG_DYNAMIC_DEBUG) |
|
/* dynamic_pr_debug() uses pr_fmt() internally so we don't need it here */ |
|
#define pr_debug(fmt, ...) \ |
|
dynamic_pr_debug(KLOG_MODNAME fmt, ##__VA_ARGS__) |
|
#elif defined(DEBUG) |
|
#define pr_debug(fmt, ...) \ |
|
printk(KERN_DEBUG KLOG_MODNAME pr_fmt(fmt), ##__VA_ARGS__) |
|
#else |
|
#define pr_debug(fmt, ...) \ |
|
no_printk(KERN_DEBUG KLOG_MODNAME pr_fmt(fmt), ##__VA_ARGS__) |
|
#endif |
|
|
|
|
|
/* |
|
* Print a one-time message (analogous to WARN_ONCE() et al): |
|
*/ |
|
|
|
#ifdef CONFIG_PRINTK |
|
#define printk_once(fmt, ...) \ |
|
({ \ |
|
static bool __print_once __read_mostly; \ |
|
\ |
|
if (!__print_once) { \ |
|
__print_once = true; \ |
|
printk(fmt, ##__VA_ARGS__); \ |
|
} \ |
|
}) |
|
#define printk_deferred_once(fmt, ...) \ |
|
({ \ |
|
static bool __print_once __read_mostly; \ |
|
\ |
|
if (!__print_once) { \ |
|
__print_once = true; \ |
|
printk_deferred(fmt, ##__VA_ARGS__); \ |
|
} \ |
|
}) |
|
#else |
|
#define printk_once(fmt, ...) \ |
|
no_printk(fmt, ##__VA_ARGS__) |
|
#define printk_deferred_once(fmt, ...) \ |
|
no_printk(fmt, ##__VA_ARGS__) |
|
#endif |
|
|
|
#define pr_emerg_once(fmt, ...) \ |
|
printk_once(KERN_EMERG KLOG_MODNAME pr_fmt(fmt), ##__VA_ARGS__) |
|
#define pr_alert_once(fmt, ...) \ |
|
printk_once(KERN_ALERT KLOG_MODNAME pr_fmt(fmt), ##__VA_ARGS__) |
|
#define pr_crit_once(fmt, ...) \ |
|
printk_once(KERN_CRIT KLOG_MODNAME pr_fmt(fmt), ##__VA_ARGS__) |
|
#define pr_err_once(fmt, ...) \ |
|
printk_once(KERN_ERR KLOG_MODNAME pr_fmt(fmt), ##__VA_ARGS__) |
|
#define pr_warn_once(fmt, ...) \ |
|
printk_once(KERN_WARNING KLOG_MODNAME pr_fmt(fmt), ##__VA_ARGS__) |
|
#define pr_notice_once(fmt, ...) \ |
|
printk_once(KERN_NOTICE KLOG_MODNAME pr_fmt(fmt), ##__VA_ARGS__) |
|
#define pr_info_once(fmt, ...) \ |
|
printk_once(KERN_INFO KLOG_MODNAME pr_fmt(fmt), ##__VA_ARGS__) |
|
#define pr_cont_once(fmt, ...) \ |
|
printk_once(KERN_CONT KLOG_MODNAME pr_fmt(fmt), ##__VA_ARGS__) |
|
|
|
#if defined(DEBUG) |
|
#define pr_devel_once(fmt, ...) \ |
|
printk_once(KERN_DEBUG KLOG_MODNAME pr_fmt(fmt), ##__VA_ARGS__) |
|
#else |
|
#define pr_devel_once(fmt, ...) \ |
|
no_printk(KERN_DEBUG KLOG_MODNAME pr_fmt(fmt), ##__VA_ARGS__) |
|
#endif |
|
|
|
/* If you are writing a driver, please use dev_dbg instead */ |
|
#if defined(DEBUG) |
|
#define pr_debug_once(fmt, ...) \ |
|
printk_once(KERN_DEBUG KLOG_MODNAME pr_fmt(fmt), ##__VA_ARGS__) |
|
#else |
|
#define pr_debug_once(fmt, ...) \ |
|
no_printk(KERN_DEBUG KLOG_MODNAME pr_fmt(fmt), ##__VA_ARGS__) |
|
#endif |
|
|
|
/* |
|
* ratelimited messages with local ratelimit_state, |
|
* no local ratelimit_state used in the !PRINTK case |
|
*/ |
|
#ifdef CONFIG_PRINTK |
|
#define printk_ratelimited(fmt, ...) \ |
|
({ \ |
|
static DEFINE_RATELIMIT_STATE(_rs, \ |
|
DEFAULT_RATELIMIT_INTERVAL, \ |
|
DEFAULT_RATELIMIT_BURST); \ |
|
\ |
|
if (__ratelimit(&_rs)) \ |
|
printk(fmt, ##__VA_ARGS__); \ |
|
}) |
|
#else |
|
#define printk_ratelimited(fmt, ...) \ |
|
no_printk(fmt, ##__VA_ARGS__) |
|
#endif |
|
|
|
#define pr_emerg_ratelimited(fmt, ...) \ |
|
printk_ratelimited(KERN_EMERG KLOG_MODNAME pr_fmt(fmt), ##__VA_ARGS__) |
|
#define pr_alert_ratelimited(fmt, ...) \ |
|
printk_ratelimited(KERN_ALERT KLOG_MODNAME pr_fmt(fmt), ##__VA_ARGS__) |
|
#define pr_crit_ratelimited(fmt, ...) \ |
|
printk_ratelimited(KERN_CRIT KLOG_MODNAME pr_fmt(fmt), ##__VA_ARGS__) |
|
#define pr_err_ratelimited(fmt, ...) \ |
|
printk_ratelimited(KERN_ERR KLOG_MODNAME pr_fmt(fmt), ##__VA_ARGS__) |
|
#define pr_warn_ratelimited(fmt, ...) \ |
|
printk_ratelimited(KERN_WARNING KLOG_MODNAME pr_fmt(fmt), ##__VA_ARGS__) |
|
#define pr_notice_ratelimited(fmt, ...) \ |
|
printk_ratelimited(KERN_NOTICE KLOG_MODNAME pr_fmt(fmt), ##__VA_ARGS__) |
|
#define pr_info_ratelimited(fmt, ...) \ |
|
printk_ratelimited(KERN_INFO KLOG_MODNAME pr_fmt(fmt), ##__VA_ARGS__) |
|
/* no pr_cont_ratelimited, don't do that... */ |
|
|
|
#if defined(DEBUG) |
|
#define pr_devel_ratelimited(fmt, ...) \ |
|
printk_ratelimited(KERN_DEBUG KLOG_MODNAME pr_fmt(fmt), ##__VA_ARGS__) |
|
#else |
|
#define pr_devel_ratelimited(fmt, ...) \ |
|
no_printk(KERN_DEBUG KLOG_MODNAME pr_fmt(fmt), ##__VA_ARGS__) |
|
#endif |
|
|
|
/* If you are writing a driver, please use dev_dbg instead */ |
|
#if defined(CONFIG_DYNAMIC_DEBUG) |
|
/* descriptor check is first to prevent flooding with "callbacks suppressed" */ |
|
#define pr_debug_ratelimited(fmt, ...) \ |
|
do { \ |
|
static DEFINE_RATELIMIT_STATE(_rs, \ |
|
DEFAULT_RATELIMIT_INTERVAL, \ |
|
DEFAULT_RATELIMIT_BURST); \ |
|
DEFINE_DYNAMIC_DEBUG_METADATA(descriptor, pr_fmt(fmt)); \ |
|
if (unlikely(descriptor.flags & _DPRINTK_FLAGS_PRINT) && \ |
|
__ratelimit(&_rs)) \ |
|
__dynamic_pr_debug(&descriptor, pr_fmt(fmt), ##__VA_ARGS__); \ |
|
} while (0) |
|
#elif defined(DEBUG) |
|
#define pr_debug_ratelimited(fmt, ...) \ |
|
printk_ratelimited(KERN_DEBUG KLOG_MODNAME pr_fmt(fmt), ##__VA_ARGS__) |
|
#else |
|
#define pr_debug_ratelimited(fmt, ...) \ |
|
no_printk(KERN_DEBUG KLOG_MODNAME pr_fmt(fmt), ##__VA_ARGS__) |
|
#endif |
|
|
|
extern const struct file_operations kmsg_fops; |
|
|
|
enum { |
|
DUMP_PREFIX_NONE, |
|
DUMP_PREFIX_ADDRESS, |
|
DUMP_PREFIX_OFFSET |
|
}; |
|
extern int hex_dump_to_buffer(const void *buf, size_t len, int rowsize, |
|
int groupsize, char *linebuf, size_t linebuflen, |
|
bool ascii); |
|
#ifdef CONFIG_PRINTK |
|
extern void print_hex_dump(const char *level, const char *prefix_str, |
|
int prefix_type, int rowsize, int groupsize, |
|
const void *buf, size_t len, bool ascii); |
|
#if defined(CONFIG_DYNAMIC_DEBUG) |
|
#define print_hex_dump_bytes(prefix_str, prefix_type, buf, len) \ |
|
dynamic_hex_dump(prefix_str, prefix_type, 16, 1, buf, len, true) |
|
#else |
|
extern void print_hex_dump_bytes(const char *prefix_str, int prefix_type, |
|
const void *buf, size_t len); |
|
#endif /* defined(CONFIG_DYNAMIC_DEBUG) */ |
|
#else |
|
static inline void print_hex_dump(const char *level, const char *prefix_str, |
|
int prefix_type, int rowsize, int groupsize, |
|
const void *buf, size_t len, bool ascii) |
|
{ |
|
} |
|
static inline void print_hex_dump_bytes(const char *prefix_str, int prefix_type, |
|
const void *buf, size_t len) |
|
{ |
|
} |
|
|
|
#endif |
|
|
|
#if defined(CONFIG_DYNAMIC_DEBUG) |
|
#define print_hex_dump_debug(prefix_str, prefix_type, rowsize, \ |
|
groupsize, buf, len, ascii) \ |
|
dynamic_hex_dump(prefix_str, prefix_type, rowsize, \ |
|
groupsize, buf, len, ascii) |
|
#elif defined(DEBUG) |
|
#define print_hex_dump_debug(prefix_str, prefix_type, rowsize, \ |
|
groupsize, buf, len, ascii) \ |
|
print_hex_dump(KERN_DEBUG, prefix_str, prefix_type, rowsize, \ |
|
groupsize, buf, len, ascii) |
|
#else |
|
static inline void print_hex_dump_debug(const char *prefix_str, int prefix_type, |
|
int rowsize, int groupsize, |
|
const void *buf, size_t len, bool ascii) |
|
{ |
|
} |
|
#endif |
|
|
|
#endif
|
|
|