Blame view

include/linux/dynamic_debug.h 3.91 KB
e9d376f0f   Jason Baron   dynamic debug: co...
1
2
  #ifndef _DYNAMIC_DEBUG_H
  #define _DYNAMIC_DEBUG_H
e9d376f0f   Jason Baron   dynamic debug: co...
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   Jim Cromie   dynamic_debug: re...
17
  	unsigned int lineno:18;
e9d376f0f   Jason Baron   dynamic debug: co...
18
  	/*
3faa28605   Jim Cromie   dynamic_debug: fi...
19
20
  	 * The flags field controls the behaviour at the callsite.
  	 * The bits here are changed dynamically when the user
2b2f68b53   Florian Ragwitz   DYNAMIC_DEBUG: fi...
21
  	 * writes commands to <debugfs>/dynamic_debug/control
e9d376f0f   Jason Baron   dynamic debug: co...
22
  	 */
5ca7d2a6c   Jim Cromie   dynamic_debug: de...
23
24
  #define _DPRINTK_FLAGS_NONE	0
  #define _DPRINTK_FLAGS_PRINT	(1<<0) /* printk() a message using the format */
8ba6ebf58   Bart Van Assche   Dynamic debug: Ad...
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   Jim Cromie   dynamic_debug: ma...
29
30
31
  #if defined DEBUG
  #define _DPRINTK_FLAGS_DEFAULT _DPRINTK_FLAGS_PRINT
  #else
e9d376f0f   Jason Baron   dynamic debug: co...
32
  #define _DPRINTK_FLAGS_DEFAULT 0
b558c96ff   Jim Cromie   dynamic_debug: ma...
33
  #endif
e9d376f0f   Jason Baron   dynamic debug: co...
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   Yehuda Sadeh   module: initializ...
42
  extern int ddebug_remove_module(const char *mod_name);
b9075fa96   Joe Perches   treewide: use __p...
43
  extern __printf(2, 3)
906d20153   Joe Perches   dynamic_debug: ch...
44
  void __dynamic_pr_debug(struct _ddebug *descriptor, const char *fmt, ...);
e9d376f0f   Jason Baron   dynamic debug: co...
45

b48420c1d   Jim Cromie   dynamic_debug: ma...
46
47
  extern int ddebug_dyndbg_module_param_cb(char *param, char *val,
  					const char *modname);
cbc466355   Joe Perches   dynamic_debug: Ad...
48
  struct device;
b9075fa96   Joe Perches   treewide: use __p...
49
  extern __printf(3, 4)
906d20153   Joe Perches   dynamic_debug: ch...
50
51
  void __dynamic_dev_dbg(struct _ddebug *descriptor, const struct device *dev,
  		       const char *fmt, ...);
cbc466355   Joe Perches   dynamic_debug: Ad...
52

ffa10cb47   Jason Baron   dynamic_debug: ma...
53
  struct net_device;
b9075fa96   Joe Perches   treewide: use __p...
54
  extern __printf(3, 4)
906d20153   Joe Perches   dynamic_debug: ch...
55
56
57
  void __dynamic_netdev_dbg(struct _ddebug *descriptor,
  			  const struct net_device *dev,
  			  const char *fmt, ...);
ffa10cb47   Jason Baron   dynamic_debug: ma...
58

07613b0b5   Jason Baron   dynamic_debug: co...
59
  #define DEFINE_DYNAMIC_DEBUG_METADATA(name, fmt)		\
c0d2af637   Joe Perches   dynamic_debug: Re...
60
  	static struct _ddebug  __aligned(8)			\
07613b0b5   Jason Baron   dynamic_debug: co...
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   Jason Baron   dynamic_debug: co...
68
69
70
71
72
  	}
  
  #define dynamic_pr_debug(fmt, ...)				\
  do {								\
  	DEFINE_DYNAMIC_DEBUG_METADATA(descriptor, fmt);		\
87e6f9683   Jim Cromie   dynamic_debug: dr...
73
  	if (unlikely(descriptor.flags & _DPRINTK_FLAGS_PRINT))	\
07613b0b5   Jason Baron   dynamic_debug: co...
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   Jim Cromie   dynamic_debug: dr...
80
81
  	DEFINE_DYNAMIC_DEBUG_METADATA(descriptor, fmt);		\
  	if (unlikely(descriptor.flags & _DPRINTK_FLAGS_PRINT))	\
07613b0b5   Jason Baron   dynamic_debug: co...
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   Jim Cromie   dynamic_debug: dr...
89
  	if (unlikely(descriptor.flags & _DPRINTK_FLAGS_PRINT))	\
07613b0b5   Jason Baron   dynamic_debug: co...
90
91
92
  		__dynamic_netdev_dbg(&descriptor, dev, fmt,	\
  				     ##__VA_ARGS__);		\
  } while (0)
ffa10cb47   Jason Baron   dynamic_debug: ma...
93

7a555613e   Vladimir Kondratiev   dynamic_debug: dy...
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   Jason Baron   dynamic debug: co...
104
  #else
b48420c1d   Jim Cromie   dynamic_debug: ma...
105
106
  #include <linux/string.h>
  #include <linux/errno.h>
ff49d74ad   Yehuda Sadeh   module: initializ...
107
  static inline int ddebug_remove_module(const char *mod)
e9d376f0f   Jason Baron   dynamic debug: co...
108
109
110
  {
  	return 0;
  }
b48420c1d   Jim Cromie   dynamic_debug: ma...
111
112
113
114
  static inline int ddebug_dyndbg_module_param_cb(char *param, char *val,
  						const char *modname)
  {
  	if (strstr(param, "dyndbg")) {
516cf1be0   Jim Cromie   dynamic_debug: us...
115
116
  		/* avoid pr_warn(), which wants pr_fmt() fully defined */
  		printk(KERN_WARNING "dyndbg param is supported only in "
b48420c1d   Jim Cromie   dynamic_debug: ma...
117
118
119
120
121
122
  			"CONFIG_DYNAMIC_DEBUG builds
  ");
  		return 0; /* allow and ignore */
  	}
  	return -EINVAL;
  }
00b55864b   Joe Perches   dynamic_debug.h/k...
123
124
  #define dynamic_pr_debug(fmt, ...)					\
  	do { if (0) printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__); } while (0)
be70e2671   Philipp Reisner   dynamic_debug.h: ...
125
  #define dynamic_dev_dbg(dev, fmt, ...)					\
00b55864b   Joe Perches   dynamic_debug.h/k...
126
  	do { if (0) dev_printk(KERN_DEBUG, dev, fmt, ##__VA_ARGS__); } while (0)
e9d376f0f   Jason Baron   dynamic debug: co...
127
128
129
  #endif
  
  #endif