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 annotate_reachable(); \ 48 instrumentation_end(); \ 49 } while (0) 50 51 #define BUG() \ 52 do { \ 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