x86_64: Fixups for x32

This commit is contained in:
Richard Henderson
2014-10-27 13:41:39 -07:00
parent ebd82769de
commit 2e9dc16556
2 changed files with 19 additions and 6 deletions

View File

@@ -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;

View File

@@ -32,7 +32,7 @@
#include <ffi.h> #include <ffi.h>
#include <ffi_cfi.h> #include <ffi_cfi.h>
.text .text
/* ffi_call_unix64 (void *args, unsigned long bytes, unsigned flags, /* ffi_call_unix64 (void *args, unsigned long bytes, unsigned flags,
void *raddr, void (*fnaddr)(void)); void *raddr, void (*fnaddr)(void));
@@ -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