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