summaryrefslogtreecommitdiff
path: root/arch/x86/lib/bhi.S
blob: 58891681261b0b91098d2ced2e9baef56396a97e (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
/* SPDX-License-Identifier: GPL-2.0 */

#include <linux/linkage.h>
#include <asm/unwind_hints.h>
#include <asm/nospec-branch.h>

/*
 * Notably, the FineIBT preamble calling these will have ZF set and r10 zero.
 *
 * The very last element is in fact larger than 32 bytes, but since its the
 * last element, this does not matter,
 *
 * There are 2 #UD sites, located between 0,1-2,3 and 4,5-6,7 such that they
 * can be reached using Jcc.d8, these elements (1 and 5) have sufficiently
 * big alignment holes for this to not stagger the array.
 */

.pushsection .noinstr.text, "ax"

	.align 32
SYM_CODE_START(__bhi_args)

#ifdef CONFIG_FINEIBT_BHI

	.align 32
SYM_INNER_LABEL(__bhi_args_0, SYM_L_LOCAL)
	ANNOTATE_NOENDBR
	UNWIND_HINT_FUNC
	jne .Lud_1
	ANNOTATE_UNRET_SAFE
	ret
	int3

	.align 32
SYM_INNER_LABEL(__bhi_args_1, SYM_L_LOCAL)
	ANNOTATE_NOENDBR
	UNWIND_HINT_FUNC
	jne .Lud_1
	cmovne %r10, %rdi
	ANNOTATE_UNRET_SAFE
	ret
	int3

	.align 8
	ANNOTATE_REACHABLE
.Lud_1:	ud2
	ANNOTATE_UNRET_SAFE
	ret
	int3

	.align 32
SYM_INNER_LABEL(__bhi_args_2, SYM_L_LOCAL)
	ANNOTATE_NOENDBR
	UNWIND_HINT_FUNC
	jne .Lud_1
	cmovne %r10, %rdi
	cmovne %r10, %rsi
	ANNOTATE_UNRET_SAFE
	ret
	int3

	.align 32
SYM_INNER_LABEL(__bhi_args_3, SYM_L_LOCAL)
	ANNOTATE_NOENDBR
	UNWIND_HINT_FUNC
	jne .Lud_1
	cmovne %r10, %rdi
	cmovne %r10, %rsi
	cmovne %r10, %rdx
	ANNOTATE_UNRET_SAFE
	ret
	int3

	.align 32
SYM_INNER_LABEL(__bhi_args_4, SYM_L_LOCAL)
	ANNOTATE_NOENDBR
	UNWIND_HINT_FUNC
	jne .Lud_2
	cmovne %r10, %rdi
	cmovne %r10, %rsi
	cmovne %r10, %rdx
	cmovne %r10, %rcx
	ANNOTATE_UNRET_SAFE
	ret
	int3

	.align 32
SYM_INNER_LABEL(__bhi_args_5, SYM_L_LOCAL)
	ANNOTATE_NOENDBR
	UNWIND_HINT_FUNC
	jne .Lud_2
	cmovne %r10, %rdi
	cmovne %r10, %rsi
	cmovne %r10, %rdx
	cmovne %r10, %rcx
	cmovne %r10, %r8
	ANNOTATE_UNRET_SAFE
	ret
	int3

	.align 8
	ANNOTATE_REACHABLE
.Lud_2:	ud2
	ANNOTATE_UNRET_SAFE
	ret
	int3

	.align 32
SYM_INNER_LABEL(__bhi_args_6, SYM_L_LOCAL)
	ANNOTATE_NOENDBR
	UNWIND_HINT_FUNC
	jne .Lud_2
	cmovne %r10, %rdi
	cmovne %r10, %rsi
	cmovne %r10, %rdx
	cmovne %r10, %rcx
	cmovne %r10, %r8
	cmovne %r10, %r9
	ANNOTATE_UNRET_SAFE
	ret
	int3

	.align 32
SYM_INNER_LABEL(__bhi_args_7, SYM_L_LOCAL)
	ANNOTATE_NOENDBR
	UNWIND_HINT_FUNC
	jne .Lud_2
	cmovne %r10, %rdi
	cmovne %r10, %rsi
	cmovne %r10, %rdx
	cmovne %r10, %rcx
	cmovne %r10, %r8
	cmovne %r10, %r9
	cmovne %r10, %rsp
	ANNOTATE_UNRET_SAFE
	ret
	int3

#endif /* CONFIG_FINEIBT_BHI */

	.align 32
SYM_INNER_LABEL(__bhi_args_end, SYM_L_GLOBAL)
	ANNOTATE_NOENDBR
	nop /* Work around toolchain+objtool quirk */
SYM_CODE_END(__bhi_args)

.popsection