xref: /openbmc/linux/arch/x86/include/asm/bug.h (revision 70579a86)
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