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 eax 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 %rax, %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 %rax, %rdi
cmovne %rax, %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 %rax, %rdi
cmovne %rax, %rsi
cmovne %rax, %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 %rax, %rdi
cmovne %rax, %rsi
cmovne %rax, %rdx
cmovne %rax, %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 %rax, %rdi
cmovne %rax, %rsi
cmovne %rax, %rdx
cmovne %rax, %rcx
cmovne %rax, %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 %rax, %rdi
cmovne %rax, %rsi
cmovne %rax, %rdx
cmovne %rax, %rcx
cmovne %rax, %r8
cmovne %rax, %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 %rax, %rdi
cmovne %rax, %rsi
cmovne %rax, %rdx
cmovne %rax, %rcx
cmovne %rax, %r8
cmovne %rax, %r9
cmovne %rax, %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
|