• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #ifndef _DYNAMIC_PRINTK_H
2 #define _DYNAMIC_PRINTK_H
3 
4 #define DYNAMIC_DEBUG_HASH_BITS 6
5 #define DEBUG_HASH_TABLE_SIZE (1 << DYNAMIC_DEBUG_HASH_BITS)
6 
7 #define TYPE_BOOLEAN 1
8 
9 #define DYNAMIC_ENABLED_ALL 0
10 #define DYNAMIC_ENABLED_NONE 1
11 #define DYNAMIC_ENABLED_SOME 2
12 
13 extern int dynamic_enabled;
14 
15 /* dynamic_printk_enabled, and dynamic_printk_enabled2 are bitmasks in which
16  * bit n is set to 1 if any modname hashes into the bucket n, 0 otherwise. They
17  * use independent hash functions, to reduce the chance of false positives.
18  */
19 extern long long dynamic_printk_enabled;
20 extern long long dynamic_printk_enabled2;
21 
22 struct mod_debug {
23 	char *modname;
24 	char *logical_modname;
25 	char *flag_names;
26 	int type;
27 	int hash;
28 	int hash2;
29 } __attribute__((aligned(8)));
30 
31 int register_dynamic_debug_module(char *mod_name, int type, char *share_name,
32 					char *flags, int hash, int hash2);
33 
34 #if defined(CONFIG_DYNAMIC_PRINTK_DEBUG)
35 extern int unregister_dynamic_debug_module(char *mod_name);
36 extern int __dynamic_dbg_enabled_helper(char *modname, int type,
37 					int value, int hash);
38 
39 #define __dynamic_dbg_enabled(module, type, value, level, hash)  ({	     \
40 	int __ret = 0;							     \
41 	if (unlikely((dynamic_printk_enabled & (1LL << DEBUG_HASH)) &&	     \
42 			(dynamic_printk_enabled2 & (1LL << DEBUG_HASH2))))   \
43 			__ret = __dynamic_dbg_enabled_helper(module, type,   \
44 								value, hash);\
45 	__ret; })
46 
47 #define dynamic_pr_debug(fmt, ...) do {					    \
48 	static char mod_name[]						    \
49 	__attribute__((section("__verbose_strings")))			    \
50 	 = KBUILD_MODNAME;						    \
51 	static struct mod_debug descriptor				    \
52 	__used								    \
53 	__attribute__((section("__verbose"), aligned(8))) =		    \
54 	{ mod_name, mod_name, NULL, TYPE_BOOLEAN, DEBUG_HASH, DEBUG_HASH2 };\
55 	if (__dynamic_dbg_enabled(KBUILD_MODNAME, TYPE_BOOLEAN,		    \
56 						0, 0, DEBUG_HASH))	    \
57 		printk(KERN_DEBUG KBUILD_MODNAME ":" fmt,		    \
58 				##__VA_ARGS__);				    \
59 	} while (0)
60 
61 #define dynamic_dev_dbg(dev, format, ...) do {				    \
62 	static char mod_name[]						    \
63 	__attribute__((section("__verbose_strings")))			    \
64 	 = KBUILD_MODNAME;						    \
65 	static struct mod_debug descriptor				    \
66 	__used								    \
67 	__attribute__((section("__verbose"), aligned(8))) =		    \
68 	{ mod_name, mod_name, NULL, TYPE_BOOLEAN, DEBUG_HASH, DEBUG_HASH2 };\
69 	if (__dynamic_dbg_enabled(KBUILD_MODNAME, TYPE_BOOLEAN,		    \
70 						0, 0, DEBUG_HASH))	    \
71 			dev_printk(KERN_DEBUG, dev,			    \
72 					KBUILD_MODNAME ": " format,	    \
73 					##__VA_ARGS__);			    \
74 	} while (0)
75 
76 #else
77 
unregister_dynamic_debug_module(const char * mod_name)78 static inline int unregister_dynamic_debug_module(const char *mod_name)
79 {
80 	return 0;
81 }
__dynamic_dbg_enabled_helper(char * modname,int type,int value,int hash)82 static inline int __dynamic_dbg_enabled_helper(char *modname, int type,
83 						int value, int hash)
84 {
85 	return 0;
86 }
87 
88 #define __dynamic_dbg_enabled(module, type, value, level, hash)  ({ 0; })
89 #define dynamic_pr_debug(fmt, ...)  do { } while (0)
90 #define dynamic_dev_dbg(dev, format, ...)  do { } while (0)
91 #endif
92 
93 #endif
94