1 // This file is generated from a similarly-named Perl script in the BoringSSL 2 // source tree. Do not edit by hand. 3 4 #if defined(__has_feature) 5 #if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) 6 #define OPENSSL_NO_ASM 7 #endif 8 #endif 9 10 #if !defined(OPENSSL_NO_ASM) 11 #if defined(BORINGSSL_PREFIX) 12 #include <boringssl_prefix_symbols_asm.h> 13 #endif 14 .syntax unified 15 16 17 18 19 .text 20 21 @ abi_test_trampoline loads callee-saved registers from |state|, calls |func| 22 @ with |argv|, then saves the callee-saved registers into |state|. It returns 23 @ the result of |func|. The |unwind| argument is unused. 24 @ uint32_t abi_test_trampoline(void (*func)(...), CallerState *state, 25 @ const uint32_t *argv, size_t argc, 26 @ int unwind); 27 28 .globl _abi_test_trampoline 29 .private_extern _abi_test_trampoline 30 .align 4 31 _abi_test_trampoline: 32 Labi_test_trampoline_begin: 33 @ Save parameters and all callee-saved registers. For convenience, we 34 @ save r9 on iOS even though it's volatile. 35 vstmdb sp!, {d8,d9,d10,d11,d12,d13,d14,d15} 36 stmdb sp!, {r0,r1,r2,r3,r4,r5,r6,r7,r8,r9,r10,r11,lr} 37 38 @ Reserve stack space for six (10-4) stack parameters, plus an extra 4 39 @ bytes to keep it 8-byte-aligned (see AAPCS, section 5.3). 40 sub sp, sp, #28 41 42 @ Every register in AAPCS is either non-volatile or a parameter (except 43 @ r9 on iOS), so this code, by the actual call, loses all its scratch 44 @ registers. First fill in stack parameters while there are registers 45 @ to spare. 46 cmp r3, #4 47 bls Lstack_args_done 48 mov r4, sp @ r4 is the output pointer. 49 add r5, r2, r3, lsl #2 @ Set r5 to the end of argv. 50 add r2, r2, #16 @ Skip four arguments. 51 Lstack_args_loop: 52 ldr r6, [r2], #4 53 cmp r2, r5 54 str r6, [r4], #4 55 bne Lstack_args_loop 56 57 Lstack_args_done: 58 @ Load registers from |r1|. 59 vldmia r1!, {d8,d9,d10,d11,d12,d13,d14,d15} 60 #if defined(__APPLE__) 61 @ r9 is not volatile on iOS. 62 ldmia r1!, {r4,r5,r6,r7,r8,r10-r11} 63 #else 64 ldmia r1!, {r4,r5,r6,r7,r8,r9,r10,r11} 65 #endif 66 67 @ Load register parameters. This uses up our remaining registers, so we 68 @ repurpose lr as scratch space. 69 ldr r3, [sp, #40] @ Reload argc. 70 ldr lr, [sp, #36] @ Load argv into lr. 71 cmp r3, #3 72 bhi Larg_r3 73 beq Larg_r2 74 cmp r3, #1 75 bhi Larg_r1 76 beq Larg_r0 77 b Largs_done 78 79 Larg_r3: 80 ldr r3, [lr, #12] @ argv[3] 81 Larg_r2: 82 ldr r2, [lr, #8] @ argv[2] 83 Larg_r1: 84 ldr r1, [lr, #4] @ argv[1] 85 Larg_r0: 86 ldr r0, [lr] @ argv[0] 87 Largs_done: 88 89 @ With every other register in use, load the function pointer into lr 90 @ and call the function. 91 ldr lr, [sp, #28] 92 blx lr 93 94 @ r1-r3 are free for use again. The trampoline only supports 95 @ single-return functions. Pass r4-r11 to the caller. 96 ldr r1, [sp, #32] 97 vstmia r1!, {d8,d9,d10,d11,d12,d13,d14,d15} 98 #if defined(__APPLE__) 99 @ r9 is not volatile on iOS. 100 stmia r1!, {r4,r5,r6,r7,r8,r10-r11} 101 #else 102 stmia r1!, {r4,r5,r6,r7,r8,r9,r10,r11} 103 #endif 104 105 @ Unwind the stack and restore registers. 106 add sp, sp, #44 @ 44 = 28+16 107 ldmia sp!, {r4,r5,r6,r7,r8,r9,r10,r11,lr} @ Skip r0-r3 (see +16 above). 108 vldmia sp!, {d8,d9,d10,d11,d12,d13,d14,d15} 109 110 bx lr 111 112 113 .globl _abi_test_clobber_r0 114 .private_extern _abi_test_clobber_r0 115 .align 4 116 _abi_test_clobber_r0: 117 mov r0, #0 118 bx lr 119 120 121 .globl _abi_test_clobber_r1 122 .private_extern _abi_test_clobber_r1 123 .align 4 124 _abi_test_clobber_r1: 125 mov r1, #0 126 bx lr 127 128 129 .globl _abi_test_clobber_r2 130 .private_extern _abi_test_clobber_r2 131 .align 4 132 _abi_test_clobber_r2: 133 mov r2, #0 134 bx lr 135 136 137 .globl _abi_test_clobber_r3 138 .private_extern _abi_test_clobber_r3 139 .align 4 140 _abi_test_clobber_r3: 141 mov r3, #0 142 bx lr 143 144 145 .globl _abi_test_clobber_r4 146 .private_extern _abi_test_clobber_r4 147 .align 4 148 _abi_test_clobber_r4: 149 mov r4, #0 150 bx lr 151 152 153 .globl _abi_test_clobber_r5 154 .private_extern _abi_test_clobber_r5 155 .align 4 156 _abi_test_clobber_r5: 157 mov r5, #0 158 bx lr 159 160 161 .globl _abi_test_clobber_r6 162 .private_extern _abi_test_clobber_r6 163 .align 4 164 _abi_test_clobber_r6: 165 mov r6, #0 166 bx lr 167 168 169 .globl _abi_test_clobber_r7 170 .private_extern _abi_test_clobber_r7 171 .align 4 172 _abi_test_clobber_r7: 173 mov r7, #0 174 bx lr 175 176 177 .globl _abi_test_clobber_r8 178 .private_extern _abi_test_clobber_r8 179 .align 4 180 _abi_test_clobber_r8: 181 mov r8, #0 182 bx lr 183 184 185 .globl _abi_test_clobber_r9 186 .private_extern _abi_test_clobber_r9 187 .align 4 188 _abi_test_clobber_r9: 189 mov r9, #0 190 bx lr 191 192 193 .globl _abi_test_clobber_r10 194 .private_extern _abi_test_clobber_r10 195 .align 4 196 _abi_test_clobber_r10: 197 mov r10, #0 198 bx lr 199 200 201 .globl _abi_test_clobber_r11 202 .private_extern _abi_test_clobber_r11 203 .align 4 204 _abi_test_clobber_r11: 205 mov r11, #0 206 bx lr 207 208 209 .globl _abi_test_clobber_r12 210 .private_extern _abi_test_clobber_r12 211 .align 4 212 _abi_test_clobber_r12: 213 mov r12, #0 214 bx lr 215 216 217 .globl _abi_test_clobber_d0 218 .private_extern _abi_test_clobber_d0 219 .align 4 220 _abi_test_clobber_d0: 221 mov r0, #0 222 vmov s0, r0 223 vmov s1, r0 224 bx lr 225 226 227 .globl _abi_test_clobber_d1 228 .private_extern _abi_test_clobber_d1 229 .align 4 230 _abi_test_clobber_d1: 231 mov r0, #0 232 vmov s2, r0 233 vmov s3, r0 234 bx lr 235 236 237 .globl _abi_test_clobber_d2 238 .private_extern _abi_test_clobber_d2 239 .align 4 240 _abi_test_clobber_d2: 241 mov r0, #0 242 vmov s4, r0 243 vmov s5, r0 244 bx lr 245 246 247 .globl _abi_test_clobber_d3 248 .private_extern _abi_test_clobber_d3 249 .align 4 250 _abi_test_clobber_d3: 251 mov r0, #0 252 vmov s6, r0 253 vmov s7, r0 254 bx lr 255 256 257 .globl _abi_test_clobber_d4 258 .private_extern _abi_test_clobber_d4 259 .align 4 260 _abi_test_clobber_d4: 261 mov r0, #0 262 vmov s8, r0 263 vmov s9, r0 264 bx lr 265 266 267 .globl _abi_test_clobber_d5 268 .private_extern _abi_test_clobber_d5 269 .align 4 270 _abi_test_clobber_d5: 271 mov r0, #0 272 vmov s10, r0 273 vmov s11, r0 274 bx lr 275 276 277 .globl _abi_test_clobber_d6 278 .private_extern _abi_test_clobber_d6 279 .align 4 280 _abi_test_clobber_d6: 281 mov r0, #0 282 vmov s12, r0 283 vmov s13, r0 284 bx lr 285 286 287 .globl _abi_test_clobber_d7 288 .private_extern _abi_test_clobber_d7 289 .align 4 290 _abi_test_clobber_d7: 291 mov r0, #0 292 vmov s14, r0 293 vmov s15, r0 294 bx lr 295 296 297 .globl _abi_test_clobber_d8 298 .private_extern _abi_test_clobber_d8 299 .align 4 300 _abi_test_clobber_d8: 301 mov r0, #0 302 vmov s16, r0 303 vmov s17, r0 304 bx lr 305 306 307 .globl _abi_test_clobber_d9 308 .private_extern _abi_test_clobber_d9 309 .align 4 310 _abi_test_clobber_d9: 311 mov r0, #0 312 vmov s18, r0 313 vmov s19, r0 314 bx lr 315 316 317 .globl _abi_test_clobber_d10 318 .private_extern _abi_test_clobber_d10 319 .align 4 320 _abi_test_clobber_d10: 321 mov r0, #0 322 vmov s20, r0 323 vmov s21, r0 324 bx lr 325 326 327 .globl _abi_test_clobber_d11 328 .private_extern _abi_test_clobber_d11 329 .align 4 330 _abi_test_clobber_d11: 331 mov r0, #0 332 vmov s22, r0 333 vmov s23, r0 334 bx lr 335 336 337 .globl _abi_test_clobber_d12 338 .private_extern _abi_test_clobber_d12 339 .align 4 340 _abi_test_clobber_d12: 341 mov r0, #0 342 vmov s24, r0 343 vmov s25, r0 344 bx lr 345 346 347 .globl _abi_test_clobber_d13 348 .private_extern _abi_test_clobber_d13 349 .align 4 350 _abi_test_clobber_d13: 351 mov r0, #0 352 vmov s26, r0 353 vmov s27, r0 354 bx lr 355 356 357 .globl _abi_test_clobber_d14 358 .private_extern _abi_test_clobber_d14 359 .align 4 360 _abi_test_clobber_d14: 361 mov r0, #0 362 vmov s28, r0 363 vmov s29, r0 364 bx lr 365 366 367 .globl _abi_test_clobber_d15 368 .private_extern _abi_test_clobber_d15 369 .align 4 370 _abi_test_clobber_d15: 371 mov r0, #0 372 vmov s30, r0 373 vmov s31, r0 374 bx lr 375 376 #endif // !OPENSSL_NO_ASM 377