pkgsrc-WIP-changes archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

frida-libffi: Revert back to 3.0.13



Module Name:	pkgsrc-wip
Committed By:	Kamil Rytarowski <n54%gmx.com@localhost>
Pushed By:	kamil
Date:		Mon Mar 12 20:25:03 2018 +0100
Changeset:	5e5f2fc7dea6db2bf32d252ea7dbf7b5c1cbbdaa

Modified Files:
	frida-libffi/Makefile
	frida-libffi/distinfo
	frida-libffi/patches/patch-aa
	frida-libffi/patches/patch-ac
	frida-libffi/patches/patch-ad
	frida-libffi/patches/patch-ae
	frida-libffi/patches/patch-af
	frida-libffi/patches/patch-ag
	frida-libffi/patches/patch-aj
	frida-libffi/patches/patch-src_arm_sysv.S
	frida-libffi/patches/patch-src_m88k_elfbsd.S
Added Files:
	frida-libffi/patches/patch-Makefile.am
	frida-libffi/patches/patch-ah
	frida-libffi/patches/patch-ai
	frida-libffi/patches/patch-configure.ac
	frida-libffi/patches/patch-fficonfig.h.in
	frida-libffi/patches/patch-src_m88k_ffi.c
	frida-libffi/patches/patch-src_m88k_ffitarget.h
	frida-libffi/patches/patch-src_vax_elfbsd.S
	frida-libffi/patches/patch-src_vax_ffi.c
	frida-libffi/patches/patch-src_vax_ffitarget.h
	frida-libffi/patches/patch-src_x86_ffi.c
	frida-libffi/patches/patch-src_x86_win64.S
Removed Files:
	frida-libffi/patches/patch-src_alpha_osf.S
	frida-libffi/patches/patch-src_closures.c
	frida-libffi/patches/patch-src_x86_win32.S

Log Message:
frida-libffi: Revert back to 3.0.13

Frida uses a fork of 3.0.13.

To see a diff of this commit:
https://wip.pkgsrc.org/cgi-bin/gitweb.cgi?p=pkgsrc-wip.git;a=commitdiff;h=5e5f2fc7dea6db2bf32d252ea7dbf7b5c1cbbdaa

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

diffstat:
 frida-libffi/Makefile                           |  29 +-
 frida-libffi/distinfo                           |  42 ++-
 frida-libffi/patches/patch-Makefile.am          |  40 +++
 frida-libffi/patches/patch-aa                   |  95 ++++--
 frida-libffi/patches/patch-ac                   |   8 +-
 frida-libffi/patches/patch-ad                   |  10 +-
 frida-libffi/patches/patch-ae                   |  17 +-
 frida-libffi/patches/patch-af                   |  34 +-
 frida-libffi/patches/patch-ag                   |   6 +-
 frida-libffi/patches/patch-ah                   |  26 ++
 frida-libffi/patches/patch-ai                   |  20 ++
 frida-libffi/patches/patch-aj                   |   8 +-
 frida-libffi/patches/patch-configure.ac         |  51 +++
 frida-libffi/patches/patch-fficonfig.h.in       |  14 +
 frida-libffi/patches/patch-src_alpha_osf.S      |  26 --
 frida-libffi/patches/patch-src_arm_sysv.S       |  53 ++--
 frida-libffi/patches/patch-src_closures.c       |  94 ------
 frida-libffi/patches/patch-src_m88k_elfbsd.S    |   6 +-
 frida-libffi/patches/patch-src_m88k_ffi.c       | 405 ++++++++++++++++++++++++
 frida-libffi/patches/patch-src_m88k_ffitarget.h |  54 ++++
 frida-libffi/patches/patch-src_vax_elfbsd.S     | 200 ++++++++++++
 frida-libffi/patches/patch-src_vax_ffi.c        | 281 ++++++++++++++++
 frida-libffi/patches/patch-src_vax_ffitarget.h  |  54 ++++
 frida-libffi/patches/patch-src_x86_ffi.c        |  15 +
 frida-libffi/patches/patch-src_x86_win32.S      |  23 --
 frida-libffi/patches/patch-src_x86_win64.S      |  15 +
 26 files changed, 1370 insertions(+), 256 deletions(-)

diffs:
diff --git a/frida-libffi/Makefile b/frida-libffi/Makefile
index d1e109e97e..787da991bb 100644
--- a/frida-libffi/Makefile
+++ b/frida-libffi/Makefile
@@ -1,7 +1,6 @@
-# $NetBSD: Makefile,v 1.33 2017/09/05 15:08:42 joerg Exp $
+# $NetBSD: Makefile,v 1.23 2014/05/18 15:17:51 wiz Exp $
 
-DISTNAME=	libffi-3.2.1
-PKGREVISION=	4
+DISTNAME=	libffi-3.0.13
 CATEGORIES=	devel
 MASTER_SITES=	ftp://sourceware.org/pub/libffi/
 
@@ -10,13 +9,14 @@ HOMEPAGE=	https://www.sourceware.org/libffi/
 COMMENT=	Foreign function interface
 LICENSE=	mit
 
-USE_LANGUAGES=		c c++
-USE_LIBTOOL=		yes
-USE_TOOLS+=		pkg-config
-GNU_CONFIGURE=		yes
-CONFIGURE_ARGS=		--includedir=${PREFIX}/include
+GNU_CONFIGURE=	yes
+CONFIGURE_ARGS=	--includedir=${PREFIX}/include
+USE_LIBTOOL=	yes
+USE_TOOLS+=	pkg-config
+USE_LANGUAGES=	c c++
+INFO_FILES=	yes
+
 PKGCONFIG_OVERRIDE+=	libffi.pc.in
-INFO_FILES=		yes
 
 .include "../../mk/compiler.mk"
 # The Compaq C frontend groks .s, but not .S. Assemble osf.S directly w/ as(1).
@@ -30,25 +30,24 @@ pre-build:
 
 .if !empty(PKGSRC_RUN_TEST:M[Yy][Ee][Ss])
 TEST_TARGET=	check
-TEST_ENV=	# empty?
+TEST_ENV=	
 BUILD_DEPENDS+=	dejagnu-[0-9]*:../../devel/dejagnu
 .endif
 
 # patch-aj uses m68k_sync_icache(2)
 .if !empty(MACHINE_PLATFORM:MNetBSD-*-m68k)
-LIBS+=		-lm68k
+LIBS+=	-lm68k
 .endif
 
 # fix http://gnats.netbsd.org/42865
 .if !empty(MACHINE_PLATFORM:MSunOS-*-i386) && !empty(CC_VERSION:Mgcc-[23]*)
-CPPFLAGS+=	-D__PIC__
+CPPFLAGS += -D__PIC__
 .endif
 
 # irix fixes from PR 48587
 .if !empty(OPSYS:MIRIX)
-USE_TOOLS+=		bash gmake
-MAKE_FLAGS+=		SHELL=${TOOLS_DIR}/bin/bash
+USE_TOOLS+=     bash gmake
+MAKE_FLAGS+=SHELL=${TOOLS_DIR}/bin/bash
 .endif
 
-.include "../../mk/pthread.buildlink3.mk"
 .include "../../mk/bsd.pkg.mk"
diff --git a/frida-libffi/distinfo b/frida-libffi/distinfo
index c01589c73c..5a66fb3a19 100644
--- a/frida-libffi/distinfo
+++ b/frida-libffi/distinfo
@@ -1,18 +1,26 @@
-$NetBSD: distinfo,v 1.45 2017/09/05 15:08:42 joerg Exp $
+$NetBSD: distinfo,v 1.34 2014/06/11 11:45:04 joerg Exp $
 
-SHA1 (libffi-3.2.1.tar.gz) = 280c265b789e041c02e5c97815793dfc283fb1e6
-RMD160 (libffi-3.2.1.tar.gz) = 9b546a3d002380bec3f00d86fc47d730abf51dfd
-SHA512 (libffi-3.2.1.tar.gz) = 980ca30a8d76f963fca722432b1fe5af77d7a4e4d2eac5144fbc5374d4c596609a293440573f4294207e1bdd9fda80ad1e1cafb2ffb543df5a275bc3bd546483
-Size (libffi-3.2.1.tar.gz) = 940837 bytes
-SHA1 (patch-aa) = 5218c8d895f97c812b7ca8d07c55b82ebcdc87d4
-SHA1 (patch-ac) = 63fba2e9486b73485a4f633927f5041110c43239
-SHA1 (patch-ad) = db57395ff721d7b56edec8a3a64b4b529258341c
-SHA1 (patch-ae) = fdb84a49c15041826396e4d3a6dda2de719801c0
-SHA1 (patch-af) = bf64b4082f24947cd47aba0758c347e5ddac3d7e
-SHA1 (patch-ag) = ae6a89f6b2be00c52139be6dcd14d0ebfe85d8f7
-SHA1 (patch-aj) = 5179cfd150bc7de15eb1c5ee0a327016c2c32b3e
-SHA1 (patch-src_alpha_osf.S) = 50d564a1d88284f04f6896719fa3613e9b0be70b
-SHA1 (patch-src_arm_sysv.S) = 2c97e0d069a4df2e1f5b6604e54b2d02c92691e2
-SHA1 (patch-src_closures.c) = 72760ccd973c5f9b157f5db8da180861d748beb2
-SHA1 (patch-src_m88k_elfbsd.S) = 6572c7fa39c00096cb4a80bb88993ff1b4aaa8cc
-SHA1 (patch-src_x86_win32.S) = 8a41cbc7237d6a171605a66e91d8d92a57181569
+SHA1 (libffi-3.0.13.tar.gz) = f5230890dc0be42fb5c58fbf793da253155de106
+RMD160 (libffi-3.0.13.tar.gz) = 03f0627c0fcc800d38636258a2fab2d6bb8b6625
+Size (libffi-3.0.13.tar.gz) = 845747 bytes
+SHA1 (patch-Makefile.am) = 01109a0d5708835162a2d007a26decac5bb0bbac
+SHA1 (patch-aa) = 79cc45c6051705bde3f3229aca4e0fa49ff149b9
+SHA1 (patch-ac) = f3c6324f4334d23e684b4eca25173a13be5d37eb
+SHA1 (patch-ad) = 8901a00abe25422e3e35f321a5fb89311185fc0b
+SHA1 (patch-ae) = 3d8cd3bcd834876f6e60ae519dca8c0b0ba0d4d1
+SHA1 (patch-af) = 2c7ca79ef980a2561333bf79a18df1ecb0bbb9f7
+SHA1 (patch-ag) = 6333317170f6e92f89db966315276dcd8e3484f2
+SHA1 (patch-ah) = e9580069ede90cd616da7bc230b28acbf5d204a6
+SHA1 (patch-ai) = f85a6cb64d4a9d7c3e56b47b7092fce10a744b5b
+SHA1 (patch-aj) = d130b2b20b94ca26c70dcc46614e36c6d0ac9153
+SHA1 (patch-configure.ac) = 080d79b5ada93c5073df7dd09c5131fcfe72ce86
+SHA1 (patch-fficonfig.h.in) = fd85fa767bc057c843ff71cc61bedfcff84def43
+SHA1 (patch-src_arm_sysv.S) = c7c8b33bb019c0f41b6866368096a7594314efea
+SHA1 (patch-src_m88k_elfbsd.S) = fae3e425dcff3e924ef195eab165f9bbc6ec4077
+SHA1 (patch-src_m88k_ffi.c) = e4b7382c3d6e253b8c1c6054150c530c21d018de
+SHA1 (patch-src_m88k_ffitarget.h) = e8479bc3aa876f5e6d52a4d578c5da88291c6646
+SHA1 (patch-src_vax_elfbsd.S) = abf284bd1db086a12608b7243344af30e4a314ca
+SHA1 (patch-src_vax_ffi.c) = f47ced03388e9744afa44d6bb5e14d5f4285cfbf
+SHA1 (patch-src_vax_ffitarget.h) = 388f3a58e37dd8af5c194b5be77a6ea6f9beef4b
+SHA1 (patch-src_x86_ffi.c) = b9ac64a53a92de663a339212e22c1286fa41c1d5
+SHA1 (patch-src_x86_win64.S) = 5b6836bae6c73743b925de4d11bc241c783bffd6
diff --git a/frida-libffi/patches/patch-Makefile.am b/frida-libffi/patches/patch-Makefile.am
new file mode 100644
index 0000000000..89521b781f
--- /dev/null
+++ b/frida-libffi/patches/patch-Makefile.am
@@ -0,0 +1,40 @@
+$NetBSD: patch-Makefile.am,v 1.1 2013/11/03 23:51:51 jklos Exp $
+
+--- Makefile.am.orig	2013-03-16 11:52:11.000000000 +0000
++++ Makefile.am
+@@ -19,6 +19,7 @@ EXTRA_DIST = LICENSE ChangeLog.v1 Change
+ 	 src/moxie/ffitarget.h src/moxie/eabi.S src/mips/ffitarget.h	\
+ 	 src/m32r/ffi.c src/m32r/sysv.S src/m32r/ffitarget.h		\
+ 	 src/m68k/ffi.c src/m68k/sysv.S src/m68k/ffitarget.h		\
++	 src/m88k/ffi.c src/m88k/obsd.S src/m88k/ffitarget.h		\
+ 	 src/microblaze/ffi.c src/microblaze/sysv.S			\
+ 	 src/microblaze/ffitarget.h src/powerpc/ffi.c			\
+ 	 src/powerpc/sysv.S src/powerpc/linux64.S			\
+@@ -38,6 +39,7 @@ EXTRA_DIST = LICENSE ChangeLog.v1 Change
+ 	 src/bfin/ffitarget.h src/bfin/sysv.S src/frv/eabi.S		\
+ 	 src/frv/ffitarget.h src/dlmalloc.c src/tile/ffi.c		\
+ 	 src/tile/ffitarget.h src/tile/tile.S libtool-version		\
++	 src/vax/ffi.c src/vax/ffitarget.h src/vax/elfbsd.S		\
+ 	 src/xtensa/ffitarget.h src/xtensa/ffi.c src/xtensa/sysv.S	\
+ 	 ChangeLog.libffi m4/libtool.m4 m4/lt~obsolete.m4		\
+ 	 m4/ltoptions.m4 m4/ltsugar.m4 m4/ltversion.m4			\
+@@ -149,6 +151,9 @@ endif
+ if M68K
+ nodist_libffi_la_SOURCES += src/m68k/ffi.c src/m68k/sysv.S
+ endif
++if M88K
++nodist_libffi_la_SOURCES += src/m88k/ffi.c src/m88k/obsd.S
++endif
+ if MOXIE
+ nodist_libffi_la_SOURCES += src/moxie/ffi.c src/moxie/eabi.S
+ endif
+@@ -212,6 +217,9 @@ endif
+ if METAG
+ nodist_libffi_la_SOURCES += src/metag/sysv.S src/metag/ffi.c
+ endif
++if VAX
++nodist_libffi_la_SOURCES += src/vax/elfbsd.S src/vax/ffi.c
++endif
+ 
+ libffi_convenience_la_SOURCES = $(libffi_la_SOURCES)
+ nodist_libffi_convenience_la_SOURCES = $(nodist_libffi_la_SOURCES)
diff --git a/frida-libffi/patches/patch-aa b/frida-libffi/patches/patch-aa
index cc26834c67..5ea53e4404 100644
--- a/frida-libffi/patches/patch-aa
+++ b/frida-libffi/patches/patch-aa
@@ -1,12 +1,12 @@
-$NetBSD: patch-aa,v 1.24 2016/01/25 17:56:39 jperkin Exp $
+$NetBSD: patch-aa,v 1.20 2014/06/01 03:53:03 ryoon Exp $
 
-Add more platforms to list which don't support writeable and executable heap.
-Other various platform changes.
+* unwind: from https://github.com/atgreen/libffi/commit/76d19d004e36e99d261ee78261e2f52cea5e4ab1#diff-e2d5a00791bce9a01f99bc6fd613a39d
+  Fix build under OpenBSD 5.5
 
---- configure.orig	2014-11-12 11:59:57.000000000 +0000
+--- configure.orig	2013-03-17 22:36:19.000000000 +0000
 +++ configure
-@@ -654,6 +654,8 @@ VAX_FALSE
- VAX_TRUE
+@@ -651,6 +651,8 @@ XTENSA_FALSE
+ XTENSA_TRUE
  TILE_FALSE
  TILE_TRUE
 +VAX_FALSE
@@ -14,7 +14,7 @@ Other various platform changes.
  PA64_HPUX_FALSE
  PA64_HPUX_TRUE
  PA_HPUX_FALSE
-@@ -17120,7 +17122,7 @@ case "$host" in
+@@ -13331,7 +13333,7 @@ case "$host" in
  	TARGET=FRV; TARGETDIR=frv
  	;;
  
@@ -23,7 +23,7 @@ Other various platform changes.
  	TARGET=PA_LINUX; TARGETDIR=pa
  	;;
    hppa*64-*-hpux*)
-@@ -17218,10 +17220,10 @@ case "$host" in
+@@ -13425,10 +13427,10 @@ case "$host" in
  	TARGET=METAG; TARGETDIR=metag
  	;;
  
@@ -31,21 +31,21 @@ Other various platform changes.
 +  mips*-sgi-irix5.* | mips*-sgi-irix6.* | mips*-*-rtems*)
  	TARGET=MIPS; TARGETDIR=mips
  	;;
--  mips*-*linux* | mips*-*-openbsd*)
-+  mips*-*linux* | mips*-*-netbsd* | mips*-*-openbsd*)
+-  mips*-*-linux* | mips*-*-openbsd*)
++  mips*-*-linux* | mips*-*-netbsd* | mips*-*-openbsd*)
  	# Support 128-bit long double for NewABI.
  	HAVE_LONG_DOUBLE='defined(__mips64)'
  	TARGET=MIPS; TARGETDIR=mips
-@@ -17251,7 +17253,7 @@ case "$host" in
+@@ -13449,7 +13451,7 @@ case "$host" in
    powerpc-*-aix* | rs6000-*-aix*)
  	TARGET=POWERPC_AIX; TARGETDIR=powerpc
  	;;
 -  powerpc-*-freebsd* | powerpc-*-openbsd*)
 +  powerpc-*-freebsd* | powerpc-*-netbsd* | powerpc-*-openbsd*)
  	TARGET=POWERPC_FREEBSD; TARGETDIR=powerpc
- 	HAVE_LONG_DOUBLE_VARIANT=1
  	;;
-@@ -17266,7 +17268,7 @@ case "$host" in
+   powerpc64-*-freebsd*)
+@@ -13463,7 +13465,7 @@ case "$host" in
  	TARGET=S390; TARGETDIR=s390
  	;;
  
@@ -54,9 +54,9 @@ Other various platform changes.
  	TARGET=SH; TARGETDIR=sh
  	;;
    sh64-*-* | sh5*-*-*)
-@@ -17285,6 +17287,10 @@ case "$host" in
- 	TARGET=VAX; TARGETDIR=vax
- 	;;
+@@ -13478,6 +13480,10 @@ case "$host" in
+         TARGET=TILE; TARGETDIR=tile
+         ;;
  
 +  vax-*-*)
 +	TARGET=VAX; TARGETDIR=vax
@@ -65,8 +65,8 @@ Other various platform changes.
    xtensa*-*)
  	TARGET=XTENSA; TARGETDIR=xtensa
  	;;
-@@ -17610,6 +17616,14 @@ else
-   VAX_FALSE=
+@@ -13747,6 +13753,14 @@ else
+   TILE_FALSE=
  fi
  
 + if test x$TARGET = xVAX; then
@@ -80,29 +80,68 @@ Other various platform changes.
   if test x$TARGET = xXTENSA; then
    XTENSA_TRUE=
    XTENSA_FALSE='#'
-@@ -18530,7 +18544,7 @@ case "$target" in
+@@ -14661,7 +14675,7 @@ case "$target" in
  $as_echo "#define FFI_EXEC_TRAMPOLINE_TABLE 1" >>confdefs.h
  
       ;;
 -     *-apple-darwin1* | *-*-freebsd* | *-*-kfreebsd* | *-*-openbsd* | *-pc-solaris*)
-+     *-apple-darwin1* | *-*-freebsd* | *-*-kfreebsd* | *-*-netbsd* | *-*-openbsd* | *-*-solaris*)
++     *-apple-darwin1* | *-*-freebsd* | *-*-kfreebsd* | *-*-netbsd* | *-*-openbsd* | *-pc-solaris*)
  
  $as_echo "#define FFI_MMAP_EXEC_WRIT 1" >>confdefs.h
  
-@@ -18725,11 +18739,6 @@ if test "x$GCC" = "xyes"; then
-     toolexecdir="${libdir}"/gcc-lib/'$(target_alias)'
-     toolexeclibdir="${libdir}"
+@@ -14678,16 +14692,32 @@ fi
+ 
+ 
+ if test x$TARGET = xX86_64; then
+-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking assembler supports unwind section type" >&5
+-$as_echo_n "checking assembler supports unwind section type... " >&6; }
++    { $as_echo "$as_me:${as_lineno-$LINENO}: checking toolchain supports unwind section type" >&5
++$as_echo_n "checking toolchain supports unwind section type... " >&6; }
+ if ${libffi_cv_as_x86_64_unwind_section_type+:} false; then :
+   $as_echo_n "(cached) " >&6
+ else
+ 
+-	libffi_cv_as_x86_64_unwind_section_type=yes
+-	echo '.section .eh_frame,"a",@unwind' > conftest.s
+-	if $CC $CFLAGS -c conftest.s 2>&1 | grep -i warning > /dev/null; then
+-	    libffi_cv_as_x86_64_unwind_section_type=no
++        cat  > conftest1.s << EOF
++.text
++.globl foo
++foo:
++jmp bar
++.section .eh_frame,"a",@unwind
++bar:
++EOF
++
++        cat > conftest2.c  << EOF
++extern void foo();
++int main(){foo();}
++EOF
++
++	libffi_cv_as_x86_64_unwind_section_type=no
++	# we ensure that we can compile _and_ link an assembly file containing an @unwind section
++	# since the compiler can support it and not the linker (ie old binutils)
++	if $CC -Wa,--fatal-warnings $CFLAGS -c conftest1.s > /dev/null 2>&1 && \
++           $CC conftest2.c conftest1.o > /dev/null 2>&1 ; then
++	    libffi_cv_as_x86_64_unwind_section_type=yes
+ 	fi
+ 
+ fi
+@@ -14840,11 +14870,6 @@ if test "x$GCC" = "xyes"; then
+     toolexecdir='$(libdir)/gcc-lib/$(target_alias)'
+     toolexeclibdir='$(libdir)'
    fi
--  multi_os_directory=`$CC $CFLAGS -print-multi-os-directory`
+-  multi_os_directory=`$CC -print-multi-os-directory`
 -  case $multi_os_directory in
 -    .) ;; # Avoid trailing /.
 -    ../*) toolexeclibdir=$toolexeclibdir/$multi_os_directory ;;
 -  esac
  
  else
-   toolexeclibdir="${libdir}"
-@@ -19052,6 +19061,10 @@ if test -z "${VAX_TRUE}" && test -z "${V
-   as_fn_error $? "conditional \"VAX\" was never defined.
+   toolexeclibdir='$(libdir)'
+@@ -15135,6 +15160,10 @@ if test -z "${TILE_TRUE}" && test -z "${
+   as_fn_error $? "conditional \"TILE\" was never defined.
  Usually this means the macro was only invoked conditionally." "$LINENO" 5
  fi
 +if test -z "${VAX_TRUE}" && test -z "${VAX_FALSE}"; then
@@ -112,7 +151,7 @@ Other various platform changes.
  if test -z "${XTENSA_TRUE}" && test -z "${XTENSA_FALSE}"; then
    as_fn_error $? "conditional \"XTENSA\" was never defined.
  Usually this means the macro was only invoked conditionally." "$LINENO" 5
-@@ -20749,13 +20762,13 @@ s/ [a-zA-Z0-9-]*-all [a-zA-Z0-9-]*-all-a
+@@ -16734,13 +16763,13 @@ s/ [a-zA-Z0-9-]*-all [a-zA-Z0-9-]*-all-a
  /-all-all/d
  a\\
  	@ HOST="\$(HOST)\" \\\\\\
diff --git a/frida-libffi/patches/patch-ac b/frida-libffi/patches/patch-ac
index 69ea7b4b6e..5fd6bf8d70 100644
--- a/frida-libffi/patches/patch-ac
+++ b/frida-libffi/patches/patch-ac
@@ -1,10 +1,10 @@
-$NetBSD: patch-ac,v 1.3 2016/01/25 17:56:39 jperkin Exp $
+$NetBSD: patch-ac,v 1.2 2010/01/16 16:28:58 asau Exp $
 
 Install header files in backwards compatible way.
 
---- include/Makefile.in.orig	2014-11-12 11:59:58.000000000 +0000
-+++ include/Makefile.in
-@@ -314,7 +314,7 @@ top_srcdir = @top_srcdir@
+--- include/Makefile.in.orig	2009-12-31 15:41:01.000000000 +0300
++++ include/Makefile.in	2010-01-12 12:43:57.000000000 +0300
+@@ -203,7 +203,7 @@
  AUTOMAKE_OPTIONS = foreign
  DISTCLEANFILES = ffitarget.h
  EXTRA_DIST = ffi.h.in ffi_common.h
diff --git a/frida-libffi/patches/patch-ad b/frida-libffi/patches/patch-ad
index 06a2d0e8cc..514eff5d80 100644
--- a/frida-libffi/patches/patch-ad
+++ b/frida-libffi/patches/patch-ad
@@ -1,13 +1,13 @@
-$NetBSD: patch-ad,v 1.3 2016/01/25 17:56:39 jperkin Exp $
+$NetBSD: patch-ad,v 1.1 2008/10/11 22:33:56 dholland Exp $
 
 Install header files in backwards compatible way.
 
---- libffi.pc.in.orig	2014-11-08 12:47:24.000000000 +0000
-+++ libffi.pc.in
-@@ -2,7 +2,7 @@ prefix=@prefix@
+--- libffi.pc.in.orig	2008-10-09 12:38:02.000000000 +0400
++++ libffi.pc.in	2008-10-09 12:41:54.000000000 +0400
+@@ -1,7 +1,7 @@
+ prefix=@prefix@
  exec_prefix=@exec_prefix@
  libdir=@libdir@
- toolexeclibdir=@toolexeclibdir@
 -includedir=${libdir}/@PACKAGE_NAME@-@PACKAGE_VERSION@/include
 +includedir=@includedir@
  
diff --git a/frida-libffi/patches/patch-ae b/frida-libffi/patches/patch-ae
index 475fbcda0b..8ca294a9df 100644
--- a/frida-libffi/patches/patch-ae
+++ b/frida-libffi/patches/patch-ae
@@ -1,8 +1,8 @@
-$NetBSD: patch-ae,v 1.8 2016/11/03 11:40:28 maya Exp $
+$NetBSD: patch-ae,v 1.6 2014/02/11 07:21:28 dholland Exp $
 
 Make a minimal adjustment to support the various NetBSD mips ports.
 
---- src/mips/ffitarget.h.orig	2014-11-08 12:47:24.000000000 +0000
+--- src/mips/ffitarget.h.orig	2012-04-12 02:46:06.000000000 +0000
 +++ src/mips/ffitarget.h
 @@ -32,7 +32,7 @@
  #error "Please do not include ffitarget.h directly into your source.  Use ffi.h instead."
@@ -25,3 +25,16 @@ Make a minimal adjustment to support the various NetBSD mips ports.
  #endif
  
  #  ifndef _ABIN32
+@@ -55,6 +57,12 @@
+ #    define _ABIO32 _MIPS_SIM_ABI32
+ #  endif
+ 
++#ifdef __NetBSD__
++/* Let's cheat a bit... */   
++#  define _ABIO32 1     
++#  define _MIPS_SIM _ABIO32
++#endif
++
+ #if !defined(_MIPS_SIM)
+ # error -- something is very wrong --
+ #else
diff --git a/frida-libffi/patches/patch-af b/frida-libffi/patches/patch-af
index c9f5dcbfaa..3b6ed649b1 100644
--- a/frida-libffi/patches/patch-af
+++ b/frida-libffi/patches/patch-af
@@ -1,10 +1,30 @@
-$NetBSD: patch-af,v 1.5 2016/11/03 11:40:28 maya Exp $
+$NetBSD: patch-af,v 1.3 2012/09/14 23:45:27 asau Exp $
 
 Fixes to support the various NetBSD mips ports.
 
---- src/mips/ffi.c.orig	2014-11-08 12:47:24.000000000 +0000
-+++ src/mips/ffi.c
-@@ -472,6 +477,7 @@ ffi_status ffi_prep_cif_machdep(ffi_cif 
+--- src/mips/ffi.c.orig	2011-08-23 18:28:08.000000000 +0400
++++ src/mips/ffi.c	2012-02-19 20:04:17.000000000 +0400
+@@ -33,12 +33,17 @@
+ 
+ #ifdef __GNUC__
+ #  if (__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 3))
+-#    define USE__BUILTIN___CLEAR_CACHE 1
++#    if !defined(__NetBSD__)
++#      define USE__BUILTIN___CLEAR_CACHE 1
++#    endif
+ #  endif
+ #endif
+ 
+ #ifndef USE__BUILTIN___CLEAR_CACHE
+-#  if defined(__OpenBSD__)
++#  if defined(__NetBSD__)
++#    include <mips/cachectl.h>
++#    define cacheflush _cacheflush
++#  elif defined(__OpenBSD__)
+ #    include <mips64/sysarch.h>
+ #  else
+ #    include <sys/cachectl.h>
+@@ -465,6 +470,7 @@
                ((cif->arg_types)[index]->type << (arg_reg * FFI_FLAG_BITS));
  	    arg_reg++;
  	    break;
@@ -12,7 +32,7 @@ Fixes to support the various NetBSD mips ports.
            case FFI_TYPE_LONGDOUBLE:
              /* Align it.  */
              arg_reg = ALIGN(arg_reg, 2);
-@@ -490,7 +496,7 @@ ffi_status ffi_prep_cif_machdep(ffi_cif 
+@@ -483,7 +489,7 @@
  		arg_reg++;
  	      }
              break;
@@ -21,7 +41,7 @@ Fixes to support the various NetBSD mips ports.
  	  case FFI_TYPE_STRUCT:
              loc = arg_reg * FFI_SIZEOF_ARG;
  	    cif->flags += calc_n32_struct_flags(soft_float,
-@@ -552,6 +558,7 @@ ffi_status ffi_prep_cif_machdep(ffi_cif 
+@@ -545,6 +551,7 @@
  	  cif->flags += cif->rtype->type << (FFI_FLAG_BITS * 8);
  	break;
  
@@ -29,7 +49,7 @@ Fixes to support the various NetBSD mips ports.
        case FFI_TYPE_LONGDOUBLE:
  	/* Long double is returned as if it were a struct containing
  	   two doubles.  */
-@@ -568,6 +575,7 @@ ffi_status ffi_prep_cif_machdep(ffi_cif 
+@@ -561,6 +568,7 @@
  					      << (4 + (FFI_FLAG_BITS * 8));
  	  }
  	break;
diff --git a/frida-libffi/patches/patch-ag b/frida-libffi/patches/patch-ag
index 84acda3053..6033bfbc3f 100644
--- a/frida-libffi/patches/patch-ag
+++ b/frida-libffi/patches/patch-ag
@@ -1,10 +1,10 @@
-$NetBSD: patch-ag,v 1.2 2016/01/25 17:56:39 jperkin Exp $
+$NetBSD: patch-ag,v 1.1 2009/05/26 12:27:12 he Exp $
 
 The %Lf printf format expects "long double", so cast args accordingly.
 
---- testsuite/libffi.call/float2.c.orig	2014-11-08 12:47:24.000000000 +0000
+--- testsuite/libffi.call/float2.c.orig	2008-01-29 16:15:20.000000000 +0100
 +++ testsuite/libffi.call/float2.c
-@@ -45,7 +45,7 @@ int main (void)
+@@ -44,7 +44,7 @@ int main (void)
    /* This is ifdef'd out for now. long double support under SunOS/gcc
       is pretty much non-existent.  You'll get the odd bus error in library
       routines like printf().  */
diff --git a/frida-libffi/patches/patch-ah b/frida-libffi/patches/patch-ah
new file mode 100644
index 0000000000..fd636e3ab5
--- /dev/null
+++ b/frida-libffi/patches/patch-ah
@@ -0,0 +1,26 @@
+$NetBSD: patch-ah,v 1.1 2009/09/20 13:10:30 tnn Exp $
+
+--- src/alpha/ffi.c.orig	2008-02-26 18:34:36.000000000 +0100
++++ src/alpha/ffi.c
+@@ -27,6 +27,9 @@
+ #include <ffi.h>
+ #include <ffi_common.h>
+ #include <stdlib.h>
++#ifndef __GNUC__
++#include <c_asm.h>
++#endif
+ 
+ /* Force FFI_TYPE_LONGDOUBLE to be different than FFI_TYPE_DOUBLE;
+    all further uses in this file will refer to the 128-bit type.  */
+@@ -195,7 +198,11 @@ ffi_prep_closure_loc (ffi_closure* closu
+      instead, since both Compaq as and gas can handle it.
+ 
+      0x86 is PAL_imb in Tru64 UNIX <alpha/pal.h>.  */
++#ifdef __GNUC__
+   asm volatile ("call_pal 0x86" : : : "memory");
++#else /* Compaq C compiler */
++  asm ("call_pal 0x86");
++#endif
+ 
+   return FFI_OK;
+ }
diff --git a/frida-libffi/patches/patch-ai b/frida-libffi/patches/patch-ai
new file mode 100644
index 0000000000..a0ec8299a9
--- /dev/null
+++ b/frida-libffi/patches/patch-ai
@@ -0,0 +1,20 @@
+$NetBSD: patch-ai,v 1.2 2010/01/16 16:28:58 asau Exp $
+
+--- include/ffi_common.h.orig	2009-12-29 18:22:26.000000000 +0300
++++ include/ffi_common.h	2010-01-12 12:47:54.000000000 +0300
+@@ -99,6 +99,15 @@
+ typedef uint64_t UINT64;
+ typedef int64_t  SINT64;
+ # endif
++#elif defined(__digital__) && !defined(__GNUC__) /* XXX tnn: check sunpro */
++typedef unsigned int UINT8;
++typedef signed int   SINT8;
++typedef unsigned int UINT16;
++typedef signed int   SINT16;
++typedef unsigned int UINT32;
++typedef signed int   SINT32;
++typedef unsigned int UINT64;
++typedef signed int   SINT64;
+ #else
+ typedef unsigned int UINT8  __attribute__((__mode__(__QI__)));
+ typedef signed int   SINT8  __attribute__((__mode__(__QI__)));
diff --git a/frida-libffi/patches/patch-aj b/frida-libffi/patches/patch-aj
index 0c4a5899e1..b9a2a25101 100644
--- a/frida-libffi/patches/patch-aj
+++ b/frida-libffi/patches/patch-aj
@@ -1,8 +1,6 @@
-$NetBSD: patch-aj,v 1.5 2016/01/25 17:56:39 jperkin Exp $
+$NetBSD: patch-aj,v 1.4 2012/09/14 23:45:27 asau Exp $
 
-NetBSD/m68k support.
-
---- src/m68k/ffi.c.orig	2014-11-08 12:47:24.000000000 +0000
+--- src/m68k/ffi.c.orig	2012-04-12 02:46:06.000000000 +0000
 +++ src/m68k/ffi.c
 @@ -9,8 +9,11 @@
  
@@ -17,7 +15,7 @@ NetBSD/m68k support.
  #else
  #include <sys/syscall.h>
  #ifdef __MINT__
-@@ -345,8 +348,10 @@ ffi_prep_closure_loc (ffi_closure* closu
+@@ -335,8 +338,10 @@ ffi_prep_closure_loc (ffi_closure* closu
    else
      *(void **)(closure->tramp + 8) = ffi_closure_SYSV;
  
diff --git a/frida-libffi/patches/patch-configure.ac b/frida-libffi/patches/patch-configure.ac
new file mode 100644
index 0000000000..aa6fe6816d
--- /dev/null
+++ b/frida-libffi/patches/patch-configure.ac
@@ -0,0 +1,51 @@
+$NetBSD: patch-configure.ac,v 1.2 2014/02/11 07:21:28 dholland Exp $
+
+--- configure.ac.orig	2014-02-11 07:13:01.000000000 +0000
++++ configure.ac
+@@ -191,6 +191,10 @@ case "$host" in
+ 	TARGET=M68K; TARGETDIR=m68k
+ 	;;
+ 
++  m88k-*-*)
++	TARGET=M88K; TARGETDIR=m88k
++	;;
++
+   microblaze*-*-*)
+ 	TARGET=MICROBLAZE; TARGETDIR=microblaze
+ 	;;
+@@ -203,7 +207,7 @@ case "$host" in
+ 	TARGET=METAG; TARGETDIR=metag
+ 	;;
+ 
+-  mips-sgi-irix5.* | mips-sgi-irix6.* | mips*-*-rtems*)
++  mips*-sgi-irix5.* | mips*-sgi-irix6.* | mips*-*-rtems*)
+ 	TARGET=MIPS; TARGETDIR=mips
+ 	;;
+   mips*-*-linux* | mips*-*-openbsd*)
+@@ -256,6 +260,10 @@ case "$host" in
+         TARGET=TILE; TARGETDIR=tile
+         ;;
+ 
++  vax-*-*)
++	TARGET=VAX; TARGETDIR=vax
++	;;
++
+   xtensa*-*)
+ 	TARGET=XTENSA; TARGETDIR=xtensa
+ 	;;
+@@ -281,6 +289,7 @@ AM_CONDITIONAL(ALPHA, test x$TARGET = xA
+ AM_CONDITIONAL(IA64, test x$TARGET = xIA64)
+ AM_CONDITIONAL(M32R, test x$TARGET = xM32R)
+ AM_CONDITIONAL(M68K, test x$TARGET = xM68K)
++AM_CONDITIONAL(M88K, test x$TARGET = xM88K)
+ AM_CONDITIONAL(MICROBLAZE, test x$TARGET = xMICROBLAZE)
+ AM_CONDITIONAL(METAG, test x$TARGET = xMETAG)
+ AM_CONDITIONAL(MOXIE, test x$TARGET = xMOXIE)
+@@ -301,6 +310,7 @@ AM_CONDITIONAL(PA_LINUX, test x$TARGET =
+ AM_CONDITIONAL(PA_HPUX, test x$TARGET = xPA_HPUX)
+ AM_CONDITIONAL(PA64_HPUX, test x$TARGET = xPA64_HPUX)
+ AM_CONDITIONAL(TILE, test x$TARGET = xTILE)
++AM_CONDITIONAL(VAX, test x$TARGET = xVAX)
+ AM_CONDITIONAL(XTENSA, test x$TARGET = xXTENSA)
+ 
+ AC_HEADER_STDC
diff --git a/frida-libffi/patches/patch-fficonfig.h.in b/frida-libffi/patches/patch-fficonfig.h.in
new file mode 100644
index 0000000000..2285977d79
--- /dev/null
+++ b/frida-libffi/patches/patch-fficonfig.h.in
@@ -0,0 +1,14 @@
+$NetBSD: patch-fficonfig.h.in,v 1.1 2012/05/30 09:13:16 jperkin Exp $
+
+--- fficonfig.h.in.orig	Wed May 30 08:53:33 2012
++++ fficonfig.h.in	Wed May 30 08:54:03 2012
+@@ -46,6 +46,9 @@
+ /* Define if your assembler supports PC relative relocs. */
+ #undef HAVE_AS_X86_PCREL
+ 
++/* Define if your assembler supports unwind section type. */
++#undef HAVE_AS_X86_64_UNWIND_SECTION_TYPE
++
+ /* Define to 1 if you have the <dlfcn.h> header file. */
+ #undef HAVE_DLFCN_H
+ 
diff --git a/frida-libffi/patches/patch-src_alpha_osf.S b/frida-libffi/patches/patch-src_alpha_osf.S
deleted file mode 100644
index ec3901e3b2..0000000000
--- a/frida-libffi/patches/patch-src_alpha_osf.S
+++ /dev/null
@@ -1,26 +0,0 @@
-$NetBSD: patch-src_alpha_osf.S,v 1.2 2016/01/25 17:56:39 jperkin Exp $
-
-Band-aid update of the alpha asm code to make it compile past the addition
-of type complex. Someone with clue on the alpha ELF ABI should provide
-real support for complex arguments.
-
---- src/alpha/osf.S.orig	2014-11-08 12:47:24.000000000 +0000
-+++ src/alpha/osf.S
-@@ -279,6 +279,7 @@ $load_table:
- 	.gprel32 $load_64	# FFI_TYPE_SINT64
- 	.gprel32 $load_none	# FFI_TYPE_STRUCT
- 	.gprel32 $load_64	# FFI_TYPE_POINTER
-+	.gprel32 $load_none	# FFI_TYPE_COMPLEX
- 
- /* Assert that the table above is in sync with ffi.h.  */
- 
-@@ -294,7 +295,8 @@ $load_table:
- 	|| FFI_TYPE_SINT64 != 12	\
- 	|| FFI_TYPE_STRUCT != 13	\
- 	|| FFI_TYPE_POINTER != 14	\
--	|| FFI_TYPE_LAST != 14
-+	|| FFI_TYPE_COMPLEX != 15	\
-+	|| FFI_TYPE_LAST != 15
- #error "osf.S out of sync with ffi.h"
- #endif
- 
diff --git a/frida-libffi/patches/patch-src_arm_sysv.S b/frida-libffi/patches/patch-src_arm_sysv.S
index ac8afad366..fd116b9807 100644
--- a/frida-libffi/patches/patch-src_arm_sysv.S
+++ b/frida-libffi/patches/patch-src_arm_sysv.S
@@ -1,8 +1,6 @@
-$NetBSD: patch-src_arm_sysv.S,v 1.7 2016/01/25 17:56:39 jperkin Exp $
+$NetBSD: patch-src_arm_sysv.S,v 1.4 2014/06/11 11:45:04 joerg Exp $
 
-ARM fixes.
-
---- src/arm/sysv.S.orig	2014-11-08 12:47:24.000000000 +0000
+--- src/arm/sysv.S.orig	2013-03-16 11:19:39.000000000 +0000
 +++ src/arm/sysv.S
 @@ -25,6 +25,8 @@
     DEALINGS IN THE SOFTWARE.
@@ -22,23 +20,23 @@ ARM fixes.
  #define UNWIND
  #else
  #define UNWIND @
-@@ -121,6 +123,7 @@
- 	bx pc; \
- 	nop; \
- 	.arm; \
-+	.cfi_startproc; \
- 	UNWIND .fnstart; \
- _L__##name:
- #else
-@@ -129,6 +132,7 @@ _L__##name:
- 	.align 2; \
- 	.arm; \
- 	ENTRY(name); \
-+	.cfi_startproc; \
+@@ -125,6 +127,7 @@
+ 	nop
+ 	.arm
+ 	UNWIND .fnstart
++	.cfi_startproc
+ /* A hook to tell gdb that we've switched to ARM mode.  Also used to call
+    directly from other local arm routines.  */
+ #ifdef __APPLE__
+@@ -144,6 +147,7 @@ _L__\name:
+ 	ENTRY(\name)
+ #endif
  	UNWIND .fnstart
++        .cfi_startproc
+ .endm
  #endif
  
-@@ -160,6 +164,7 @@ ARM_FUNC_START(ffi_call_SYSV)
+@@ -175,6 +179,7 @@ ARM_FUNC_START ffi_call_SYSV
  	@ Save registers
          stmfd	sp!, {r0-r3, fp, lr}
  	UNWIND .save	{r0-r3, fp, lr}
@@ -46,7 +44,16 @@ ARM fixes.
  	mov	fp, sp
  
  	UNWIND .setfp	fp, sp
-@@ -238,6 +243,7 @@ LSYM(Lepilogue):
+@@ -228,7 +233,7 @@ ARM_FUNC_START ffi_call_SYSV
+ #if defined(__SOFTFP__) || defined(__ARM_EABI__)
+ 	cmpne	r3, #FFI_TYPE_DOUBLE
+ #endif
+-	stmeqia	r2, {r0, r1}
++	stmiaeq	r2, {r0, r1}
+ 
+ #if !defined(__SOFTFP__) && !defined(__ARM_EABI__)
+ 	beq	LSYM(Lepilogue)
+@@ -253,6 +258,7 @@ LSYM(Lepilogue):
  
  .ffi_call_SYSV_end:
  	UNWIND .fnend
@@ -54,7 +61,7 @@ ARM fixes.
  #ifdef __ELF__
          .size    CNAME(ffi_call_SYSV),.ffi_call_SYSV_end-CNAME(ffi_call_SYSV)
  #endif
-@@ -313,6 +319,7 @@ ARM_FUNC_START(ffi_closure_SYSV)
+@@ -328,6 +334,7 @@ ARM_FUNC_START ffi_closure_SYSV
  
  .ffi_closure_SYSV_end:
  	UNWIND .fnend
@@ -62,7 +69,7 @@ ARM fixes.
  #ifdef __ELF__
          .size    CNAME(ffi_closure_SYSV),.ffi_closure_SYSV_end-CNAME(ffi_closure_SYSV)
  #endif
-@@ -396,7 +403,7 @@ LSYM(Lbase_args):
+@@ -410,7 +417,7 @@ LSYM(Lbase_args):
  	beq	LSYM(Lepilogue_vfp)
  
  	cmp	r3, #FFI_TYPE_SINT64
@@ -71,7 +78,7 @@ ARM fixes.
  	beq	LSYM(Lepilogue_vfp)
  
  	cmp	r3, #FFI_TYPE_FLOAT
-@@ -416,6 +423,7 @@ LSYM(Lepilogue_vfp):
+@@ -430,6 +437,7 @@ LSYM(Lepilogue_vfp):
  
  .ffi_call_VFP_end:
  	UNWIND .fnend
@@ -79,7 +86,7 @@ ARM fixes.
          .size    CNAME(ffi_call_VFP),.ffi_call_VFP_end-CNAME(ffi_call_VFP)
  
  
-@@ -478,6 +486,7 @@ ARM_FUNC_START(ffi_closure_VFP)
+@@ -492,6 +500,7 @@ ARM_FUNC_START ffi_closure_VFP
  
  .ffi_closure_VFP_end:
  	UNWIND .fnend
diff --git a/frida-libffi/patches/patch-src_closures.c b/frida-libffi/patches/patch-src_closures.c
deleted file mode 100644
index a135fecb8f..0000000000
--- a/frida-libffi/patches/patch-src_closures.c
+++ /dev/null
@@ -1,94 +0,0 @@
-$NetBSD: patch-src_closures.c,v 1.2 2017/09/05 15:08:42 joerg Exp $
-
---- src/closures.c.orig	2017-05-22 23:16:12.516083134 +0000
-+++ src/closures.c
-@@ -33,6 +33,83 @@
- #include <ffi.h>
- #include <ffi_common.h>
- 
-+#ifdef __NetBSD__
-+#include <sys/param.h>
-+#endif
-+
-+#if __NetBSD_Version__ - 0 >= 799007200
-+/* NetBSD with PROT_MPROTECT */
-+#include <sys/mman.h>
-+
-+#include <stddef.h>
-+#include <unistd.h>
-+
-+static const size_t overhead =
-+  (sizeof(max_align_t) > sizeof(void *) + sizeof(size_t)) ?
-+    sizeof(max_align_t)
-+    : sizeof(void *) + sizeof(size_t);
-+
-+#define ADD_TO_POINTER(p, d) ((void *)((uintptr_t)(p) + (d)))
-+
-+void *
-+ffi_closure_alloc (size_t size, void **code)
-+{
-+  static size_t page_size;
-+  size_t rounded_size;
-+  void *codeseg, *dataseg;
-+  int prot;
-+  
-+
-+  /* Expect that PAX mprotect is active and a separate code mapping is necessary. */
-+  if (!code)
-+    return NULL;
-+
-+  /* Obtain system page size. */
-+  if (!page_size)
-+    page_size = sysconf(_SC_PAGESIZE);
-+
-+  /* Round allocation size up to the next page, keeping in mind the size field and pointer to code map. */
-+  rounded_size = (size + overhead + page_size - 1) & ~(page_size - 1);
-+
-+  /* Primary mapping is RW, but request permission to switch to PROT_EXEC later. */
-+  prot = PROT_READ | PROT_WRITE | PROT_MPROTECT(PROT_EXEC);
-+  dataseg = mmap(NULL, rounded_size, prot, MAP_ANON | MAP_PRIVATE, -1, 0);
-+  if (dataseg == MAP_FAILED)
-+    return NULL;
-+
-+  /* Create secondary mapping and switch it to RX. */
-+  codeseg = mremap(dataseg, rounded_size, NULL, rounded_size, MAP_REMAPDUP);
-+  if (codeseg == MAP_FAILED) {
-+    munmap(dataseg, rounded_size);
-+    return NULL;
-+  }
-+  if (mprotect(codeseg, rounded_size, PROT_READ | PROT_EXEC) == -1) {
-+    munmap(codeseg, rounded_size);
-+    munmap(dataseg, rounded_size);
-+    return NULL;
-+  }
-+
-+  /* Remember allocation size and location of the secondary mapping for ffi_closure_free. */
-+  memcpy(dataseg, &rounded_size, sizeof(rounded_size));
-+  memcpy(ADD_TO_POINTER(dataseg, sizeof(size_t)), &codeseg, sizeof(void *));
-+  *code = ADD_TO_POINTER(codeseg, overhead);
-+  return ADD_TO_POINTER(dataseg, overhead);
-+}
-+
-+void
-+ffi_closure_free (void *ptr)
-+{
-+  void *codeseg, *dataseg;
-+  size_t rounded_size;
-+
-+  dataseg = ADD_TO_POINTER(ptr, -overhead);
-+  memcpy(&rounded_size, dataseg, sizeof(rounded_size));
-+  memcpy(&codeseg, ADD_TO_POINTER(dataseg, sizeof(size_t)), sizeof(void *));
-+  munmap(dataseg, rounded_size);
-+  munmap(codeseg, rounded_size);
-+}
-+#else /* !NetBSD with PROT_MPROTECT */
-+
- #if !FFI_MMAP_EXEC_WRIT && !FFI_EXEC_TRAMPOLINE_TABLE
- # if __gnu_linux__ && !defined(__ANDROID__)
- /* This macro indicates it may be forbidden to map anonymous memory
-@@ -686,3 +763,5 @@ ffi_closure_free (void *ptr)
- 
- # endif /* ! FFI_MMAP_EXEC_WRIT */
- #endif /* FFI_CLOSURES */
-+
-+#endif /* NetBSD with PROT_MPROTECT */
diff --git a/frida-libffi/patches/patch-src_m88k_elfbsd.S b/frida-libffi/patches/patch-src_m88k_elfbsd.S
index 943d22a337..644ce2c221 100644
--- a/frida-libffi/patches/patch-src_m88k_elfbsd.S
+++ b/frida-libffi/patches/patch-src_m88k_elfbsd.S
@@ -1,8 +1,6 @@
-$NetBSD: patch-src_m88k_elfbsd.S,v 1.2 2016/01/25 17:56:39 jperkin Exp $
+$NetBSD: patch-src_m88k_elfbsd.S,v 1.1 2013/11/03 23:51:51 jklos Exp $
 
-m88k support.
-
---- src/m88k/elfbsd.S.orig	2016-01-25 17:24:51.000000000 +0000
+--- src/m88k/elfbsd.S.orig	2013-11-03 22:57:57.000000000 +0000
 +++ src/m88k/elfbsd.S
 @@ -0,0 +1,195 @@
 +/*
diff --git a/frida-libffi/patches/patch-src_m88k_ffi.c b/frida-libffi/patches/patch-src_m88k_ffi.c
new file mode 100644
index 0000000000..3eb5cdce8b
--- /dev/null
+++ b/frida-libffi/patches/patch-src_m88k_ffi.c
@@ -0,0 +1,405 @@
+$NetBSD: patch-src_m88k_ffi.c,v 1.1 2013/11/03 23:51:51 jklos Exp $
+
+--- src/m88k/ffi.c.orig	2013-11-03 22:59:04.000000000 +0000
++++ src/m88k/ffi.c
+@@ -0,0 +1,400 @@
++/*
++ * Copyright (c) 2013 Miodrag Vallat.  <miod%openbsd.org@localhost>
++ *
++ * 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.
++ */
++
++/*
++ * m88k Foreign Function Interface
++ *
++ * This file attempts to provide all the FFI entry points which can reliably
++ * be implemented in C.
++ *
++ * Only OpenBSD/m88k is currently supported; other platforms (such as
++ * Motorola's SysV/m88k) could be supported with the following tweaks:
++ *
++ * - non-OpenBSD systems use an `outgoing parameter area' as part of the
++ *   88BCS calling convention, which is not supported under OpenBSD from
++ *   release 3.6 onwards.  Supporting it should be as easy as taking it
++ *   into account when adjusting the stack, in the assembly code.
++ *
++ * - the logic deciding whether a function argument gets passed through
++ *   registers, or on the stack, has changed several times in OpenBSD in
++ *   edge cases (especially for structs larger than 32 bytes being passed
++ *   by value). The code below attemps to match the logic used by the
++ *   system compiler of OpenBSD 5.3, i.e. gcc 3.3.6 with many m88k backend
++ *   fixes.
++ */
++
++#include <ffi.h>
++#include <ffi_common.h>
++
++#include <stdlib.h>
++#include <unistd.h>
++
++void ffi_call_OBSD (unsigned int, extended_cif *, unsigned int, void *,
++		    void (*fn) ());
++void *ffi_prep_args (void *, extended_cif *);
++void ffi_closure_OBSD (ffi_closure *);
++void ffi_closure_struct_OBSD (ffi_closure *);
++unsigned int ffi_closure_OBSD_inner (ffi_closure *, void *, unsigned int *,
++				     char *);
++void ffi_cacheflush_OBSD (unsigned int, unsigned int);
++
++#define CIF_FLAGS_INT		(1 << 0)
++#define CIF_FLAGS_DINT		(1 << 1)
++
++/*
++ * Foreign Function Interface API
++ */
++
++/* ffi_prep_args is called by the assembly routine once stack space has
++   been allocated for the function's arguments.  */
++
++void *
++ffi_prep_args (void *stack, extended_cif *ecif)
++{
++  unsigned int i;
++  void **p_argv;
++  char *argp, *stackp;
++  unsigned int *regp;
++  unsigned int regused;
++  ffi_type **p_arg;
++  void *struct_value_ptr;
++
++  regp = (unsigned int *)stack;
++  stackp = (char *)(regp + 8);
++  regused = 0;
++
++  if (ecif->cif->rtype->type == FFI_TYPE_STRUCT
++      && !ecif->cif->flags)
++    struct_value_ptr = ecif->rvalue;
++  else
++    struct_value_ptr = NULL;
++
++  p_argv = ecif->avalue;
++
++  for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types; i != 0; i--, p_arg++)
++    {
++      size_t z;
++      unsigned short t, a;
++
++      z = (*p_arg)->size;
++      t = (*p_arg)->type;
++      a = (*p_arg)->alignment;
++
++      /*
++       * Figure out whether the argument can be passed through registers
++       * or on the stack.
++       * The rule is that registers can only receive simple types not larger
++       * than 64 bits, or structs the exact size of a register and aligned to
++       * the size of a register.
++       */
++      if (t == FFI_TYPE_STRUCT)
++	{
++	  if (z == sizeof (int) && a == sizeof (int) && regused < 8)
++	    argp = (char *)regp;
++	  else
++	    argp = stackp;
++	}
++      else
++	{
++	  if (z > sizeof (int) && regused < 8 - 1)
++	    {
++	      /* align to an even register pair */
++	      if (regused & 1)
++		{
++		  regp++;
++		  regused++;
++		}
++	    }
++	  if (regused < 8)
++	    argp = (char *)regp;
++	  else
++	    argp = stackp;
++	}
++
++      /* Enforce proper stack alignment of 64-bit types */
++      if (argp == stackp && a > sizeof (int))
++	{
++	  stackp = (char *) ALIGN(stackp, a);
++	  argp = stackp;
++	}
++
++      switch (t)
++	{
++	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_INT:
++	case FFI_TYPE_FLOAT:
++	case FFI_TYPE_UINT32:
++	case FFI_TYPE_SINT32:
++	case FFI_TYPE_POINTER:
++	  *(unsigned int *) argp = *(unsigned int *) *p_argv;
++	  break;
++
++	case FFI_TYPE_DOUBLE:
++	case FFI_TYPE_UINT64:
++	case FFI_TYPE_SINT64:
++	case FFI_TYPE_STRUCT:
++	  memcpy (argp, *p_argv, z);
++	  break;
++
++	default:
++	  FFI_ASSERT (0);
++	}
++
++      /* Align if necessary.  */
++      if ((sizeof (int) - 1) & z)
++	z = ALIGN(z, sizeof (int));
++
++      p_argv++;
++
++      /* Be careful, once all registers are filled, and about to continue
++         on stack, regp == stackp.  Therefore the check for regused as well. */
++      if (argp == (char *)regp && regused < 8)
++	{
++	  regp += z / sizeof (int);
++	  regused += z / sizeof (int);
++	}
++      else
++	stackp += z;
++    }
++
++  return struct_value_ptr;
++}
++
++/* 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 = 0;
++      break;
++
++    case FFI_TYPE_STRUCT:
++      if (cif->rtype->size == sizeof (int) &&
++	  cif->rtype->alignment == sizeof (int))
++	cif->flags = CIF_FLAGS_INT;
++      else
++	cif->flags = 0;
++      break;
++
++    case FFI_TYPE_DOUBLE:
++    case FFI_TYPE_SINT64:
++    case FFI_TYPE_UINT64:
++      cif->flags = CIF_FLAGS_DINT;
++      break;
++
++    default:
++      cif->flags = CIF_FLAGS_INT;
++      break;
++    }
++
++  return FFI_OK;
++}
++
++void
++ffi_call (ffi_cif *cif, void (*fn) (), 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
++      && (cif->rtype->size != sizeof (int)
++	  || cif->rtype->alignment != sizeof (int)))
++    ecif.rvalue = alloca (cif->rtype->size);
++  else
++    ecif.rvalue = rvalue;
++
++  switch (cif->abi)
++    {
++    case FFI_OBSD:
++      ffi_call_OBSD (cif->bytes, &ecif, cif->flags, ecif.rvalue, fn);
++      break;
++
++    default:
++      FFI_ASSERT (0);
++      break;
++    }
++}
++
++/*
++ * Closure API
++ */
++
++static void
++ffi_prep_closure_args_OBSD (ffi_cif *cif, void **avalue, unsigned int *regp,
++			    char *stackp)
++{
++  unsigned int i;
++  void **p_argv;
++  char *argp;
++  unsigned int regused;
++  ffi_type **p_arg;
++
++  regused = 0;
++
++  p_argv = avalue;
++
++  for (i = cif->nargs, p_arg = cif->arg_types; i != 0; i--, p_arg++)
++    {
++      size_t z;
++      unsigned short t, a;
++
++      z = (*p_arg)->size;
++      t = (*p_arg)->type;
++      a = (*p_arg)->alignment;
++
++      /*
++       * Figure out whether the argument has been passed through registers
++       * or on the stack.
++       * The rule is that registers can only receive simple types not larger
++       * than 64 bits, or structs the exact size of a register and aligned to
++       * the size of a register.
++       */
++      if (t == FFI_TYPE_STRUCT)
++	{
++	  if (z == sizeof (int) && a == sizeof (int) && regused < 8)
++	    argp = (char *)regp;
++	  else
++	    argp = stackp;
++	}
++      else
++	{
++	  if (z > sizeof (int) && regused < 8 - 1)
++	    {
++	      /* align to an even register pair */
++	      if (regused & 1)
++		{
++		  regp++;
++		  regused++;
++		}
++	    }
++	  if (regused < 8)
++	    argp = (char *)regp;
++	  else
++	    argp = stackp;
++	}
++
++      /* Enforce proper stack alignment of 64-bit types */
++      if (argp == stackp && a > sizeof (int))
++	{
++	  stackp = (char *) ALIGN(stackp, a);
++	  argp = stackp;
++	}
++
++      if (z < sizeof (int) && t != FFI_TYPE_STRUCT)
++	*p_argv = (void *) (argp + sizeof (int) - z);
++      else
++	*p_argv = (void *) argp;
++
++      /* Align if necessary */
++      if ((sizeof (int) - 1) & z)
++	z = ALIGN(z, sizeof (int));
++
++      p_argv++;
++
++      /* Be careful, once all registers are exhausted, and about to fetch from
++	 stack, regp == stackp.  Therefore the check for regused as well. */
++      if (argp == (char *)regp && regused < 8)
++	{
++	  regp += z / sizeof (int);
++	  regused += z / sizeof (int);
++	}
++      else
++	stackp += z;
++    }
++}
++
++unsigned int
++ffi_closure_OBSD_inner (ffi_closure *closure, void *resp, unsigned int *regp,
++			char *stackp)
++{
++  ffi_cif *cif;
++  void **arg_area;
++
++  cif = closure->cif;
++  arg_area = (void**) alloca (cif->nargs * sizeof (void *));
++
++  ffi_prep_closure_args_OBSD(cif, arg_area, regp, stackp);
++
++  (closure->fun) (cif, resp, 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)
++{
++  unsigned int *tramp = (unsigned int *) codeloc;
++  void *fn;
++
++  FFI_ASSERT (cif->abi == FFI_OBSD);
++
++  if (cif->rtype->type == FFI_TYPE_STRUCT && !cif->flags)
++    fn = &ffi_closure_struct_OBSD;
++  else
++    fn = &ffi_closure_OBSD;
++
++  /* or.u %r10, %r0, %hi16(fn) */
++  tramp[0] = 0x5d400000 | (((unsigned int)fn) >> 16);
++  /* or.u %r13, %r0, %hi16(closure) */
++  tramp[1] = 0x5da00000 | ((unsigned int)closure >> 16);
++  /* or %r10, %r10, %lo16(fn) */
++  tramp[2] = 0x594a0000 | (((unsigned int)fn) & 0xffff);
++  /* jmp.n %r10 */
++  tramp[3] = 0xf400c40a;
++  /* or %r13, %r13, %lo16(closure) */
++  tramp[4] = 0x59ad0000 | ((unsigned int)closure & 0xffff);
++
++  ffi_cacheflush_OBSD((unsigned int)codeloc, FFI_TRAMPOLINE_SIZE);
++
++  closure->cif  = cif;
++  closure->user_data = user_data;
++  closure->fun  = fun;
++
++  return FFI_OK;
++}
diff --git a/frida-libffi/patches/patch-src_m88k_ffitarget.h b/frida-libffi/patches/patch-src_m88k_ffitarget.h
new file mode 100644
index 0000000000..b9e789adb7
--- /dev/null
+++ b/frida-libffi/patches/patch-src_m88k_ffitarget.h
@@ -0,0 +1,54 @@
+$NetBSD: patch-src_m88k_ffitarget.h,v 1.1 2013/11/03 23:51:51 jklos Exp $
+
+--- src/m88k/ffitarget.h.orig	2013-11-03 23:00:28.000000000 +0000
++++ src/m88k/ffitarget.h
+@@ -0,0 +1,49 @@
++/*
++ * Copyright (c) 2013 Miodrag Vallat.  <miod%openbsd.org@localhost>
++ *
++ * 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.
++ */
++
++/*
++ * m88k Foreign Function Interface
++ */
++
++#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_OBSD,
++  FFI_DEFAULT_ABI = FFI_OBSD,
++  FFI_LAST_ABI = FFI_DEFAULT_ABI + 1
++} ffi_abi;
++#endif
++
++/* ---- Definitions for closures ----------------------------------------- */
++
++#define FFI_CLOSURES 1
++#define FFI_TRAMPOLINE_SIZE 0x14
++#define FFI_NATIVE_RAW_API 0
++
++#endif
diff --git a/frida-libffi/patches/patch-src_vax_elfbsd.S b/frida-libffi/patches/patch-src_vax_elfbsd.S
new file mode 100644
index 0000000000..de67548ae5
--- /dev/null
+++ b/frida-libffi/patches/patch-src_vax_elfbsd.S
@@ -0,0 +1,200 @@
+$NetBSD: patch-src_vax_elfbsd.S,v 1.1 2013/11/03 23:51:51 jklos Exp $
+
+--- src/vax/elfbsd.S.orig	2013-11-03 23:01:39.000000000 +0000
++++ src/vax/elfbsd.S
+@@ -0,0 +1,195 @@
++/*
++ * Copyright (c) 2013 Miodrag Vallat.  <miod%openbsd.org@localhost>
++ *
++ * 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.
++ */
++
++/*
++ * vax Foreign Function Interface
++ */
++
++#define LIBFFI_ASM	
++#include <fficonfig.h>
++#include <ffi.h>
++
++	.text
++
++/*
++ * void *					%r0
++ * ffi_call_elfbsd(extended_cif *ecif,		4(%ap)
++ *		   unsigned bytes,		8(%ap)
++ *		   unsigned flags,		12(%ap)
++ *		   void *rvalue,		16(%ap)
++ *		   void (*fn)());		20(%ap)
++ */
++	.globl	ffi_call_elfbsd
++	.type	ffi_call_elfbsd,@function
++	.align	2
++ffi_call_elfbsd:
++	.word	0x00c		# save R2 and R3
++
++	# Allocate stack space for the args
++	subl2	8(%ap), %sp
++
++	# Call ffi_prep_args
++	pushl	%sp
++	pushl	4(%ap)
++	calls	$2, ffi_prep_args
++
++	# Get function pointer
++	movl	20(%ap), %r1
++
++	# Build a CALLS frame
++	ashl	$-2, 8(%ap), %r0
++	pushl	%r0		# argument stack usage
++	movl	%sp, %r0	# future %ap
++	# saved registers
++	bbc	$11, 0(%r1), 1f
++	pushl	%r11
++1:	bbc	$10, 0(%r1), 1f
++	pushl	%r10
++1:	bbc	$9, 0(%r1), 1f
++	pushl	%r9
++1:	bbc	$8, 0(%r1), 1f
++	pushl	%r8
++1:	bbc	$7, 0(%r1), 1f
++	pushl	%r7
++1:	bbc	$6, 0(%r1), 1f
++	pushl	%r6
++1:	bbc	$5, 0(%r1), 1f
++	pushl	%r5
++1:	bbc	$4, 0(%r1), 1f
++	pushl	%r4
++1:	bbc	$3, 0(%r1), 1f
++	pushl	%r3
++1:	bbc	$2, 0(%r1), 1f
++	pushl	%r2
++1:	
++	pushal	9f
++	pushl	%fp
++	pushl	%ap
++	movl	16(%ap), %r3	# struct return address, if needed
++	movl	%r0, %ap
++	movzwl	4(%fp), %r0	# previous PSW, without the saved registers mask
++	bisl2	$0x20000000, %r0 # calls frame
++	movzwl	0(%r1), %r2
++	bicw2	$0xf003, %r2	# only keep R11-R2
++	ashl	$16, %r2, %r2
++	bisl2	%r2, %r0	# saved register mask of the called function
++	pushl	%r0	
++	pushl	$0
++	movl	%sp, %fp
++
++	# Invoke the function
++	pushal	2(%r1)		# skip procedure entry mask
++	movl	%r3, %r1
++	bicpsw	$0x000f
++	rsb
++
++9:
++	# Copy return value if necessary
++	tstl	16(%ap)
++	jeql	9f
++	movl	16(%ap), %r2
++
++	bbc	$0, 12(%ap), 1f	# CIF_FLAGS_CHAR
++	movb	%r0, 0(%r2)
++	brb	9f
++1:
++	bbc	$1, 12(%ap), 1f	# CIF_FLAGS_SHORT
++	movw	%r0, 0(%r2)
++	brb	9f
++1:
++	bbc	$2, 12(%ap), 1f	# CIF_FLAGS_INT
++	movl	%r0, 0(%r2)
++	brb	9f
++1:
++	bbc	$3, 12(%ap), 1f	# CIF_FLAGS_DINT
++	movq	%r0, 0(%r2)
++	brb	9f
++1:
++	movl	%r1, %r0	# might have been a struct
++	#brb	9f
++
++9:
++	ret
++
++/*
++ * ffi_closure_elfbsd(void);
++ * invoked with	%r0: ffi_closure *closure
++ */
++	.globl	ffi_closure_elfbsd
++	.type	ffi_closure_elfbsd, @function
++	.align	2
++ffi_closure_elfbsd:
++	.word	0
++
++	# Allocate room on stack for return value
++	subl2	$8, %sp
++
++	# Invoke the closure function
++	pushal	4(%ap)		# calling stack
++	pushal	4(%sp)		# return value
++	pushl	%r0		# closure
++	calls	$3, ffi_closure_elfbsd_inner
++
++	# Copy return value if necessary
++	bitb	$1, %r0		# CIF_FLAGS_CHAR
++	beql	1f
++	movb	0(%sp), %r0
++	brb	9f
++1:
++	bitb	$2, %r0		# CIF_FLAGS_SHORT
++	beql	1f
++	movw	0(%sp), %r0
++	brb	9f
++1:
++	bitb	$4, %r0		# CIF_FLAGS_INT
++	beql	1f
++	movl	0(%sp), %r0
++	brb	9f
++1:
++	bitb	$8, %r0		# CIF_FLAGS_DINT
++	beql	1f
++	movq	0(%sp), %r0
++	#brb	9f
++1:
++
++9:
++	ret
++
++/*
++ * ffi_closure_struct_elfbsd(void);
++ * invoked with	%r0: ffi_closure *closure
++ *		%r1: struct return address
++ */
++	.globl	ffi_closure_struct_elfbsd
++	.type	ffi_closure_struct_elfbsd, @function
++	.align	2
++ffi_closure_struct_elfbsd:
++	.word	0
++
++	# Invoke the closure function
++	pushal	4(%ap)		# calling stack
++	pushl	%r1		# return value
++	pushl	%r0		# closure
++	calls	$3, ffi_closure_elfbsd_inner
++
++	ret
diff --git a/frida-libffi/patches/patch-src_vax_ffi.c b/frida-libffi/patches/patch-src_vax_ffi.c
new file mode 100644
index 0000000000..dedcd2bb13
--- /dev/null
+++ b/frida-libffi/patches/patch-src_vax_ffi.c
@@ -0,0 +1,281 @@
+$NetBSD: patch-src_vax_ffi.c,v 1.1 2013/11/03 23:51:51 jklos Exp $
+
+--- src/vax/ffi.c.orig	2013-11-03 23:02:29.000000000 +0000
++++ src/vax/ffi.c
+@@ -0,0 +1,276 @@
++/*
++ * Copyright (c) 2013 Miodrag Vallat.  <miod%openbsd.org@localhost>
++ *
++ * 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.
++ */
++
++/*
++ * vax Foreign Function Interface
++ *
++ * This file attempts to provide all the FFI entry points which can reliably
++ * be implemented in C.
++ */
++
++#include <ffi.h>
++#include <ffi_common.h>
++
++#include <stdlib.h>
++#include <unistd.h>
++
++#define CIF_FLAGS_CHAR		1	/* for struct only */
++#define CIF_FLAGS_SHORT		2	/* for struct only */
++#define CIF_FLAGS_INT		4
++#define CIF_FLAGS_DINT		8
++
++/*
++ * Foreign Function Interface API
++ */
++
++void ffi_call_elfbsd (extended_cif *, unsigned, unsigned, void *,
++		       void (*) ());
++void *ffi_prep_args (extended_cif *ecif, void *stack);
++
++void *
++ffi_prep_args (extended_cif *ecif, void *stack)
++{
++  unsigned int i;
++  void **p_argv;
++  char *argp;
++  ffi_type **p_arg;
++  void *struct_value_ptr;
++
++  argp = stack;
++
++  if (ecif->cif->rtype->type == FFI_TYPE_STRUCT
++      && !ecif->cif->flags)
++    struct_value_ptr = ecif->rvalue;
++  else
++    struct_value_ptr = NULL;
++
++  p_argv = ecif->avalue;
++
++  for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types;
++       i != 0;
++       i--, p_arg++)
++    {
++      size_t z;
++
++      z = (*p_arg)->size;
++      if (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, z);
++	      break;
++
++	    default:
++	      FFI_ASSERT (0);
++	    }
++	  z = sizeof (int);
++	}
++      else
++	{
++	  memcpy (argp, *p_argv, z);
++
++	  /* Align if necessary.  */
++	  if ((sizeof(int) - 1) & z)
++	    z = ALIGN(z, sizeof(int));
++	}
++
++      p_argv++;
++      argp += z;
++    }
++
++  return struct_value_ptr;
++}
++
++ffi_status
++ffi_prep_cif_machdep (ffi_cif *cif)
++{
++  /* Set the return type flag */
++  switch (cif->rtype->type)
++    {
++    case FFI_TYPE_VOID:
++      cif->flags = 0;
++      break;
++
++    case FFI_TYPE_STRUCT:
++      if (cif->rtype->elements[0]->type == FFI_TYPE_STRUCT &&
++	  cif->rtype->elements[1])
++	{
++	  cif->flags = 0;
++	  break;
++	}
++
++      if (cif->rtype->size == sizeof (char))
++	cif->flags = CIF_FLAGS_CHAR;
++      else if (cif->rtype->size == sizeof (short))
++	cif->flags = CIF_FLAGS_SHORT;
++      else if (cif->rtype->size == sizeof (int))
++	cif->flags = CIF_FLAGS_INT;
++      else if (cif->rtype->size == 2 * sizeof (int))
++	cif->flags = CIF_FLAGS_DINT;
++      else
++	cif->flags = 0;
++      break;
++
++    default:
++      if (cif->rtype->size <= sizeof (int))
++	cif->flags = CIF_FLAGS_INT;
++      else
++	cif->flags = CIF_FLAGS_DINT;
++      break;
++    }
++
++  return FFI_OK;
++}
++
++void
++ffi_call (ffi_cif *cif, void (*fn) (), 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
++      && cif->flags == 0)
++    ecif.rvalue = alloca (cif->rtype->size);
++  else
++    ecif.rvalue = rvalue;
++
++  switch (cif->abi)
++    {
++    case FFI_ELFBSD:
++      ffi_call_elfbsd (&ecif, cif->bytes, cif->flags, ecif.rvalue, fn);
++      break;
++
++    default:
++      FFI_ASSERT (0);
++      break;
++    }
++}
++
++/*
++ * Closure API
++ */
++
++void ffi_closure_elfbsd (void);
++void ffi_closure_struct_elfbsd (void);
++unsigned int ffi_closure_elfbsd_inner (ffi_closure *, void *, char *);
++
++static void
++ffi_prep_closure_elfbsd (ffi_cif *cif, void **avalue, char *stackp)
++{
++  unsigned int i;
++  void **p_argv;
++  ffi_type **p_arg;
++
++  p_argv = avalue;
++
++  for (i = cif->nargs, p_arg = cif->arg_types; i != 0; i--, p_arg++)
++    {
++      size_t z;
++
++      z = (*p_arg)->size;
++      *p_argv = stackp;
++
++      /* Align if necessary */
++      if ((sizeof (int) - 1) & z)
++	z = ALIGN(z, sizeof (int));
++
++      p_argv++;
++      stackp += z;
++    }
++}
++
++unsigned int
++ffi_closure_elfbsd_inner (ffi_closure *closure, void *resp, char *stack)
++{
++  ffi_cif *cif;
++  void **arg_area;
++
++  cif = closure->cif;
++  arg_area = (void **) alloca (cif->nargs * sizeof (void *));
++
++  ffi_prep_closure_elfbsd (cif, arg_area, stack);
++
++  (closure->fun) (cif, resp, 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)
++{
++  char *tramp = (char *) codeloc;
++  void *fn;
++
++  FFI_ASSERT (cif->abi == FFI_ELFBSD);
++
++  /* entry mask */
++  *(unsigned short *)(tramp + 0) = 0x0000;
++  /* movl #closure, r0 */
++  tramp[2] = 0xd0;
++  tramp[3] = 0x8f;
++  *(unsigned int *)(tramp + 4) = (unsigned int) closure;
++  tramp[8] = 0x50;
++
++  if (cif->rtype->type == FFI_TYPE_STRUCT
++      && !cif->flags)
++    fn = &ffi_closure_struct_elfbsd;
++  else
++    fn = &ffi_closure_elfbsd;
++
++  /* jmpl #fn */
++  tramp[9] = 0x17;
++  tramp[10] = 0xef;
++  *(unsigned int *)(tramp + 11) = (unsigned int)fn + 2 -
++				  (unsigned int)tramp - 9 - 6;
++
++  closure->cif = cif;
++  closure->user_data = user_data;
++  closure->fun = fun;
++
++  return FFI_OK;
++}
diff --git a/frida-libffi/patches/patch-src_vax_ffitarget.h b/frida-libffi/patches/patch-src_vax_ffitarget.h
new file mode 100644
index 0000000000..55233d268a
--- /dev/null
+++ b/frida-libffi/patches/patch-src_vax_ffitarget.h
@@ -0,0 +1,54 @@
+$NetBSD: patch-src_vax_ffitarget.h,v 1.1 2013/11/03 23:51:51 jklos Exp $
+
+--- src/vax/ffitarget.h.orig	2013-11-03 23:03:01.000000000 +0000
++++ src/vax/ffitarget.h
+@@ -0,0 +1,49 @@
++/*
++ * Copyright (c) 2013 Miodrag Vallat.  <miod%openbsd.org@localhost>
++ *
++ * 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.
++ */
++
++/*
++ * vax Foreign Function Interface
++ */
++
++#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_ELFBSD,
++  FFI_DEFAULT_ABI = FFI_ELFBSD,
++  FFI_LAST_ABI = FFI_DEFAULT_ABI + 1
++} ffi_abi;
++#endif
++
++/* ---- Definitions for closures ----------------------------------------- */
++
++#define FFI_CLOSURES 1
++#define FFI_TRAMPOLINE_SIZE 15
++#define FFI_NATIVE_RAW_API 0
++
++#endif
diff --git a/frida-libffi/patches/patch-src_x86_ffi.c b/frida-libffi/patches/patch-src_x86_ffi.c
new file mode 100644
index 0000000000..eee8bedfc5
--- /dev/null
+++ b/frida-libffi/patches/patch-src_x86_ffi.c
@@ -0,0 +1,15 @@
+$NetBSD: patch-src_x86_ffi.c,v 1.1 2013/07/26 13:12:25 ryoon Exp $
+
+Fix build on Cygwin64. From Cygwin64 1.7.22's 3.0.12-cygwin.patch.
+
+--- src/x86/ffi.c.orig	2013-03-16 11:25:04.000000000 +0000
++++ src/x86/ffi.c
+@@ -28,7 +28,7 @@
+    DEALINGS IN THE SOFTWARE.
+    ----------------------------------------------------------------------- */
+ 
+-#if !defined(__x86_64__) || defined(_WIN64)
++#if !defined(__x86_64__) || defined(_WIN64) || defined(__CYGWIN__)
+ 
+ #ifdef _WIN64
+ #include <windows.h>
diff --git a/frida-libffi/patches/patch-src_x86_win32.S b/frida-libffi/patches/patch-src_x86_win32.S
deleted file mode 100644
index eee7b8c06e..0000000000
--- a/frida-libffi/patches/patch-src_x86_win32.S
+++ /dev/null
@@ -1,23 +0,0 @@
-$NetBSD: patch-src_x86_win32.S,v 1.1 2015/03/23 15:34:18 jperkin Exp $
-
-Disable incompatible assembly sections on 32-bit OSX.  Based on MacPorts fix
-in http://trac.macports.org/ticket/44170
-
---- src/x86/win32.S.orig	2014-11-11 14:41:37.000000000 +0000
-+++ src/x86/win32.S
-@@ -1182,6 +1182,7 @@ L_ffi_closure_WIN32_inner$stub:
-         hlt ; hlt ; hlt ; hlt ; hlt
- #endif
- 
-+#if !defined(X86_DARWIN)
- #if defined(X86_WIN32) && !defined(__OS2__)
-         .section	.eh_frame,"w"
- #endif
-@@ -1343,6 +1344,7 @@ L_ffi_closure_WIN32_inner$stub:
-         /* End of DW_CFA_xxx CFI instructions.  */
-         .align 4
- .LEFDE5:
-+#endif /* X86_DARWIN */
- 
- #endif /* !_MSC_VER */
- 
diff --git a/frida-libffi/patches/patch-src_x86_win64.S b/frida-libffi/patches/patch-src_x86_win64.S
new file mode 100644
index 0000000000..c37faa9ce3
--- /dev/null
+++ b/frida-libffi/patches/patch-src_x86_win64.S
@@ -0,0 +1,15 @@
+$NetBSD: patch-src_x86_win64.S,v 1.1 2013/07/26 13:12:25 ryoon Exp $
+
+Fix build on Cygwin64. From Cygwin64 1.7.22's 3.0.12-cygwin.patch.
+
+--- src/x86/win64.S.orig	2013-03-16 11:19:39.000000000 +0000
++++ src/x86/win64.S
+@@ -295,7 +295,7 @@ SYMBOL_NAME(ffi_closure_win64):
+ 	mov	%rax, %rcx	# context is first parameter
+ 	mov	%rsp, %rdx	# stack is second parameter
+ 	add	$48, %rdx	# point to start of arguments
+-	mov	$SYMBOL_NAME(ffi_closure_win64_inner), %rax
++	lea	SYMBOL_NAME(ffi_closure_win64_inner)(%rip), %rax
+ 	callq	*%rax		# call the real closure function
+ 	add	$40, %rsp
+ 	movq	%rax, %xmm0	# If the closure returned a float,


Home | Main Index | Thread Index | Old Index