|  | /* 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 |