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