Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

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