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