1
#ifndef _ASM_GENERIC_BUG_H
2
#define _ASM_GENERIC_BUG_H
4
#include <linux/compiler.h>
8
#ifdef CONFIG_GENERIC_BUG
11
#ifndef CONFIG_GENERIC_BUG_RELATIVE_POINTERS
12
unsigned long bug_addr;
14
signed int bug_addr_disp;
16
#ifdef CONFIG_DEBUG_BUGVERBOSE
17
#ifndef CONFIG_GENERIC_BUG_RELATIVE_POINTERS
26
#endif /* __ASSEMBLY__ */
28
#define BUGFLAG_WARNING (1 << 0)
29
#define BUGFLAG_TAINT(taint) (BUGFLAG_WARNING | ((taint) << 8))
30
#define BUG_GET_TAINT(bug) ((bug)->flags >> 8)
32
#endif /* CONFIG_GENERIC_BUG */
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.
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.
47
printk("BUG: failure at %s:%d/%s()!\n", __FILE__, __LINE__, __func__); \
52
#ifndef HAVE_ARCH_BUG_ON
53
#define BUG_ON(condition) do { if (unlikely(condition)) BUG(); } while(0)
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.
65
void warn_slowpath_fmt(const char *file, const int line,
66
const char *fmt, ...);
68
void warn_slowpath_fmt_taint(const char *file, const int line, unsigned taint,
69
const char *fmt, ...);
70
extern void warn_slowpath_null(const char *file, const int line);
71
#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)
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)
85
#define WARN_ON(condition) ({ \
86
int __ret_warn_on = !!(condition); \
87
if (unlikely(__ret_warn_on)) \
89
unlikely(__ret_warn_on); \
94
#define WARN(condition, format...) ({ \
95
int __ret_warn_on = !!(condition); \
96
if (unlikely(__ret_warn_on)) \
97
__WARN_printf(format); \
98
unlikely(__ret_warn_on); \
102
#define WARN_TAINT(condition, taint, format...) ({ \
103
int __ret_warn_on = !!(condition); \
104
if (unlikely(__ret_warn_on)) \
105
__WARN_printf_taint(taint, format); \
106
unlikely(__ret_warn_on); \
109
#else /* !CONFIG_BUG */
110
#ifndef HAVE_ARCH_BUG
111
#define BUG() do {} while(0)
114
#ifndef HAVE_ARCH_BUG_ON
115
#define BUG_ON(condition) do { if (condition) ; } while(0)
118
#ifndef HAVE_ARCH_WARN_ON
119
#define WARN_ON(condition) ({ \
120
int __ret_warn_on = !!(condition); \
121
unlikely(__ret_warn_on); \
126
#define WARN(condition, format...) ({ \
127
int __ret_warn_on = !!(condition); \
128
unlikely(__ret_warn_on); \
132
#define WARN_TAINT(condition, taint, format...) WARN_ON(condition)
136
#define WARN_ON_ONCE(condition) ({ \
137
static bool __warned; \
138
int __ret_warn_once = !!(condition); \
140
if (unlikely(__ret_warn_once)) \
141
if (WARN_ON(!__warned)) \
143
unlikely(__ret_warn_once); \
146
#define WARN_ONCE(condition, format...) ({ \
147
static bool __warned; \
148
int __ret_warn_once = !!(condition); \
150
if (unlikely(__ret_warn_once)) \
151
if (WARN(!__warned, format)) \
153
unlikely(__ret_warn_once); \
156
#define WARN_TAINT_ONCE(condition, taint, format...) ({ \
157
static bool __warned; \
158
int __ret_warn_once = !!(condition); \
160
if (unlikely(__ret_warn_once)) \
161
if (WARN_TAINT(!__warned, taint, format)) \
163
unlikely(__ret_warn_once); \
167
* WARN_ON_SMP() is for cases that the warning is either
168
* meaningless for !SMP or may even cause failures.
169
* This is usually used for cases that we have
170
* WARN_ON(!spin_is_locked(&lock)) checks, as spin_is_locked()
171
* returns 0 for uniprocessor settings.
172
* It can also be used with values that are only defined
182
* void func(struct foo *zoot)
184
* WARN_ON_SMP(!zoot->bar);
186
* For CONFIG_SMP, WARN_ON_SMP() should act the same as WARN_ON(),
187
* and should be a nop and return false for uniprocessor.
189
* if (WARN_ON_SMP(x)) returns true only when CONFIG_SMP is set
193
# define WARN_ON_SMP(x) WARN_ON(x)
196
* Use of ({0;}) because WARN_ON_SMP(x) may be used either as
197
* a stand alone line statement or as a condition in an if ()
199
* A simple "0" would cause gcc to give a "statement has no effect"
202
# define WARN_ON_SMP(x) ({0;})