diff options
Diffstat (limited to 'src/aarch64/sysv.S')
-rw-r--r-- | src/aarch64/sysv.S | 23 |
1 files changed, 21 insertions, 2 deletions
diff --git a/src/aarch64/sysv.S b/src/aarch64/sysv.S index 40851ea..46f50b9 100644 --- a/src/aarch64/sysv.S +++ b/src/aarch64/sysv.S @@ -248,8 +248,8 @@ CNAME(ffi_closure_SYSV): stp x6, x7, [sp, #16 + 16*N_V_ARG_REG + 48] /* Load ffi_closure_inner arguments. */ - ldp x0, x1, [x17, #FFI_TRAMPOLINE_SIZE] /* load cif, fn */ - ldr x2, [x17, #FFI_TRAMPOLINE_SIZE+16] /* load user_data */ + ldp x0, x1, [x17, #FFI_TRAMPOLINE_CLOSURE_OFFSET] /* load cif, fn */ + ldr x2, [x17, #FFI_TRAMPOLINE_CLOSURE_OFFSET+16] /* load user_data */ .Ldo_closure: add x3, sp, #16 /* load context */ add x4, sp, #ffi_closure_SYSV_FS /* load stack */ @@ -343,6 +343,25 @@ CNAME(ffi_closure_SYSV): .size CNAME(ffi_closure_SYSV), . - CNAME(ffi_closure_SYSV) #endif +#if FFI_EXEC_TRAMPOLINE_TABLE + .align 12 +CNAME(ffi_closure_trampoline_table_page): + .rept 16384 / FFI_TRAMPOLINE_SIZE + adr x17, -16384 + adr x16, -16380 + ldr x16, [x16] + ldr x17, [x17] + br x16 + .endr + + .globl CNAME(ffi_closure_trampoline_table_page) + #ifdef __ELF__ + .type CNAME(ffi_closure_trampoline_table_page), #function + .hidden CNAME(ffi_closure_trampoline_table_page) + .size CNAME(ffi_closure_trampoline_table_page), . - CNAME(ffi_closure_trampoline_table_page) + #endif +#endif + #ifdef FFI_GO_CLOSURES .align 4 CNAME(ffi_go_closure_SYSV_V): |