On Saturday, January 18, 2014 16:29 CET, James Turner <ja...@calminferno.net> wrote: > On Sat, Jan 18, 2014 at 02:36:13PM +0100, Sebastian Reitenbach wrote: > > Hi, > > > > while playing with GNUstep on my lemote, I found libffi absolute > > unusable. Since the GNUstep stuff also supports to link against > > ffcall, I tried that. > > The patches make ffcall compile with lots of warnings suppressed, > > and allow the configure script of gnustep-base to pass the test > > (before it didn't) > > > > Running the regression tests of ffcall there, some tests are still failing. > > However, I enabled devel/clisp on mips64, the only consumer for > > ffcall, and with that I was at least able to run a simple hello world. > > > > Is the patch OK? > > > > Sebastian > > > > > > Hi Sebastian, > > You got farther then I original did when I attempted to get ffcall and > clisp working on mips64el [0]. However, avcall still fails 2 tests, > callback/trampoline_r tests fail with a SIGILL and vacall tests core dump. > > One plus trampoline tests now pass! > > It's good to here clisp can run a simple hello world, but I believe I > was in the same boat. > > How does make test fair on clisp? I would run into the following error, > which seems to relate to ffcall. > > (TYPE-OF (SETQ CALLBACKF (WITH-C-VAR (X 'IDFUN #'CALLBACK) X))) > Bus error (core dumped).
It's there with illegal instruction, (core dumped). However, I need to do first tests on my mips64 box. Then have to look again for mips64el. After a closer look, and reading a bit up about mips64el, I think at least, I got an idea, for example look at: callback/trampoline_r/trampoline.c The processor instructions there for mips is written with big endian, but mips64el is little endian. Maybe its just a matter of #ifdef __mips64el__ and then reversing the instructions and being done. Look at the comment /* What about big endian / little endian ?? */ I guess in other files same stuff might be the case. Could this just be the case, does that makes sense? Cheers, Sebastian > > [0] http://marc.info/?l=openbsd-ports&m=135718006608319&w=2 > > > Index: Makefile > > =================================================================== > > RCS file: /cvs/ports/devel/ffcall/Makefile,v > > retrieving revision 1.22 > > diff -u -p -u -r1.22 Makefile > > --- Makefile 21 Mar 2013 08:45:14 -0000 1.22 > > +++ Makefile 18 Jan 2014 13:29:32 -0000 > > @@ -7,9 +7,9 @@ ONLY_FOR_ARCHS= alpha amd64 hppa i386 mi > > COMMENT= foreign function call libraries > > > > DISTNAME= ffcall-1.10 > > -REVISION = 1 > > -SHARED_LIBS= avcall 1.0 \ > > - callback 1.0 > > +REVISION = 2 > > +SHARED_LIBS= avcall 1.1 \ > > + callback 1.1 > > CATEGORIES= devel > > MASTER_SITES= http://www.haible.de/bruno/gnu/ \ > > ftp://ftp.ilog.fr/pub/Users/haible/gnu/ > > Index: patches/patch-avcall_avcall_h_in > > =================================================================== > > RCS file: /cvs/ports/devel/ffcall/patches/patch-avcall_avcall_h_in,v > > retrieving revision 1.1 > > diff -u -p -u -r1.1 patch-avcall_avcall_h_in > > --- patches/patch-avcall_avcall_h_in 23 Sep 2010 13:38:33 -0000 > > 1.1 > > +++ patches/patch-avcall_avcall_h_in 18 Jan 2014 13:29:32 -0000 > > @@ -1,6 +1,54 @@ > > $OpenBSD: patch-avcall_avcall_h_in,v 1.1 2010/09/23 13:38:33 joshe Exp $ > > ---- avcall/avcall.h.in.orig Mon Jan 26 06:58:41 2004 > > -+++ avcall/avcall.h.in Sat Apr 25 16:17:43 2009 > > + > > +try fix mips64el > > + > > +--- avcall/avcall.h.in.orig Mon Jan 26 15:58:41 2004 > > ++++ avcall/avcall.h.in Tue Jan 14 20:29:21 2014 > > +@@ -367,7 +367,7 @@ typedef struct > > + __avword* iaptr; > > + __avword iargs[6]; > > + #endif > > +-#if defined(__mips__) && !defined(__mipsn32__) > > ++#if defined(__mips__) && !defined(__mipsn32__) && !defined(__mips64__) > > + /* store the floating-point arguments in an extra array */ > > + int anum; > > + double floatarg[2]; > > +@@ -447,7 +447,7 @@ typedef struct > > + #define __av_start1(LIST) \ > > + (LIST).aptr = &(LIST).args[0], > > + #endif > > +-#if defined(__mips__) && !defined(__mipsn32__) > > ++#if defined(__mips__) && !defined(__mipsn32__) && !defined(__mips64__) > > + #define __av_start1(LIST) \ > > + (LIST).anum = 0, > > \ > > + (LIST).aptr = &(LIST).args[0], > > +@@ -606,7 +606,7 @@ typedef struct > > + #define __av_start_struct3(LIST) \ > > + 0 > > + #endif > > +-#if defined(__mips__) && !defined(__mipsn32__) > > ++#if defined(__mips__) && !defined(__mipsn32__) && !defined(__mips64__) > > + #define __av_reg_struct_return(LIST,TYPE_SIZE,TYPE_SPLITTABLE) \ > > + ((TYPE_SIZE) == 1 || (TYPE_SIZE) == 2 || (TYPE_SIZE) == 4) > > + /* Test __AV_SMALL_STRUCT_RETURN instead of __AV_REGISTER_STRUCT_RETURN. > > */ > > +@@ -840,7 +840,7 @@ typedef struct > > + > > + #endif > > + > > +-#if defined(__mips__) && !defined(__mipsn32__) > > ++#if defined(__mips__) && !defined(__mipsn32__) && !defined(__mips64__) > > + > > + /* Up to 2 leading float or double non-varargs args can be passed in > > + * float registers, but we also push them into the corresponding int > > +@@ -1145,7 +1145,7 @@ typedef struct > > + 0))) > > + #endif > > + /* small structures < 1 word are adjusted depending on compiler */ > > +-#if defined(__mips__) && !defined(__mipsn32__) > > ++#if defined(__mips__) && !defined(__mipsn32__) && !defined(__mips64__) > > + #define > > __av_struct_leftadjusted(LIST,TYPE,TYPE_SIZE,TYPE_ALIGN,ASSIGN,VAL) \ > > + (((LIST).aptr = \ > > + (__avword*)(((__avword)(LIST).aptr+(TYPE_SIZE)+(TYPE_ALIGN)-1) & > > -(long)(TYPE_ALIGN)))\ > > @@ -1307,8 +1307,9 @@ typedef struct > > ? -1 : > > (ASSIGN(TYPE,TYPE_SIZE,TYPE_ALIGN,(void*)((__avword)(LIST).aptr-(TYPE_SIZE)),VAL),\ > > (LIST).aptr = > > (__avword*)(((__avword)(LIST).aptr+sizeof(__avword)-1) & > > -(long)sizeof(__avword)),\ > > Index: patches/patch-callback_trampoline_r_test1_c > > =================================================================== > > RCS file: > > /cvs/ports/devel/ffcall/patches/patch-callback_trampoline_r_test1_c,v > > retrieving revision 1.1 > > diff -u -p -u -r1.1 patch-callback_trampoline_r_test1_c > > --- patches/patch-callback_trampoline_r_test1_c 23 Aug 2010 14:16:09 > > -0000 1.1 > > +++ patches/patch-callback_trampoline_r_test1_c 18 Jan 2014 13:29:32 > > -0000 > > @@ -1,7 +1,21 @@ > > $OpenBSD: patch-callback_trampoline_r_test1_c,v 1.1 2010/08/23 14:16:09 > > jasper Exp $ > > ---- callback/trampoline_r/test1.c.orig Sun Apr 26 06:46:30 2009 > > -+++ callback/trampoline_r/test1.c Sun Apr 26 06:46:30 2009 > > -@@ -70,7 +70,7 @@ register void* env __asm__("%r29"); > > +--- callback/trampoline_r/test1.c.orig Mon Jan 26 15:59:26 2004 > > ++++ callback/trampoline_r/test1.c Fri Jan 17 23:33:22 2014 > > +@@ -48,12 +48,9 @@ int f (x) > > + #ifdef __m68k__ > > + register void* env __asm__("a0"); > > + #endif > > +-#ifdef __mips__ > > ++#if defined(__mips__) || defined(__mips64__) > > + register void* env __asm__("$2"); > > + #endif > > +-#ifdef __mips64__ > > +-register void* env __asm__("$2"); > > +-#endif > > + #if defined(__sparc__) && !defined(__sparc64__) > > + register void* env __asm__("%g2"); > > + #endif > > +@@ -70,7 +67,7 @@ register void* env __asm__("%r29"); > > register void* env __asm__("r12"); > > #endif > > #ifdef __rs6000__ > > Index: patches/patch-callback_trampoline_r_trampoline_c > > =================================================================== > > RCS file: > > /cvs/ports/devel/ffcall/patches/patch-callback_trampoline_r_trampoline_c,v > > retrieving revision 1.3 > > diff -u -p -u -r1.3 patch-callback_trampoline_r_trampoline_c > > --- patches/patch-callback_trampoline_r_trampoline_c 23 Sep 2010 > > 13:38:33 -0000 1.3 > > +++ patches/patch-callback_trampoline_r_trampoline_c 18 Jan 2014 > > 13:29:32 -0000 > > @@ -7,8 +7,8 @@ stack instead. > > > > Also fix powerpc and mips64. > > > > ---- callback/trampoline_r/trampoline.c.orig Mon Jan 26 07:00:05 2004 > > -+++ callback/trampoline_r/trampoline.c Fri Jul 30 14:34:10 2010 > > +--- callback/trampoline_r/trampoline.c.orig Mon Jan 26 16:00:05 2004 > > ++++ callback/trampoline_r/trampoline.c Wed Jan 15 09:14:02 2014 > > @@ -21,7 +21,7 @@ > > #endif > > #endif > > @@ -18,7 +18,7 @@ Also fix powerpc and mips64. > > #define __rs6000netbsd__ > > #else > > #if !defined(_AIX) > > -@@ -196,8 +196,12 @@ extern RETGETPAGESIZETYPE getpagesize (); > > +@@ -196,12 +196,16 @@ extern RETGETPAGESIZETYPE getpagesize (); > > #ifdef linux > > #include <asm/cachectl.h> > > #else > > @@ -27,11 +27,24 @@ Also fix powerpc and mips64. > > +#else > > #ifdef HAVE_SYS_CACHECTL_H > > #include <sys/cachectl.h> > > + #endif > > + #endif > > + #endif > > + #endif > > +#endif > > + #ifdef __m88k__ > > + #include <sys/syslocal.h> > > #endif > > +@@ -242,7 +246,7 @@ extern void __TR_clear_cache(); > > + #define TRAMP_LENGTH 14 > > + #define TRAMP_ALIGN 16 > > #endif > > +-#if defined(__mips__) && !defined(__mipsn32__) > > ++#if defined(__mips__) && !defined(__mipsn32__) && !defined(__mips64__) > > + #define TRAMP_LENGTH 24 > > + #define TRAMP_ALIGN 4 > > #endif > > -@@ -259,11 +259,11 @@ extern void __TR_clear_cache(); > > +@@ -259,11 +263,11 @@ extern void __TR_clear_cache(); > > #define TRAMP_ALIGN 8 > > #endif > > #if defined(__sparc__) && !defined(__sparc64__) > > @@ -45,7 +58,16 @@ Also fix powerpc and mips64. > > #define TRAMP_ALIGN 16 > > #endif > > #ifdef __alpha__ > > -@@ -614,52 +614,64 @@ __TR_function alloc_trampoline_r (address, data0, > > data > > +@@ -459,7 +463,7 @@ __TR_function alloc_trampoline_r (address, data0, data > > + #define tramp_data(function) \ > > + *(long *) (function + 2) > > + #endif > > +-#if defined(__mips__) && !defined(__mipsn32__) > > ++#if defined(__mips__) && !defined(__mipsn32__) && !defined(__mips64__) > > + /* function: > > + * li $2,<data>&0xffff0000 3C 02 hi16(<data>) > > + * ori $2,$2,<data>&0xffff 34 42 lo16(<data>) > > +@@ -614,52 +618,64 @@ __TR_function alloc_trampoline_r (address, data0, > > data > > /* function: > > * sethi %hi(<data>),%g2 05000000 | (<data> >> 10) > > * sethi %hi(<address>),%g1 03000000 | (<address> >> 10) > > Index: patches/patch-callback_vacall_r_vacall_r_h_in > > =================================================================== > > RCS file: > > /cvs/ports/devel/ffcall/patches/patch-callback_vacall_r_vacall_r_h_in,v > > retrieving revision 1.1 > > diff -u -p -u -r1.1 patch-callback_vacall_r_vacall_r_h_in > > --- patches/patch-callback_vacall_r_vacall_r_h_in 23 Feb 2010 20:11:15 > > -0000 1.1 > > +++ patches/patch-callback_vacall_r_vacall_r_h_in 18 Jan 2014 13:29:32 > > -0000 > > @@ -3,8 +3,8 @@ $OpenBSD: patch-callback_vacall_r_vacall > > On OpenBSD the mips64(el) architectures define both __mips__ and > > __mips64__, > > which leads to confusion and redeclarations here. > > > > ---- callback/vacall_r/vacall_r.h.in.orig Thu Feb 11 23:44:38 2010 > > -+++ callback/vacall_r/vacall_r.h.in Thu Feb 11 23:48:22 2010 > > +--- callback/vacall_r/vacall_r.h.in.orig Wed Jun 2 21:18:12 2004 > > ++++ callback/vacall_r/vacall_r.h.in Tue Jan 14 20:31:43 2014 > > @@ -395,7 +395,7 @@ typedef struct > > float farg[4]; > > double darg[2]; > > @@ -46,7 +46,7 @@ which leads to confusion and redeclarati > > #define __va_align_double(LIST) > > #endif > > -#if defined(__mips__) && !defined(__mipsn32__) || defined(__m88k__) > > -+#if defined(__mips__) && !defined(__mipsn32__) || defined(__m88k__) && > > !defined(__mips64__) > > ++#if defined(__mips__) && !defined(__mipsn32__) && !defined(__mips64__) || > > defined(__m88k__) > > /* __VA_alignof(double) > sizeof(__vaword) */ > > #define __va_align_double(LIST) \ > > (LIST)->aptr = ((LIST)->aptr + sizeof(double)-1) & > > -(long)sizeof(double), > > Index: patches/patch-trampoline_trampoline_c > > =================================================================== > > RCS file: /cvs/ports/devel/ffcall/patches/patch-trampoline_trampoline_c,v > > retrieving revision 1.1 > > diff -u -p -u -r1.1 patch-trampoline_trampoline_c > > --- patches/patch-trampoline_trampoline_c 23 Feb 2010 20:11:15 -0000 > > 1.1 > > +++ patches/patch-trampoline_trampoline_c 18 Jan 2014 13:29:32 -0000 > > @@ -1,7 +1,7 @@ > > $OpenBSD: patch-trampoline_trampoline_c,v 1.1 2010/02/23 20:11:15 jasper > > Exp $ > > ---- trampoline/trampoline.c.orig Thu Feb 11 23:38:13 2010 > > -+++ trampoline/trampoline.c Thu Feb 11 23:40:59 2010 > > -@@ -192,8 +192,12 @@ extern RETGETPAGESIZETYPE getpagesize (); > > +--- trampoline/trampoline.c.orig Mon Jan 26 16:02:10 2004 > > ++++ trampoline/trampoline.c Wed Jan 15 08:53:57 2014 > > +@@ -192,12 +192,16 @@ extern RETGETPAGESIZETYPE getpagesize (); > > #ifdef linux > > #include <asm/cachectl.h> > > #else > > @@ -10,7 +10,29 @@ $OpenBSD: patch-trampoline_trampoline_c, > > +#else > > #ifdef HAVE_SYS_CACHECTL_H > > #include <sys/cachectl.h> > > + #endif > > + #endif > > + #endif > > + #endif > > +#endif > > + #ifdef __m88k__ > > + #include <sys/syslocal.h> > > + #endif > > +@@ -238,7 +242,7 @@ extern void __TR_clear_cache(); > > + #define TRAMP_LENGTH 18 > > + #define TRAMP_ALIGN 16 > > #endif > > +-#if defined(__mips__) && !defined(__mipsn32__) > > ++#if defined(__mips__) && !defined(__mipsn32__) && !defined(__mips64__) > > + #define TRAMP_LENGTH 32 > > + #define TRAMP_ALIGN 4 > > #endif > > +@@ -435,7 +439,7 @@ __TR_function alloc_trampoline (address, variable, dat > > + #define tramp_data(function) \ > > + *(long *) (function + 2) > > #endif > > +-#if defined(__mips__) && !defined(__mipsn32__) > > ++#if defined(__mips__) && !defined(__mipsn32__) && !defined(__mips64__) > > + /* function: > > + * li $2,<data>&0xffff0000 3C 02 hi16(<data>) > > + * ori $2,$2,<data>&0xffff 34 42 lo16(<data>) > > > > -- > James Turner