This is the mail archive of the
libffi-discuss@sourceware.org
mailing list for the libffi project.
Re: libffi err_bad_abi excecution test fix
- From: Andrew Haley <aph at redhat dot com>
- To: libffi-discuss at sourceware dot org
- Cc: Duncan Simpson <dps at simpson dot demon dot co dot uk>
- Date: Sat, 05 Sep 2009 12:22:34 +0100
- Subject: Re: libffi err_bad_abi excecution test fix
- References: <4AA05E04.5060503@simpson.demon.co.uk>
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.
>
> 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;