Add a WARN() macro; this is WARN_ON() + printk arguments
[linux-3.10.git] / include / asm-generic / bug.h
1 #ifndef _ASM_GENERIC_BUG_H
2 #define _ASM_GENERIC_BUG_H
3
4 #include <linux/compiler.h>
5
6 #ifdef CONFIG_BUG
7
8 #ifdef CONFIG_GENERIC_BUG
9 #ifndef __ASSEMBLY__
10 struct bug_entry {
11         unsigned long   bug_addr;
12 #ifdef CONFIG_DEBUG_BUGVERBOSE
13         const char      *file;
14         unsigned short  line;
15 #endif
16         unsigned short  flags;
17 };
18 #endif          /* __ASSEMBLY__ */
19
20 #define BUGFLAG_WARNING (1<<0)
21 #endif  /* CONFIG_GENERIC_BUG */
22
23 #ifndef HAVE_ARCH_BUG
24 #define BUG() do { \
25         printk("BUG: failure at %s:%d/%s()!\n", __FILE__, __LINE__, __FUNCTION__); \
26         panic("BUG!"); \
27 } while (0)
28 #endif
29
30 #ifndef HAVE_ARCH_BUG_ON
31 #define BUG_ON(condition) do { if (unlikely(condition)) BUG(); } while(0)
32 #endif
33
34 #ifndef __WARN
35 #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,
38                 const char *fmt, ...) __attribute__((format(printf, 3, 4)));
39 #define WANT_WARN_ON_SLOWPATH
40 #endif
41 #define __WARN() warn_on_slowpath(__FILE__, __LINE__)
42 #define __WARN_printf(arg...) warn_slowpath(__FILE__, __LINE__, arg)
43 #else
44 #define __WARN_printf(arg...) __WARN()
45 #endif
46
47 #ifndef WARN_ON
48 #define WARN_ON(condition) ({                                           \
49         int __ret_warn_on = !!(condition);                              \
50         if (unlikely(__ret_warn_on))                                    \
51                 __WARN();                                               \
52         unlikely(__ret_warn_on);                                        \
53 })
54 #endif
55
56 #ifndef WARN
57 #define WARN(condition, format...) ({                                           \
58         int __ret_warn_on = !!(condition);                              \
59         if (unlikely(__ret_warn_on))                                    \
60                 __WARN_printf(format);                                  \
61         unlikely(__ret_warn_on);                                        \
62 })
63 #endif
64
65 #else /* !CONFIG_BUG */
66 #ifndef HAVE_ARCH_BUG
67 #define BUG()
68 #endif
69
70 #ifndef HAVE_ARCH_BUG_ON
71 #define BUG_ON(condition) do { if (condition) ; } while(0)
72 #endif
73
74 #ifndef HAVE_ARCH_WARN_ON
75 #define WARN_ON(condition) ({                                           \
76         int __ret_warn_on = !!(condition);                              \
77         unlikely(__ret_warn_on);                                        \
78 })
79 #endif
80
81 #ifndef WARN
82 #define WARN(condition, format...) ({                                   \
83         int __ret_warn_on = !!(condition);                              \
84         unlikely(__ret_warn_on);                                        \
85 })
86 #endif
87
88 #endif
89
90 #define WARN_ON_ONCE(condition) ({                              \
91         static int __warned;                                    \
92         int __ret_warn_once = !!(condition);                    \
93                                                                 \
94         if (unlikely(__ret_warn_once))                          \
95                 if (WARN_ON(!__warned))                         \
96                         __warned = 1;                           \
97         unlikely(__ret_warn_once);                              \
98 })
99
100 #ifdef CONFIG_SMP
101 # define WARN_ON_SMP(x)                 WARN_ON(x)
102 #else
103 # define WARN_ON_SMP(x)                 do { } while (0)
104 #endif
105
106 #endif