Merge tag 'perf-tools-for-v6.4-3-2023-05-06' of git://git.kernel.org/pub/scm/linux...
[linux-block.git] / include / asm-generic / bug.h
CommitLineData
b2441318 1/* SPDX-License-Identifier: GPL-2.0 */
1da177e4
LT
2#ifndef _ASM_GENERIC_BUG_H
3#define _ASM_GENERIC_BUG_H
4
5#include <linux/compiler.h>
d19e789f 6#include <linux/instrumentation.h>
a358f406 7#include <linux/once_lite.h>
1da177e4 8
2a8358d8
KC
9#define CUT_HERE "------------[ cut here ]------------\n"
10
09682c1d
PM
11#ifdef CONFIG_GENERIC_BUG
12#define BUGFLAG_WARNING (1 << 0)
19d43626
PZ
13#define BUGFLAG_ONCE (1 << 1)
14#define BUGFLAG_DONE (1 << 2)
a44f71a9 15#define BUGFLAG_NO_CUT_HERE (1 << 3) /* CUT_HERE already sent */
f26dee15 16#define BUGFLAG_TAINT(taint) ((taint) << 8)
09682c1d
PM
17#define BUG_GET_TAINT(bug) ((bug)->flags >> 8)
18#endif
19
20#ifndef __ASSEMBLY__
f39650de
AS
21#include <linux/panic.h>
22#include <linux/printk.h>
09682c1d 23
1fa568e2
SZ
24struct warn_args;
25struct pt_regs;
26
27void __warn(const char *file, int line, void *caller, unsigned taint,
28 struct pt_regs *regs, struct warn_args *args);
29
ffb61c63
IM
30#ifdef CONFIG_BUG
31
f81f8ad5 32#ifdef CONFIG_GENERIC_BUG
ffb61c63 33struct bug_entry {
b93a531e 34#ifndef CONFIG_GENERIC_BUG_RELATIVE_POINTERS
7664c5a1 35 unsigned long bug_addr;
b93a531e
JB
36#else
37 signed int bug_addr_disp;
38#endif
7664c5a1 39#ifdef CONFIG_DEBUG_BUGVERBOSE
b93a531e 40#ifndef CONFIG_GENERIC_BUG_RELATIVE_POINTERS
7664c5a1 41 const char *file;
b93a531e
JB
42#else
43 signed int file_disp;
44#endif
7664c5a1
JF
45 unsigned short line;
46#endif
47 unsigned short flags;
f81f8ad5 48};
ffb61c63 49#endif /* CONFIG_GENERIC_BUG */
7664c5a1 50
af9379c7
DB
51/*
52 * Don't use BUG() or BUG_ON() unless there's really no way out; one
53 * example might be detecting data structure corruption in the middle
54 * of an operation that can't be backed out of. If the (sub)system
55 * can somehow continue operating, perhaps with reduced functionality,
56 * it's probably not BUG-worthy.
57 *
58 * If you're tempted to BUG(), think again: is completely giving up
59 * really the *only* solution? There are usually better options, where
60 * users don't need to reboot ASAP and can mostly shut down cleanly.
61 */
1da177e4
LT
62#ifndef HAVE_ARCH_BUG
63#define BUG() do { \
d5c003b4 64 printk("BUG: failure at %s:%d/%s()!\n", __FILE__, __LINE__, __func__); \
173a3efd 65 barrier_before_unreachable(); \
1da177e4
LT
66 panic("BUG!"); \
67} while (0)
68#endif
69
1da177e4 70#ifndef HAVE_ARCH_BUG_ON
a3f7607d 71#define BUG_ON(condition) do { if (unlikely(condition)) BUG(); } while (0)
1da177e4
LT
72#endif
73
af9379c7
DB
74/*
75 * WARN(), WARN_ON(), WARN_ON_ONCE, and so on can be used to report
96c6a32c
DV
76 * significant kernel issues that need prompt attention if they should ever
77 * appear at runtime.
78 *
79 * Do not use these macros when checking for invalid external inputs
80 * (e.g. invalid system call arguments, or invalid data coming from
81 * network/devices), and on transient conditions like ENOMEM or EAGAIN.
82 * These macros should be used for recoverable kernel issues only.
83 * For invalid external inputs, transient conditions, etc use
84 * pr_err[_once/_ratelimited]() followed by dump_stack(), if necessary.
85 * Do not include "BUG"/"WARNING" in format strings manually to make these
86 * conditions distinguishable from kernel issues.
87 *
88 * Use the versions with printk format strings to provide better diagnostics.
af9379c7 89 */
d4bce140 90#ifndef __WARN_FLAGS
b9075fa9 91extern __printf(4, 5)
ee871133
KC
92void warn_slowpath_fmt(const char *file, const int line, unsigned taint,
93 const char *fmt, ...);
f2f84b05 94#define __WARN() __WARN_printf(TAINT_WARN, NULL)
5916d5f9
TG
95#define __WARN_printf(taint, arg...) do { \
96 instrumentation_begin(); \
97 warn_slowpath_fmt(__FILE__, __LINE__, taint, arg); \
98 instrumentation_end(); \
99 } while (0)
a8f18b90 100#else
a7bed27a 101extern __printf(1, 2) void __warn_printk(const char *fmt, ...);
a44f71a9 102#define __WARN() __WARN_FLAGS(BUGFLAG_TAINT(TAINT_WARN))
d4bce140 103#define __WARN_printf(taint, arg...) do { \
5916d5f9 104 instrumentation_begin(); \
d4bce140 105 __warn_printk(arg); \
a44f71a9 106 __WARN_FLAGS(BUGFLAG_NO_CUT_HERE | BUGFLAG_TAINT(taint));\
5916d5f9 107 instrumentation_end(); \
d4bce140 108 } while (0)
2da1ead4
KC
109#define WARN_ON_ONCE(condition) ({ \
110 int __ret_warn_on = !!(condition); \
111 if (unlikely(__ret_warn_on)) \
112 __WARN_FLAGS(BUGFLAG_ONCE | \
113 BUGFLAG_TAINT(TAINT_WARN)); \
114 unlikely(__ret_warn_on); \
115})
3a6a62f9
OJ
116#endif
117
2553b67a 118/* used internally by panic.c */
2553b67a 119
3a6a62f9 120#ifndef WARN_ON
684f9783 121#define WARN_ON(condition) ({ \
8d4fbcfb 122 int __ret_warn_on = !!(condition); \
3a6a62f9
OJ
123 if (unlikely(__ret_warn_on)) \
124 __WARN(); \
684f9783
HX
125 unlikely(__ret_warn_on); \
126})
1da177e4
LT
127#endif
128
a8f18b90 129#ifndef WARN
19d43626 130#define WARN(condition, format...) ({ \
a8f18b90
AV
131 int __ret_warn_on = !!(condition); \
132 if (unlikely(__ret_warn_on)) \
89348fc3 133 __WARN_printf(TAINT_WARN, format); \
a8f18b90
AV
134 unlikely(__ret_warn_on); \
135})
136#endif
137
b2be0527
BH
138#define WARN_TAINT(condition, taint, format...) ({ \
139 int __ret_warn_on = !!(condition); \
140 if (unlikely(__ret_warn_on)) \
89348fc3 141 __WARN_printf(taint, format); \
b2be0527
BH
142 unlikely(__ret_warn_on); \
143})
144
19d43626 145#ifndef WARN_ON_ONCE
a358f406
TL
146#define WARN_ON_ONCE(condition) \
147 DO_ONCE_LITE_IF(condition, WARN_ON, 1)
19d43626 148#endif
74bb6a09 149
a358f406
TL
150#define WARN_ONCE(condition, format...) \
151 DO_ONCE_LITE_IF(condition, WARN, 1, format)
45e9c0de 152
a358f406
TL
153#define WARN_TAINT_ONCE(condition, taint, format...) \
154 DO_ONCE_LITE_IF(condition, WARN_TAINT, 1, taint, format)
b2be0527 155
b607e70e
JT
156#else /* !CONFIG_BUG */
157#ifndef HAVE_ARCH_BUG
a4b5d580 158#define BUG() do {} while (1)
b607e70e
JT
159#endif
160
161#ifndef HAVE_ARCH_BUG_ON
9b87647c 162#define BUG_ON(condition) do { if (unlikely(condition)) BUG(); } while (0)
b607e70e
JT
163#endif
164
165#ifndef HAVE_ARCH_WARN_ON
166#define WARN_ON(condition) ({ \
167 int __ret_warn_on = !!(condition); \
168 unlikely(__ret_warn_on); \
169})
170#endif
171
172#ifndef WARN
173#define WARN(condition, format...) ({ \
174 int __ret_warn_on = !!(condition); \
4e50ebde 175 no_printk(format); \
b607e70e
JT
176 unlikely(__ret_warn_on); \
177})
178#endif
179
180#define WARN_ON_ONCE(condition) WARN_ON(condition)
181#define WARN_ONCE(condition, format...) WARN(condition, format)
182#define WARN_TAINT(condition, taint, format...) WARN(condition, format)
183#define WARN_TAINT_ONCE(condition, taint, format...) WARN(condition, format)
184
185#endif
186
2092e6be
SR
187/*
188 * WARN_ON_SMP() is for cases that the warning is either
189 * meaningless for !SMP or may even cause failures.
2092e6be
SR
190 * It can also be used with values that are only defined
191 * on SMP:
192 *
193 * struct foo {
194 * [...]
195 * #ifdef CONFIG_SMP
196 * int bar;
197 * #endif
198 * };
199 *
200 * void func(struct foo *zoot)
201 * {
202 * WARN_ON_SMP(!zoot->bar);
203 *
204 * For CONFIG_SMP, WARN_ON_SMP() should act the same as WARN_ON(),
205 * and should be a nop and return false for uniprocessor.
206 *
207 * if (WARN_ON_SMP(x)) returns true only when CONFIG_SMP is set
208 * and x is true.
209 */
8eb94f80
IM
210#ifdef CONFIG_SMP
211# define WARN_ON_SMP(x) WARN_ON(x)
212#else
ccd0d44f
SR
213/*
214 * Use of ({0;}) because WARN_ON_SMP(x) may be used either as
215 * a stand alone line statement or as a condition in an if ()
216 * statement.
217 * A simple "0" would cause gcc to give a "statement has no effect"
218 * warning.
219 */
2092e6be 220# define WARN_ON_SMP(x) ({0;})
8eb94f80
IM
221#endif
222
2603efa3
PM
223#endif /* __ASSEMBLY__ */
224
1da177e4 225#endif