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