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