xref: /openbmc/linux/include/asm-generic/bug.h (revision f15cbe6f1a4b4d9df59142fc8e4abb973302cf44)
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 #define WARN_ON_RATELIMIT(condition, state)			\
101 		WARN_ON((condition) && __ratelimit(state))
102 
103 #ifdef CONFIG_SMP
104 # define WARN_ON_SMP(x)			WARN_ON(x)
105 #else
106 # define WARN_ON_SMP(x)			do { } while (0)
107 #endif
108 
109 #endif
110