^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /* SPDX-License-Identifier: GPL-2.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) #ifndef _ASM_X86_BUG_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) #define _ASM_X86_BUG_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) #include <linux/stringify.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) #include <linux/instrumentation.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) * Despite that some emulators terminate on UD2, we use it for WARN().
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) * Since various instruction decoders/specs disagree on the encoding of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) * UD0/UD1.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #define ASM_UD0 ".byte 0x0f, 0xff" /* + ModRM (for Intel) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) #define ASM_UD1 ".byte 0x0f, 0xb9" /* + ModRM */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) #define ASM_UD2 ".byte 0x0f, 0x0b"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) #define INSN_UD0 0xff0f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) #define INSN_UD2 0x0b0f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) #define LEN_UD2 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) #ifdef CONFIG_GENERIC_BUG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) #ifdef CONFIG_X86_32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) # define __BUG_REL(val) ".long " __stringify(val)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) # define __BUG_REL(val) ".long " __stringify(val) " - 2b"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) #ifdef CONFIG_DEBUG_BUGVERBOSE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) #define _BUG_FLAGS(ins, flags) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) do { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) asm_inline volatile("1:\t" ins "\n" \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) ".pushsection __bug_table,\"aw\"\n" \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) "2:\t" __BUG_REL(1b) "\t# bug_entry::bug_addr\n" \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) "\t" __BUG_REL(%c0) "\t# bug_entry::file\n" \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) "\t.word %c1" "\t# bug_entry::line\n" \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) "\t.word %c2" "\t# bug_entry::flags\n" \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) "\t.org 2b+%c3\n" \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) ".popsection" \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) : : "i" (__FILE__), "i" (__LINE__), \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) "i" (flags), \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) "i" (sizeof(struct bug_entry))); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) } while (0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) #else /* !CONFIG_DEBUG_BUGVERBOSE */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) #define _BUG_FLAGS(ins, flags) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) do { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) asm_inline volatile("1:\t" ins "\n" \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) ".pushsection __bug_table,\"aw\"\n" \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) "2:\t" __BUG_REL(1b) "\t# bug_entry::bug_addr\n" \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) "\t.word %c0" "\t# bug_entry::flags\n" \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) "\t.org 2b+%c1\n" \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) ".popsection" \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) : : "i" (flags), \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) "i" (sizeof(struct bug_entry))); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) } while (0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) #endif /* CONFIG_DEBUG_BUGVERBOSE */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) #define _BUG_FLAGS(ins, flags) asm volatile(ins)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) #endif /* CONFIG_GENERIC_BUG */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) #define HAVE_ARCH_BUG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) #define BUG() \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) do { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) instrumentation_begin(); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) _BUG_FLAGS(ASM_UD2, 0); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) unreachable(); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) } while (0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) * This instrumentation_begin() is strictly speaking incorrect; but it
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) * suppresses the complaints from WARN()s in noinstr code. If such a WARN()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) * were to trigger, we'd rather wreck the machine in an attempt to get the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) * message out than not know about it.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) #define __WARN_FLAGS(flags) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) do { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) instrumentation_begin(); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) _BUG_FLAGS(ASM_UD2, BUGFLAG_WARNING|(flags)); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) annotate_reachable(); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) instrumentation_end(); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) } while (0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) #include <asm-generic/bug.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) #endif /* _ASM_X86_BUG_H */