This is the mail archive of the libffi-discuss@sourceware.org mailing list for the libffi project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: libffi err_bad_abi excecution test fix


Andrew Haley wrote:
Forwarding upstream for consideration.

Andrew.

Duncan Simpson wrote:
I believe the patch below fixes the err_bad_abi execution tests on all
platforms. I have actually verified this on the x86_64 platform for
both 32 and 64 bit binaries. I do not have access to verify that my
fixes for other architectures are correct.
Thanks for this patch, Duncan. I think we can remove a couple more FFI_ASSERTs at the bottom as well. Let me tweak this and I'll apply to both repositories.

AG


Please Cc: comments to me because I do not subscribe to the
gcc-patches mailing list. I receive far too much email already.

Duncan Simpson (-:


--- libffi/ChangeLog.dist 2009-09-02 00:30:05.958626045 +0100 +++ libffi/ChangeLog 2009-09-04 00:48:32.986127555 +0100 @@ -1,3 +1,24 @@ +2009-08-03 Duncan Simpson <dps@simpson.demon.co.uk> + + * src/prep_cif.c: In ffi_prep_cif return FFI_BAD_ABI is the abi + parameter is not valid. + * src/x86/libffi64.c: In ffi_prep_closure_loc return FFI_BAD_ABI + if cif->abi is not a valid abi (tested on x86_64) + * src/alpha/ffi.c: ditto (not tested) + * src/arm/ffi.c: ditto (not tested) + * src/cris/ffi.c: ditto (not tested) + * src/frv/ffi.c: ditto (not tested) + * src/ia64/ffi.c: In ffi_prep_cloure_loc return FFI_BAD_ABI + instead of failing an assertion (not tested). + * src/m66k/ffi.c: ditto (not tested) + * src/mips/ffi.c: ditto (not tested) + * src/pa/ffi.c: ditto (not tested) + * src/powerpc/ffi.c: ditto (not tested) + * src/s390/ffi.c: ditto (not tested) + * src/sh/ffi.c: ditto (not tested) + * src/sh64/ffi.c: ditto (not tested) + * src/sparc/ffi.c: ditto (not tested) + 2009-08-24 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>

     * configure.ac (AC_PREREQ): Bump to 2.64.
--- libffi/src/mips/ffi.c.dist    2009-08-29 01:26:58.686124378 +0100
+++ libffi/src/mips/ffi.c    2009-09-02 18:05:16.990135433 +0100
@@ -574,9 +574,13 @@
   char *clear_location = (char *) codeloc;

 #if defined(FFI_MIPS_O32)
+  if (cif->abi != FFI_O32 && cif->abi != FFI_O32_SOFT_FLOAT)
+      return FFI_BAD_ABI;
   FFI_ASSERT(cif->abi == FFI_O32 || cif->abi == FFI_O32_SOFT_FLOAT);
   fn = ffi_closure_O32;
 #else /* FFI_MIPS_N32 */
+  if (cif->abi != FFI_N32 && cif->abi != FFI_N64)
+      return FFI_BAD_ABI;
   FFI_ASSERT(cif->abi == FFI_N32 || cif->abi == FFI_N64);
   fn = ffi_closure_N32;
 #endif /* FFI_MIPS_O32 */
--- libffi/src/sparc/ffi.c.dist    2009-08-29 01:26:59.110636528 +0100
+++ libffi/src/sparc/ffi.c    2009-09-02 18:16:50.266131344 +0100
@@ -447,6 +447,8 @@
 #ifdef SPARC64
   /* Trampoline address is equal to the closure address.  We take
advantage
      of that to reduce the trampoline size by 8 bytes. */
+  if (cif->abi != FFI_V9)
+    return FFI_BAD_ABIl
   FFI_ASSERT (cif->abi == FFI_V9);
   fn = (unsigned long) ffi_closure_v9;
   tramp[0] = 0x83414000;    /* rd    %pc, %g1    */
@@ -456,6 +458,8 @@
   *((unsigned long *) &tramp[4]) = fn;
 #else
   unsigned long ctx = (unsigned long) codeloc;
+  if (cif->abi != FFI_V8)
+    return FFI_BAD_ABIl
   FFI_ASSERT (cif->abi == FFI_V8);
   fn = (unsigned long) ffi_closure_v8;
   tramp[0] = 0x03000000 | fn >> 10;    /* sethi %hi(fn), %g1    */
--- libffi/src/sh/ffi.c.dist    2009-08-29 01:26:59.206126820 +0100
+++ libffi/src/sh/ffi.c    2009-09-02 18:15:30.382640181 +0100
@@ -463,6 +463,8 @@
   unsigned int *tramp;
   unsigned int insn;

+  if (cif->abi != FFI_GCC_SYSV)
+    return FFI_BAD_ABI;
   FFI_ASSERT (cif->abi == FFI_GCC_SYSV);

   tramp = (unsigned int *) &closure->tramp[0];
--- libffi/src/pa/ffi.c.dist    2009-08-29 01:26:58.534630514 +0100
+++ libffi/src/pa/ffi.c    2009-09-02 18:06:35.230132463 +0100
@@ -626,6 +626,8 @@
   UINT32 *tmp;
 #endif

+  if (cif->abi != FFI_PA32)
+      return FFI_BAD_ABI;
   FFI_ASSERT (cif->abi == FFI_PA32);

   /* Make a small trampoline that will branch to our
--- libffi/src/s390/ffi.c.dist    2009-08-29 01:26:58.438636691 +0100
+++ libffi/src/s390/ffi.c    2009-09-02 18:12:54.014145749 +0100
@@ -750,6 +750,8 @@
               void *user_data,
               void *codeloc)
 {
+  if (cif->abi != FFI_SYSV)
+    return FFI_BAD_ABI;
   FFI_ASSERT (cif->abi == FFI_SYSV);

 #ifndef __s390x__
--- libffi/src/alpha/ffi.c.dist    2009-09-04 00:06:11.686634778 +0100
+++ libffi/src/alpha/ffi.c    2009-09-04 00:06:21.262635864 +0100
@@ -177,6 +177,8 @@
               void *codeloc)
 {
   unsigned int *tramp;
+  if (cif->abi<=FFI_FIRST_ABI || cif->abi > FFI_DEFAULT_ABI)
+    return FFI_BAD_ABI;

   tramp = (unsigned int *) &closure->tramp[0];
   tramp[0] = 0x47fb0401;    /* mov $27,$1        */
--- libffi/src/frv/ffi.c.dist    2009-09-04 00:10:17.254128944 +0100
+++ libffi/src/frv/ffi.c    2009-09-04 00:13:07.638635251 +0100
@@ -259,6 +259,8 @@
   register void *got __asm__("gr15");
 #endif
   int i;
+  if (cif->abi != FFI_EABI)
+    return FFI_BAD_ABI;

fn = (unsigned long) ffi_closure_eabi;

--- libffi/src/prep_cif.c.dist    2009-09-04 00:38:46.514149189 +0100
+++ libffi/src/prep_cif.c    2009-09-04 00:47:32.930636373 +0100
@@ -92,6 +92,8 @@
   unsigned int i;
   ffi_type **ptr;

+  if (abi <= FFI_FIRST_ABI || abi > FFI_DEFAULT_ABI)
+    return FFI_BAD_ABI;
   FFI_ASSERT(cif != NULL);
   FFI_ASSERT((abi > FFI_FIRST_ABI) && (abi <= FFI_DEFAULT_ABI));

--- libffi/src/powerpc/ffi.c.dist    2009-08-29 01:26:57.814627263 +0100
+++ libffi/src/powerpc/ffi.c    2009-09-02 18:08:40.154128013 +0100
@@ -948,6 +948,8 @@
 #ifdef POWERPC64
   void **tramp = (void **) &closure->tramp[0];

+  if (cif->abi != FFI_LINUX64)
+    return FFI_BAD_ABI;
   FFI_ASSERT (cif->abi == FFI_LINUX64);
   /* Copy function address and TOC from ffi_closure_LINUX64.  */
   memcpy (tramp, (char *) ffi_closure_LINUX64, 16);
@@ -955,6 +957,8 @@
 #else
   unsigned int *tramp;

+  if (cif->abi != FFI_GCC_SYSV && cif->abi != FFI_SYSV)
+    return FFI_BAD_ABI;
   FFI_ASSERT (cif->abi == FFI_GCC_SYSV || cif->abi == FFI_SYSV);

   tramp = (unsigned int *) &closure->tramp[0];
--- libffi/src/powerpc/ffi_darwin.c.dist    2009-08-29
01:26:57.822630703 +0100
+++ libffi/src/powerpc/ffi_darwin.c    2009-09-02 18:10:20.642135172 +0100
@@ -581,8 +581,7 @@

default:

-      FFI_ASSERT(0);
-      break;
+      return FFI_BAD_ABI;
     }
   return FFI_OK;
 }
--- libffi/src/sh64/ffi.c.dist    2009-08-29 01:26:57.954649606 +0100
+++ libffi/src/sh64/ffi.c    2009-09-02 18:14:30.966136362 +0100
@@ -302,6 +302,8 @@
 {
   unsigned int *tramp;

+  if (cif->abi == FFI_GCC_SYSV)
+    return FFI_BAD_ABI;
   FFI_ASSERT (cif->abi == FFI_GCC_SYSV);

   tramp = (unsigned int *) &closure->tramp[0];
--- libffi/src/arm/ffi.c.dist    2009-08-29 01:26:57.658650933 +0100
+++ libffi/src/arm/ffi.c    2009-09-02 17:57:59.422131055 +0100
@@ -295,6 +295,8 @@
               void *user_data,
               void *codeloc)
 {
+  if (cif->abi != FFI_SYSV)
+    return FFI_BAD_ABI;
   FFI_ASSERT (cif->abi == FFI_SYSV);

   FFI_INIT_TRAMPOLINE (&closure->tramp[0], \
--- libffi/src/m68k/ffi.c.dist    2009-08-29 01:26:58.354638462 +0100
+++ libffi/src/m68k/ffi.c    2009-09-02 18:03:11.070637441 +0100
@@ -255,6 +255,8 @@
               void *user_data,
               void *codeloc)
 {
+  if (cif->abi != FFI_SYSV)
+      return FFI_BAD_ABI;
   FFI_ASSERT (cif->abi == FFI_SYSV);

   *(unsigned short *)closure->tramp = 0x207c;
--- libffi/src/x86/ffi64.c.dist    2009-08-29 01:26:58.182641857 +0100
+++ libffi/src/x86/ffi64.c    2009-09-03 23:45:40.134139291 +0100
@@ -442,6 +442,8 @@
               void *codeloc)
 {
   volatile unsigned short *tramp;
+  if (cif->abi<=FFI_FIRST_ABI || cif->abi > FFI_DEFAULT_ABI)
+    return FFI_BAD_ABI;

tramp = (volatile unsigned short *) &closure->tramp[0];

--- libffi/src/ia64/ffi.c.dist    2009-08-29 01:26:58.582632324 +0100
+++ libffi/src/ia64/ffi.c    2009-09-02 18:01:49.994135712 +0100
@@ -425,6 +425,8 @@
   struct ffi_ia64_trampoline_struct *tramp;
   struct ia64_fd *fd;

+  if (cif->abi != FFI_UNIX)
+      return FFI_BAD_ABI;
   FFI_ASSERT (cif->abi == FFI_UNIX);

tramp = (struct ffi_ia64_trampoline_struct *)closure->tramp;
--- libffi/src/cris/ffi.c.dist 2009-08-29 01:26:58.482635236 +0100
+++ libffi/src/cris/ffi.c 2009-09-02 17:58:13.890132060 +0100
@@ -368,6 +368,8 @@
void *codeloc)
{
void *innerfn = ffi_prep_closure_inner;
+ if (cif->abi != FFI_SYSV)
+ return FFI_BAD_ABI;
FFI_ASSERT (cif->abi == FFI_SYSV);
closure->cif = cif;
closure->user_data = user_data;



Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]