xref: /linux/arch/x86/lib/bhi.S (revision 4f9786035f9e519db41375818e1d0b5f20da2f10)
1/* SPDX-License-Identifier: GPL-2.0 */
2
3#include <linux/linkage.h>
4#include <asm/unwind_hints.h>
5#include <asm/nospec-branch.h>
6
7/*
8 * Notably, the FineIBT preamble calling these will have ZF set and r10 zero.
9 *
10 * The very last element is in fact larger than 32 bytes, but since its the
11 * last element, this does not matter,
12 *
13 * There are 2 #UD sites, located between 0,1-2,3 and 4,5-6,7 such that they
14 * can be reached using Jcc.d8, these elements (1 and 5) have sufficiently
15 * big alignment holes for this to not stagger the array.
16 */
17
18.pushsection .noinstr.text, "ax"
19
20	.align 32
21SYM_CODE_START(__bhi_args)
22
23#ifdef CONFIG_FINEIBT_BHI
24
25	.align 32
26SYM_INNER_LABEL(__bhi_args_0, SYM_L_LOCAL)
27	ANNOTATE_NOENDBR
28	UNWIND_HINT_FUNC
29	jne .Lud_1
30	ANNOTATE_UNRET_SAFE
31	ret
32	int3
33
34	.align 32
35SYM_INNER_LABEL(__bhi_args_1, SYM_L_LOCAL)
36	ANNOTATE_NOENDBR
37	UNWIND_HINT_FUNC
38	jne .Lud_1
39	cmovne %r10, %rdi
40	ANNOTATE_UNRET_SAFE
41	ret
42	int3
43
44	.align 8
45	ANNOTATE_REACHABLE
46.Lud_1:	ud2
47	ANNOTATE_UNRET_SAFE
48	ret
49	int3
50
51	.align 32
52SYM_INNER_LABEL(__bhi_args_2, SYM_L_LOCAL)
53	ANNOTATE_NOENDBR
54	UNWIND_HINT_FUNC
55	jne .Lud_1
56	cmovne %r10, %rdi
57	cmovne %r10, %rsi
58	ANNOTATE_UNRET_SAFE
59	ret
60	int3
61
62	.align 32
63SYM_INNER_LABEL(__bhi_args_3, SYM_L_LOCAL)
64	ANNOTATE_NOENDBR
65	UNWIND_HINT_FUNC
66	jne .Lud_1
67	cmovne %r10, %rdi
68	cmovne %r10, %rsi
69	cmovne %r10, %rdx
70	ANNOTATE_UNRET_SAFE
71	ret
72	int3
73
74	.align 32
75SYM_INNER_LABEL(__bhi_args_4, SYM_L_LOCAL)
76	ANNOTATE_NOENDBR
77	UNWIND_HINT_FUNC
78	jne .Lud_2
79	cmovne %r10, %rdi
80	cmovne %r10, %rsi
81	cmovne %r10, %rdx
82	cmovne %r10, %rcx
83	ANNOTATE_UNRET_SAFE
84	ret
85	int3
86
87	.align 32
88SYM_INNER_LABEL(__bhi_args_5, SYM_L_LOCAL)
89	ANNOTATE_NOENDBR
90	UNWIND_HINT_FUNC
91	jne .Lud_2
92	cmovne %r10, %rdi
93	cmovne %r10, %rsi
94	cmovne %r10, %rdx
95	cmovne %r10, %rcx
96	cmovne %r10, %r8
97	ANNOTATE_UNRET_SAFE
98	ret
99	int3
100
101	.align 8
102	ANNOTATE_REACHABLE
103.Lud_2:	ud2
104	ANNOTATE_UNRET_SAFE
105	ret
106	int3
107
108	.align 32
109SYM_INNER_LABEL(__bhi_args_6, SYM_L_LOCAL)
110	ANNOTATE_NOENDBR
111	UNWIND_HINT_FUNC
112	jne .Lud_2
113	cmovne %r10, %rdi
114	cmovne %r10, %rsi
115	cmovne %r10, %rdx
116	cmovne %r10, %rcx
117	cmovne %r10, %r8
118	cmovne %r10, %r9
119	ANNOTATE_UNRET_SAFE
120	ret
121	int3
122
123	.align 32
124SYM_INNER_LABEL(__bhi_args_7, SYM_L_LOCAL)
125	ANNOTATE_NOENDBR
126	UNWIND_HINT_FUNC
127	jne .Lud_2
128	cmovne %r10, %rdi
129	cmovne %r10, %rsi
130	cmovne %r10, %rdx
131	cmovne %r10, %rcx
132	cmovne %r10, %r8
133	cmovne %r10, %r9
134	cmovne %r10, %rsp
135	ANNOTATE_UNRET_SAFE
136	ret
137	int3
138
139#endif /* CONFIG_FINEIBT_BHI */
140
141	.align 32
142SYM_INNER_LABEL(__bhi_args_end, SYM_L_GLOBAL)
143	ANNOTATE_NOENDBR
144	nop /* Work around toolchain+objtool quirk */
145SYM_CODE_END(__bhi_args)
146
147.popsection
148