xref: /linux/arch/loongarch/include/asm/bug.h (revision cb8a2ef0)
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>
62d2c3952SYouling Tang #include <linux/stringify.h>
70603839bSHuacai Chen 
82d2c3952SYouling Tang #ifndef CONFIG_DEBUG_BUGVERBOSE
92d2c3952SYouling Tang #define _BUGVERBOSE_LOCATION(file, line)
102d2c3952SYouling Tang #else
112d2c3952SYouling Tang #define __BUGVERBOSE_LOCATION(file, line)			\
122d2c3952SYouling Tang 		.pushsection .rodata.str, "aMS", @progbits, 1;	\
132d2c3952SYouling Tang 	10002:	.string file;					\
142d2c3952SYouling Tang 		.popsection;					\
152d2c3952SYouling Tang 								\
162d2c3952SYouling Tang 		.long 10002b - .;				\
172d2c3952SYouling Tang 		.short line;
182d2c3952SYouling Tang #define _BUGVERBOSE_LOCATION(file, line) __BUGVERBOSE_LOCATION(file, line)
192d2c3952SYouling Tang #endif
202d2c3952SYouling Tang 
212d2c3952SYouling Tang #ifndef CONFIG_GENERIC_BUG
222d2c3952SYouling Tang #define __BUG_ENTRY(flags)
232d2c3952SYouling Tang #else
242d2c3952SYouling Tang #define __BUG_ENTRY(flags) 					\
252d2c3952SYouling Tang 		.pushsection __bug_table, "aw";			\
262d2c3952SYouling Tang 		.align 2;					\
272d2c3952SYouling Tang 	10000:	.long 10001f - .;				\
282d2c3952SYouling Tang 		_BUGVERBOSE_LOCATION(__FILE__, __LINE__)	\
292d2c3952SYouling Tang 		.short flags; 					\
302d2c3952SYouling Tang 		.popsection;					\
312d2c3952SYouling Tang 	10001:
322d2c3952SYouling Tang #endif
332d2c3952SYouling Tang 
342d2c3952SYouling Tang #define ASM_BUG_FLAGS(flags)					\
352d2c3952SYouling Tang 	__BUG_ENTRY(flags)					\
362d2c3952SYouling Tang 	break		BRK_BUG
372d2c3952SYouling Tang 
382d2c3952SYouling Tang #define ASM_BUG()	ASM_BUG_FLAGS(0)
392d2c3952SYouling Tang 
402d2c3952SYouling Tang #define __BUG_FLAGS(flags)					\
412d2c3952SYouling Tang 	asm_inline volatile (__stringify(ASM_BUG_FLAGS(flags)));
422d2c3952SYouling Tang 
432d2c3952SYouling Tang #define __WARN_FLAGS(flags)					\
442d2c3952SYouling Tang do {								\
452d2c3952SYouling Tang 	instrumentation_begin();				\
462d2c3952SYouling Tang 	__BUG_FLAGS(BUGFLAG_WARNING|(flags));			\
47*cb8a2ef0STiezhu Yang 	annotate_reachable();					\
482d2c3952SYouling Tang 	instrumentation_end();					\
492d2c3952SYouling Tang } while (0)
502d2c3952SYouling Tang 
512d2c3952SYouling Tang #define BUG()							\
522d2c3952SYouling Tang do {								\
532d2c3952SYouling Tang 	instrumentation_begin();				\
542d2c3952SYouling Tang 	__BUG_FLAGS(0);						\
552d2c3952SYouling Tang 	unreachable();						\
562d2c3952SYouling Tang } while (0)
570603839bSHuacai Chen 
580603839bSHuacai Chen #define HAVE_ARCH_BUG
590603839bSHuacai Chen 
600603839bSHuacai Chen #include <asm-generic/bug.h>
610603839bSHuacai Chen 
620603839bSHuacai Chen #endif /* __ASM_BUG_H */
63