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) \ 44do { \ 45 instrumentation_begin(); \ 46 __BUG_FLAGS(BUGFLAG_WARNING|(flags)); \ 47 annotate_reachable(); \ 48 instrumentation_end(); \ 49} while (0) 50 51#define BUG() \ 52do { \ 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