bug.h 2.6 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3 4 5
#ifndef _ASM_GENERIC_BUG_H
#define _ASM_GENERIC_BUG_H

#include <linux/compiler.h>

M
Matt Mackall 已提交
6
#ifdef CONFIG_BUG
7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22

#ifdef CONFIG_GENERIC_BUG
#ifndef __ASSEMBLY__
struct bug_entry {
	unsigned long	bug_addr;
#ifdef CONFIG_DEBUG_BUGVERBOSE
	const char	*file;
	unsigned short	line;
#endif
	unsigned short	flags;
};
#endif		/* __ASSEMBLY__ */

#define BUGFLAG_WARNING	(1<<0)
#endif	/* CONFIG_GENERIC_BUG */

L
Linus Torvalds 已提交
23 24
#ifndef HAVE_ARCH_BUG
#define BUG() do { \
25
	printk("BUG: failure at %s:%d/%s()!\n", __FILE__, __LINE__, __FUNCTION__); \
L
Linus Torvalds 已提交
26 27 28 29 30
	panic("BUG!"); \
} while (0)
#endif

#ifndef HAVE_ARCH_BUG_ON
31
#define BUG_ON(condition) do { if (unlikely(condition)) BUG(); } while(0)
L
Linus Torvalds 已提交
32 33
#endif

O
Olof Johansson 已提交
34
#ifndef __WARN
35 36
#ifndef __ASSEMBLY__
extern void warn_on_slowpath(const char *file, const int line);
37 38
extern void warn_slowpath(const char *file, const int line,
		const char *fmt, ...) __attribute__((format(printf, 3, 4)));
39 40 41
#define WANT_WARN_ON_SLOWPATH
#endif
#define __WARN() warn_on_slowpath(__FILE__, __LINE__)
42 43 44
#define __WARN_printf(arg...) warn_slowpath(__FILE__, __LINE__, arg)
#else
#define __WARN_printf(arg...) __WARN()
O
Olof Johansson 已提交
45 46 47
#endif

#ifndef WARN_ON
48
#define WARN_ON(condition) ({						\
L
Linus Torvalds 已提交
49
	int __ret_warn_on = !!(condition);				\
O
Olof Johansson 已提交
50 51
	if (unlikely(__ret_warn_on))					\
		__WARN();						\
52 53
	unlikely(__ret_warn_on);					\
})
L
Linus Torvalds 已提交
54 55
#endif

56 57 58 59 60 61 62 63 64
#ifndef WARN
#define WARN(condition, format...) ({						\
	int __ret_warn_on = !!(condition);				\
	if (unlikely(__ret_warn_on))					\
		__WARN_printf(format);					\
	unlikely(__ret_warn_on);					\
})
#endif

M
Matt Mackall 已提交
65 66 67 68 69 70 71 72 73 74
#else /* !CONFIG_BUG */
#ifndef HAVE_ARCH_BUG
#define BUG()
#endif

#ifndef HAVE_ARCH_BUG_ON
#define BUG_ON(condition) do { if (condition) ; } while(0)
#endif

#ifndef HAVE_ARCH_WARN_ON
75
#define WARN_ON(condition) ({						\
L
Linus Torvalds 已提交
76
	int __ret_warn_on = !!(condition);				\
77 78
	unlikely(__ret_warn_on);					\
})
M
Matt Mackall 已提交
79
#endif
80 81 82 83 84 85 86 87

#ifndef WARN
#define WARN(condition, format...) ({					\
	int __ret_warn_on = !!(condition);				\
	unlikely(__ret_warn_on);					\
})
#endif

M
Matt Mackall 已提交
88 89
#endif

90 91
#define WARN_ON_ONCE(condition)	({				\
	static int __warned;					\
L
Linus Torvalds 已提交
92
	int __ret_warn_once = !!(condition);			\
93 94 95 96 97
								\
	if (unlikely(__ret_warn_once))				\
		if (WARN_ON(!__warned)) 			\
			__warned = 1;				\
	unlikely(__ret_warn_once);				\
98 99
})

100 101 102 103 104 105 106 107 108 109
#define WARN_ONCE(condition, format...)	({			\
	static int __warned;					\
	int __ret_warn_once = !!(condition);			\
								\
	if (unlikely(__ret_warn_once))				\
		if (WARN(!__warned, format)) 			\
			__warned = 1;				\
	unlikely(__ret_warn_once);				\
})

D
Dave Young 已提交
110 111 112
#define WARN_ON_RATELIMIT(condition, state)			\
		WARN_ON((condition) && __ratelimit(state))

113 114 115 116 117 118
#ifdef CONFIG_SMP
# define WARN_ON_SMP(x)			WARN_ON(x)
#else
# define WARN_ON_SMP(x)			do { } while (0)
#endif

L
Linus Torvalds 已提交
119
#endif