xref: /openbmc/linux/arch/loongarch/include/asm/bug.h (revision 2d2c3952)
10603839bSHuacai Chen /* SPDX-License-Identifier: GPL-2.0 */
20603839bSHuacai Chen #ifndef __ASM_BUG_H
30603839bSHuacai Chen #define __ASM_BUG_H
40603839bSHuacai Chen 
50603839bSHuacai Chen #include <asm/break.h>
6*2d2c3952SYouling Tang #include <linux/stringify.h>
70603839bSHuacai Chen 
8*2d2c3952SYouling Tang #ifndef CONFIG_DEBUG_BUGVERBOSE
9*2d2c3952SYouling Tang #define _BUGVERBOSE_LOCATION(file, line)
10*2d2c3952SYouling Tang #else
11*2d2c3952SYouling Tang #define __BUGVERBOSE_LOCATION(file, line)			\
12*2d2c3952SYouling Tang 		.pushsection .rodata.str, "aMS", @progbits, 1;	\
13*2d2c3952SYouling Tang 	10002:	.string file;					\
14*2d2c3952SYouling Tang 		.popsection;					\
15*2d2c3952SYouling Tang 								\
16*2d2c3952SYouling Tang 		.long 10002b - .;				\
17*2d2c3952SYouling Tang 		.short line;
18*2d2c3952SYouling Tang #define _BUGVERBOSE_LOCATION(file, line) __BUGVERBOSE_LOCATION(file, line)
19*2d2c3952SYouling Tang #endif
20*2d2c3952SYouling Tang 
21*2d2c3952SYouling Tang #ifndef CONFIG_GENERIC_BUG
22*2d2c3952SYouling Tang #define __BUG_ENTRY(flags)
23*2d2c3952SYouling Tang #else
24*2d2c3952SYouling Tang #define __BUG_ENTRY(flags) 					\
25*2d2c3952SYouling Tang 		.pushsection __bug_table, "aw";			\
26*2d2c3952SYouling Tang 		.align 2;					\
27*2d2c3952SYouling Tang 	10000:	.long 10001f - .;				\
28*2d2c3952SYouling Tang 		_BUGVERBOSE_LOCATION(__FILE__, __LINE__)	\
29*2d2c3952SYouling Tang 		.short flags; 					\
30*2d2c3952SYouling Tang 		.popsection;					\
31*2d2c3952SYouling Tang 	10001:
32*2d2c3952SYouling Tang #endif
33*2d2c3952SYouling Tang 
34*2d2c3952SYouling Tang #define ASM_BUG_FLAGS(flags)					\
35*2d2c3952SYouling Tang 	__BUG_ENTRY(flags)					\
36*2d2c3952SYouling Tang 	break		BRK_BUG
37*2d2c3952SYouling Tang 
38*2d2c3952SYouling Tang #define ASM_BUG()	ASM_BUG_FLAGS(0)
39*2d2c3952SYouling Tang 
40*2d2c3952SYouling Tang #define __BUG_FLAGS(flags)					\
41*2d2c3952SYouling Tang 	asm_inline volatile (__stringify(ASM_BUG_FLAGS(flags)));
42*2d2c3952SYouling Tang 
43*2d2c3952SYouling Tang #define __WARN_FLAGS(flags)					\
44*2d2c3952SYouling Tang do {								\
45*2d2c3952SYouling Tang 	instrumentation_begin();				\
46*2d2c3952SYouling Tang 	__BUG_FLAGS(BUGFLAG_WARNING|(flags));			\
47*2d2c3952SYouling Tang 	instrumentation_end();					\
48*2d2c3952SYouling Tang } while (0)
49*2d2c3952SYouling Tang 
50*2d2c3952SYouling Tang #define BUG()							\
51*2d2c3952SYouling Tang do {								\
52*2d2c3952SYouling Tang 	instrumentation_begin();				\
53*2d2c3952SYouling Tang 	__BUG_FLAGS(0);						\
54*2d2c3952SYouling Tang 	unreachable();						\
55*2d2c3952SYouling Tang } while (0)
560603839bSHuacai Chen 
570603839bSHuacai Chen #define HAVE_ARCH_BUG
580603839bSHuacai Chen 
590603839bSHuacai Chen #include <asm-generic/bug.h>
600603839bSHuacai Chen 
610603839bSHuacai Chen #endif /* __ASM_BUG_H */
62