Branch data Line data Source code
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 <debugfs>/dynamic_debug/control
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 : : int __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 : : int __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 : : int __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 <linux/string.h>
112 : : #include <linux/errno.h>
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 [ # # ]: 0 : if (strstr(param, "dyndbg")) {
123 : : /* avoid pr_warn(), which wants pr_fmt() fully defined */
124 : 0 : 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 : : #endif
|