xref: /linux/arch/loongarch/include/asm/bug.h (revision 0526b56cbc3c489642bd6a5fe4b718dea7ef0ee8)
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)					\
44 do {								\
45 	instrumentation_begin();				\
46 	__BUG_FLAGS(BUGFLAG_WARNING|(flags));			\
47 	instrumentation_end();					\
48 } while (0)
49 
50 #define BUG()							\
51 do {								\
52 	instrumentation_begin();				\
53 	__BUG_FLAGS(0);						\
54 	unreachable();						\
55 } while (0)
56 
57 #define HAVE_ARCH_BUG
58 
59 #include <asm-generic/bug.h>
60 
61 #endif /* __ASM_BUG_H */
62