Index: ffcall/callback/trampoline_r/trampoline.c =================================================================== RCS file: /sources/libffcall/ffcall/callback/trampoline_r/trampoline.c,v retrieving revision 1.35 diff -u -r1.35 trampoline.c --- ffcall/callback/trampoline_r/trampoline.c 27 Apr 2006 20:03:23 -0000 1.35 +++ ffcall/callback/trampoline_r/trampoline.c 16 Feb 2008 12:58:49 -0000 @@ -233,8 +233,12 @@ /* Length and alignment of trampoline */ #ifdef __i386__ -#define TRAMP_LENGTH 16 -#define TRAMP_ALIGN 16 /* 4 for a i386, 16 for a i486 */ +# ifdef __APPLE__ +# define TRAMP_LENGTH 32 +# else +# define TRAMP_LENGTH 16 +# endif +# define TRAMP_ALIGN 16 /* 4 for a i386, 16 for a i486 */ #endif #ifdef __m68k__ #define TRAMP_LENGTH 14 @@ -332,7 +336,6 @@ { char* function; char* data; - #if !defined(CODE_EXECUTABLE) static long pagesize = 0; #if defined(EXECUTABLE_VIA_MMAP_DEVZERO) @@ -406,6 +409,41 @@ * But I doubt it's really worth it. */ #ifdef __i386__ +#if TRAMP_LENGTH == 32 + /* function: + * popl %ecx 59 + * mov (%esp), %edx 8b 14 24 + * and $0xfffffff0, %esp 83 e4 f0 + * sub $8, %esp 83 ec 08 + * pushl %edx 52 + * pushl $ 68 + * pushl %ecx 51 + * jmp
E9
- + * here: + * nop 90 + * nop 90 + * nop 90 + * nop 90 + */ + *(long *) (function + 0) = 0x24148b59; + *(long *) (function + 4) = 0x83f0e483; + *(long *) (function + 8) = 0x685208ec; + *(long *) (function + 12) = (long) data; + *(short *) (function + 16) = 0xE951; + *(long *) (function + 18) = (long) address - (long) (function + 22); + *(short *) (function + 22) = 0x90909090; /* nop nop nop nop, foralignment */ + *(long *) (function + 24) = 0x90909090; /* nop nop nop nop, foralignment */ + *(long *) (function + 28) = 0x90909090; /* nop nop nop nop, foralignment */ + #define is_tramp(function) \ + *(long *) (function + 0) == 0x24148b59 && \ + *(long *) (function + 4) == 0x83f0e483 && \ + *(unsigned short *) (function + 16) == 0xE951 + #define tramp_address(function) \ + *(long *) (function + 18) + (long) (function + 22) + #define tramp_data(function) \ + *(long *) (function + 12) + #else + /* function: * popl %ecx 59 * pushl $ 68 @@ -430,6 +468,7 @@ #define tramp_data(function) \ *(long *) (function + 2) #endif +#endif #ifdef __m68k__ #ifdef __NetBSD__ /* function: Index: ffcall/callback/vacall_r/vacall-i386-macro.S =================================================================== RCS file: /sources/libffcall/ffcall/callback/vacall_r/vacall-i386-macro.S,v retrieving revision 1.1 diff -u -r1.1 vacall-i386-macro.S --- ffcall/callback/vacall_r/vacall-i386-macro.S 11 Jun 2001 21:53:05 -0000 1.1 +++ ffcall/callback/vacall_r/vacall-i386-macro.S 16 Feb 2008 12:58:49 -0000 @@ -125,8 +125,10 @@ INSN2(mov,l ,X4 MEM_DISP(esp,4),R(esp)) INSN1(jmp,_ ,INDIR(R(ecx))) L44: +#ifndef __APPLE__ INSN2(add,l ,NUM(36),R(esp)) ret NUM(4) +#endif INSN2(add,l ,NUM(36),R(esp)) ret FUNEND() Index: ffcall/callback/vacall_r/vacall_r.h.in =================================================================== RCS file: /sources/libffcall/ffcall/callback/vacall_r/vacall_r.h.in,v retrieving revision 1.24 diff -u -r1.24 vacall_r.h.in --- ffcall/callback/vacall_r/vacall_r.h.in 2 Nov 2007 15:43:58 -0000 1.24 +++ ffcall/callback/vacall_r/vacall_r.h.in 16 Feb 2008 12:58:49 -0000 @@ -406,10 +406,18 @@ */ #define __VA_START_FLAGS \ __VA_STRUCT_RETURN | __VA_FLOAT_RETURN | __VA_STRUCT_ARGS | __VA_CLEANUP +#if defined(__i386__) && defined (__APPLE__) +#define __va_start(LIST,RETTYPE) \ + ((LIST)->flags = __VA_START_FLAGS, \ + (LIST)->rtype = (RETTYPE), \ + (LIST)->aptr += 12 \ + ) +#else #define __va_start(LIST,RETTYPE) \ ((LIST)->flags = __VA_START_FLAGS, \ (LIST)->rtype = (RETTYPE) \ ) +#endif #define va_start_void(LIST) __va_start(LIST,__VAvoid) #define va_start_char(LIST) __va_start(LIST,__VAchar) #define va_start_schar(LIST) __va_start(LIST,__VAschar)