1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */ 21965aae3SH. Peter Anvin #ifndef _ASM_X86_BUG_H 31965aae3SH. Peter Anvin #define _ASM_X86_BUG_H 4bb898558SAl Viro 59a93848fSPeter Zijlstra #include <linux/stringify.h> 6d19e789fSIngo Molnar #include <linux/instrumentation.h> 7dca5da2aSPeter Zijlstra #include <linux/objtool.h> 89a93848fSPeter Zijlstra 99a93848fSPeter Zijlstra /* 103b3a371cSPeter Zijlstra * Despite that some emulators terminate on UD2, we use it for WARN(). 119a93848fSPeter Zijlstra */ 129a93848fSPeter Zijlstra #define ASM_UD2 ".byte 0x0f, 0x0b" 139a93848fSPeter Zijlstra #define INSN_UD2 0x0b0f 143b3a371cSPeter Zijlstra #define LEN_UD2 2 159a93848fSPeter Zijlstra 16ffb61c63SIngo Molnar #ifdef CONFIG_GENERIC_BUG 17ffb61c63SIngo Molnar 18ffb61c63SIngo Molnar #ifdef CONFIG_X86_32 19ffb61c63SIngo Molnar # define __BUG_REL(val) ".long " __stringify(val) 20ffb61c63SIngo Molnar #else 21*69505e3dSJosh Poimboeuf # define __BUG_REL(val) ".long " __stringify(val) " - ." 22ffb61c63SIngo Molnar #endif 23ffb61c63SIngo Molnar 24ffb61c63SIngo Molnar #ifdef CONFIG_DEBUG_BUGVERBOSE 25ffb61c63SIngo Molnar 26bfb1a7c9SNick Desaulniers #define _BUG_FLAGS(ins, flags, extra) \ 27bb898558SAl Viro do { \ 2832ee8230SRasmus Villemoes asm_inline volatile("1:\t" ins "\n" \ 29ffb61c63SIngo Molnar ".pushsection __bug_table,\"aw\"\n" \ 30ffb61c63SIngo Molnar "2:\t" __BUG_REL(1b) "\t# bug_entry::bug_addr\n" \ 31ffb61c63SIngo Molnar "\t" __BUG_REL(%c0) "\t# bug_entry::file\n" \ 32ffb61c63SIngo Molnar "\t.word %c1" "\t# bug_entry::line\n" \ 33ffb61c63SIngo Molnar "\t.word %c2" "\t# bug_entry::flags\n" \ 34ffb61c63SIngo Molnar "\t.org 2b+%c3\n" \ 35bfb1a7c9SNick Desaulniers ".popsection\n" \ 36bfb1a7c9SNick Desaulniers extra \ 37bb898558SAl Viro : : "i" (__FILE__), "i" (__LINE__), \ 389a93848fSPeter Zijlstra "i" (flags), \ 39bb898558SAl Viro "i" (sizeof(struct bug_entry))); \ 409a93848fSPeter Zijlstra } while (0) 419a93848fSPeter Zijlstra 42ffb61c63SIngo Molnar #else /* !CONFIG_DEBUG_BUGVERBOSE */ 43ffb61c63SIngo Molnar 44bfb1a7c9SNick Desaulniers #define _BUG_FLAGS(ins, flags, extra) \ 45ffb61c63SIngo Molnar do { \ 4632ee8230SRasmus Villemoes asm_inline volatile("1:\t" ins "\n" \ 47ffb61c63SIngo Molnar ".pushsection __bug_table,\"aw\"\n" \ 48ffb61c63SIngo Molnar "2:\t" __BUG_REL(1b) "\t# bug_entry::bug_addr\n" \ 49ffb61c63SIngo Molnar "\t.word %c0" "\t# bug_entry::flags\n" \ 50ffb61c63SIngo Molnar "\t.org 2b+%c1\n" \ 51bfb1a7c9SNick Desaulniers ".popsection\n" \ 52bfb1a7c9SNick Desaulniers extra \ 53ffb61c63SIngo Molnar : : "i" (flags), \ 54ffb61c63SIngo Molnar "i" (sizeof(struct bug_entry))); \ 55ffb61c63SIngo Molnar } while (0) 56ffb61c63SIngo Molnar 57ffb61c63SIngo Molnar #endif /* CONFIG_DEBUG_BUGVERBOSE */ 58ffb61c63SIngo Molnar 59ffb61c63SIngo Molnar #else 60ffb61c63SIngo Molnar 61bfb1a7c9SNick Desaulniers #define _BUG_FLAGS(ins, flags, extra) asm volatile(ins) 62ffb61c63SIngo Molnar 63ffb61c63SIngo Molnar #endif /* CONFIG_GENERIC_BUG */ 64ffb61c63SIngo Molnar 6570579a86SArnd Bergmann #define HAVE_ARCH_BUG 669a93848fSPeter Zijlstra #define BUG() \ 679a93848fSPeter Zijlstra do { \ 685916d5f9SThomas Gleixner instrumentation_begin(); \ 69bfb1a7c9SNick Desaulniers _BUG_FLAGS(ASM_UD2, 0, ""); \ 70bfb1a7c9SNick Desaulniers __builtin_unreachable(); \ 71bb898558SAl Viro } while (0) 72bb898558SAl Viro 738e8bb06dSPeter Zijlstra /* 748e8bb06dSPeter Zijlstra * This instrumentation_begin() is strictly speaking incorrect; but it 758e8bb06dSPeter Zijlstra * suppresses the complaints from WARN()s in noinstr code. If such a WARN() 768e8bb06dSPeter Zijlstra * were to trigger, we'd rather wreck the machine in an attempt to get the 778e8bb06dSPeter Zijlstra * message out than not know about it. 788e8bb06dSPeter Zijlstra */ 792b5db668SJosh Poimboeuf #define __WARN_FLAGS(flags) \ 802b5db668SJosh Poimboeuf do { \ 81bfb1a7c9SNick Desaulniers __auto_type __flags = BUGFLAG_WARNING|(flags); \ 825916d5f9SThomas Gleixner instrumentation_begin(); \ 83bfb1a7c9SNick Desaulniers _BUG_FLAGS(ASM_UD2, __flags, ASM_REACHABLE); \ 845916d5f9SThomas Gleixner instrumentation_end(); \ 852b5db668SJosh Poimboeuf } while (0) 869a93848fSPeter Zijlstra 87bb898558SAl Viro #include <asm-generic/bug.h> 88f05e798aSDavid Howells 891965aae3SH. Peter Anvin #endif /* _ASM_X86_BUG_H */ 90