Blame view
include/asm-generic/bug.h
4.65 KB
1da177e4c
|
1 2 3 4 |
#ifndef _ASM_GENERIC_BUG_H #define _ASM_GENERIC_BUG_H #include <linux/compiler.h> |
1da177e4c
|
5 |
|
c8538a7aa
|
6 |
#ifdef CONFIG_BUG |
7664c5a1d
|
7 8 9 10 |
#ifdef CONFIG_GENERIC_BUG #ifndef __ASSEMBLY__ struct bug_entry { |
b93a531e3
|
11 |
#ifndef CONFIG_GENERIC_BUG_RELATIVE_POINTERS |
7664c5a1d
|
12 |
unsigned long bug_addr; |
b93a531e3
|
13 14 15 |
#else signed int bug_addr_disp; #endif |
7664c5a1d
|
16 |
#ifdef CONFIG_DEBUG_BUGVERBOSE |
b93a531e3
|
17 |
#ifndef CONFIG_GENERIC_BUG_RELATIVE_POINTERS |
7664c5a1d
|
18 |
const char *file; |
b93a531e3
|
19 20 21 |
#else signed int file_disp; #endif |
7664c5a1d
|
22 23 24 25 26 |
unsigned short line; #endif unsigned short flags; }; #endif /* __ASSEMBLY__ */ |
b2be05273
|
27 28 29 |
#define BUGFLAG_WARNING (1 << 0) #define BUGFLAG_TAINT(taint) (BUGFLAG_WARNING | ((taint) << 8)) #define BUG_GET_TAINT(bug) ((bug)->flags >> 8) |
7664c5a1d
|
30 |
#endif /* CONFIG_GENERIC_BUG */ |
af9379c71
|
31 32 33 34 35 36 37 38 39 40 41 |
/* * Don't use BUG() or BUG_ON() unless there's really no way out; one * example might be detecting data structure corruption in the middle * of an operation that can't be backed out of. If the (sub)system * can somehow continue operating, perhaps with reduced functionality, * it's probably not BUG-worthy. * * If you're tempted to BUG(), think again: is completely giving up * really the *only* solution? There are usually better options, where * users don't need to reboot ASAP and can mostly shut down cleanly. */ |
1da177e4c
|
42 43 |
#ifndef HAVE_ARCH_BUG #define BUG() do { \ |
d5c003b4d
|
44 45 |
printk("BUG: failure at %s:%d/%s()! ", __FILE__, __LINE__, __func__); \ |
1da177e4c
|
46 47 48 |
panic("BUG!"); \ } while (0) #endif |
1da177e4c
|
49 |
#ifndef HAVE_ARCH_BUG_ON |
2a41de48b
|
50 |
#define BUG_ON(condition) do { if (unlikely(condition)) BUG(); } while(0) |
1da177e4c
|
51 |
#endif |
af9379c71
|
52 53 54 55 56 57 |
/* * WARN(), WARN_ON(), WARN_ON_ONCE, and so on can be used to report * significant issues that need prompt attention if they should ever * appear at runtime. Use the versions with printk format strings * to provide better diagnostics. */ |
b2be05273
|
58 |
#ifndef __WARN_TAINT |
79b4cc5ee
|
59 |
#ifndef __ASSEMBLY__ |
57adc4d2d
|
60 |
extern void warn_slowpath_fmt(const char *file, const int line, |
a8f18b909
|
61 |
const char *fmt, ...) __attribute__((format(printf, 3, 4))); |
b2be05273
|
62 63 64 |
extern void warn_slowpath_fmt_taint(const char *file, const int line, unsigned taint, const char *fmt, ...) __attribute__((format(printf, 4, 5))); |
57adc4d2d
|
65 |
extern void warn_slowpath_null(const char *file, const int line); |
79b4cc5ee
|
66 67 |
#define WANT_WARN_ON_SLOWPATH #endif |
57adc4d2d
|
68 69 |
#define __WARN() warn_slowpath_null(__FILE__, __LINE__) #define __WARN_printf(arg...) warn_slowpath_fmt(__FILE__, __LINE__, arg) |
b2be05273
|
70 71 |
#define __WARN_printf_taint(taint, arg...) \ warn_slowpath_fmt_taint(__FILE__, __LINE__, taint, arg) |
a8f18b909
|
72 |
#else |
b2be05273
|
73 |
#define __WARN() __WARN_TAINT(TAINT_WARN) |
ec5679e51
|
74 |
#define __WARN_printf(arg...) do { printk(arg); __WARN(); } while (0) |
b2be05273
|
75 76 |
#define __WARN_printf_taint(taint, arg...) \ do { printk(arg); __WARN_TAINT(taint); } while (0) |
3a6a62f96
|
77 78 79 |
#endif #ifndef WARN_ON |
684f97834
|
80 |
#define WARN_ON(condition) ({ \ |
8d4fbcfbe
|
81 |
int __ret_warn_on = !!(condition); \ |
3a6a62f96
|
82 83 |
if (unlikely(__ret_warn_on)) \ __WARN(); \ |
684f97834
|
84 85 |
unlikely(__ret_warn_on); \ }) |
1da177e4c
|
86 |
#endif |
a8f18b909
|
87 88 89 90 91 92 93 94 |
#ifndef WARN #define WARN(condition, format...) ({ \ int __ret_warn_on = !!(condition); \ if (unlikely(__ret_warn_on)) \ __WARN_printf(format); \ unlikely(__ret_warn_on); \ }) #endif |
b2be05273
|
95 96 97 98 99 100 |
#define WARN_TAINT(condition, taint, format...) ({ \ int __ret_warn_on = !!(condition); \ if (unlikely(__ret_warn_on)) \ __WARN_printf_taint(taint, format); \ unlikely(__ret_warn_on); \ }) |
c8538a7aa
|
101 102 |
#else /* !CONFIG_BUG */ #ifndef HAVE_ARCH_BUG |
da60682c1
|
103 |
#define BUG() do {} while(0) |
c8538a7aa
|
104 |
#endif |
c8538a7aa
|
105 106 107 108 109 |
#ifndef HAVE_ARCH_BUG_ON #define BUG_ON(condition) do { if (condition) ; } while(0) #endif #ifndef HAVE_ARCH_WARN_ON |
8c7c7c9bf
|
110 |
#define WARN_ON(condition) ({ \ |
8d4fbcfbe
|
111 |
int __ret_warn_on = !!(condition); \ |
8c7c7c9bf
|
112 113 |
unlikely(__ret_warn_on); \ }) |
c8538a7aa
|
114 |
#endif |
a8f18b909
|
115 116 117 118 119 120 121 |
#ifndef WARN #define WARN(condition, format...) ({ \ int __ret_warn_on = !!(condition); \ unlikely(__ret_warn_on); \ }) #endif |
b2be05273
|
122 |
#define WARN_TAINT(condition, taint, format...) WARN_ON(condition) |
c8538a7aa
|
123 |
#endif |
d69a89226
|
124 |
#define WARN_ON_ONCE(condition) ({ \ |
42f247c83
|
125 |
static bool __warned; \ |
8d4fbcfbe
|
126 |
int __ret_warn_once = !!(condition); \ |
d69a89226
|
127 128 129 |
\ if (unlikely(__ret_warn_once)) \ if (WARN_ON(!__warned)) \ |
42f247c83
|
130 |
__warned = true; \ |
d69a89226
|
131 |
unlikely(__ret_warn_once); \ |
74bb6a09b
|
132 |
}) |
45e9c0de2
|
133 |
#define WARN_ONCE(condition, format...) ({ \ |
42f247c83
|
134 |
static bool __warned; \ |
45e9c0de2
|
135 136 137 138 |
int __ret_warn_once = !!(condition); \ \ if (unlikely(__ret_warn_once)) \ if (WARN(!__warned, format)) \ |
42f247c83
|
139 |
__warned = true; \ |
45e9c0de2
|
140 141 |
unlikely(__ret_warn_once); \ }) |
b2be05273
|
142 143 144 145 146 147 148 149 150 |
#define WARN_TAINT_ONCE(condition, taint, format...) ({ \ static bool __warned; \ int __ret_warn_once = !!(condition); \ \ if (unlikely(__ret_warn_once)) \ if (WARN_TAINT(!__warned, taint, format)) \ __warned = true; \ unlikely(__ret_warn_once); \ }) |
717115e1a
|
151 152 |
#define WARN_ON_RATELIMIT(condition, state) \ WARN_ON((condition) && __ratelimit(state)) |
8eb94f80d
|
153 154 155 156 157 |
#ifdef CONFIG_SMP # define WARN_ON_SMP(x) WARN_ON(x) #else # define WARN_ON_SMP(x) do { } while (0) #endif |
1da177e4c
|
158 |
#endif |