Index: libffi/ChangeLog
===================================================================
--- libffi.orig/ChangeLog
+++ libffi/ChangeLog
@@ -1,3 +1,13 @@
+2012-03-19  Alan Hourihane  <alanh@fairlite.co.uk>
+
+	* src/m68k/ffi.c: Add MINT support.
+	* src/m68k/sysv.S: Ditto.
+
+2012-03-19  chennam  <csit@axway.com>
+
+	* src/powerpc/ffi_darwin.c (ffi_prep_closure_loc): Fix AIX closure
+	support.
+
 2012-04-02  Peter Bergner  <bergner@vnet.ibm.com>
 
 	* src/powerpc/ffi.c (ffi_prep_args_SYSV): Declare double_tmp.
@@ -6,11 +16,6 @@
 	(ffi_call): Silence possibly undefined warning.
 	(ffi_closure_helper_SYSV): Declare variable type.
 
-2012-03-19  chennam  <csit@axway.com>
-
-	* src/powerpc/ffi_darwin.c (ffi_prep_closure_loc): Fix AIX closure
-	support.
-
 2012-03-13  Kaz Kojima  <kkojima@gcc.gnu.org>
 
 	* src/sh/ffi.c (ffi_prep_closure_loc): Don't ASSERT ABI test,
Index: libffi/src/m68k/ffi.c
===================================================================
--- libffi.orig/src/m68k/ffi.c
+++ libffi/src/m68k/ffi.c
@@ -1,7 +1,7 @@
 /* -----------------------------------------------------------------------
    ffi.c
-   
-   m68k Foreign Function Interface 
+
+   m68k Foreign Function Interface
    ----------------------------------------------------------------------- */
 
 #include <ffi.h>
@@ -13,8 +13,13 @@
 void rtems_cache_flush_multiple_data_lines( const void *, size_t );
 #else
 #include <sys/syscall.h>
+#ifdef __MINT__
+#include <mint/mintbind.h>
+#include <mint/ssystem.h>
+#else
 #include <asm/cachectl.h>
 #endif
+#endif
 
 void ffi_call_SYSV (extended_cif *,
 		    unsigned, unsigned,
@@ -39,8 +44,12 @@ ffi_prep_args (void *stack, extended_cif
 
   argp = stack;
 
-  if (ecif->cif->rtype->type == FFI_TYPE_STRUCT
-      && !ecif->cif->flags)
+  if (
+#ifdef __MINT__
+      (ecif->cif->rtype->type == FFI_TYPE_LONGDOUBLE) ||
+#endif
+      (((ecif->cif->rtype->type == FFI_TYPE_STRUCT)
+        && !ecif->cif->flags)))
     struct_value_ptr = ecif->rvalue;
   else
     struct_value_ptr = NULL;
@@ -51,12 +60,12 @@ ffi_prep_args (void *stack, extended_cif
        i != 0;
        i--, p_arg++)
     {
-      size_t z;
+      size_t z = (*p_arg)->size;
+      int type = (*p_arg)->type;
 
-      z = (*p_arg)->size;
       if (z < sizeof (int))
 	{
-	  switch ((*p_arg)->type)
+	  switch (type)
 	    {
 	    case FFI_TYPE_SINT8:
 	      *(signed int *) argp = (signed int) *(SINT8 *) *p_argv;
@@ -75,7 +84,14 @@ ffi_prep_args (void *stack, extended_cif
 	      break;
 
 	    case FFI_TYPE_STRUCT:
+#ifdef __MINT__
+	      if (z == 1 || z == 2)
+		memcpy (argp + 2, *p_argv, z);
+              else
+		memcpy (argp, *p_argv, z);
+#else
 	      memcpy (argp + sizeof (int) - z, *p_argv, z);
+#endif
 	      break;
 
 	    default:
@@ -120,17 +136,34 @@ ffi_prep_cif_machdep (ffi_cif *cif)
       break;
 
     case FFI_TYPE_STRUCT:
+      if (cif->rtype->elements[0]->type == FFI_TYPE_STRUCT &&
+          cif->rtype->elements[1])
+        {
+          cif->flags = 0;
+          break;
+        }
+
       switch (cif->rtype->size)
 	{
 	case 1:
+#ifdef __MINT__
+	  cif->flags = CIF_FLAGS_STRUCT2;
+#else
 	  cif->flags = CIF_FLAGS_STRUCT1;
+#endif
 	  break;
 	case 2:
 	  cif->flags = CIF_FLAGS_STRUCT2;
 	  break;
+#ifdef __MINT__
+	case 3:
+#endif
 	case 4:
 	  cif->flags = CIF_FLAGS_INT;
 	  break;
+#ifdef __MINT__
+	case 7:
+#endif
 	case 8:
 	  cif->flags = CIF_FLAGS_DINT;
 	  break;
@@ -150,7 +183,11 @@ ffi_prep_cif_machdep (ffi_cif *cif)
 
 #if (FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE)
     case FFI_TYPE_LONGDOUBLE:
+#ifdef __MINT__
+      cif->flags = 0;
+#else
       cif->flags = CIF_FLAGS_LDOUBLE;
+#endif
       break;
 #endif
 
@@ -218,6 +255,26 @@ ffi_prep_incoming_args_SYSV (char *stack
       size_t z;
 
       z = (*p_arg)->size;
+#ifdef __MINT__
+      if (cif->flags &&
+          cif->rtype->type == FFI_TYPE_STRUCT &&
+          (z == 1 || z == 2))
+ 	{
+	  *p_argv = (void *) (argp + 2);
+
+	  z = 4;
+	}
+      else
+      if (cif->flags &&
+          cif->rtype->type == FFI_TYPE_STRUCT &&
+          (z == 3 || z == 4))
+ 	{
+	  *p_argv = (void *) (argp);
+
+	  z = 4;
+	}
+      else
+#endif
       if (z <= 4)
 	{
 	  *p_argv = (void *) (argp + 4 - z);
@@ -267,14 +324,21 @@ ffi_prep_closure_loc (ffi_closure* closu
   *(unsigned short *)closure->tramp = 0x207c;
   *(void **)(closure->tramp + 2) = codeloc;
   *(unsigned short *)(closure->tramp + 6) = 0x4ef9;
-  if (cif->rtype->type == FFI_TYPE_STRUCT
-      && !cif->flags)
+
+  if (
+#ifdef __MINT__
+      (cif->rtype->type == FFI_TYPE_LONGDOUBLE) ||
+#endif
+      (((cif->rtype->type == FFI_TYPE_STRUCT)
+         && !cif->flags)))
     *(void **)(closure->tramp + 8) = ffi_closure_struct_SYSV;
   else
     *(void **)(closure->tramp + 8) = ffi_closure_SYSV;
 
 #ifdef __rtems__
   rtems_cache_flush_multiple_data_lines( codeloc, FFI_TRAMPOLINE_SIZE );
+#elif defined(__MINT__)
+  Ssystem(S_FLUSHCACHE, codeloc, FFI_TRAMPOLINE_SIZE);
 #else
   syscall(SYS_cacheflush, codeloc, FLUSH_SCOPE_LINE,
 	  FLUSH_CACHE_BOTH, FFI_TRAMPOLINE_SIZE);
@@ -286,4 +350,3 @@ ffi_prep_closure_loc (ffi_closure* closu
 
   return FFI_OK;
 }
-
Index: libffi/src/m68k/sysv.S
===================================================================
--- libffi.orig/src/m68k/sysv.S
+++ libffi/src/m68k/sysv.S
@@ -1,6 +1,7 @@
 /* -----------------------------------------------------------------------
 	
-   sysv.S - Copyright (c) 1998, 2012 Andreas Schwab
+   sysv.S - Copyright (c) 2012 Alan Hourihane
+	    Copyright (c) 1998, 2012 Andreas Schwab
 	    Copyright (c) 2008 Red Hat, Inc. 
    
    m68k Foreign Function Interface 
@@ -42,13 +43,19 @@
 #define CFI_ENDPROC()
 #endif
 
+#ifdef __MINT__
+#define CALLFUNC(funcname) _ ## funcname
+#else
+#define CALLFUNC(funcname) funcname
+#endif
+
 	.text
 
-	.globl	ffi_call_SYSV
-	.type	ffi_call_SYSV,@function
+	.globl	CALLFUNC(ffi_call_SYSV)
+	.type	CALLFUNC(ffi_call_SYSV),@function
 	.align	4
 
-ffi_call_SYSV:
+CALLFUNC(ffi_call_SYSV):
 	CFI_STARTPROC()
 	link	%fp,#0
 	CFI_OFFSET(14,-8)
@@ -63,14 +70,18 @@ ffi_call_SYSV:
 	move.l	8(%fp),-(%sp)
 	pea	4(%sp)
 #if !defined __PIC__
-	jsr	ffi_prep_args
+	jsr	CALLFUNC(ffi_prep_args)
 #else
-	bsr.l	ffi_prep_args@PLTPC
+	bsr.l	CALLFUNC(ffi_prep_args@PLTPC)
 #endif
 	addq.l	#8,%sp	
 
 	| Pass pointer to struct value, if any
+#ifdef __MINT__
+	move.l	%d0,%a1
+#else
 	move.l	%a0,%a1
+#endif
 
 	| Call the function
 	move.l	24(%fp),%a0
@@ -142,7 +153,11 @@ retlongdouble:
 retpointer:
 	btst	#5,%d2
 	jbeq	retstruct1
+#ifdef __MINT__
+	move.l	%d0,(%a1)
+#else
 	move.l	%a0,(%a1)
+#endif
 	jbra	epilogue
 
 retstruct1:
@@ -162,13 +177,13 @@ epilogue:
 	unlk	%fp
 	rts
 	CFI_ENDPROC()
-	.size	ffi_call_SYSV,.-ffi_call_SYSV
+	.size	CALLFUNC(ffi_call_SYSV),.-CALLFUNC(ffi_call_SYSV)
 
-	.globl	ffi_closure_SYSV
-	.type	ffi_closure_SYSV, @function
+	.globl	CALLFUNC(ffi_closure_SYSV)
+	.type	CALLFUNC(ffi_closure_SYSV), @function
 	.align	4
 
-ffi_closure_SYSV:
+CALLFUNC(ffi_closure_SYSV):
 	CFI_STARTPROC()
 	link	%fp,#-12
 	CFI_OFFSET(14,-8)
@@ -178,9 +193,9 @@ ffi_closure_SYSV:
 	pea	-12(%fp)
 	move.l	%a0,-(%sp)
 #if !defined __PIC__
-	jsr	ffi_closure_SYSV_inner
+	jsr	CALLFUNC(ffi_closure_SYSV_inner)
 #else
-	bsr.l	ffi_closure_SYSV_inner@PLTPC
+	bsr.l	CALLFUNC(ffi_closure_SYSV_inner@PLTPC)
 #endif
 
 	lsr.l	#1,%d0
@@ -240,13 +255,13 @@ ffi_closure_SYSV:
 	jra	.Lcls_epilogue
 	CFI_ENDPROC()
 
-	.size	ffi_closure_SYSV,.-ffi_closure_SYSV
+	.size	CALLFUNC(ffi_closure_SYSV),.-CALLFUNC(ffi_closure_SYSV)
 
-	.globl	ffi_closure_struct_SYSV
-	.type	ffi_closure_struct_SYSV, @function
+	.globl	CALLFUNC(ffi_closure_struct_SYSV)
+	.type	CALLFUNC(ffi_closure_struct_SYSV), @function
 	.align	4
 
-ffi_closure_struct_SYSV:
+CALLFUNC(ffi_closure_struct_SYSV):
 	CFI_STARTPROC()
 	link	%fp,#0
 	CFI_OFFSET(14,-8)
@@ -256,14 +271,14 @@ ffi_closure_struct_SYSV:
 	move.l	%a1,-(%sp)
 	move.l	%a0,-(%sp)
 #if !defined __PIC__
-	jsr	ffi_closure_SYSV_inner
+	jsr	CALLFUNC(ffi_closure_SYSV_inner)
 #else
-	bsr.l	ffi_closure_SYSV_inner@PLTPC
+	bsr.l	CALLFUNC(ffi_closure_SYSV_inner@PLTPC)
 #endif
 	unlk	%fp
 	rts
 	CFI_ENDPROC()
-	.size	ffi_closure_struct_SYSV,.-ffi_closure_struct_SYSV
+	.size	CALLFUNC(ffi_closure_struct_SYSV),.-CALLFUNC(ffi_closure_struct_SYSV)
 
 #if defined __ELF__ && defined __linux__
 	.section	.note.GNU-stack,"",@progbits
Index: libffi/README
===================================================================
--- libffi.orig/README
+++ libffi/README
@@ -58,6 +58,7 @@ tested:
 | AVR32        | Linux            |
 | HPPA         | HPUX             |
 | IA-64        | Linux            |
+| M68K         | FreeMiNT         |
 | M68K         | RTEMS            |
 | MIPS         | IRIX             |
 | MIPS         | Linux            |
@@ -152,6 +153,7 @@ See the ChangeLog files for details.
 	Add thiscall, fastcall and MSVC cdecl support on Windows.
         Add Amiga and newer MacOS support.
 	Fix Octeon and MC68881 support.
+	Add m68k FreeMiNT support.
 	Fix code pessimizations.
         Lots of build fixes.
 
