Blame view
include/linux/dynamic_debug.h
3.91 KB
e9d376f0f
|
1 2 |
#ifndef _DYNAMIC_DEBUG_H #define _DYNAMIC_DEBUG_H |
e9d376f0f
|
3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
/* * An instance of this structure is created in a special * ELF section at every dynamic debug callsite. At runtime, * the special section is treated as an array of these. */ struct _ddebug { /* * These fields are used to drive the user interface * for selecting and displaying debug callsites. */ const char *modname; const char *function; const char *filename; const char *format; |
e703ddae3
|
17 |
unsigned int lineno:18; |
e9d376f0f
|
18 |
/* |
3faa28605
|
19 20 |
* The flags field controls the behaviour at the callsite. * The bits here are changed dynamically when the user |
2b2f68b53
|
21 |
* writes commands to <debugfs>/dynamic_debug/control |
e9d376f0f
|
22 |
*/ |
5ca7d2a6c
|
23 24 |
#define _DPRINTK_FLAGS_NONE 0 #define _DPRINTK_FLAGS_PRINT (1<<0) /* printk() a message using the format */ |
8ba6ebf58
|
25 26 27 28 |
#define _DPRINTK_FLAGS_INCL_MODNAME (1<<1) #define _DPRINTK_FLAGS_INCL_FUNCNAME (1<<2) #define _DPRINTK_FLAGS_INCL_LINENO (1<<3) #define _DPRINTK_FLAGS_INCL_TID (1<<4) |
b558c96ff
|
29 30 31 |
#if defined DEBUG #define _DPRINTK_FLAGS_DEFAULT _DPRINTK_FLAGS_PRINT #else |
e9d376f0f
|
32 |
#define _DPRINTK_FLAGS_DEFAULT 0 |
b558c96ff
|
33 |
#endif |
e9d376f0f
|
34 35 36 37 38 39 40 41 |
unsigned int flags:8; } __attribute__((aligned(8))); int ddebug_add_module(struct _ddebug *tab, unsigned int n, const char *modname); #if defined(CONFIG_DYNAMIC_DEBUG) |
ff49d74ad
|
42 |
extern int ddebug_remove_module(const char *mod_name); |
b9075fa96
|
43 |
extern __printf(2, 3) |
906d20153
|
44 |
void __dynamic_pr_debug(struct _ddebug *descriptor, const char *fmt, ...); |
e9d376f0f
|
45 |
|
b48420c1d
|
46 47 |
extern int ddebug_dyndbg_module_param_cb(char *param, char *val, const char *modname); |
cbc466355
|
48 |
struct device; |
b9075fa96
|
49 |
extern __printf(3, 4) |
906d20153
|
50 51 |
void __dynamic_dev_dbg(struct _ddebug *descriptor, const struct device *dev, const char *fmt, ...); |
cbc466355
|
52 |
|
ffa10cb47
|
53 |
struct net_device; |
b9075fa96
|
54 |
extern __printf(3, 4) |
906d20153
|
55 56 57 |
void __dynamic_netdev_dbg(struct _ddebug *descriptor, const struct net_device *dev, const char *fmt, ...); |
ffa10cb47
|
58 |
|
07613b0b5
|
59 |
#define DEFINE_DYNAMIC_DEBUG_METADATA(name, fmt) \ |
c0d2af637
|
60 |
static struct _ddebug __aligned(8) \ |
07613b0b5
|
61 62 63 64 65 66 67 |
__attribute__((section("__verbose"))) name = { \ .modname = KBUILD_MODNAME, \ .function = __func__, \ .filename = __FILE__, \ .format = (fmt), \ .lineno = __LINE__, \ .flags = _DPRINTK_FLAGS_DEFAULT, \ |
07613b0b5
|
68 69 70 71 72 |
} #define dynamic_pr_debug(fmt, ...) \ do { \ DEFINE_DYNAMIC_DEBUG_METADATA(descriptor, fmt); \ |
87e6f9683
|
73 |
if (unlikely(descriptor.flags & _DPRINTK_FLAGS_PRINT)) \ |
07613b0b5
|
74 75 76 77 78 79 |
__dynamic_pr_debug(&descriptor, pr_fmt(fmt), \ ##__VA_ARGS__); \ } while (0) #define dynamic_dev_dbg(dev, fmt, ...) \ do { \ |
87e6f9683
|
80 81 |
DEFINE_DYNAMIC_DEBUG_METADATA(descriptor, fmt); \ if (unlikely(descriptor.flags & _DPRINTK_FLAGS_PRINT)) \ |
07613b0b5
|
82 83 84 85 86 87 88 |
__dynamic_dev_dbg(&descriptor, dev, fmt, \ ##__VA_ARGS__); \ } while (0) #define dynamic_netdev_dbg(dev, fmt, ...) \ do { \ DEFINE_DYNAMIC_DEBUG_METADATA(descriptor, fmt); \ |
87e6f9683
|
89 |
if (unlikely(descriptor.flags & _DPRINTK_FLAGS_PRINT)) \ |
07613b0b5
|
90 91 92 |
__dynamic_netdev_dbg(&descriptor, dev, fmt, \ ##__VA_ARGS__); \ } while (0) |
ffa10cb47
|
93 |
|
7a555613e
|
94 95 96 97 98 99 100 101 102 103 |
#define dynamic_hex_dump(prefix_str, prefix_type, rowsize, \ groupsize, buf, len, ascii) \ do { \ DEFINE_DYNAMIC_DEBUG_METADATA(descriptor, \ __builtin_constant_p(prefix_str) ? prefix_str : "hexdump");\ if (unlikely(descriptor.flags & _DPRINTK_FLAGS_PRINT)) \ print_hex_dump(KERN_DEBUG, prefix_str, \ prefix_type, rowsize, groupsize, \ buf, len, ascii); \ } while (0) |
e9d376f0f
|
104 |
#else |
b48420c1d
|
105 106 |
#include <linux/string.h> #include <linux/errno.h> |
ff49d74ad
|
107 |
static inline int ddebug_remove_module(const char *mod) |
e9d376f0f
|
108 109 110 |
{ return 0; } |
b48420c1d
|
111 112 113 114 |
static inline int ddebug_dyndbg_module_param_cb(char *param, char *val, const char *modname) { if (strstr(param, "dyndbg")) { |
516cf1be0
|
115 116 |
/* avoid pr_warn(), which wants pr_fmt() fully defined */ printk(KERN_WARNING "dyndbg param is supported only in " |
b48420c1d
|
117 118 119 120 121 122 |
"CONFIG_DYNAMIC_DEBUG builds "); return 0; /* allow and ignore */ } return -EINVAL; } |
00b55864b
|
123 124 |
#define dynamic_pr_debug(fmt, ...) \ do { if (0) printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__); } while (0) |
be70e2671
|
125 |
#define dynamic_dev_dbg(dev, fmt, ...) \ |
00b55864b
|
126 |
do { if (0) dev_printk(KERN_DEBUG, dev, fmt, ##__VA_ARGS__); } while (0) |
e9d376f0f
|
127 128 129 |
#endif #endif |