1/* SPDX-License-Identifier: GPL-2.0 */
2#ifndef __ASM_BUG_H
3#define __ASM_BUG_H
4
5#include <asm/break.h>
6#include <linux/stringify.h>
7
8#ifndef CONFIG_DEBUG_BUGVERBOSE
9#define _BUGVERBOSE_LOCATION(file, line)
10#else
11#define __BUGVERBOSE_LOCATION(file, line)			\
12		.pushsection .rodata.str, "aMS", @progbits, 1;	\
13	10002:	.string file;					\
14		.popsection;					\
15								\
16		.long 10002b - .;				\
17		.short line;
18#define _BUGVERBOSE_LOCATION(file, line) __BUGVERBOSE_LOCATION(file, line)
19#endif
20
21#ifndef CONFIG_GENERIC_BUG
22#define __BUG_ENTRY(flags)
23#else
24#define __BUG_ENTRY(flags) 					\
25		.pushsection __bug_table, "aw";			\
26		.align 2;					\
27	10000:	.long 10001f - .;				\
28		_BUGVERBOSE_LOCATION(__FILE__, __LINE__)	\
29		.short flags; 					\
30		.popsection;					\
31	10001:
32#endif
33
34#define ASM_BUG_FLAGS(flags)					\
35	__BUG_ENTRY(flags)					\
36	break		BRK_BUG
37
38#define ASM_BUG()	ASM_BUG_FLAGS(0)
39
40#define __BUG_FLAGS(flags)					\
41	asm_inline volatile (__stringify(ASM_BUG_FLAGS(flags)));
42
43#define __WARN_FLAGS(flags)					\
44do {								\
45	instrumentation_begin();				\
46	__BUG_FLAGS(BUGFLAG_WARNING|(flags));			\
47	annotate_reachable();					\
48	instrumentation_end();					\
49} while (0)
50
51#define BUG()							\
52do {								\
53	instrumentation_begin();				\
54	__BUG_FLAGS(0);						\
55	unreachable();						\
56} while (0)
57
58#define HAVE_ARCH_BUG
59
60#include <asm-generic/bug.h>
61
62#endif /* __ASM_BUG_H */
63