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