summaryrefslogtreecommitdiffstats
path: root/package/libffi/libffi-arc-01-Add-ARC-support.patch
diff options
context:
space:
mode:
Diffstat (limited to 'package/libffi/libffi-arc-01-Add-ARC-support.patch')
-rw-r--r--package/libffi/libffi-arc-01-Add-ARC-support.patch560
1 files changed, 0 insertions, 560 deletions
diff --git a/package/libffi/libffi-arc-01-Add-ARC-support.patch b/package/libffi/libffi-arc-01-Add-ARC-support.patch
deleted file mode 100644
index c39a3e70de..0000000000
--- a/package/libffi/libffi-arc-01-Add-ARC-support.patch
+++ /dev/null
@@ -1,560 +0,0 @@
-From 5a2352c476b501ecbd3c7ef3ef3e02c24ce5a449 Mon Sep 17 00:00:00 2001
-From: Mischa Jonker <mjonker@synopsys.com>
-Date: Mon, 10 Jun 2013 16:19:33 +0200
-Subject: [PATCH 1/3] Add ARC support
-
-This adds support for the ARC architecture to libffi. DesignWare ARC
-is a family of processors from Synopsys, Inc.
-
-This patch has been tested on a little-endian system and passes
-the testsuite.
-
-Signed-off-by: Mischa Jonker <mjonker@synopsys.com>
----
- Makefile.am | 6 +-
- README | 1 +
- configure.ac | 5 +
- src/arc/arcompact.S | 135 ++++++++++++++++++++++++++
- src/arc/ffi.c | 268 ++++++++++++++++++++++++++++++++++++++++++++++++++++
- src/arc/ffitarget.h | 53 +++++++++++
- 6 files changed, 467 insertions(+), 1 deletion(-)
- create mode 100644 src/arc/arcompact.S
- create mode 100644 src/arc/ffi.c
- create mode 100644 src/arc/ffitarget.h
-
-diff --git a/Makefile.am b/Makefile.am
-index bf0156f..b57b2a8 100644
---- a/Makefile.am
-+++ b/Makefile.am
-@@ -9,7 +9,8 @@ SUBDIRS = include testsuite man
- EXTRA_DIST = LICENSE ChangeLog.v1 ChangeLog.libgcj configure.host \
- src/aarch64/ffi.c src/aarch64/ffitarget.h src/aarch64/sysv.S \
- build-ios.sh src/alpha/ffi.c src/alpha/osf.S \
-- src/alpha/ffitarget.h src/arm/ffi.c src/arm/sysv.S \
-+ src/alpha/ffitarget.h src/arc/ffi.c src/arc/arcompact.S \
-+ src/arc/ffitarget.h src/arm/ffi.c src/arm/sysv.S \
- src/arm/ffitarget.h src/avr32/ffi.c src/avr32/sysv.S \
- src/avr32/ffitarget.h src/cris/ffi.c src/cris/sysv.S \
- src/cris/ffitarget.h src/ia64/ffi.c src/ia64/ffitarget.h \
-@@ -170,6 +171,9 @@ endif
- if AARCH64
- nodist_libffi_la_SOURCES += src/aarch64/sysv.S src/aarch64/ffi.c
- endif
-+if ARC
-+nodist_libffi_la_SOURCES += src/arc/sysv.S src/arc/ffi.c
-+endif
- if ARM
- nodist_libffi_la_SOURCES += src/arm/sysv.S src/arm/ffi.c
- if FFI_EXEC_TRAMPOLINE_TABLE
-diff --git a/README b/README
-index 19156fe..d8e4e9e 100644
---- a/README
-+++ b/README
-@@ -54,6 +54,7 @@ tested:
- | AArch64 | Linux | GCC |
- | Alpha | Linux | GCC |
- | Alpha | Tru64 | GCC |
-+| ARC | Linux | GCC |
- | ARM | Linux | GCC |
- | ARM | iOS | GCC |
- | AVR32 | Linux | GCC |
-diff --git a/configure.ac b/configure.ac
-index 0dc0675..a26cb46 100644
---- a/configure.ac
-+++ b/configure.ac
-@@ -77,6 +77,10 @@ case "$host" in
- HAVE_LONG_DOUBLE='defined(__LONG_DOUBLE_128__)'
- ;;
-
-+ arc*-*-*)
-+ TARGET=ARC; TARGETDIR=arc
-+ ;;
-+
- arm*-*-*)
- TARGET=ARM; TARGETDIR=arm
- ;;
-@@ -289,6 +293,7 @@ AM_CONDITIONAL(POWERPC_AIX, test x$TARGET = xPOWERPC_AIX)
- AM_CONDITIONAL(POWERPC_DARWIN, test x$TARGET = xPOWERPC_DARWIN)
- AM_CONDITIONAL(POWERPC_FREEBSD, test x$TARGET = xPOWERPC_FREEBSD)
- AM_CONDITIONAL(AARCH64, test x$TARGET = xAARCH64)
-+AM_CONDITIONAL(ARC, test x$TARGET = xARC)
- AM_CONDITIONAL(ARM, test x$TARGET = xARM)
- AM_CONDITIONAL(AVR32, test x$TARGET = xAVR32)
- AM_CONDITIONAL(LIBFFI_CRIS, test x$TARGET = xLIBFFI_CRIS)
-diff --git a/src/arc/arcompact.S b/src/arc/arcompact.S
-new file mode 100644
-index 0000000..03715fd
---- /dev/null
-+++ b/src/arc/arcompact.S
-@@ -0,0 +1,135 @@
-+/* -----------------------------------------------------------------------
-+ arcompact.S - Copyright (c) 2013 Synposys, Inc. (www.synopsys.com)
-+
-+ ARCompact Foreign Function Interface
-+
-+ Permission is hereby granted, free of charge, to any person obtaining
-+ a copy of this software and associated documentation files (the
-+ ``Software''), to deal in the Software without restriction, including
-+ without limitation the rights to use, copy, modify, merge, publish,
-+ distribute, sublicense, and/or sell copies of the Software, and to
-+ permit persons to whom the Software is furnished to do so, subject to
-+ the following conditions:
-+
-+ The above copyright notice and this permission notice shall be included
-+ in all copies or substantial portions of the Software.
-+
-+ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS
-+ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-+ IN NO EVENT SHALL RENESAS TECHNOLOGY BE LIABLE FOR ANY CLAIM, DAMAGES OR
-+ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
-+ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-+ OTHER DEALINGS IN THE SOFTWARE.
-+ ----------------------------------------------------------------------- */
-+
-+#define LIBFFI_ASM
-+#include <fficonfig.h>
-+#include <ffi.h>
-+#ifdef HAVE_MACHINE_ASM_H
-+#include <machine/asm.h>
-+#else
-+#define CNAME(x) x
-+#define ENTRY(x) .globl CNAME(x)` .type CNAME(x),%function` CNAME(x):
-+#endif
-+
-+.text
-+
-+ /* R0: ffi_prep_args */
-+ /* R1: &ecif */
-+ /* R2: cif->bytes */
-+ /* R3: fig->flags */
-+ /* R4: ecif.rvalue */
-+ /* R5: fn */
-+ENTRY(ffi_call_ARCompact)
-+ /* Save registers. */
-+ st.a fp, [sp, -4] /* fp + 20, fp */
-+ push_s blink /* fp + 16, blink */
-+ st.a r4, [sp, -4] /* fp + 12, ecif.rvalue */
-+ push_s r3 /* fp + 8, fig->flags */
-+ st.a r5, [sp, -4] /* fp + 4, fn */
-+ push_s r2 /* fp + 0, cif->bytes */
-+ mov fp, sp
-+
-+ /* Make room for all of the new args. */
-+ sub sp, sp, r2
-+
-+ /* Place all of the ffi_prep_args in position. */
-+ /* ffi_prep_args(char *stack, extended_cif *ecif) */
-+ /* R1 already set. */
-+
-+ /* And call. */
-+ jl_s.d [r0]
-+ mov_s r0, sp
-+
-+ ld.ab r12, [fp, 4] /* cif->bytes */
-+ ld.ab r11, [fp, 4] /* fn */
-+
-+ /* Move first 8 parameters in registers... */
-+ ld_s r0, [sp]
-+ ld_s r1, [sp, 4]
-+ ld_s r2, [sp, 8]
-+ ld_s r3, [sp, 12]
-+ ld r4, [sp, 16]
-+ ld r5, [sp, 20]
-+ ld r6, [sp, 24]
-+ ld r7, [sp, 28]
-+
-+ /* ...and adjust the stack. */
-+ min r12, r12, 32
-+
-+ /* Call the function. */
-+ jl.d [r11]
-+ add sp, sp, r12
-+
-+ mov sp, fp
-+ pop_s r3 /* fig->flags, return type */
-+ pop_s r2 /* ecif.rvalue, pointer for return value */
-+
-+ /* If the return value pointer is NULL, assume no return value. */
-+ breq.d r2, 0, epilogue
-+ pop_s blink
-+
-+ /* Return INT. */
-+ brne r3, FFI_TYPE_INT, return_double
-+ b.d epilogue
-+ st_s r0, [r2]
-+
-+return_double:
-+ brne r3, FFI_TYPE_DOUBLE, epilogue
-+ st_s r0, [r2]
-+ st_s r1, [r2,4]
-+
-+epilogue:
-+ j_s.d [blink]
-+ ld.ab fp, [sp, 4]
-+
-+ENTRY(ffi_closure_ARCompact)
-+ st.a r0, [sp, -32]
-+ st_s r1, [sp, 4]
-+ st_s r2, [sp, 8]
-+ st_s r3, [sp, 12]
-+ st r4, [sp, 16]
-+ st r5, [sp, 20]
-+ st r6, [sp, 24]
-+ st r7, [sp, 28]
-+
-+ /* pointer to arguments */
-+ mov_s r2, sp
-+
-+ /* return value goes here */
-+ sub sp, sp, 8
-+ mov_s r1, sp
-+
-+ push_s blink
-+
-+ bl.d ffi_closure_inner_ARCompact
-+ mov_s r0, r8 /* codeloc, set by trampoline */
-+
-+ pop_s blink
-+
-+ /* set return value to r1:r0 */
-+ pop_s r0
-+ pop_s r1
-+ j_s.d [blink]
-+ add_s sp, sp, 32
-diff --git a/src/arc/ffi.c b/src/arc/ffi.c
-new file mode 100644
-index 0000000..32f82a7
---- /dev/null
-+++ b/src/arc/ffi.c
-@@ -0,0 +1,268 @@
-+/* -----------------------------------------------------------------------
-+ ffi.c - Copyright (c) 2013 Synopsys, Inc. (www.synopsys.com)
-+
-+ ARC Foreign Function Interface
-+
-+ Permission is hereby granted, free of charge, to any person obtaining
-+ a copy of this software and associated documentation files (the
-+ ``Software''), to deal in the Software without restriction, including
-+ without limitation the rights to use, copy, modify, merge, publish,
-+ distribute, sublicense, and/or sell copies of the Software, and to
-+ permit persons to whom the Software is furnished to do so, subject to
-+ the following conditions:
-+
-+ The above copyright notice and this permission notice shall be included
-+ in all copies or substantial portions of the Software.
-+
-+ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS
-+ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-+ IN NO EVENT SHALL RENESAS TECHNOLOGY BE LIABLE FOR ANY CLAIM, DAMAGES OR
-+ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
-+ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-+ OTHER DEALINGS IN THE SOFTWARE.
-+ ----------------------------------------------------------------------- */
-+
-+#include <ffi.h>
-+#include <ffi_common.h>
-+
-+#include <stdlib.h>
-+#include <stdint.h>
-+
-+#include <sys/cachectl.h>
-+
-+/* for little endian ARC, the code is in fact stored as mixed endian for
-+ performance reasons */
-+#if __BIG_ENDIAN__
-+#define CODE_ENDIAN(x) (x)
-+#else
-+#define CODE_ENDIAN(x) ( (((uint32_t) (x)) << 16) | (((uint32_t) (x)) >> 16))
-+#endif
-+
-+/* ffi_prep_args is called by the assembly routine once stack
-+ space has been allocated for the function's arguments. */
-+
-+void
-+ffi_prep_args (char *stack, extended_cif * ecif)
-+{
-+ unsigned int i;
-+ int tmp;
-+ void **p_argv;
-+ char *argp;
-+ ffi_type **p_arg;
-+
-+ tmp = 0;
-+ argp = stack;
-+
-+ if (ecif->cif->rtype->type == FFI_TYPE_STRUCT)
-+ {
-+ *(void **) argp = ecif->rvalue;
-+ argp += 4;
-+ }
-+
-+ p_argv = ecif->avalue;
-+
-+ for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types;
-+ (i != 0); i--, p_arg++)
-+ {
-+ size_t z;
-+ int alignment;
-+
-+ /* align alignment to 4 */
-+ alignment = (((*p_arg)->alignment - 1) | 3) + 1;
-+
-+ /* Align if necessary. */
-+ if ((alignment - 1) & (unsigned) argp)
-+ argp = (char *) ALIGN (argp, alignment);
-+
-+ z = (*p_arg)->size;
-+ if (z < sizeof (int))
-+ {
-+ z = sizeof (int);
-+
-+ switch ((*p_arg)->type)
-+ {
-+ case FFI_TYPE_SINT8:
-+ *(signed int *) argp = (signed int) *(SINT8 *) (*p_argv);
-+ break;
-+
-+ case FFI_TYPE_UINT8:
-+ *(unsigned int *) argp = (unsigned int) *(UINT8 *) (*p_argv);
-+ break;
-+
-+ case FFI_TYPE_SINT16:
-+ *(signed int *) argp = (signed int) *(SINT16 *) (*p_argv);
-+ break;
-+
-+ case FFI_TYPE_UINT16:
-+ *(unsigned int *) argp = (unsigned int) *(UINT16 *) (*p_argv);
-+ break;
-+
-+ case FFI_TYPE_STRUCT:
-+ memcpy (argp, *p_argv, (*p_arg)->size);
-+ break;
-+
-+ default:
-+ FFI_ASSERT (0);
-+ }
-+ }
-+ else if (z == sizeof (int))
-+ {
-+ *(unsigned int *) argp = (unsigned int) *(UINT32 *) (*p_argv);
-+ }
-+ else
-+ {
-+ if ((*p_arg)->type == FFI_TYPE_STRUCT)
-+ {
-+ memcpy (argp, *p_argv, z);
-+ }
-+ else
-+ {
-+ /* Double or long long 64bit. */
-+ memcpy (argp, *p_argv, z);
-+ }
-+ }
-+ p_argv++;
-+ argp += z;
-+ }
-+
-+ return;
-+}
-+
-+/* Perform machine dependent cif processing. */
-+ffi_status
-+ffi_prep_cif_machdep (ffi_cif * cif)
-+{
-+ /* Set the return type flag. */
-+ switch (cif->rtype->type)
-+ {
-+ case FFI_TYPE_VOID:
-+ cif->flags = (unsigned) cif->rtype->type;
-+ break;
-+
-+ case FFI_TYPE_STRUCT:
-+ cif->flags = (unsigned) cif->rtype->type;
-+ break;
-+
-+ case FFI_TYPE_SINT64:
-+ case FFI_TYPE_UINT64:
-+ case FFI_TYPE_DOUBLE:
-+ cif->flags = FFI_TYPE_DOUBLE;
-+ break;
-+
-+ case FFI_TYPE_FLOAT:
-+ default:
-+ cif->flags = FFI_TYPE_INT;
-+ break;
-+ }
-+
-+ return FFI_OK;
-+}
-+
-+extern void ffi_call_ARCompact (void (*)(char *, extended_cif *),
-+ extended_cif *, unsigned, unsigned,
-+ unsigned *, void (*fn) (void));
-+
-+void
-+ffi_call (ffi_cif * cif, void (*fn) (void), void *rvalue, void **avalue)
-+{
-+ extended_cif ecif;
-+
-+ ecif.cif = cif;
-+ ecif.avalue = avalue;
-+
-+ /* If the return value is a struct and we don't have
-+ a return value address then we need to make one. */
-+ if ((rvalue == NULL) && (cif->rtype->type == FFI_TYPE_STRUCT))
-+ {
-+ ecif.rvalue = alloca (cif->rtype->size);
-+ }
-+ else
-+ ecif.rvalue = rvalue;
-+
-+ switch (cif->abi)
-+ {
-+ case FFI_ARCOMPACT:
-+ ffi_call_ARCompact (ffi_prep_args, &ecif, cif->bytes,
-+ cif->flags, ecif.rvalue, fn);
-+ break;
-+
-+ default:
-+ FFI_ASSERT (0);
-+ break;
-+ }
-+}
-+
-+int
-+ffi_closure_inner_ARCompact (ffi_closure * closure, void *rvalue,
-+ ffi_arg * args)
-+{
-+ void **arg_area, **p_argv;
-+ ffi_cif *cif = closure->cif;
-+ char *argp = (char *) args;
-+ ffi_type **p_argt;
-+ int i;
-+
-+ arg_area = (void **) alloca (cif->nargs * sizeof (void *));
-+
-+ /* handle hidden argument */
-+ if (cif->flags == FFI_TYPE_STRUCT)
-+ {
-+ rvalue = *(void **) argp;
-+ argp += 4;
-+ }
-+
-+ p_argv = arg_area;
-+
-+ for (i = 0, p_argt = cif->arg_types; i < cif->nargs;
-+ i++, p_argt++, p_argv++)
-+ {
-+ size_t z;
-+ int alignment;
-+
-+ /* align alignment to 4 */
-+ alignment = (((*p_argt)->alignment - 1) | 3) + 1;
-+
-+ /* Align if necessary. */
-+ if ((alignment - 1) & (unsigned) argp)
-+ argp = (char *) ALIGN (argp, alignment);
-+
-+ z = (*p_argt)->size;
-+ *p_argv = (void *) argp;
-+ argp += z;
-+ }
-+
-+ (closure->fun) (cif, rvalue, arg_area, closure->user_data);
-+
-+ return cif->flags;
-+}
-+
-+extern void ffi_closure_ARCompact (void);
-+
-+ffi_status
-+ffi_prep_closure_loc (ffi_closure * closure, ffi_cif * cif,
-+ void (*fun) (ffi_cif *, void *, void **, void *),
-+ void *user_data, void *codeloc)
-+{
-+ uint32_t *tramp = (uint32_t *) & (closure->tramp[0]);
-+
-+ switch (cif->abi)
-+ {
-+ case FFI_ARCOMPACT:
-+ FFI_ASSERT (tramp == codeloc);
-+ tramp[0] = CODE_ENDIAN (0x200a1fc0); /* mov r8, pcl */
-+ tramp[1] = CODE_ENDIAN (0x20200f80); /* j [long imm] */
-+ tramp[2] = CODE_ENDIAN (ffi_closure_ARCompact);
-+ break;
-+
-+ default:
-+ return FFI_BAD_ABI;
-+ }
-+
-+ closure->cif = cif;
-+ closure->fun = fun;
-+ closure->user_data = user_data;
-+ cacheflush (codeloc, FFI_TRAMPOLINE_SIZE, BCACHE);
-+
-+ return FFI_OK;
-+}
-diff --git a/src/arc/ffitarget.h b/src/arc/ffitarget.h
-new file mode 100644
-index 0000000..bf8311b
---- /dev/null
-+++ b/src/arc/ffitarget.h
-@@ -0,0 +1,53 @@
-+/* -----------------------------------------------------------------------
-+ ffitarget.h - Copyright (c) 2012 Anthony Green
-+ Copyright (c) 2013 Synopsys, Inc. (www.synopsys.com)
-+ Target configuration macros for ARC.
-+
-+ Permission is hereby granted, free of charge, to any person obtaining
-+ a copy of this software and associated documentation files (the
-+ ``Software''), to deal in the Software without restriction, including
-+ without limitation the rights to use, copy, modify, merge, publish,
-+ distribute, sublicense, and/or sell copies of the Software, and to
-+ permit persons to whom the Software is furnished to do so, subject to
-+ the following conditions:
-+
-+ The above copyright notice and this permission notice shall be included
-+ in all copies or substantial portions of the Software.
-+
-+ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS
-+ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-+ IN NO EVENT SHALL RENESAS TECHNOLOGY BE LIABLE FOR ANY CLAIM, DAMAGES OR
-+ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
-+ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-+ OTHER DEALINGS IN THE SOFTWARE.
-+
-+ ----------------------------------------------------------------------- */
-+
-+#ifndef LIBFFI_TARGET_H
-+#define LIBFFI_TARGET_H
-+
-+#ifndef LIBFFI_H
-+#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead."
-+#endif
-+
-+/* ---- Generic type definitions ----------------------------------------- */
-+
-+#ifndef LIBFFI_ASM
-+typedef unsigned long ffi_arg;
-+typedef signed long ffi_sarg;
-+
-+typedef enum ffi_abi
-+{
-+ FFI_FIRST_ABI = 0,
-+ FFI_ARCOMPACT,
-+ FFI_LAST_ABI,
-+ FFI_DEFAULT_ABI = FFI_ARCOMPACT
-+} ffi_abi;
-+#endif
-+
-+#define FFI_CLOSURES 1
-+#define FFI_TRAMPOLINE_SIZE 12
-+#define FFI_NATIVE_RAW_API 0
-+
-+#endif
---
-1.9.0
-
OpenPOWER on IntegriCloud