1*e9d376f0SJason Baron #ifndef _DYNAMIC_DEBUG_H 2*e9d376f0SJason Baron #define _DYNAMIC_DEBUG_H 3*e9d376f0SJason Baron 4*e9d376f0SJason Baron /* dynamic_printk_enabled, and dynamic_printk_enabled2 are bitmasks in which 5*e9d376f0SJason Baron * bit n is set to 1 if any modname hashes into the bucket n, 0 otherwise. They 6*e9d376f0SJason Baron * use independent hash functions, to reduce the chance of false positives. 7*e9d376f0SJason Baron */ 8*e9d376f0SJason Baron extern long long dynamic_debug_enabled; 9*e9d376f0SJason Baron extern long long dynamic_debug_enabled2; 10*e9d376f0SJason Baron 11*e9d376f0SJason Baron /* 12*e9d376f0SJason Baron * An instance of this structure is created in a special 13*e9d376f0SJason Baron * ELF section at every dynamic debug callsite. At runtime, 14*e9d376f0SJason Baron * the special section is treated as an array of these. 15*e9d376f0SJason Baron */ 16*e9d376f0SJason Baron struct _ddebug { 17*e9d376f0SJason Baron /* 18*e9d376f0SJason Baron * These fields are used to drive the user interface 19*e9d376f0SJason Baron * for selecting and displaying debug callsites. 20*e9d376f0SJason Baron */ 21*e9d376f0SJason Baron const char *modname; 22*e9d376f0SJason Baron const char *function; 23*e9d376f0SJason Baron const char *filename; 24*e9d376f0SJason Baron const char *format; 25*e9d376f0SJason Baron char primary_hash; 26*e9d376f0SJason Baron char secondary_hash; 27*e9d376f0SJason Baron unsigned int lineno:24; 28*e9d376f0SJason Baron /* 29*e9d376f0SJason Baron * The flags field controls the behaviour at the callsite. 30*e9d376f0SJason Baron * The bits here are changed dynamically when the user 31*e9d376f0SJason Baron * writes commands to <debugfs>/dynamic_debug/ddebug 32*e9d376f0SJason Baron */ 33*e9d376f0SJason Baron #define _DPRINTK_FLAGS_PRINT (1<<0) /* printk() a message using the format */ 34*e9d376f0SJason Baron #define _DPRINTK_FLAGS_DEFAULT 0 35*e9d376f0SJason Baron unsigned int flags:8; 36*e9d376f0SJason Baron } __attribute__((aligned(8))); 37*e9d376f0SJason Baron 38*e9d376f0SJason Baron 39*e9d376f0SJason Baron int ddebug_add_module(struct _ddebug *tab, unsigned int n, 40*e9d376f0SJason Baron const char *modname); 41*e9d376f0SJason Baron 42*e9d376f0SJason Baron #if defined(CONFIG_DYNAMIC_DEBUG) 43*e9d376f0SJason Baron extern int ddebug_remove_module(char *mod_name); 44*e9d376f0SJason Baron 45*e9d376f0SJason Baron #define __dynamic_dbg_enabled(dd) ({ \ 46*e9d376f0SJason Baron int __ret = 0; \ 47*e9d376f0SJason Baron if (unlikely((dynamic_debug_enabled & (1LL << DEBUG_HASH)) && \ 48*e9d376f0SJason Baron (dynamic_debug_enabled2 & (1LL << DEBUG_HASH2)))) \ 49*e9d376f0SJason Baron if (unlikely(dd.flags)) \ 50*e9d376f0SJason Baron __ret = 1; \ 51*e9d376f0SJason Baron __ret; }) 52*e9d376f0SJason Baron 53*e9d376f0SJason Baron #define dynamic_pr_debug(fmt, ...) do { \ 54*e9d376f0SJason Baron static struct _ddebug descriptor \ 55*e9d376f0SJason Baron __used \ 56*e9d376f0SJason Baron __attribute__((section("__verbose"), aligned(8))) = \ 57*e9d376f0SJason Baron { KBUILD_MODNAME, __func__, __FILE__, fmt, DEBUG_HASH, \ 58*e9d376f0SJason Baron DEBUG_HASH2, __LINE__, _DPRINTK_FLAGS_DEFAULT }; \ 59*e9d376f0SJason Baron if (__dynamic_dbg_enabled(descriptor)) \ 60*e9d376f0SJason Baron printk(KERN_DEBUG KBUILD_MODNAME ":" fmt, \ 61*e9d376f0SJason Baron ##__VA_ARGS__); \ 62*e9d376f0SJason Baron } while (0) 63*e9d376f0SJason Baron 64*e9d376f0SJason Baron 65*e9d376f0SJason Baron #define dynamic_dev_dbg(dev, fmt, ...) do { \ 66*e9d376f0SJason Baron static struct _ddebug descriptor \ 67*e9d376f0SJason Baron __used \ 68*e9d376f0SJason Baron __attribute__((section("__verbose"), aligned(8))) = \ 69*e9d376f0SJason Baron { KBUILD_MODNAME, __func__, __FILE__, fmt, DEBUG_HASH, \ 70*e9d376f0SJason Baron DEBUG_HASH2, __LINE__, _DPRINTK_FLAGS_DEFAULT }; \ 71*e9d376f0SJason Baron if (__dynamic_dbg_enabled(descriptor)) \ 72*e9d376f0SJason Baron dev_printk(KERN_DEBUG, dev, \ 73*e9d376f0SJason Baron KBUILD_MODNAME ": " fmt, \ 74*e9d376f0SJason Baron ##__VA_ARGS__); \ 75*e9d376f0SJason Baron } while (0) 76*e9d376f0SJason Baron 77*e9d376f0SJason Baron #else 78*e9d376f0SJason Baron 79*e9d376f0SJason Baron static inline int ddebug_remove_module(char *mod) 80*e9d376f0SJason Baron { 81*e9d376f0SJason Baron return 0; 82*e9d376f0SJason Baron } 83*e9d376f0SJason Baron 84*e9d376f0SJason Baron #define dynamic_pr_debug(fmt, ...) do { } while (0) 85*e9d376f0SJason Baron #define dynamic_dev_dbg(dev, format, ...) do { } while (0) 86*e9d376f0SJason Baron #endif 87*e9d376f0SJason Baron 88*e9d376f0SJason Baron #endif 89