xref: /openbmc/linux/arch/x86/include/asm/bug.h (revision 4bf3bd0f)
1 /* SPDX-License-Identifier: GPL-2.0 */
2 #ifndef _ASM_X86_BUG_H
3 #define _ASM_X86_BUG_H
4 
5 #include <linux/stringify.h>
6 
7 #ifndef __ASSEMBLY__
8 
9 /*
10  * Despite that some emulators terminate on UD2, we use it for WARN().
11  *
12  * Since various instruction decoders/specs disagree on the encoding of
13  * UD0/UD1.
14  */
15 
16 #define ASM_UD0		".byte 0x0f, 0xff" /* + ModRM (for Intel) */
17 #define ASM_UD1		".byte 0x0f, 0xb9" /* + ModRM */
18 #define ASM_UD2		".byte 0x0f, 0x0b"
19 
20 #define INSN_UD0	0xff0f
21 #define INSN_UD2	0x0b0f
22 
23 #define LEN_UD2		2
24 
25 #define _BUG_FLAGS(ins, flags)						\
26 do {									\
27 	asm volatile("ASM_BUG ins=\"" ins "\" file=%c0 line=%c1 "	\
28 		     "flags=%c2 size=%c3"				\
29 		     : : "i" (__FILE__), "i" (__LINE__),                \
30 			 "i" (flags),                                   \
31 			 "i" (sizeof(struct bug_entry)));		\
32 } while (0)
33 
34 #define HAVE_ARCH_BUG
35 #define BUG()							\
36 do {								\
37 	_BUG_FLAGS(ASM_UD2, 0);					\
38 	unreachable();						\
39 } while (0)
40 
41 #define __WARN_FLAGS(flags)					\
42 do {								\
43 	_BUG_FLAGS(ASM_UD2, BUGFLAG_WARNING|(flags));		\
44 	annotate_reachable();					\
45 } while (0)
46 
47 #include <asm-generic/bug.h>
48 
49 #else /* __ASSEMBLY__ */
50 
51 #ifdef CONFIG_GENERIC_BUG
52 
53 #ifdef CONFIG_X86_32
54 .macro __BUG_REL val:req
55 	.long \val
56 .endm
57 #else
58 .macro __BUG_REL val:req
59 	.long \val - 2b
60 .endm
61 #endif
62 
63 #ifdef CONFIG_DEBUG_BUGVERBOSE
64 
65 .macro ASM_BUG ins:req file:req line:req flags:req size:req
66 1:	\ins
67 	.pushsection __bug_table,"aw"
68 2:	__BUG_REL val=1b	# bug_entry::bug_addr
69 	__BUG_REL val=\file	# bug_entry::file
70 	.word \line		# bug_entry::line
71 	.word \flags		# bug_entry::flags
72 	.org 2b+\size
73 	.popsection
74 .endm
75 
76 #else /* !CONFIG_DEBUG_BUGVERBOSE */
77 
78 .macro ASM_BUG ins:req file:req line:req flags:req size:req
79 1:	\ins
80 	.pushsection __bug_table,"aw"
81 2:	__BUG_REL val=1b	# bug_entry::bug_addr
82 	.word \flags		# bug_entry::flags
83 	.org 2b+\size
84 	.popsection
85 .endm
86 
87 #endif /* CONFIG_DEBUG_BUGVERBOSE */
88 
89 #else /* CONFIG_GENERIC_BUG */
90 
91 .macro ASM_BUG ins:req file:req line:req flags:req size:req
92 	\ins
93 .endm
94 
95 #endif /* CONFIG_GENERIC_BUG */
96 
97 #endif /* __ASSEMBLY__ */
98 
99 #endif /* _ASM_X86_BUG_H */
100