summaryrefslogtreecommitdiff
path: root/patches/avr32
diff options
context:
space:
mode:
Diffstat (limited to 'patches/avr32')
-rw-r--r--patches/avr32928
1 files changed, 0 insertions, 928 deletions
diff --git a/patches/avr32 b/patches/avr32
deleted file mode 100644
index e2d2cae..0000000
--- a/patches/avr32
+++ /dev/null
@@ -1,928 +0,0 @@
-Index: libffi/src/avr32/ffi.c
-===================================================================
---- /dev/null
-+++ libffi/src/avr32/ffi.c
-@@ -0,0 +1,421 @@
-+/* -----------------------------------------------------------------------
-+ ffi.c - Copyright (c) 2009 Bradley Smith <brad@brad-smith.co.uk>
-+
-+ AVR32 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 THE AUTHORS OR COPYRIGHT
-+ HOLDERS 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 <stdio.h>
-+#include <unistd.h>
-+#include <asm/unistd.h>
-+
-+/* #define DEBUG */
-+
-+extern void ffi_call_SYSV(void (*)(char *, extended_cif *), extended_cif *,
-+ unsigned int, unsigned int, unsigned int*, unsigned int,
-+ void (*fn)(void));
-+extern void ffi_closure_SYSV (ffi_closure *);
-+
-+unsigned int pass_struct_on_stack(ffi_type *type)
-+{
-+ if(type->type != FFI_TYPE_STRUCT)
-+ return 0;
-+
-+ if(type->alignment < type->size &&
-+ !(type->size == 4 || type->size == 8) &&
-+ !(type->size == 8 && type->alignment >= 4))
-+ return 1;
-+
-+ if(type->size == 3 || type->size == 5 || type->size == 6 ||
-+ type->size == 7)
-+ return 1;
-+
-+ return 0;
-+}
-+
-+/* ffi_prep_args is called by the assembly routine once stack space
-+ * has been allocated for the function's arguments
-+ *
-+ * This is annoyingly complex since we need to keep track of used
-+ * registers.
-+ */
-+
-+void ffi_prep_args(char *stack, extended_cif *ecif)
-+{
-+ unsigned int i;
-+ void **p_argv;
-+ ffi_type **p_arg;
-+ char *reg_base = stack;
-+ char *stack_base = stack + 20;
-+ unsigned int stack_offset = 0;
-+ unsigned int reg_mask = 0;
-+
-+ p_argv = ecif->avalue;
-+
-+ /* If cif->flags is struct then we know it's not passed in registers */
-+ if(ecif->cif->flags == FFI_TYPE_STRUCT)
-+ {
-+ *(void**)reg_base = ecif->rvalue;
-+ reg_mask |= 1;
-+ }
-+
-+ for(i = 0, p_arg = ecif->cif->arg_types; i < ecif->cif->nargs;
-+ i++, p_arg++)
-+ {
-+ size_t z = (*p_arg)->size;
-+ int alignment = (*p_arg)->alignment;
-+ int type = (*p_arg)->type;
-+ char *addr = 0;
-+
-+ if(z % 4 != 0)
-+ z += (4 - z % 4);
-+
-+ if(reg_mask != 0x1f)
-+ {
-+ if(pass_struct_on_stack(*p_arg))
-+ {
-+ addr = stack_base + stack_offset;
-+ stack_offset += z;
-+ }
-+ else if(z == sizeof(int))
-+ {
-+ char index = 0;
-+
-+ while((reg_mask >> index) & 1)
-+ index++;
-+
-+ addr = reg_base + (index * 4);
-+ reg_mask |= (1 << index);
-+ }
-+ else if(z == 2 * sizeof(int))
-+ {
-+ if(!((reg_mask >> 1) & 1))
-+ {
-+ addr = reg_base + 4;
-+ reg_mask |= (3 << 1);
-+ }
-+ else if(!((reg_mask >> 3) & 1))
-+ {
-+ addr = reg_base + 12;
-+ reg_mask |= (3 << 3);
-+ }
-+ }
-+ }
-+
-+ if(!addr)
-+ {
-+ addr = stack_base + stack_offset;
-+ stack_offset += z;
-+ }
-+
-+ if(type == FFI_TYPE_STRUCT && (*p_arg)->elements[1] == NULL)
-+ type = (*p_arg)->elements[0]->type;
-+
-+ switch(type)
-+ {
-+ case FFI_TYPE_UINT8:
-+ *(unsigned int *)addr = (unsigned int)*(UINT8 *)(*p_argv);
-+ break;
-+ case FFI_TYPE_SINT8:
-+ *(signed int *)addr = (signed int)*(SINT8 *)(*p_argv);
-+ break;
-+ case FFI_TYPE_UINT16:
-+ *(unsigned int *)addr = (unsigned int)*(UINT16 *)(*p_argv);
-+ break;
-+ case FFI_TYPE_SINT16:
-+ *(signed int *)addr = (signed int)*(SINT16 *)(*p_argv);
-+ break;
-+ default:
-+ memcpy(addr, *p_argv, z);
-+ }
-+
-+ p_argv++;
-+ }
-+
-+#ifdef DEBUG
-+ /* Debugging */
-+ for(i = 0; i < 5; i++)
-+ {
-+ if((reg_mask & (1 << i)) == 0)
-+ printf("r%d: (unused)\n", 12 - i);
-+ else
-+ printf("r%d: 0x%08x\n", 12 - i, ((unsigned int*)reg_base)[i]);
-+ }
-+
-+ for(i = 0; i < stack_offset / 4; i++)
-+ {
-+ printf("sp+%d: 0x%08x\n", i*4, ((unsigned int*)stack_base)[i]);
-+ }
-+#endif
-+}
-+
-+/* Perform machine dependent cif processing */
-+ffi_status ffi_prep_cif_machdep(ffi_cif *cif)
-+{
-+ /* Round the stack up to a multiple of 8 bytes. This isn't needed
-+ * everywhere, but it is on some platforms, and it doesn't harm
-+ * anything when it isn't needed. */
-+ cif->bytes = (cif->bytes + 7) & ~7;
-+
-+ /* Flag to indicate that he return value is in fact a struct */
-+ cif->rstruct_flag = 0;
-+
-+ /* Set the return type flag */
-+ switch(cif->rtype->type)
-+ {
-+ case FFI_TYPE_SINT8:
-+ case FFI_TYPE_UINT8:
-+ cif->flags = (unsigned)FFI_TYPE_UINT8;
-+ break;
-+ case FFI_TYPE_SINT16:
-+ case FFI_TYPE_UINT16:
-+ cif->flags = (unsigned)FFI_TYPE_UINT16;
-+ break;
-+ case FFI_TYPE_FLOAT:
-+ case FFI_TYPE_SINT32:
-+ case FFI_TYPE_UINT32:
-+ case FFI_TYPE_POINTER:
-+ cif->flags = (unsigned)FFI_TYPE_UINT32;
-+ break;
-+ case FFI_TYPE_DOUBLE:
-+ case FFI_TYPE_SINT64:
-+ case FFI_TYPE_UINT64:
-+ cif->flags = (unsigned)FFI_TYPE_UINT64;
-+ break;
-+ case FFI_TYPE_STRUCT:
-+ cif->rstruct_flag = 1;
-+ if(!pass_struct_on_stack(cif->rtype))
-+ {
-+ if(cif->rtype->size <= 1)
-+ cif->flags = (unsigned)FFI_TYPE_UINT8;
-+ else if(cif->rtype->size <= 2)
-+ cif->flags = (unsigned)FFI_TYPE_UINT16;
-+ else if(cif->rtype->size <= 4)
-+ cif->flags = (unsigned)FFI_TYPE_UINT32;
-+ else if(cif->rtype->size <= 8)
-+ cif->flags = (unsigned)FFI_TYPE_UINT64;
-+ else
-+ cif->flags = (unsigned)cif->rtype->type;
-+ }
-+ else
-+ cif->flags = (unsigned)cif->rtype->type;
-+ break;
-+ default:
-+ cif->flags = (unsigned)cif->rtype->type;
-+ break;
-+ }
-+
-+ return FFI_OK;
-+}
-+
-+void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue)
-+{
-+ extended_cif ecif;
-+
-+ unsigned int size = 0, i = 0;
-+ ffi_type **p_arg;
-+
-+ ecif.cif = cif;
-+ ecif.avalue = avalue;
-+
-+ for(i = 0, p_arg = cif->arg_types; i < cif->nargs; i++, p_arg++)
-+ size += (*p_arg)->size + (4 - (*p_arg)->size % 4);
-+
-+ /* If the return value is a struct and we don't have a return value
-+ * address then we need to make one */
-+
-+ /* If cif->flags is struct then it's not suitable for registers */
-+ if((rvalue == NULL) && (cif->flags == FFI_TYPE_STRUCT))
-+ ecif.rvalue = alloca(cif->rtype->size);
-+ else
-+ ecif.rvalue = rvalue;
-+
-+ switch(cif->abi)
-+ {
-+ case FFI_SYSV:
-+ ffi_call_SYSV(ffi_prep_args, &ecif, size, cif->flags,
-+ ecif.rvalue, cif->rstruct_flag, fn);
-+ break;
-+ default:
-+ FFI_ASSERT(0);
-+ break;
-+ }
-+}
-+
-+static void ffi_prep_incoming_args_SYSV(char *stack, void **rvalue,
-+ void **avalue, ffi_cif *cif)
-+{
-+ register unsigned int i, reg_mask = 0;
-+ register void **p_argv;
-+ register ffi_type **p_arg;
-+ register char *reg_base = stack;
-+ register char *stack_base = stack + 20;
-+ register unsigned int stack_offset = 0;
-+
-+#ifdef DEBUG
-+ /* Debugging */
-+ for(i = 0; i < cif->nargs + 7; i++)
-+ {
-+ printf("sp+%d: 0x%08x\n", i*4, ((unsigned int*)stack)[i]);
-+ }
-+#endif
-+
-+ /* If cif->flags is struct then we know it's not passed in registers */
-+ if(cif->flags == FFI_TYPE_STRUCT)
-+ {
-+ *rvalue = *(void **)reg_base;
-+ reg_mask |= 1;
-+ }
-+
-+ p_argv = avalue;
-+
-+ for(i = 0, p_arg = cif->arg_types; i < cif->nargs; i++, p_arg++)
-+ {
-+ size_t z = (*p_arg)->size;
-+ int alignment = (*p_arg)->alignment;
-+
-+ *p_argv = 0;
-+
-+ if(z % 4 != 0)
-+ z += (4 - z % 4);
-+
-+ if(reg_mask != 0x1f)
-+ {
-+ if(pass_struct_on_stack(*p_arg))
-+ {
-+ *p_argv = (void*)stack_base + stack_offset;
-+ stack_offset += z;
-+ }
-+ else if(z <= sizeof(int))
-+ {
-+ char index = 0;
-+
-+ while((reg_mask >> index) & 1)
-+ index++;
-+
-+ *p_argv = (void*)reg_base + (index * 4);
-+ reg_mask |= (1 << index);
-+ }
-+ else if(z == 2 * sizeof(int))
-+ {
-+ if(!((reg_mask >> 1) & 1))
-+ {
-+ *p_argv = (void*)reg_base + 4;
-+ reg_mask |= (3 << 1);
-+ }
-+ else if(!((reg_mask >> 3) & 1))
-+ {
-+ *p_argv = (void*)reg_base + 12;
-+ reg_mask |= (3 << 3);
-+ }
-+ }
-+ }
-+
-+ if(!*p_argv)
-+ {
-+ *p_argv = (void*)stack_base + stack_offset;
-+ stack_offset += z;
-+ }
-+
-+ if((*p_arg)->type != FFI_TYPE_STRUCT ||
-+ (*p_arg)->elements[1] == NULL)
-+ {
-+ if(alignment == 1)
-+ **(unsigned int**)p_argv <<= 24;
-+ else if(alignment == 2)
-+ **(unsigned int**)p_argv <<= 16;
-+ }
-+
-+ p_argv++;
-+ }
-+
-+#ifdef DEBUG
-+ /* Debugging */
-+ for(i = 0; i < cif->nargs; i++)
-+ {
-+ printf("sp+%d: 0x%08x\n", i*4, *(((unsigned int**)avalue)[i]));
-+ }
-+#endif
-+}
-+
-+/* This function is jumped to by the trampoline */
-+
-+unsigned int ffi_closure_SYSV_inner(ffi_closure *closure, void **respp,
-+ void *args)
-+{
-+ ffi_cif *cif;
-+ void **arg_area;
-+ unsigned int i, size = 0;
-+ ffi_type **p_arg;
-+
-+ cif = closure->cif;
-+
-+ for(i = 0, p_arg = cif->arg_types; i < cif->nargs; i++, p_arg++)
-+ size += (*p_arg)->size + (4 - (*p_arg)->size % 4);
-+
-+ arg_area = (void **)alloca(size);
-+
-+ /* this call will initialize ARG_AREA, such that each element in that
-+ * array points to the corresponding value on the stack; and if the
-+ * function returns a structure, it will re-set RESP to point to the
-+ * structure return address. */
-+
-+ ffi_prep_incoming_args_SYSV(args, respp, arg_area, cif);
-+
-+ (closure->fun)(cif, *respp, arg_area, closure->user_data);
-+
-+ return cif->flags;
-+}
-+
-+ffi_status ffi_prep_closure_loc(ffi_closure* closure, ffi_cif* cif,
-+ void (*fun)(ffi_cif*, void*, void**, void*), void *user_data,
-+ void *codeloc)
-+{
-+ FFI_ASSERT(cif->abi == FFI_SYSV);
-+
-+ unsigned char *__tramp = (unsigned char*)(&closure->tramp[0]);
-+ unsigned int __fun = (unsigned int)(&ffi_closure_SYSV);
-+ unsigned int __ctx = (unsigned int)(codeloc);
-+ unsigned int __rstruct_flag = (unsigned int)(cif->rstruct_flag);
-+ unsigned int __inner = (unsigned int)(&ffi_closure_SYSV_inner);
-+ *(unsigned int*) &__tramp[0] = 0xebcd1f00; /* pushm r8-r12 */
-+ *(unsigned int*) &__tramp[4] = 0xfefc0010; /* ld.w r12, pc[16] */
-+ *(unsigned int*) &__tramp[8] = 0xfefb0010; /* ld.w r11, pc[16] */
-+ *(unsigned int*) &__tramp[12] = 0xfefa0010; /* ld.w r10, pc[16] */
-+ *(unsigned int*) &__tramp[16] = 0xfeff0010; /* ld.w pc, pc[16] */
-+ *(unsigned int*) &__tramp[20] = __ctx;
-+ *(unsigned int*) &__tramp[24] = __rstruct_flag;
-+ *(unsigned int*) &__tramp[28] = __inner;
-+ *(unsigned int*) &__tramp[32] = __fun;
-+ syscall(__NR_cacheflush, 0, (&__tramp[0]), 36);
-+
-+ closure->cif = cif;
-+ closure->user_data = user_data;
-+ closure->fun = fun;
-+
-+ return FFI_OK;
-+}
-+
-Index: libffi/src/avr32/ffitarget.h
-===================================================================
---- /dev/null
-+++ libffi/src/avr32/ffitarget.h
-@@ -0,0 +1,50 @@
-+/* -----------------------------------------------------------------*-C-*-
-+ ffitarget.h - Copyright (c) 2009 Bradley Smith <brad@brad-smith.co.uk>
-+ Target configuration macros for AVR32.
-+
-+ 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 THE AUTHORS OR COPYRIGHT
-+ HOLDERS 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_ASM
-+typedef unsigned long ffi_arg;
-+typedef signed long ffi_sarg;
-+
-+typedef enum ffi_abi {
-+ FFI_FIRST_ABI = 0,
-+ FFI_SYSV,
-+ FFI_DEFAULT_ABI = FFI_SYSV,
-+ FFI_LAST_ABI = FFI_DEFAULT_ABI + 1
-+} ffi_abi;
-+#endif
-+
-+#define FFI_EXTRA_CIF_FIELDS unsigned int rstruct_flag
-+
-+/* Definitions for closures */
-+
-+#define FFI_CLOSURES 1
-+#define FFI_TRAMPOLINE_SIZE 36
-+#define FFI_NATIVE_RAW_API 0
-+
-+#endif
-Index: libffi/src/avr32/sysv.S
-===================================================================
---- /dev/null
-+++ libffi/src/avr32/sysv.S
-@@ -0,0 +1,208 @@
-+/* -----------------------------------------------------------------------
-+ sysv.S - Copyright (c) 2009 Bradley Smith <brad@brad-smith.co.uk>
-+
-+ AVR32 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 THE AUTHORS OR COPYRIGHT HOLDERS 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>
-+
-+ /* r12: ffi_prep_args
-+ * r11: &ecif
-+ * r10: size
-+ * r9: cif->flags
-+ * r8: ecif.rvalue
-+ * sp+0: cif->rstruct_flag
-+ * sp+4: fn */
-+
-+ .text
-+ .align 1
-+ .globl ffi_call_SYSV
-+ .type ffi_call_SYSV, @function
-+ffi_call_SYSV:
-+ stm --sp, r0,r1,lr
-+ stm --sp, r8-r12
-+ mov r0, sp
-+
-+ /* Make room for all of the new args. */
-+ sub sp, r10
-+ /* Pad to make way for potential skipped registers */
-+ sub sp, 20
-+
-+ /* Call ffi_prep_args(stack, &ecif). */
-+ /* r11 already set */
-+ mov r1, r12
-+ mov r12, sp
-+ icall r1
-+
-+ /* Save new argument size */
-+ mov r1, r12
-+
-+ /* Move first 5 parameters in registers. */
-+ ldm sp++, r8-r12
-+
-+ /* call (fn) (...). */
-+ ld.w r1, r0[36]
-+ icall r1
-+
-+ /* Remove the space we pushed for the args. */
-+ mov sp, r0
-+
-+ /* Load r1 with the rstruct flag. */
-+ ld.w r1, sp[32]
-+
-+ /* Load r9 with the return type code. */
-+ ld.w r9, sp[12]
-+
-+ /* Load r8 with the return value pointer. */
-+ ld.w r8, sp[16]
-+
-+ /* If the return value pointer is NULL, assume no return value. */
-+ cp.w r8, 0
-+ breq .Lend
-+
-+ /* Check if return type is actually a struct */
-+ cp.w r1, 0
-+ breq 1f
-+
-+ /* Return 8bit */
-+ cp.w r9, FFI_TYPE_UINT8
-+ breq .Lstore8
-+
-+ /* Return 16bit */
-+ cp.w r9, FFI_TYPE_UINT16
-+ breq .Lstore16
-+
-+1:
-+ /* Return 32bit */
-+ cp.w r9, FFI_TYPE_UINT32
-+ breq .Lstore32
-+ cp.w r9, FFI_TYPE_UINT16
-+ breq .Lstore32
-+ cp.w r9, FFI_TYPE_UINT8
-+ breq .Lstore32
-+
-+ /* Return 64bit */
-+ cp.w r9, FFI_TYPE_UINT64
-+ breq .Lstore64
-+
-+ /* Didn't match anything */
-+ bral .Lend
-+
-+.Lstore64:
-+ st.w r8[0], r11
-+ st.w r8[4], r10
-+ bral .Lend
-+
-+.Lstore32:
-+ st.w r8[0], r12
-+ bral .Lend
-+
-+.Lstore16:
-+ st.h r8[0], r12
-+ bral .Lend
-+
-+.Lstore8:
-+ st.b r8[0], r12
-+ bral .Lend
-+
-+.Lend:
-+ sub sp, -20
-+ ldm sp++, r0,r1,pc
-+
-+ .size ffi_call_SYSV, . - ffi_call_SYSV
-+
-+
-+ /* r12: __ctx
-+ * r11: __rstruct_flag
-+ * r10: __inner */
-+
-+ .align 1
-+ .globl ffi_closure_SYSV
-+ .type ffi_closure_SYSV, @function
-+ffi_closure_SYSV:
-+ stm --sp, r0,lr
-+ mov r0, r11
-+ mov r8, r10
-+ sub r10, sp, -8
-+ sub sp, 12
-+ st.w sp[8], sp
-+ sub r11, sp, -8
-+ icall r8
-+
-+ /* Check if return type is actually a struct */
-+ cp.w r0, 0
-+ breq 1f
-+
-+ /* Return 8bit */
-+ cp.w r12, FFI_TYPE_UINT8
-+ breq .Lget8
-+
-+ /* Return 16bit */
-+ cp.w r12, FFI_TYPE_UINT16
-+ breq .Lget16
-+
-+1:
-+ /* Return 32bit */
-+ cp.w r12, FFI_TYPE_UINT32
-+ breq .Lget32
-+ cp.w r12, FFI_TYPE_UINT16
-+ breq .Lget32
-+ cp.w r12, FFI_TYPE_UINT8
-+ breq .Lget32
-+
-+ /* Return 64bit */
-+ cp.w r12, FFI_TYPE_UINT64
-+ breq .Lget64
-+
-+ /* Didn't match anything */
-+ bral .Lclend
-+
-+.Lget64:
-+ ld.w r11, sp[0]
-+ ld.w r10, sp[4]
-+ bral .Lclend
-+
-+.Lget32:
-+ ld.w r12, sp[0]
-+ bral .Lclend
-+
-+.Lget16:
-+ ld.uh r12, sp[0]
-+ bral .Lclend
-+
-+.Lget8:
-+ ld.ub r12, sp[0]
-+ bral .Lclend
-+
-+.Lclend:
-+ sub sp, -12
-+ ldm sp++, r0,lr
-+ sub sp, -20
-+ mov pc, lr
-+
-+ .size ffi_closure_SYSV, . - ffi_closure_SYSV
-+
-+#if defined __ELF__ && defined __linux__
-+ .section .note.GNU-stack,"",@progbits
-+#endif
-Index: libffi/Makefile.am
-===================================================================
---- libffi.orig/Makefile.am
-+++ libffi/Makefile.am
-@@ -7,6 +7,7 @@ SUBDIRS = include testsuite man
- EXTRA_DIST = LICENSE ChangeLog.v1 ChangeLog.libgcj configure.host \
- src/alpha/ffi.c src/alpha/osf.S src/alpha/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 src/ia64/ia64_flags.h \
- src/ia64/unix.S \
-@@ -141,6 +142,9 @@ endif
- if ARM
- nodist_libffi_la_SOURCES += src/arm/sysv.S src/arm/ffi.c
- endif
-+if AVR32
-+nodist_libffi_la_SOURCES += src/avr32/sysv.S src/avr32/ffi.c
-+endif
- if LIBFFI_CRIS
- nodist_libffi_la_SOURCES += src/cris/sysv.S src/cris/ffi.c
- endif
-Index: libffi/configure
-===================================================================
---- libffi.orig/configure
-+++ libffi/configure
-@@ -813,6 +813,8 @@ FRV_FALSE
- FRV_TRUE
- LIBFFI_CRIS_FALSE
- LIBFFI_CRIS_TRUE
-+AVR32_FALSE
-+AVR32_TRUE
- ARM_FALSE
- ARM_TRUE
- POWERPC_FREEBSD_FALSE
-@@ -4770,13 +4772,13 @@ if test "${lt_cv_nm_interface+set}" = se
- else
- lt_cv_nm_interface="BSD nm"
- echo "int some_variable = 0;" > conftest.$ac_ext
-- (eval echo "\"\$as_me:4773: $ac_compile\"" >&5)
-+ (eval echo "\"\$as_me:4775: $ac_compile\"" >&5)
- (eval "$ac_compile" 2>conftest.err)
- cat conftest.err >&5
-- (eval echo "\"\$as_me:4776: $NM \\\"conftest.$ac_objext\\\"\"" >&5)
-+ (eval echo "\"\$as_me:4778: $NM \\\"conftest.$ac_objext\\\"\"" >&5)
- (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out)
- cat conftest.err >&5
-- (eval echo "\"\$as_me:4779: output\"" >&5)
-+ (eval echo "\"\$as_me:4781: output\"" >&5)
- cat conftest.out >&5
- if $GREP 'External.*some_variable' conftest.out > /dev/null; then
- lt_cv_nm_interface="MS dumpbin"
-@@ -5982,7 +5984,7 @@ ia64-*-hpux*)
- ;;
- *-*-irix6*)
- # Find out which ABI we are using.
-- echo '#line 5985 "configure"' > conftest.$ac_ext
-+ echo '#line 5987 "configure"' > conftest.$ac_ext
- if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
- (eval $ac_compile) 2>&5
- ac_status=$?
-@@ -7835,11 +7837,11 @@ else
- -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
- -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
- -e 's:$: $lt_compiler_flag:'`
-- (eval echo "\"\$as_me:7838: $lt_compile\"" >&5)
-+ (eval echo "\"\$as_me:7840: $lt_compile\"" >&5)
- (eval "$lt_compile" 2>conftest.err)
- ac_status=$?
- cat conftest.err >&5
-- echo "$as_me:7842: \$? = $ac_status" >&5
-+ echo "$as_me:7844: \$? = $ac_status" >&5
- if (exit $ac_status) && test -s "$ac_outfile"; then
- # The compiler can only warn and ignore the option if not recognized
- # So say no if there are warnings other than the usual output.
-@@ -8174,11 +8176,11 @@ else
- -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
- -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
- -e 's:$: $lt_compiler_flag:'`
-- (eval echo "\"\$as_me:8177: $lt_compile\"" >&5)
-+ (eval echo "\"\$as_me:8179: $lt_compile\"" >&5)
- (eval "$lt_compile" 2>conftest.err)
- ac_status=$?
- cat conftest.err >&5
-- echo "$as_me:8181: \$? = $ac_status" >&5
-+ echo "$as_me:8183: \$? = $ac_status" >&5
- if (exit $ac_status) && test -s "$ac_outfile"; then
- # The compiler can only warn and ignore the option if not recognized
- # So say no if there are warnings other than the usual output.
-@@ -8279,11 +8281,11 @@ else
- -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
- -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
- -e 's:$: $lt_compiler_flag:'`
-- (eval echo "\"\$as_me:8282: $lt_compile\"" >&5)
-+ (eval echo "\"\$as_me:8284: $lt_compile\"" >&5)
- (eval "$lt_compile" 2>out/conftest.err)
- ac_status=$?
- cat out/conftest.err >&5
-- echo "$as_me:8286: \$? = $ac_status" >&5
-+ echo "$as_me:8288: \$? = $ac_status" >&5
- if (exit $ac_status) && test -s out/conftest2.$ac_objext
- then
- # The compiler can only warn and ignore the option if not recognized
-@@ -8334,11 +8336,11 @@ else
- -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
- -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
- -e 's:$: $lt_compiler_flag:'`
-- (eval echo "\"\$as_me:8337: $lt_compile\"" >&5)
-+ (eval echo "\"\$as_me:8339: $lt_compile\"" >&5)
- (eval "$lt_compile" 2>out/conftest.err)
- ac_status=$?
- cat out/conftest.err >&5
-- echo "$as_me:8341: \$? = $ac_status" >&5
-+ echo "$as_me:8343: \$? = $ac_status" >&5
- if (exit $ac_status) && test -s out/conftest2.$ac_objext
- then
- # The compiler can only warn and ignore the option if not recognized
-@@ -11137,7 +11139,7 @@ else
- lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
- lt_status=$lt_dlunknown
- cat > conftest.$ac_ext <<_LT_EOF
--#line 11140 "configure"
-+#line 11142 "configure"
- #include "confdefs.h"
-
- #if HAVE_DLFCN_H
-@@ -11233,7 +11235,7 @@ else
- lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
- lt_status=$lt_dlunknown
- cat > conftest.$ac_ext <<_LT_EOF
--#line 11236 "configure"
-+#line 11238 "configure"
- #include "confdefs.h"
-
- #if HAVE_DLFCN_H
-@@ -12155,6 +12157,10 @@ case "$host" in
- TARGET=X86_64; TARGETDIR=x86
- ;;
-
-+ avr32*-*-*)
-+ TARGET=AVR32; TARGETDIR=avr32
-+ ;;
-+
- cris-*-*)
- TARGET=LIBFFI_CRIS; TARGETDIR=cris
- ;;
-@@ -12391,6 +12397,14 @@ else
- ARM_FALSE=
- fi
-
-+ if test x$TARGET = xAVR32; then
-+ AVR32_TRUE=
-+ AVR32_FALSE='#'
-+else
-+ AVR32_TRUE='#'
-+ AVR32_FALSE=
-+fi
-+
- if test x$TARGET = xLIBFFI_CRIS; then
- LIBFFI_CRIS_TRUE=
- LIBFFI_CRIS_FALSE='#'
-@@ -14483,6 +14497,16 @@ _ACEOF
- fi
- fi
-
-+case "$target" in
-+ i?86-apple-darwin10*)
-+
-+cat >>confdefs.h <<\_ACEOF
-+#define FFI_MMAP_EXEC_WRIT 1
-+_ACEOF
-+
-+ ;;
-+esac
-+
- { $as_echo "$as_me:$LINENO: checking whether .eh_frame section should be read-only" >&5
- $as_echo_n "checking whether .eh_frame section should be read-only... " >&6; }
- if test "${libffi_cv_ro_eh_frame+set}" = set; then
-@@ -14895,6 +14919,13 @@ $as_echo "$as_me: error: conditional \"A
- Usually this means the macro was only invoked conditionally." >&2;}
- { (exit 1); exit 1; }; }
- fi
-+if test -z "${AVR32_TRUE}" && test -z "${AVR32_FALSE}"; then
-+ { { $as_echo "$as_me:$LINENO: error: conditional \"AVR32\" was never defined.
-+Usually this means the macro was only invoked conditionally." >&5
-+$as_echo "$as_me: error: conditional \"AVR32\" was never defined.
-+Usually this means the macro was only invoked conditionally." >&2;}
-+ { (exit 1); exit 1; }; }
-+fi
- if test -z "${LIBFFI_CRIS_TRUE}" && test -z "${LIBFFI_CRIS_FALSE}"; then
- { { $as_echo "$as_me:$LINENO: error: conditional \"LIBFFI_CRIS\" was never defined.
- Usually this means the macro was only invoked conditionally." >&5
-Index: libffi/configure.ac
-===================================================================
---- libffi.orig/configure.ac
-+++ libffi/configure.ac
-@@ -58,6 +58,10 @@ case "$host" in
- TARGET=X86_64; TARGETDIR=x86
- ;;
-
-+ avr32*-*-*)
-+ TARGET=AVR32; TARGETDIR=avr32
-+ ;;
-+
- cris-*-*)
- TARGET=LIBFFI_CRIS; TARGETDIR=cris
- ;;
-@@ -180,6 +184,7 @@ AM_CONDITIONAL(POWERPC_AIX, test x$TARGE
- AM_CONDITIONAL(POWERPC_DARWIN, test x$TARGET = xPOWERPC_DARWIN)
- AM_CONDITIONAL(POWERPC_FREEBSD, test x$TARGET = xPOWERPC_FREEBSD)
- AM_CONDITIONAL(ARM, test x$TARGET = xARM)
-+AM_CONDITIONAL(AVR32, test x$TARGET = xAVR32)
- AM_CONDITIONAL(LIBFFI_CRIS, test x$TARGET = xLIBFFI_CRIS)
- AM_CONDITIONAL(FRV, test x$TARGET = xFRV)
- AM_CONDITIONAL(S390, test x$TARGET = xS390)
-Index: libffi/ChangeLog.libffi
-===================================================================
---- libffi.orig/ChangeLog.libffi
-+++ libffi/ChangeLog.libffi
-@@ -1,3 +1,14 @@
-+2009-10-05 Bradley Smith <brad@brad-smith.co.uk>
-+
-+ * configure.ac, Makefile.am, src/avr32/ffi.c,
-+ src/avr32/ffitarget.h,
-+ src/avr32/sysv.S: Add AVR32 port.
-+ * testsuite/libffi.call/cls_dbls_struct.c,
-+ testsuite/libffi.call/cls_double_va.c,
-+ testsuite/libffi.call/cls_longdouble_va.c,
-+ testsuite/libffi.call/huge_struct.c: Mark expected failures on
-+ AVR32.
-+
- 2009-06-16 Andrew Haley <aph@redhat.com>
-
- * testsuite/libffi.call/cls_align_sint64.c,