x86_64: Fixups for x32
This commit is contained in:
@@ -568,6 +568,7 @@ ffi_prep_closure_loc (ffi_closure* closure,
|
|||||||
0x0f, 0x1f, 0x00
|
0x0f, 0x1f, 0x00
|
||||||
};
|
};
|
||||||
void (*dest)(void);
|
void (*dest)(void);
|
||||||
|
char *tramp = closure->tramp;
|
||||||
|
|
||||||
if (cif->abi != FFI_UNIX64)
|
if (cif->abi != FFI_UNIX64)
|
||||||
return FFI_BAD_ABI;
|
return FFI_BAD_ABI;
|
||||||
@@ -577,8 +578,8 @@ ffi_prep_closure_loc (ffi_closure* closure,
|
|||||||
else
|
else
|
||||||
dest = ffi_closure_unix64;
|
dest = ffi_closure_unix64;
|
||||||
|
|
||||||
memcpy (closure->tramp, trampoline, sizeof(trampoline));
|
memcpy (tramp, trampoline, sizeof(trampoline));
|
||||||
*(UINT64 *)(closure->tramp + 16) = (uintptr_t)dest;
|
*(UINT64 *)(tramp + 16) = (uintptr_t)dest;
|
||||||
|
|
||||||
closure->cif = cif;
|
closure->cif = cif;
|
||||||
closure->fun = fun;
|
closure->fun = fun;
|
||||||
|
|||||||
@@ -272,9 +272,15 @@ ffi_closure_unix64:
|
|||||||
movq %r8, ffi_closure_OFS_G+0x20(%rsp)
|
movq %r8, ffi_closure_OFS_G+0x20(%rsp)
|
||||||
movq %r9, ffi_closure_OFS_G+0x28(%rsp)
|
movq %r9, ffi_closure_OFS_G+0x28(%rsp)
|
||||||
|
|
||||||
movq 24(%r10), %rdi /* Load cif */
|
#ifdef __ILP32__
|
||||||
movq 32(%r10), %rsi /* Load fun */
|
movl FFI_TRAMPOLINE_SIZE(%r10), %edi /* Load cif */
|
||||||
movq 40(%r10), %rdx /* Load user_data */
|
movl FFI_TRAMPOLINE_SIZE+4(%r10), %esi /* Load fun */
|
||||||
|
movl FFI_TRAMPOLINE_SIZE+8(%r10), %edx /* Load user_data */
|
||||||
|
#else
|
||||||
|
movq FFI_TRAMPOLINE_SIZE(%r10), %rdi /* Load cif */
|
||||||
|
movq FFI_TRAMPOLINE_SIZE+8(%r10), %rsi /* Load fun */
|
||||||
|
movq FFI_TRAMPOLINE_SIZE+16(%r10), %rdx /* Load user_data */
|
||||||
|
#endif
|
||||||
.Ldo_closure:
|
.Ldo_closure:
|
||||||
leaq ffi_closure_OFS_RVALUE(%rsp), %rcx /* Load rvalue */
|
leaq ffi_closure_OFS_RVALUE(%rsp), %rcx /* Load rvalue */
|
||||||
movq %rsp, %r8 /* Load reg_args */
|
movq %rsp, %r8 /* Load reg_args */
|
||||||
@@ -407,9 +413,15 @@ ffi_go_closure_unix64:
|
|||||||
movq %r8, ffi_closure_OFS_G+0x20(%rsp)
|
movq %r8, ffi_closure_OFS_G+0x20(%rsp)
|
||||||
movq %r9, ffi_closure_OFS_G+0x28(%rsp)
|
movq %r9, ffi_closure_OFS_G+0x28(%rsp)
|
||||||
|
|
||||||
|
#ifdef __ILP32__
|
||||||
|
movl 4(%r10), %edi /* Load cif */
|
||||||
|
movl 8(%r10), %esi /* Load fun */
|
||||||
|
movl %r10d, %edx /* Load closure (user_data) */
|
||||||
|
#else
|
||||||
movq 8(%r10), %rdi /* Load cif */
|
movq 8(%r10), %rdi /* Load cif */
|
||||||
movq 16(%r10), %rsi /* Load fun */
|
movq 16(%r10), %rsi /* Load fun */
|
||||||
movq %r10, %rdx /* Load closure (user_data) */
|
movq %r10, %rdx /* Load closure (user_data) */
|
||||||
|
#endif
|
||||||
jmp .Ldo_closure
|
jmp .Ldo_closure
|
||||||
|
|
||||||
cfi_endproc
|
cfi_endproc
|
||||||
|
|||||||
Reference in New Issue
Block a user