blob: 25042bcb64a1f72c5cc921d32a471ab9e4c050d4 [file] [log] [blame]
Nicholas Flintham1e3d3112013-04-10 10:48:38 +01001#ifndef _DYNAMIC_DEBUG_H
2#define _DYNAMIC_DEBUG_H
3
4struct _ddebug {
5 const char *modname;
6 const char *function;
7 const char *filename;
8 const char *format;
9 unsigned int lineno:18;
10#define _DPRINTK_FLAGS_NONE 0
11#define _DPRINTK_FLAGS_PRINT (1<<0)
12#define _DPRINTK_FLAGS_INCL_MODNAME (1<<1)
13#define _DPRINTK_FLAGS_INCL_FUNCNAME (1<<2)
14#define _DPRINTK_FLAGS_INCL_LINENO (1<<3)
15#define _DPRINTK_FLAGS_INCL_TID (1<<4)
16#if defined DEBUG
17#define _DPRINTK_FLAGS_DEFAULT _DPRINTK_FLAGS_PRINT
18#else
19#define _DPRINTK_FLAGS_DEFAULT 0
20#endif
21 unsigned int flags:8;
22} __attribute__((aligned(8)));
23
24
25int ddebug_add_module(struct _ddebug *tab, unsigned int n,
26 const char *modname);
27
28#if defined(CONFIG_DYNAMIC_DEBUG)
29extern int ddebug_remove_module(const char *mod_name);
30extern __printf(2, 3)
31int __dynamic_pr_debug(struct _ddebug *descriptor, const char *fmt, ...);
32
33struct device;
34
35extern __printf(3, 4)
36int __dynamic_dev_dbg(struct _ddebug *descriptor, const struct device *dev,
37 const char *fmt, ...);
38
39struct net_device;
40
41extern __printf(3, 4)
42int __dynamic_netdev_dbg(struct _ddebug *descriptor,
43 const struct net_device *dev,
44 const char *fmt, ...);
45
46#define DEFINE_DYNAMIC_DEBUG_METADATA(name, fmt) \
47 static struct _ddebug __used __aligned(8) \
48 __attribute__((section("__verbose"))) name = { \
49 .modname = KBUILD_MODNAME, \
50 .function = __func__, \
51 .filename = __FILE__, \
52 .format = (fmt), \
53 .lineno = __LINE__, \
54 .flags = _DPRINTK_FLAGS_DEFAULT, \
55 }
56
57#define dynamic_pr_debug(fmt, ...) \
58do { \
59 DEFINE_DYNAMIC_DEBUG_METADATA(descriptor, fmt); \
60 if (unlikely(descriptor.flags & _DPRINTK_FLAGS_PRINT)) \
61 __dynamic_pr_debug(&descriptor, pr_fmt(fmt), \
62 ##__VA_ARGS__); \
63} while (0)
64
65#define dynamic_dev_dbg(dev, fmt, ...) \
66do { \
67 DEFINE_DYNAMIC_DEBUG_METADATA(descriptor, fmt); \
68 if (unlikely(descriptor.flags & _DPRINTK_FLAGS_PRINT)) \
69 __dynamic_dev_dbg(&descriptor, dev, fmt, \
70 ##__VA_ARGS__); \
71} while (0)
72
73#define dynamic_netdev_dbg(dev, fmt, ...) \
74do { \
75 DEFINE_DYNAMIC_DEBUG_METADATA(descriptor, fmt); \
76 if (unlikely(descriptor.flags & _DPRINTK_FLAGS_PRINT)) \
77 __dynamic_netdev_dbg(&descriptor, dev, fmt, \
78 ##__VA_ARGS__); \
79} while (0)
80
81#else
82
83static inline int ddebug_remove_module(const char *mod)
84{
85 return 0;
86}
87
88#define dynamic_pr_debug(fmt, ...) \
89 do { if (0) printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__); } while (0)
90#define dynamic_dev_dbg(dev, fmt, ...) \
91 do { if (0) dev_printk(KERN_DEBUG, dev, fmt, ##__VA_ARGS__); } while (0)
92#endif
93
94#endif