6 #ifdef CONFIG_BUG |
6 #ifdef CONFIG_BUG |
7 |
7 |
8 #ifdef CONFIG_GENERIC_BUG |
8 #ifdef CONFIG_GENERIC_BUG |
9 #ifndef __ASSEMBLY__ |
9 #ifndef __ASSEMBLY__ |
10 struct bug_entry { |
10 struct bug_entry { |
|
11 #ifndef CONFIG_GENERIC_BUG_RELATIVE_POINTERS |
11 unsigned long bug_addr; |
12 unsigned long bug_addr; |
|
13 #else |
|
14 signed int bug_addr_disp; |
|
15 #endif |
12 #ifdef CONFIG_DEBUG_BUGVERBOSE |
16 #ifdef CONFIG_DEBUG_BUGVERBOSE |
|
17 #ifndef CONFIG_GENERIC_BUG_RELATIVE_POINTERS |
13 const char *file; |
18 const char *file; |
|
19 #else |
|
20 signed int file_disp; |
|
21 #endif |
14 unsigned short line; |
22 unsigned short line; |
15 #endif |
23 #endif |
16 unsigned short flags; |
24 unsigned short flags; |
17 }; |
25 }; |
18 #endif /* __ASSEMBLY__ */ |
26 #endif /* __ASSEMBLY__ */ |
19 |
27 |
20 #define BUGFLAG_WARNING (1<<0) |
28 #define BUGFLAG_WARNING (1<<0) |
21 #endif /* CONFIG_GENERIC_BUG */ |
29 #endif /* CONFIG_GENERIC_BUG */ |
22 |
30 |
|
31 /* |
|
32 * Don't use BUG() or BUG_ON() unless there's really no way out; one |
|
33 * example might be detecting data structure corruption in the middle |
|
34 * of an operation that can't be backed out of. If the (sub)system |
|
35 * can somehow continue operating, perhaps with reduced functionality, |
|
36 * it's probably not BUG-worthy. |
|
37 * |
|
38 * If you're tempted to BUG(), think again: is completely giving up |
|
39 * really the *only* solution? There are usually better options, where |
|
40 * users don't need to reboot ASAP and can mostly shut down cleanly. |
|
41 */ |
23 #ifndef HAVE_ARCH_BUG |
42 #ifndef HAVE_ARCH_BUG |
24 #define BUG() do { \ |
43 #define BUG() do { \ |
25 printk("BUG: failure at %s:%d/%s()!\n", __FILE__, __LINE__, __func__); \ |
44 printk("BUG: failure at %s:%d/%s()!\n", __FILE__, __LINE__, __func__); \ |
26 panic("BUG!"); \ |
45 panic("BUG!"); \ |
27 } while (0) |
46 } while (0) |
29 |
48 |
30 #ifndef HAVE_ARCH_BUG_ON |
49 #ifndef HAVE_ARCH_BUG_ON |
31 #define BUG_ON(condition) do { if (unlikely(condition)) BUG(); } while(0) |
50 #define BUG_ON(condition) do { if (unlikely(condition)) BUG(); } while(0) |
32 #endif |
51 #endif |
33 |
52 |
|
53 /* |
|
54 * WARN(), WARN_ON(), WARN_ON_ONCE, and so on can be used to report |
|
55 * significant issues that need prompt attention if they should ever |
|
56 * appear at runtime. Use the versions with printk format strings |
|
57 * to provide better diagnostics. |
|
58 */ |
34 #ifndef __WARN |
59 #ifndef __WARN |
35 #ifndef __ASSEMBLY__ |
60 #ifndef __ASSEMBLY__ |
36 extern void warn_on_slowpath(const char *file, const int line); |
|
37 extern void warn_slowpath(const char *file, const int line, |
61 extern void warn_slowpath(const char *file, const int line, |
38 const char *fmt, ...) __attribute__((format(printf, 3, 4))); |
62 const char *fmt, ...) __attribute__((format(printf, 3, 4))); |
39 #define WANT_WARN_ON_SLOWPATH |
63 #define WANT_WARN_ON_SLOWPATH |
40 #endif |
64 #endif |
41 #define __WARN() warn_on_slowpath(__FILE__, __LINE__) |
65 #define __WARN() warn_slowpath(__FILE__, __LINE__, NULL) |
42 #define __WARN_printf(arg...) warn_slowpath(__FILE__, __LINE__, arg) |
66 #define __WARN_printf(arg...) warn_slowpath(__FILE__, __LINE__, arg) |
43 #else |
67 #else |
44 #define __WARN_printf(arg...) do { printk(arg); __WARN(); } while (0) |
68 #define __WARN_printf(arg...) do { printk(arg); __WARN(); } while (0) |
45 #endif |
69 #endif |
46 |
70 |
47 #ifndef WARN_ON |
71 #ifndef WARN_ON |
48 #define WARN_ON(condition) ({ \ |
72 #define WARN_ON(condition) ({ \ |
49 int __ret_warn_on = !!(condition); \ |
73 int __ret_warn_on = !!(condition); \ |