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
 
 
 
 

Reply via email to