Root/
1 | #ifndef _DYNAMIC_DEBUG_H |
2 | #define _DYNAMIC_DEBUG_H |
3 | |
4 | /* dynamic_printk_enabled, and dynamic_printk_enabled2 are bitmasks in which |
5 | * bit n is set to 1 if any modname hashes into the bucket n, 0 otherwise. They |
6 | * use independent hash functions, to reduce the chance of false positives. |
7 | */ |
8 | extern long long dynamic_debug_enabled; |
9 | extern long long dynamic_debug_enabled2; |
10 | |
11 | /* |
12 | * An instance of this structure is created in a special |
13 | * ELF section at every dynamic debug callsite. At runtime, |
14 | * the special section is treated as an array of these. |
15 | */ |
16 | struct _ddebug { |
17 | /* |
18 | * These fields are used to drive the user interface |
19 | * for selecting and displaying debug callsites. |
20 | */ |
21 | const char *modname; |
22 | const char *function; |
23 | const char *filename; |
24 | const char *format; |
25 | unsigned int lineno:24; |
26 | /* |
27 | * The flags field controls the behaviour at the callsite. |
28 | * The bits here are changed dynamically when the user |
29 | * writes commands to <debugfs>/dynamic_debug/control |
30 | */ |
31 | #define _DPRINTK_FLAGS_PRINT (1<<0) /* printk() a message using the format */ |
32 | #define _DPRINTK_FLAGS_INCL_MODNAME (1<<1) |
33 | #define _DPRINTK_FLAGS_INCL_FUNCNAME (1<<2) |
34 | #define _DPRINTK_FLAGS_INCL_LINENO (1<<3) |
35 | #define _DPRINTK_FLAGS_INCL_TID (1<<4) |
36 | #define _DPRINTK_FLAGS_DEFAULT 0 |
37 | unsigned int flags:8; |
38 | char enabled; |
39 | } __attribute__((aligned(8))); |
40 | |
41 | |
42 | int ddebug_add_module(struct _ddebug *tab, unsigned int n, |
43 | const char *modname); |
44 | |
45 | #if defined(CONFIG_DYNAMIC_DEBUG) |
46 | extern int ddebug_remove_module(const char *mod_name); |
47 | extern int __dynamic_pr_debug(struct _ddebug *descriptor, const char *fmt, ...) |
48 | __attribute__ ((format (printf, 2, 3))); |
49 | |
50 | #define dynamic_pr_debug(fmt, ...) do { \ |
51 | static struct _ddebug descriptor \ |
52 | __used \ |
53 | __attribute__((section("__verbose"), aligned(8))) = \ |
54 | { KBUILD_MODNAME, __func__, __FILE__, fmt, __LINE__, \ |
55 | _DPRINTK_FLAGS_DEFAULT }; \ |
56 | if (unlikely(descriptor.enabled)) \ |
57 | __dynamic_pr_debug(&descriptor, pr_fmt(fmt), ##__VA_ARGS__); \ |
58 | } while (0) |
59 | |
60 | |
61 | #define dynamic_dev_dbg(dev, fmt, ...) do { \ |
62 | static struct _ddebug descriptor \ |
63 | __used \ |
64 | __attribute__((section("__verbose"), aligned(8))) = \ |
65 | { KBUILD_MODNAME, __func__, __FILE__, fmt, __LINE__, \ |
66 | _DPRINTK_FLAGS_DEFAULT }; \ |
67 | if (unlikely(descriptor.enabled)) \ |
68 | dev_printk(KERN_DEBUG, dev, fmt, ##__VA_ARGS__); \ |
69 | } while (0) |
70 | |
71 | #else |
72 | |
73 | static inline int ddebug_remove_module(const char *mod) |
74 | { |
75 | return 0; |
76 | } |
77 | |
78 | #define dynamic_pr_debug(fmt, ...) \ |
79 | do { if (0) printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__); } while (0) |
80 | #define dynamic_dev_dbg(dev, fmt, ...) \ |
81 | do { if (0) dev_printk(KERN_DEBUG, dev, fmt, ##__VA_ARGS__); } while (0) |
82 | #endif |
83 | |
84 | #endif |
85 |
Branches:
ben-wpan
ben-wpan-stefan
javiroman/ks7010
jz-2.6.34
jz-2.6.34-rc5
jz-2.6.34-rc6
jz-2.6.34-rc7
jz-2.6.35
jz-2.6.36
jz-2.6.37
jz-2.6.38
jz-2.6.39
jz-3.0
jz-3.1
jz-3.11
jz-3.12
jz-3.13
jz-3.15
jz-3.16
jz-3.18-dt
jz-3.2
jz-3.3
jz-3.4
jz-3.5
jz-3.6
jz-3.6-rc2-pwm
jz-3.9
jz-3.9-clk
jz-3.9-rc8
jz47xx
jz47xx-2.6.38
master
Tags:
od-2011-09-04
od-2011-09-18
v2.6.34-rc5
v2.6.34-rc6
v2.6.34-rc7
v3.9