Tidy up addresses in random drivers
[linux-2.6/sactl.git] / include / linux / dynamic_printk.h
blob2d528d009074dfcbd4f47a74faf71f6d77111116
1 #ifndef _DYNAMIC_PRINTK_H
2 #define _DYNAMIC_PRINTK_H
4 #define DYNAMIC_DEBUG_HASH_BITS 6
5 #define DEBUG_HASH_TABLE_SIZE (1 << DYNAMIC_DEBUG_HASH_BITS)
7 #define TYPE_BOOLEAN 1
9 #define DYNAMIC_ENABLED_ALL 0
10 #define DYNAMIC_ENABLED_NONE 1
11 #define DYNAMIC_ENABLED_SOME 2
13 extern int dynamic_enabled;
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.
19 extern long long dynamic_printk_enabled;
20 extern long long dynamic_printk_enabled2;
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)));
31 int register_dynamic_debug_module(char *mod_name, int type, char *share_name,
32 char *flags, int hash, int hash2);
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);
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; })
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)
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)
76 #else
78 static inline int unregister_dynamic_debug_module(const char *mod_name)
80 return 0;
82 static inline int __dynamic_dbg_enabled_helper(char *modname, int type,
83 int value, int hash)
85 return 0;
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
93 #endif