11965aae3SH. Peter Anvin #ifndef _ASM_X86_BUG_H 21965aae3SH. Peter Anvin #define _ASM_X86_BUG_H 3bb898558SAl Viro 49a93848fSPeter Zijlstra #include <linux/stringify.h> 59a93848fSPeter Zijlstra 69a93848fSPeter Zijlstra /* 79a93848fSPeter Zijlstra * Since some emulators terminate on UD2, we cannot use it for WARN. 89a93848fSPeter Zijlstra * Since various instruction decoders disagree on the length of UD1, 99a93848fSPeter Zijlstra * we cannot use it either. So use UD0 for WARN. 109a93848fSPeter Zijlstra * 119a93848fSPeter Zijlstra * (binutils knows about "ud1" but {en,de}codes it as 2 bytes, whereas 129a93848fSPeter Zijlstra * our kernel decoder thinks it takes a ModRM byte, which seems consistent 139a93848fSPeter Zijlstra * with various things like the Intel SDM instruction encoding rules) 149a93848fSPeter Zijlstra */ 159a93848fSPeter Zijlstra 169a93848fSPeter Zijlstra #define ASM_UD0 ".byte 0x0f, 0xff" 179a93848fSPeter Zijlstra #define ASM_UD1 ".byte 0x0f, 0xb9" /* + ModRM */ 189a93848fSPeter Zijlstra #define ASM_UD2 ".byte 0x0f, 0x0b" 199a93848fSPeter Zijlstra 209a93848fSPeter Zijlstra #define INSN_UD0 0xff0f 219a93848fSPeter Zijlstra #define INSN_UD2 0x0b0f 229a93848fSPeter Zijlstra 239a93848fSPeter Zijlstra #define LEN_UD0 2 249a93848fSPeter Zijlstra 259a93848fSPeter Zijlstra #ifdef CONFIG_GENERIC_BUG 26bb898558SAl Viro 279a93848fSPeter Zijlstra #ifdef CONFIG_X86_32 289a93848fSPeter Zijlstra # define __BUG_REL(val) ".long " __stringify(val) 299a93848fSPeter Zijlstra #else 309a93848fSPeter Zijlstra # define __BUG_REL(val) ".long " __stringify(val) " - 2b" 319a93848fSPeter Zijlstra #endif 329a93848fSPeter Zijlstra 33bb898558SAl Viro #ifdef CONFIG_DEBUG_BUGVERBOSE 34bb898558SAl Viro 359a93848fSPeter Zijlstra #define _BUG_FLAGS(ins, flags) \ 36bb898558SAl Viro do { \ 379a93848fSPeter Zijlstra asm volatile("1:\t" ins "\n" \ 38bb898558SAl Viro ".pushsection __bug_table,\"a\"\n" \ 399a93848fSPeter Zijlstra "2:\t" __BUG_REL(1b) "\t# bug_entry::bug_addr\n" \ 409a93848fSPeter Zijlstra "\t" __BUG_REL(%c0) "\t# bug_entry::file\n" \ 419a93848fSPeter Zijlstra "\t.word %c1" "\t# bug_entry::line\n" \ 429a93848fSPeter Zijlstra "\t.word %c2" "\t# bug_entry::flags\n" \ 439a93848fSPeter Zijlstra "\t.org 2b+%c3\n" \ 44bb898558SAl Viro ".popsection" \ 45bb898558SAl Viro : : "i" (__FILE__), "i" (__LINE__), \ 469a93848fSPeter Zijlstra "i" (flags), \ 47bb898558SAl Viro "i" (sizeof(struct bug_entry))); \ 489a93848fSPeter Zijlstra } while (0) 499a93848fSPeter Zijlstra 509a93848fSPeter Zijlstra #else /* !CONFIG_DEBUG_BUGVERBOSE */ 519a93848fSPeter Zijlstra 529a93848fSPeter Zijlstra #define _BUG_FLAGS(ins, flags) \ 539a93848fSPeter Zijlstra do { \ 549a93848fSPeter Zijlstra asm volatile("1:\t" ins "\n" \ 559a93848fSPeter Zijlstra ".pushsection __bug_table,\"a\"\n" \ 569a93848fSPeter Zijlstra "2:\t" __BUG_REL(1b) "\t# bug_entry::bug_addr\n" \ 579a93848fSPeter Zijlstra "\t.word %c0" "\t# bug_entry::flags\n" \ 589a93848fSPeter Zijlstra "\t.org 2b+%c1\n" \ 599a93848fSPeter Zijlstra ".popsection" \ 609a93848fSPeter Zijlstra : : "i" (flags), \ 619a93848fSPeter Zijlstra "i" (sizeof(struct bug_entry))); \ 629a93848fSPeter Zijlstra } while (0) 639a93848fSPeter Zijlstra 649a93848fSPeter Zijlstra #endif /* CONFIG_DEBUG_BUGVERBOSE */ 659a93848fSPeter Zijlstra 6670579a86SArnd Bergmann #else 6770579a86SArnd Bergmann 6870579a86SArnd Bergmann #define _BUG_FLAGS(ins, flags) asm volatile(ins) 6970579a86SArnd Bergmann 7070579a86SArnd Bergmann #endif /* CONFIG_GENERIC_BUG */ 7170579a86SArnd Bergmann 7270579a86SArnd Bergmann #define HAVE_ARCH_BUG 739a93848fSPeter Zijlstra #define BUG() \ 749a93848fSPeter Zijlstra do { \ 759a93848fSPeter Zijlstra _BUG_FLAGS(ASM_UD2, 0); \ 76a5fc5ebaSDavid Daney unreachable(); \ 77bb898558SAl Viro } while (0) 78bb898558SAl Viro 799a93848fSPeter Zijlstra #define __WARN_TAINT(taint) _BUG_FLAGS(ASM_UD0, BUGFLAG_TAINT(taint)) 809a93848fSPeter Zijlstra 81bb898558SAl Viro #include <asm-generic/bug.h> 82f05e798aSDavid Howells 831965aae3SH. Peter Anvin #endif /* _ASM_X86_BUG_H */ 84