| Jason Baron | e9d376f | 2009-02-05 11:51:38 -0500 | [diff] [blame] | 1 | #ifndef _DYNAMIC_DEBUG_H | 
 | 2 | #define _DYNAMIC_DEBUG_H | 
 | 3 |  | 
| Jason Baron | e9d376f | 2009-02-05 11:51:38 -0500 | [diff] [blame] | 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; | 
| Jason Baron | e9d376f | 2009-02-05 11:51:38 -0500 | [diff] [blame] | 18 | 	unsigned int lineno:24; | 
 | 19 | 	/* | 
 | 20 |  	 * The flags field controls the behaviour at the callsite. | 
 | 21 |  	 * The bits here are changed dynamically when the user | 
| Florian Ragwitz | 2b2f68b | 2010-05-24 14:33:21 -0700 | [diff] [blame] | 22 | 	 * writes commands to <debugfs>/dynamic_debug/control | 
| Jason Baron | e9d376f | 2009-02-05 11:51:38 -0500 | [diff] [blame] | 23 | 	 */ | 
 | 24 | #define _DPRINTK_FLAGS_PRINT   (1<<0)  /* printk() a message using the format */ | 
| Bart Van Assche | 8ba6ebf | 2011-01-23 17:17:24 +0100 | [diff] [blame] | 25 | #define _DPRINTK_FLAGS_INCL_MODNAME	(1<<1) | 
 | 26 | #define _DPRINTK_FLAGS_INCL_FUNCNAME	(1<<2) | 
 | 27 | #define _DPRINTK_FLAGS_INCL_LINENO	(1<<3) | 
 | 28 | #define _DPRINTK_FLAGS_INCL_TID		(1<<4) | 
| Jason Baron | e9d376f | 2009-02-05 11:51:38 -0500 | [diff] [blame] | 29 | #define _DPRINTK_FLAGS_DEFAULT 0 | 
 | 30 | 	unsigned int flags:8; | 
| Jason Baron | 52159d9 | 2010-09-17 11:09:17 -0400 | [diff] [blame] | 31 | 	char enabled; | 
| Jason Baron | e9d376f | 2009-02-05 11:51:38 -0500 | [diff] [blame] | 32 | } __attribute__((aligned(8))); | 
 | 33 |  | 
 | 34 |  | 
 | 35 | int ddebug_add_module(struct _ddebug *tab, unsigned int n, | 
 | 36 | 				const char *modname); | 
 | 37 |  | 
 | 38 | #if defined(CONFIG_DYNAMIC_DEBUG) | 
| Yehuda Sadeh | ff49d74 | 2010-07-03 13:07:35 +1000 | [diff] [blame] | 39 | extern int ddebug_remove_module(const char *mod_name); | 
| Joe Perches | b9075fa | 2011-10-31 17:11:33 -0700 | [diff] [blame] | 40 | extern __printf(2, 3) | 
 | 41 | int __dynamic_pr_debug(struct _ddebug *descriptor, const char *fmt, ...); | 
| Jason Baron | e9d376f | 2009-02-05 11:51:38 -0500 | [diff] [blame] | 42 |  | 
| Joe Perches | cbc4663 | 2011-08-11 14:36:21 -0400 | [diff] [blame] | 43 | struct device; | 
 | 44 |  | 
| Joe Perches | b9075fa | 2011-10-31 17:11:33 -0700 | [diff] [blame] | 45 | extern __printf(3, 4) | 
 | 46 | int __dynamic_dev_dbg(struct _ddebug *descriptor, const struct device *dev, | 
 | 47 | 		      const char *fmt, ...); | 
| Joe Perches | cbc4663 | 2011-08-11 14:36:21 -0400 | [diff] [blame] | 48 |  | 
| Jason Baron | ffa10cb | 2011-08-11 14:36:48 -0400 | [diff] [blame] | 49 | struct net_device; | 
 | 50 |  | 
| Joe Perches | b9075fa | 2011-10-31 17:11:33 -0700 | [diff] [blame] | 51 | extern __printf(3, 4) | 
 | 52 | int __dynamic_netdev_dbg(struct _ddebug *descriptor, | 
 | 53 | 			 const struct net_device *dev, | 
 | 54 | 			 const char *fmt, ...); | 
| Jason Baron | ffa10cb | 2011-08-11 14:36:48 -0400 | [diff] [blame] | 55 |  | 
| Jason Baron | 07613b0 | 2011-10-04 14:13:15 -0700 | [diff] [blame] | 56 | #define DEFINE_DYNAMIC_DEBUG_METADATA(name, fmt)		\ | 
 | 57 | 	static struct _ddebug __used __aligned(8)		\ | 
 | 58 | 	__attribute__((section("__verbose"))) name = {		\ | 
 | 59 | 		.modname = KBUILD_MODNAME,			\ | 
 | 60 | 		.function = __func__,				\ | 
 | 61 | 		.filename = __FILE__,				\ | 
 | 62 | 		.format = (fmt),				\ | 
 | 63 | 		.lineno = __LINE__,				\ | 
 | 64 | 		.flags =  _DPRINTK_FLAGS_DEFAULT,		\ | 
 | 65 | 		.enabled = false,				\ | 
 | 66 | 	} | 
| Jason Baron | e9d376f | 2009-02-05 11:51:38 -0500 | [diff] [blame] | 67 |  | 
| Jason Baron | 07613b0 | 2011-10-04 14:13:15 -0700 | [diff] [blame] | 68 | #define dynamic_pr_debug(fmt, ...)				\ | 
 | 69 | do {								\ | 
 | 70 | 	DEFINE_DYNAMIC_DEBUG_METADATA(descriptor, fmt);		\ | 
 | 71 | 	if (unlikely(descriptor.enabled))			\ | 
 | 72 | 		__dynamic_pr_debug(&descriptor, pr_fmt(fmt),	\ | 
 | 73 | 				   ##__VA_ARGS__);		\ | 
 | 74 | } while (0) | 
| Jason Baron | e9d376f | 2009-02-05 11:51:38 -0500 | [diff] [blame] | 75 |  | 
| Jason Baron | 07613b0 | 2011-10-04 14:13:15 -0700 | [diff] [blame] | 76 | #define dynamic_dev_dbg(dev, fmt, ...)				\ | 
 | 77 | do {								\ | 
 | 78 | 	DEFINE_DYNAMIC_DEBUG_METADATA(descriptor, fmt);	\ | 
 | 79 | 	if (unlikely(descriptor.enabled))			\ | 
 | 80 | 		__dynamic_dev_dbg(&descriptor, dev, fmt,	\ | 
 | 81 | 				  ##__VA_ARGS__);		\ | 
 | 82 | } while (0) | 
 | 83 |  | 
 | 84 | #define dynamic_netdev_dbg(dev, fmt, ...)			\ | 
 | 85 | do {								\ | 
 | 86 | 	DEFINE_DYNAMIC_DEBUG_METADATA(descriptor, fmt);		\ | 
 | 87 | 	if (unlikely(descriptor.enabled))			\ | 
 | 88 | 		__dynamic_netdev_dbg(&descriptor, dev, fmt,	\ | 
 | 89 | 				     ##__VA_ARGS__);		\ | 
 | 90 | } while (0) | 
| Jason Baron | ffa10cb | 2011-08-11 14:36:48 -0400 | [diff] [blame] | 91 |  | 
| Jason Baron | e9d376f | 2009-02-05 11:51:38 -0500 | [diff] [blame] | 92 | #else | 
 | 93 |  | 
| Yehuda Sadeh | ff49d74 | 2010-07-03 13:07:35 +1000 | [diff] [blame] | 94 | static inline int ddebug_remove_module(const char *mod) | 
| Jason Baron | e9d376f | 2009-02-05 11:51:38 -0500 | [diff] [blame] | 95 | { | 
 | 96 | 	return 0; | 
 | 97 | } | 
 | 98 |  | 
| Joe Perches | 00b5586 | 2009-12-14 18:00:14 -0800 | [diff] [blame] | 99 | #define dynamic_pr_debug(fmt, ...)					\ | 
 | 100 | 	do { if (0) printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__); } while (0) | 
| Philipp Reisner | be70e26 | 2010-10-14 11:58:20 +0200 | [diff] [blame] | 101 | #define dynamic_dev_dbg(dev, fmt, ...)					\ | 
| Joe Perches | 00b5586 | 2009-12-14 18:00:14 -0800 | [diff] [blame] | 102 | 	do { if (0) dev_printk(KERN_DEBUG, dev, fmt, ##__VA_ARGS__); } while (0) | 
| Jason Baron | e9d376f | 2009-02-05 11:51:38 -0500 | [diff] [blame] | 103 | #endif | 
 | 104 |  | 
 | 105 | #endif |