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