Rev 6936 | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
6936 | serge | 1 | #ifndef _ASM_GENERIC_BUG_H |
2 | #define _ASM_GENERIC_BUG_H |
||
3 | |||
4 | #include |
||
5 | |||
6 | #ifdef CONFIG_GENERIC_BUG |
||
7 | #define BUGFLAG_WARNING (1 << 0) |
||
8 | #define BUGFLAG_TAINT(taint) (BUGFLAG_WARNING | ((taint) << 8)) |
||
9 | #define BUG_GET_TAINT(bug) ((bug)->flags >> 8) |
||
10 | #endif |
||
11 | |||
12 | #ifndef __ASSEMBLY__ |
||
13 | #include |
||
14 | |||
15 | #ifdef CONFIG_BUG |
||
16 | |||
17 | #ifdef CONFIG_GENERIC_BUG |
||
18 | struct bug_entry { |
||
19 | #ifndef CONFIG_GENERIC_BUG_RELATIVE_POINTERS |
||
20 | unsigned long bug_addr; |
||
21 | #else |
||
22 | signed int bug_addr_disp; |
||
23 | #endif |
||
24 | #ifdef CONFIG_DEBUG_BUGVERBOSE |
||
25 | #ifndef CONFIG_GENERIC_BUG_RELATIVE_POINTERS |
||
26 | const char *file; |
||
27 | #else |
||
28 | signed int file_disp; |
||
29 | #endif |
||
30 | unsigned short line; |
||
31 | #endif |
||
32 | unsigned short flags; |
||
33 | }; |
||
34 | #endif /* CONFIG_GENERIC_BUG */ |
||
35 | |||
36 | /* |
||
37 | * Don't use BUG() or BUG_ON() unless there's really no way out; one |
||
38 | * example might be detecting data structure corruption in the middle |
||
39 | * of an operation that can't be backed out of. If the (sub)system |
||
40 | * can somehow continue operating, perhaps with reduced functionality, |
||
41 | * it's probably not BUG-worthy. |
||
42 | * |
||
43 | * If you're tempted to BUG(), think again: is completely giving up |
||
44 | * really the *only* solution? There are usually better options, where |
||
45 | * users don't need to reboot ASAP and can mostly shut down cleanly. |
||
46 | */ |
||
47 | #ifndef HAVE_ARCH_BUG |
||
48 | #define BUG() do { \ |
||
49 | printk("BUG: failure at %s:%d/%s()!\n", __FILE__, __LINE__, __func__); \ |
||
50 | panic("BUG!"); \ |
||
51 | } while (0) |
||
52 | #endif |
||
53 | |||
54 | #ifndef HAVE_ARCH_BUG_ON |
||
55 | #define BUG_ON(condition) do { if (unlikely(condition)) BUG(); } while (0) |
||
56 | #endif |
||
57 | |||
58 | /* |
||
59 | * WARN(), WARN_ON(), WARN_ON_ONCE, and so on can be used to report |
||
60 | * significant issues that need prompt attention if they should ever |
||
61 | * appear at runtime. Use the versions with printk format strings |
||
62 | * to provide better diagnostics. |
||
63 | */ |
||
64 | #ifndef __WARN_TAINT |
||
65 | extern __printf(3, 4) |
||
66 | void warn_slowpath_fmt(const char *file, const int line, |
||
67 | const char *fmt, ...); |
||
68 | extern __printf(4, 5) |
||
69 | void warn_slowpath_fmt_taint(const char *file, const int line, unsigned taint, |
||
70 | const char *fmt, ...); |
||
71 | extern void warn_slowpath_null(const char *file, const int line); |
||
72 | #define WANT_WARN_ON_SLOWPATH |
||
73 | #define __WARN() warn_slowpath_null(__FILE__, __LINE__) |
||
74 | #define __WARN_printf(arg...) warn_slowpath_fmt(__FILE__, __LINE__, arg) |
||
75 | #define __WARN_printf_taint(taint, arg...) \ |
||
76 | warn_slowpath_fmt_taint(__FILE__, __LINE__, taint, arg) |
||
77 | #else |
||
78 | #define __WARN() __WARN_TAINT(TAINT_WARN) |
||
79 | #define __WARN_printf(arg...) do { printk(arg); __WARN(); } while (0) |
||
80 | #define __WARN_printf_taint(taint, arg...) \ |
||
81 | do { printk(arg); __WARN_TAINT(taint); } while (0) |
||
82 | #endif |
||
83 | |||
7143 | serge | 84 | /* used internally by panic.c */ |
85 | struct warn_args; |
||
86 | |||
87 | void __warn(const char *file, int line, void *caller, unsigned taint, |
||
88 | struct pt_regs *regs, struct warn_args *args); |
||
89 | |||
6936 | serge | 90 | #ifndef WARN_ON |
91 | #define WARN_ON(condition) ({ \ |
||
92 | int __ret_warn_on = !!(condition); \ |
||
93 | if (unlikely(__ret_warn_on)) \ |
||
94 | __WARN(); \ |
||
95 | unlikely(__ret_warn_on); \ |
||
96 | }) |
||
97 | #endif |
||
98 | |||
99 | #ifndef WARN |
||
100 | #define WARN(condition, format...) ({ \ |
||
101 | int __ret_warn_on = !!(condition); \ |
||
102 | if (unlikely(__ret_warn_on)) \ |
||
103 | __WARN_printf(format); \ |
||
104 | unlikely(__ret_warn_on); \ |
||
105 | }) |
||
106 | #endif |
||
107 | |||
108 | #define WARN_TAINT(condition, taint, format...) ({ \ |
||
109 | int __ret_warn_on = !!(condition); \ |
||
110 | if (unlikely(__ret_warn_on)) \ |
||
111 | __WARN_printf_taint(taint, format); \ |
||
112 | unlikely(__ret_warn_on); \ |
||
113 | }) |
||
114 | |||
115 | #define WARN_ON_ONCE(condition) ({ \ |
||
116 | static bool __section(.data.unlikely) __warned; \ |
||
117 | int __ret_warn_once = !!(condition); \ |
||
118 | \ |
||
7143 | serge | 119 | if (unlikely(__ret_warn_once && !__warned)) { \ |
120 | __warned = true; \ |
||
121 | WARN_ON(1); \ |
||
122 | } \ |
||
6936 | serge | 123 | unlikely(__ret_warn_once); \ |
124 | }) |
||
125 | |||
126 | #define WARN_ONCE(condition, format...) ({ \ |
||
127 | static bool __section(.data.unlikely) __warned; \ |
||
128 | int __ret_warn_once = !!(condition); \ |
||
129 | \ |
||
7143 | serge | 130 | if (unlikely(__ret_warn_once && !__warned)) { \ |
131 | __warned = true; \ |
||
132 | WARN(1, format); \ |
||
133 | } \ |
||
6936 | serge | 134 | unlikely(__ret_warn_once); \ |
135 | }) |
||
136 | |||
137 | #define WARN_TAINT_ONCE(condition, taint, format...) ({ \ |
||
138 | static bool __section(.data.unlikely) __warned; \ |
||
139 | int __ret_warn_once = !!(condition); \ |
||
140 | \ |
||
7143 | serge | 141 | if (unlikely(__ret_warn_once && !__warned)) { \ |
142 | __warned = true; \ |
||
143 | WARN_TAINT(1, taint, format); \ |
||
144 | } \ |
||
6936 | serge | 145 | unlikely(__ret_warn_once); \ |
146 | }) |
||
147 | |||
148 | #else /* !CONFIG_BUG */ |
||
149 | #ifndef HAVE_ARCH_BUG |
||
150 | #define BUG() do {} while (1) |
||
151 | #endif |
||
152 | |||
153 | #ifndef HAVE_ARCH_BUG_ON |
||
7143 | serge | 154 | #define BUG_ON(condition) do { if (condition) BUG(); } while (0) |
6936 | serge | 155 | #endif |
156 | |||
157 | #ifndef HAVE_ARCH_WARN_ON |
||
158 | #define WARN_ON(condition) ({ \ |
||
159 | int __ret_warn_on = !!(condition); \ |
||
160 | unlikely(__ret_warn_on); \ |
||
161 | }) |
||
162 | #endif |
||
163 | |||
164 | #ifndef WARN |
||
165 | #define WARN(condition, format...) ({ \ |
||
166 | int __ret_warn_on = !!(condition); \ |
||
167 | no_printk(format); \ |
||
168 | unlikely(__ret_warn_on); \ |
||
169 | }) |
||
170 | #endif |
||
171 | |||
172 | #define WARN_ON_ONCE(condition) WARN_ON(condition) |
||
173 | #define WARN_ONCE(condition, format...) WARN(condition, format) |
||
174 | #define WARN_TAINT(condition, taint, format...) WARN(condition, format) |
||
175 | #define WARN_TAINT_ONCE(condition, taint, format...) WARN(condition, format) |
||
176 | |||
177 | #endif |
||
178 | |||
179 | /* |
||
180 | * WARN_ON_SMP() is for cases that the warning is either |
||
181 | * meaningless for !SMP or may even cause failures. |
||
182 | * This is usually used for cases that we have |
||
183 | * WARN_ON(!spin_is_locked(&lock)) checks, as spin_is_locked() |
||
184 | * returns 0 for uniprocessor settings. |
||
185 | * It can also be used with values that are only defined |
||
186 | * on SMP: |
||
187 | * |
||
188 | * struct foo { |
||
189 | * [...] |
||
190 | * #ifdef CONFIG_SMP |
||
191 | * int bar; |
||
192 | * #endif |
||
193 | * }; |
||
194 | * |
||
195 | * void func(struct foo *zoot) |
||
196 | * { |
||
197 | * WARN_ON_SMP(!zoot->bar); |
||
198 | * |
||
199 | * For CONFIG_SMP, WARN_ON_SMP() should act the same as WARN_ON(), |
||
200 | * and should be a nop and return false for uniprocessor. |
||
201 | * |
||
202 | * if (WARN_ON_SMP(x)) returns true only when CONFIG_SMP is set |
||
203 | * and x is true. |
||
204 | */ |
||
205 | #ifdef CONFIG_SMP |
||
206 | # define WARN_ON_SMP(x) WARN_ON(x) |
||
207 | #else |
||
208 | /* |
||
209 | * Use of ({0;}) because WARN_ON_SMP(x) may be used either as |
||
210 | * a stand alone line statement or as a condition in an if () |
||
211 | * statement. |
||
212 | * A simple "0" would cause gcc to give a "statement has no effect" |
||
213 | * warning. |
||
214 | */ |
||
215 | # define WARN_ON_SMP(x) ({0;}) |
||
216 | #endif |
||
217 | |||
218 | #endif /* __ASSEMBLY__ */ |
||
219 | |||
220 | #endif><>><> |