* gnu/packages/java.scm (jamvm@1.5.1)[source]: Add patch. * gnu/packages/patches/jamvm-arm.patch: New file. * gnu/local.mk (dist_patch_DATA): Register it.
		
			
				
	
	
		
			1313 lines
		
	
	
	
		
			39 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			1313 lines
		
	
	
	
		
			39 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| From 67faeb7d58e0d25a50d36788ed49ed383b92e090 Mon Sep 17 00:00:00 2001
 | |
| From: Efraim Flashner <efraim@flashner.co.il>
 | |
| Date: Mon, 26 Mar 2018 11:08:17 +0300
 | |
| Subject: [PATCH] add ARMv7 support
 | |
| 
 | |
| ---
 | |
|  src/arch/arm.h                           |  75 +++++-
 | |
|  src/os/linux/arm/Makefile.am             |   9 +-
 | |
|  src/os/linux/arm/Makefile.in             | 166 ++++++++----
 | |
|  src/os/linux/arm/callNative.S            |  12 +-
 | |
|  src/os/linux/arm/callNativeEABI.S        |   8 +-
 | |
|  src/os/linux/arm/callNativeEABIHard.S    | 315 +++++++++++++++++++++++
 | |
|  src/os/linux/arm/callNativeEABIHardARM.S | 266 +++++++++++++++++++
 | |
|  src/os/linux/arm/dll_md.c                |  61 ++++-
 | |
|  8 files changed, 843 insertions(+), 69 deletions(-)
 | |
|  create mode 100644 src/os/linux/arm/callNativeEABIHard.S
 | |
|  create mode 100644 src/os/linux/arm/callNativeEABIHardARM.S
 | |
| 
 | |
| diff --git a/src/arch/arm.h b/src/arch/arm.h
 | |
| index ccf68c4..d2c0318 100644
 | |
| --- a/src/arch/arm.h
 | |
| +++ b/src/arch/arm.h
 | |
| @@ -1,6 +1,6 @@
 | |
|  /*
 | |
| - * Copyright (C) 2003, 2004, 2005, 2006, 2007
 | |
| - * Robert Lougher <rob@lougher.org.uk>.
 | |
| + * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012,
 | |
| + * 2014 Robert Lougher <rob@jamvm.org.uk>.
 | |
|   *
 | |
|   * This file is part of JamVM.
 | |
|   *
 | |
| @@ -21,10 +21,16 @@
 | |
|  
 | |
|  #define OS_ARCH "arm"
 | |
|  
 | |
| -/* Override default min and max heap sizes.  ARM machines are
 | |
| -   usually embedded, and the standard defaults are too large. */
 | |
| -#define DEFAULT_MAX_HEAP 16*MB
 | |
| +/* Override minimum min heap size.  The initial heap size is a ratio
 | |
| +   of the physical memory, but it must be at least the minimum min
 | |
| +   size.  The normal setting is too large for ARM machines as they
 | |
| +   are usually embedded. */
 | |
| +#define MIN_MIN_HEAP 1*MB
 | |
| +
 | |
| +/* Likewise, override the default min/max heap sizes used when the
 | |
| +   size of physical memory is not available */
 | |
|  #define DEFAULT_MIN_HEAP 1*MB
 | |
| +#define DEFAULT_MAX_HEAP 64*MB
 | |
|  
 | |
|  #ifdef DIRECT
 | |
|  #define HANDLER_TABLE_T static const void
 | |
| @@ -51,6 +57,36 @@
 | |
|  /* Needed for i386 -- empty here */
 | |
|  #define FPU_HACK
 | |
|  
 | |
| +#if defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_7A__)
 | |
| +#define COMPARE_AND_SWAP_32(addr, old_val, new_val)       \
 | |
| +({                                                        \
 | |
| +    int result, read_val;                                 \
 | |
| +    __asm__ __volatile__ ("                               \
 | |
| +        1:      mov %0, #0;                               \
 | |
| +                ldrex %1, [%2];                           \
 | |
| +                cmp %3, %1;                               \
 | |
| +                bne 2f;                                   \
 | |
| +                strex %0, %4, [%2];                       \
 | |
| +                cmp %0, #1;                               \
 | |
| +                beq 1b;                                   \
 | |
| +                mov %0, #1;                               \
 | |
| +        2:"                                               \
 | |
| +    : "=&r" (result), "=&r" (read_val)                    \
 | |
| +    : "r" (addr), "r" (old_val), "r" (new_val)            \
 | |
| +    : "cc", "memory");                                    \
 | |
| +    result;                                               \
 | |
| +})
 | |
| +
 | |
| +#define COMPARE_AND_SWAP(addr, old_val, new_val)          \
 | |
| +        COMPARE_AND_SWAP_32(addr, old_val, new_val)
 | |
| +
 | |
| +#define LOCKWORD_READ(addr) *addr
 | |
| +#define LOCKWORD_WRITE(addr, value) *addr = value
 | |
| +#define LOCKWORD_COMPARE_AND_SWAP(addr, old_val, new_val) \
 | |
| +        COMPARE_AND_SWAP(addr, old_val, new_val)
 | |
| +
 | |
| +#else
 | |
| +
 | |
|  #define LOCKWORD_COMPARE_AND_SWAP(addr, old_val, new_val) \
 | |
|  ({                                                        \
 | |
|      int result, read_val;                                 \
 | |
| @@ -94,7 +130,7 @@ do {                                                      \
 | |
|      : "r" (addr), "r" (new_val)                           \
 | |
|      : "cc", "memory");                                    \
 | |
|  } while(0)
 | |
| -
 | |
| +#endif
 | |
|  
 | |
|  #ifdef __ARM_EABI__
 | |
|  #define FLUSH_CACHE(addr, length)                         \
 | |
| @@ -124,8 +160,33 @@ do {                                                      \
 | |
|  }
 | |
|  #endif
 | |
|  
 | |
| +#define GEN_REL_JMP(target_addr, patch_addr, patch_size)  \
 | |
| +({                                                        \
 | |
| +    int patched = FALSE;                                  \
 | |
| +                                                          \
 | |
| +    if(patch_size >= 4) {                                 \
 | |
| +        /* Guard against the pointer difference being     \
 | |
| +           larger than the signed range */                \
 | |
| +        long long offset = (uintptr_t)(target_addr) -     \
 | |
| +                           (uintptr_t)(patch_addr) - 8;   \
 | |
| +                                                          \
 | |
| +        if(offset >= -1<<25 && offset < 1<<25) {          \
 | |
| +            *(int*)(patch_addr) = offset>>2 & 0x00ffffff  \
 | |
| +                                            | 0xea000000; \
 | |
| +            patched = TRUE;                               \
 | |
| +        }                                                 \
 | |
| +    }                                                     \
 | |
| +    patched;                                              \
 | |
| +})
 | |
| +
 | |
| +#ifdef __ARM_ARCH_7A__
 | |
| +#define MBARRIER() __asm__ __volatile__ ("dmb" ::: "memory")
 | |
| +#define UNLOCK_MBARRIER() __asm__ __volatile__ ("dmb" ::: "memory")
 | |
| +#define JMM_LOCK_MBARRIER() __asm__ __volatile__ ("dmb" ::: "memory")
 | |
| +#define JMM_UNLOCK_MBARRIER() __asm__ __volatile__ ("dmb" ::: "memory")
 | |
| +#else
 | |
|  #define MBARRIER() __asm__ __volatile__ ("" ::: "memory")
 | |
|  #define UNLOCK_MBARRIER() __asm__ __volatile__ ("" ::: "memory")
 | |
|  #define JMM_LOCK_MBARRIER() __asm__ __volatile__ ("" ::: "memory")
 | |
|  #define JMM_UNLOCK_MBARRIER() __asm__ __volatile__ ("" ::: "memory")
 | |
| -
 | |
| +#endif
 | |
| diff --git a/src/os/linux/arm/Makefile.am b/src/os/linux/arm/Makefile.am
 | |
| index d18ea5a..74e7786 100644
 | |
| --- a/src/os/linux/arm/Makefile.am
 | |
| +++ b/src/os/linux/arm/Makefile.am
 | |
| @@ -1,6 +1,6 @@
 | |
|  ##
 | |
| -## Copyright (C) 2003, 2004, 2005, 2006, 2007
 | |
| -## Robert Lougher <rob@lougher.org.uk>.
 | |
| +## Copyright (C) 2003, 2004, 2005, 2006, 2007, 2010, 2011, 2012
 | |
| +## Robert Lougher <rob@jamvm.org.uk>.
 | |
|  ##
 | |
|  ## This file is part of JamVM.
 | |
|  ##
 | |
| @@ -19,10 +19,11 @@
 | |
|  ## Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 | |
|  ##
 | |
|  
 | |
| -EXTRA_DIST = callNativeOABI.S callNativeEABI.S
 | |
| +EXTRA_DIST = callNativeOABI.S callNativeEABI.S callNativeEABIHard.S \
 | |
| +             callNativeEABIHardARM.S
 | |
|  
 | |
|  noinst_LTLIBRARIES = libnative.la
 | |
|  libnative_la_SOURCES = init.c dll_md.c callNative.S
 | |
|  
 | |
| -AM_CPPFLAGS = -I$(top_builddir)/src
 | |
| +AM_CPPFLAGS = -I$(top_builddir)/src -I$(top_srcdir)/src
 | |
|  AM_CCASFLAGS = -I$(top_builddir)/src
 | |
| diff --git a/src/os/linux/arm/Makefile.in b/src/os/linux/arm/Makefile.in
 | |
| index 63b21ad..6d44ea9 100644
 | |
| --- a/src/os/linux/arm/Makefile.in
 | |
| +++ b/src/os/linux/arm/Makefile.in
 | |
| @@ -1,8 +1,9 @@
 | |
| -# Makefile.in generated by automake 1.10 from Makefile.am.
 | |
| +# Makefile.in generated by automake 1.11.6 from Makefile.am.
 | |
|  # @configure_input@
 | |
|  
 | |
|  # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
 | |
| -# 2003, 2004, 2005, 2006  Free Software Foundation, Inc.
 | |
| +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
 | |
| +# Foundation, Inc.
 | |
|  # This Makefile.in is free software; the Free Software Foundation
 | |
|  # gives unlimited permission to copy and/or distribute it,
 | |
|  # with or without modifications, as long as this notice is preserved.
 | |
| @@ -15,9 +16,27 @@
 | |
|  @SET_MAKE@
 | |
|  
 | |
|  VPATH = @srcdir@
 | |
| +am__make_dryrun = \
 | |
| +  { \
 | |
| +    am__dry=no; \
 | |
| +    case $$MAKEFLAGS in \
 | |
| +      *\\[\ \	]*) \
 | |
| +        echo 'am--echo: ; @echo "AM"  OK' | $(MAKE) -f - 2>/dev/null \
 | |
| +          | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
 | |
| +      *) \
 | |
| +        for am__flg in $$MAKEFLAGS; do \
 | |
| +          case $$am__flg in \
 | |
| +            *=*|--*) ;; \
 | |
| +            *n*) am__dry=yes; break;; \
 | |
| +          esac; \
 | |
| +        done;; \
 | |
| +    esac; \
 | |
| +    test $$am__dry = yes; \
 | |
| +  }
 | |
|  pkgdatadir = $(datadir)/@PACKAGE@
 | |
| -pkglibdir = $(libdir)/@PACKAGE@
 | |
|  pkgincludedir = $(includedir)/@PACKAGE@
 | |
| +pkglibdir = $(libdir)/@PACKAGE@
 | |
| +pkglibexecdir = $(libexecdir)/@PACKAGE@
 | |
|  am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
 | |
|  install_sh_DATA = $(install_sh) -c -m 644
 | |
|  install_sh_PROGRAM = $(install_sh) -c
 | |
| @@ -42,13 +61,15 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 | |
|  mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
 | |
|  CONFIG_HEADER = $(top_builddir)/src/config.h
 | |
|  CONFIG_CLEAN_FILES =
 | |
| +CONFIG_CLEAN_VPATH_FILES =
 | |
|  LTLIBRARIES = $(noinst_LTLIBRARIES)
 | |
|  libnative_la_LIBADD =
 | |
|  am_libnative_la_OBJECTS = init.lo dll_md.lo callNative.lo
 | |
|  libnative_la_OBJECTS = $(am_libnative_la_OBJECTS)
 | |
| -DEFAULT_INCLUDES = -I. -I$(top_builddir)/src@am__isrc@
 | |
| +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/src
 | |
|  depcomp = $(SHELL) $(top_srcdir)/depcomp
 | |
|  am__depfiles_maybe = depfiles
 | |
| +am__mv = mv -f
 | |
|  CPPASCOMPILE = $(CCAS) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
 | |
|  	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CCASFLAGS) $(CCASFLAGS)
 | |
|  LTCPPASCOMPILE = $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
 | |
| @@ -65,6 +86,11 @@ LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
 | |
|  	$(LDFLAGS) -o $@
 | |
|  SOURCES = $(libnative_la_SOURCES)
 | |
|  DIST_SOURCES = $(libnative_la_SOURCES)
 | |
| +am__can_run_installinfo = \
 | |
| +  case $$AM_UPDATE_INFO_DIR in \
 | |
| +    n|no|NO) false;; \
 | |
| +    *) (install-info --version) >/dev/null 2>&1;; \
 | |
| +  esac
 | |
|  ETAGS = etags
 | |
|  CTAGS = ctags
 | |
|  DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 | |
| @@ -84,21 +110,18 @@ CCDEPMODE = @CCDEPMODE@
 | |
|  CFLAGS = @CFLAGS@
 | |
|  CPP = @CPP@
 | |
|  CPPFLAGS = @CPPFLAGS@
 | |
| -CXX = @CXX@
 | |
| -CXXCPP = @CXXCPP@
 | |
| -CXXDEPMODE = @CXXDEPMODE@
 | |
| -CXXFLAGS = @CXXFLAGS@
 | |
|  CYGPATH_W = @CYGPATH_W@
 | |
|  DEFS = @DEFS@
 | |
|  DEPDIR = @DEPDIR@
 | |
| -ECHO = @ECHO@
 | |
| +DLLTOOL = @DLLTOOL@
 | |
| +DSYMUTIL = @DSYMUTIL@
 | |
| +DUMPBIN = @DUMPBIN@
 | |
|  ECHO_C = @ECHO_C@
 | |
|  ECHO_N = @ECHO_N@
 | |
|  ECHO_T = @ECHO_T@
 | |
|  EGREP = @EGREP@
 | |
|  EXEEXT = @EXEEXT@
 | |
| -F77 = @F77@
 | |
| -FFLAGS = @FFLAGS@
 | |
| +FGREP = @FGREP@
 | |
|  GREP = @GREP@
 | |
|  INSTALL = @INSTALL@
 | |
|  INSTALL_DATA = @INSTALL_DATA@
 | |
| @@ -106,21 +129,30 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@
 | |
|  INSTALL_SCRIPT = @INSTALL_SCRIPT@
 | |
|  INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
 | |
|  JAVAC = @JAVAC@
 | |
| +LD = @LD@
 | |
|  LDFLAGS = @LDFLAGS@
 | |
|  LIBOBJS = @LIBOBJS@
 | |
|  LIBS = @LIBS@
 | |
|  LIBTOOL = @LIBTOOL@
 | |
| +LIPO = @LIPO@
 | |
|  LN_S = @LN_S@
 | |
|  LTLIBOBJS = @LTLIBOBJS@
 | |
|  MAINT = @MAINT@
 | |
|  MAKEINFO = @MAKEINFO@
 | |
| +MANIFEST_TOOL = @MANIFEST_TOOL@
 | |
|  MKDIR_P = @MKDIR_P@
 | |
| +NM = @NM@
 | |
| +NMEDIT = @NMEDIT@
 | |
| +OBJDUMP = @OBJDUMP@
 | |
|  OBJEXT = @OBJEXT@
 | |
| +OTOOL = @OTOOL@
 | |
| +OTOOL64 = @OTOOL64@
 | |
|  PACKAGE = @PACKAGE@
 | |
|  PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
 | |
|  PACKAGE_NAME = @PACKAGE_NAME@
 | |
|  PACKAGE_STRING = @PACKAGE_STRING@
 | |
|  PACKAGE_TARNAME = @PACKAGE_TARNAME@
 | |
| +PACKAGE_URL = @PACKAGE_URL@
 | |
|  PACKAGE_VERSION = @PACKAGE_VERSION@
 | |
|  PATH_SEPARATOR = @PATH_SEPARATOR@
 | |
|  RANLIB = @RANLIB@
 | |
| @@ -133,9 +165,9 @@ abs_builddir = @abs_builddir@
 | |
|  abs_srcdir = @abs_srcdir@
 | |
|  abs_top_builddir = @abs_top_builddir@
 | |
|  abs_top_srcdir = @abs_top_srcdir@
 | |
| +ac_ct_AR = @ac_ct_AR@
 | |
|  ac_ct_CC = @ac_ct_CC@
 | |
| -ac_ct_CXX = @ac_ct_CXX@
 | |
| -ac_ct_F77 = @ac_ct_F77@
 | |
| +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
 | |
|  am__include = @am__include@
 | |
|  am__leading_dot = @am__leading_dot@
 | |
|  am__quote = @am__quote@
 | |
| @@ -149,6 +181,7 @@ build_cpu = @build_cpu@
 | |
|  build_os = @build_os@
 | |
|  build_vendor = @build_vendor@
 | |
|  builddir = @builddir@
 | |
| +classlib = @classlib@
 | |
|  datadir = @datadir@
 | |
|  datarootdir = @datarootdir@
 | |
|  docdir = @docdir@
 | |
| @@ -181,15 +214,18 @@ sharedstatedir = @sharedstatedir@
 | |
|  srcdir = @srcdir@
 | |
|  sysconfdir = @sysconfdir@
 | |
|  target_alias = @target_alias@
 | |
| +top_build_prefix = @top_build_prefix@
 | |
|  top_builddir = @top_builddir@
 | |
|  top_srcdir = @top_srcdir@
 | |
|  use_zip_no = @use_zip_no@
 | |
|  use_zip_yes = @use_zip_yes@
 | |
|  with_classpath_install_dir = @with_classpath_install_dir@
 | |
| -EXTRA_DIST = callNativeOABI.S callNativeEABI.S
 | |
| +EXTRA_DIST = callNativeOABI.S callNativeEABI.S callNativeEABIHard.S \
 | |
| +             callNativeEABIHardARM.S
 | |
| +
 | |
|  noinst_LTLIBRARIES = libnative.la
 | |
|  libnative_la_SOURCES = init.c dll_md.c callNative.S
 | |
| -AM_CPPFLAGS = -I$(top_builddir)/src
 | |
| +AM_CPPFLAGS = -I$(top_builddir)/src -I$(top_srcdir)/src
 | |
|  AM_CCASFLAGS = -I$(top_builddir)/src
 | |
|  all: all-am
 | |
|  
 | |
| @@ -199,14 +235,14 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__confi
 | |
|  	@for dep in $?; do \
 | |
|  	  case '$(am__configure_deps)' in \
 | |
|  	    *$$dep*) \
 | |
| -	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
 | |
| -		&& exit 0; \
 | |
| +	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
 | |
| +	        && { if test -f $@; then exit 0; else break; fi; }; \
 | |
|  	      exit 1;; \
 | |
|  	  esac; \
 | |
|  	done; \
 | |
| -	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu  src/os/linux/arm/Makefile'; \
 | |
| -	cd $(top_srcdir) && \
 | |
| -	  $(AUTOMAKE) --gnu  src/os/linux/arm/Makefile
 | |
| +	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/os/linux/arm/Makefile'; \
 | |
| +	$(am__cd) $(top_srcdir) && \
 | |
| +	  $(AUTOMAKE) --gnu src/os/linux/arm/Makefile
 | |
|  .PRECIOUS: Makefile
 | |
|  Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 | |
|  	@case '$?' in \
 | |
| @@ -224,6 +260,7 @@ $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
 | |
|  	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 | |
|  $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
 | |
|  	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 | |
| +$(am__aclocal_m4_deps):
 | |
|  
 | |
|  clean-noinstLTLIBRARIES:
 | |
|  	-test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
 | |
| @@ -233,7 +270,7 @@ clean-noinstLTLIBRARIES:
 | |
|  	  echo "rm -f \"$${dir}/so_locations\""; \
 | |
|  	  rm -f "$${dir}/so_locations"; \
 | |
|  	done
 | |
| -libnative.la: $(libnative_la_OBJECTS) $(libnative_la_DEPENDENCIES) 
 | |
| +libnative.la: $(libnative_la_OBJECTS) $(libnative_la_DEPENDENCIES) $(EXTRA_libnative_la_DEPENDENCIES) 
 | |
|  	$(LINK)  $(libnative_la_OBJECTS) $(libnative_la_LIBADD) $(LIBS)
 | |
|  
 | |
|  mostlyclean-compile:
 | |
| @@ -248,42 +285,42 @@ distclean-compile:
 | |
|  
 | |
|  .S.o:
 | |
|  @am__fastdepCCAS_TRUE@	$(CPPASCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
 | |
| -@am__fastdepCCAS_TRUE@	mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
 | |
| +@am__fastdepCCAS_TRUE@	$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
 | |
|  @AMDEP_TRUE@@am__fastdepCCAS_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
 | |
|  @AMDEP_TRUE@@am__fastdepCCAS_FALSE@	DEPDIR=$(DEPDIR) $(CCASDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 | |
|  @am__fastdepCCAS_FALSE@	$(CPPASCOMPILE) -c -o $@ $<
 | |
|  
 | |
|  .S.obj:
 | |
|  @am__fastdepCCAS_TRUE@	$(CPPASCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
 | |
| -@am__fastdepCCAS_TRUE@	mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
 | |
| +@am__fastdepCCAS_TRUE@	$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
 | |
|  @AMDEP_TRUE@@am__fastdepCCAS_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
 | |
|  @AMDEP_TRUE@@am__fastdepCCAS_FALSE@	DEPDIR=$(DEPDIR) $(CCASDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 | |
|  @am__fastdepCCAS_FALSE@	$(CPPASCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
 | |
|  
 | |
|  .S.lo:
 | |
|  @am__fastdepCCAS_TRUE@	$(LTCPPASCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
 | |
| -@am__fastdepCCAS_TRUE@	mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
 | |
| +@am__fastdepCCAS_TRUE@	$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
 | |
|  @AMDEP_TRUE@@am__fastdepCCAS_FALSE@	source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
 | |
|  @AMDEP_TRUE@@am__fastdepCCAS_FALSE@	DEPDIR=$(DEPDIR) $(CCASDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 | |
|  @am__fastdepCCAS_FALSE@	$(LTCPPASCOMPILE) -c -o $@ $<
 | |
|  
 | |
|  .c.o:
 | |
|  @am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
 | |
| -@am__fastdepCC_TRUE@	mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
 | |
| +@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
 | |
|  @AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
 | |
|  @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 | |
|  @am__fastdepCC_FALSE@	$(COMPILE) -c $<
 | |
|  
 | |
|  .c.obj:
 | |
|  @am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
 | |
| -@am__fastdepCC_TRUE@	mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
 | |
| +@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
 | |
|  @AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
 | |
|  @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 | |
|  @am__fastdepCC_FALSE@	$(COMPILE) -c `$(CYGPATH_W) '$<'`
 | |
|  
 | |
|  .c.lo:
 | |
|  @am__fastdepCC_TRUE@	$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
 | |
| -@am__fastdepCC_TRUE@	mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
 | |
| +@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
 | |
|  @AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
 | |
|  @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 | |
|  @am__fastdepCC_FALSE@	$(LTCOMPILE) -c -o $@ $<
 | |
| @@ -299,45 +336,49 @@ ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
 | |
|  	unique=`for i in $$list; do \
 | |
|  	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
 | |
|  	  done | \
 | |
| -	  $(AWK) '    { files[$$0] = 1; } \
 | |
| -	       END { for (i in files) print i; }'`; \
 | |
| +	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
 | |
| +	      END { if (nonempty) { for (i in files) print i; }; }'`; \
 | |
|  	mkid -fID $$unique
 | |
|  tags: TAGS
 | |
|  
 | |
|  TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
 | |
|  		$(TAGS_FILES) $(LISP)
 | |
| -	tags=; \
 | |
| +	set x; \
 | |
|  	here=`pwd`; \
 | |
|  	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
 | |
|  	unique=`for i in $$list; do \
 | |
|  	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
 | |
|  	  done | \
 | |
| -	  $(AWK) '    { files[$$0] = 1; } \
 | |
| -	       END { for (i in files) print i; }'`; \
 | |
| -	if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
 | |
| +	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
 | |
| +	      END { if (nonempty) { for (i in files) print i; }; }'`; \
 | |
| +	shift; \
 | |
| +	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
 | |
|  	  test -n "$$unique" || unique=$$empty_fix; \
 | |
| -	  $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
 | |
| -	    $$tags $$unique; \
 | |
| +	  if test $$# -gt 0; then \
 | |
| +	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
 | |
| +	      "$$@" $$unique; \
 | |
| +	  else \
 | |
| +	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
 | |
| +	      $$unique; \
 | |
| +	  fi; \
 | |
|  	fi
 | |
|  ctags: CTAGS
 | |
|  CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
 | |
|  		$(TAGS_FILES) $(LISP)
 | |
| -	tags=; \
 | |
| -	here=`pwd`; \
 | |
|  	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
 | |
|  	unique=`for i in $$list; do \
 | |
|  	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
 | |
|  	  done | \
 | |
| -	  $(AWK) '    { files[$$0] = 1; } \
 | |
| -	       END { for (i in files) print i; }'`; \
 | |
| -	test -z "$(CTAGS_ARGS)$$tags$$unique" \
 | |
| +	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
 | |
| +	      END { if (nonempty) { for (i in files) print i; }; }'`; \
 | |
| +	test -z "$(CTAGS_ARGS)$$unique" \
 | |
|  	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
 | |
| -	     $$tags $$unique
 | |
| +	     $$unique
 | |
|  
 | |
|  GTAGS:
 | |
|  	here=`$(am__cd) $(top_builddir) && pwd` \
 | |
| -	  && cd $(top_srcdir) \
 | |
| -	  && gtags -i $(GTAGS_ARGS) $$here
 | |
| +	  && $(am__cd) $(top_srcdir) \
 | |
| +	  && gtags -i $(GTAGS_ARGS) "$$here"
 | |
|  
 | |
|  distclean-tags:
 | |
|  	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
 | |
| @@ -358,13 +399,17 @@ distdir: $(DISTFILES)
 | |
|  	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
 | |
|  	  if test -d $$d/$$file; then \
 | |
|  	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
 | |
| +	    if test -d "$(distdir)/$$file"; then \
 | |
| +	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
 | |
| +	    fi; \
 | |
|  	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
 | |
| -	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
 | |
| +	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
 | |
| +	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
 | |
|  	    fi; \
 | |
| -	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
 | |
| +	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
 | |
|  	  else \
 | |
| -	    test -f $(distdir)/$$file \
 | |
| -	    || cp -p $$d/$$file $(distdir)/$$file \
 | |
| +	    test -f "$(distdir)/$$file" \
 | |
| +	    || cp -p $$d/$$file "$(distdir)/$$file" \
 | |
|  	    || exit 1; \
 | |
|  	  fi; \
 | |
|  	done
 | |
| @@ -382,16 +427,22 @@ install-am: all-am
 | |
|  
 | |
|  installcheck: installcheck-am
 | |
|  install-strip:
 | |
| -	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
 | |
| -	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
 | |
| -	  `test -z '$(STRIP)' || \
 | |
| -	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
 | |
| +	if test -z '$(STRIP)'; then \
 | |
| +	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
 | |
| +	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
 | |
| +	      install; \
 | |
| +	else \
 | |
| +	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
 | |
| +	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
 | |
| +	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
 | |
| +	fi
 | |
|  mostlyclean-generic:
 | |
|  
 | |
|  clean-generic:
 | |
|  
 | |
|  distclean-generic:
 | |
|  	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
 | |
| +	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
 | |
|  
 | |
|  maintainer-clean-generic:
 | |
|  	@echo "This command is intended for maintainers to use"
 | |
| @@ -413,6 +464,8 @@ dvi-am:
 | |
|  
 | |
|  html: html-am
 | |
|  
 | |
| +html-am:
 | |
| +
 | |
|  info: info-am
 | |
|  
 | |
|  info-am:
 | |
| @@ -421,18 +474,28 @@ install-data-am:
 | |
|  
 | |
|  install-dvi: install-dvi-am
 | |
|  
 | |
| +install-dvi-am:
 | |
| +
 | |
|  install-exec-am:
 | |
|  
 | |
|  install-html: install-html-am
 | |
|  
 | |
| +install-html-am:
 | |
| +
 | |
|  install-info: install-info-am
 | |
|  
 | |
| +install-info-am:
 | |
| +
 | |
|  install-man:
 | |
|  
 | |
|  install-pdf: install-pdf-am
 | |
|  
 | |
| +install-pdf-am:
 | |
| +
 | |
|  install-ps: install-ps-am
 | |
|  
 | |
| +install-ps-am:
 | |
| +
 | |
|  installcheck-am:
 | |
|  
 | |
|  maintainer-clean: maintainer-clean-am
 | |
| @@ -470,6 +533,7 @@ uninstall-am:
 | |
|  	mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
 | |
|  	pdf pdf-am ps ps-am tags uninstall uninstall-am
 | |
|  
 | |
| +
 | |
|  # Tell versions [3.59,3.63) of GNU make to not export all variables.
 | |
|  # Otherwise a system limit (for SysV at least) may be exceeded.
 | |
|  .NOEXPORT:
 | |
| diff --git a/src/os/linux/arm/callNative.S b/src/os/linux/arm/callNative.S
 | |
| index 39ab6d3..245afd1 100644
 | |
| --- a/src/os/linux/arm/callNative.S
 | |
| +++ b/src/os/linux/arm/callNative.S
 | |
| @@ -1,6 +1,6 @@
 | |
|  /*
 | |
| - * Copyright (C) 2003, 2004, 2005, 2006, 2007
 | |
| - * Robert Lougher <rob@lougher.org.uk>.
 | |
| + * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2011, 2012
 | |
| + * Robert Lougher <rob@jamvm.org.uk>.
 | |
|   *
 | |
|   * This file is part of JamVM.
 | |
|   *
 | |
| @@ -23,7 +23,15 @@
 | |
|  
 | |
|  #ifndef USE_FFI
 | |
|  #ifdef __ARM_EABI__
 | |
| +#ifdef __ARM_PCS_VFP
 | |
| +#ifdef __ARM_ARCH_7A__
 | |
| +#include "callNativeEABIHard.S"
 | |
| +#else
 | |
| +#include "callNativeEABIHardARM.S"
 | |
| +#endif
 | |
| +#else
 | |
|  #include "callNativeEABI.S"
 | |
| +#endif
 | |
|  #else
 | |
|  #include "callNativeOABI.S"
 | |
|  #endif
 | |
| diff --git a/src/os/linux/arm/callNativeEABI.S b/src/os/linux/arm/callNativeEABI.S
 | |
| index 5effa57..3a7539e 100644
 | |
| --- a/src/os/linux/arm/callNativeEABI.S
 | |
| +++ b/src/os/linux/arm/callNativeEABI.S
 | |
| @@ -1,6 +1,6 @@
 | |
|  /*
 | |
| - * Copyright (C) 2003, 2004, 2005, 2006, 2007
 | |
| - * Robert Lougher <rob@lougher.org.uk>.
 | |
| + * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2011
 | |
| + * Robert Lougher <rob@jamvm.org.uk>.
 | |
|   *
 | |
|   * This file is part of JamVM.
 | |
|   *
 | |
| @@ -95,8 +95,12 @@ done:
 | |
|          ldmfd   sp!, {r2, r3}
 | |
|  
 | |
|          /* Call the function */
 | |
| +#if defined(__ARM_ARCH_4__) || defined(__ARM_ARCH_4T__)
 | |
|          mov     lr, pc
 | |
|          bx      ip
 | |
| +#else
 | |
| +        blx     ip
 | |
| +#endif
 | |
|  
 | |
|          subs    r4, r4, #8              /* Pop argument area */
 | |
|                                          /* (minus 8 for r2/r3) */
 | |
| diff --git a/src/os/linux/arm/callNativeEABIHard.S b/src/os/linux/arm/callNativeEABIHard.S
 | |
| new file mode 100644
 | |
| index 0000000..5d5785b
 | |
| --- /dev/null
 | |
| +++ b/src/os/linux/arm/callNativeEABIHard.S
 | |
| @@ -0,0 +1,315 @@
 | |
| +/*
 | |
| + * Copyright (C) 2011, 2012 Robert Lougher <rob@jamvm.org.uk>.
 | |
| + *
 | |
| + * This file is part of JamVM.
 | |
| + *
 | |
| + * This program is free software; you can redistribute it and/or
 | |
| + * modify it under the terms of the GNU General Public License
 | |
| + * as published by the Free Software Foundation; either version 2,
 | |
| + * or (at your option) any later version.
 | |
| + *
 | |
| + * This program is distributed in the hope that it will be useful,
 | |
| + * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | |
| + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | |
| + * GNU General Public License for more details.
 | |
| + *
 | |
| + * You should have received a copy of the GNU General Public License
 | |
| + * along with this program; if not, write to the Free Software
 | |
| + * Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 | |
| + */
 | |
| +
 | |
| +        .text
 | |
| +        .syntax unified
 | |
| +        .arch armv7-a
 | |
| +        .thumb
 | |
| +        .align  2
 | |
| +        .global callJNIMethod
 | |
| +        .type   callJNIMethod,function
 | |
| +
 | |
| +/*
 | |
| + * Arguments passed in:
 | |
| + *
 | |
| + * r0 JNIEnv
 | |
| + * r1 class or NULL
 | |
| + * r2 sig
 | |
| + * r3 extra arg
 | |
| + * sp + 0 ostack
 | |
| + * sp + 4 function pntr
 | |
| + * sp + 8 args count
 | |
| + */
 | |
| +
 | |
| +/* Register usage :
 | |
| + *
 | |
| + * r11 function pntr
 | |
| + * lr ostack pntr
 | |
| + * ip args pntr
 | |
| + * r8 sig pntr
 | |
| + * r10 extra stack
 | |
| + * r6 fp backfill 
 | |
| + * r4 fp reg
 | |
| + * r7 int reg
 | |
| + * r5 scratch
 | |
| + * r3, r2 outgoing int args
 | |
| + * r1 outgoing class or this pntr
 | |
| + * r0 outgoing JNIEnv (as passed in)
 | |
| + *
 | |
| + * s0 - s16 (d0 - d7) outgoing float args
 | |
| + */
 | |
| +
 | |
| +callJNIMethod:
 | |
| +        stmfd   sp!, {r4, r5, r6, r7, r8, r10, r11, lr}
 | |
| +        ldr     lr, [sp, #32]           /* get ostack pntr */
 | |
| +        ldr     r11, [sp, #36]          /* get function pntr */
 | |
| +
 | |
| +        cmp     r1, #0                  /* is method non-static? */
 | |
| +        it      eq
 | |
| +        ldreq   r1, [lr], #4            /* yes, load r1 with "this" */
 | |
| +
 | |
| +        mov     r10, r3
 | |
| +        subs    sp, sp, r3              /* allocate room for stacked */
 | |
| +        add     r8, r2, #1              /* init sig pntr -- skipping '(' */
 | |
| +
 | |
| +        mov     ip, sp                  /* init loop pntr */
 | |
| +
 | |
| +        mov     r7, #2
 | |
| +        mov     r4, #16
 | |
| +        mov     r6, #0
 | |
| +
 | |
| +scan_sig:
 | |
| +        ldrb    r5, [r8], #1
 | |
| +
 | |
| +        cmp     r5, #41                 /* ')' */
 | |
| +        beq     done
 | |
| +
 | |
| +        cmp     r5, #70                 /* 'F' */
 | |
| +        beq     float
 | |
| +
 | |
| +        cmp     r5, #68                 /* 'D' */
 | |
| +        beq     double
 | |
| +
 | |
| +        cmp     r5, #74                 /* 'J' */
 | |
| +        beq     long
 | |
| +
 | |
| +skip_brackets:
 | |
| +        cmp     r5, #91                 /* '[' */
 | |
| +        itt     eq
 | |
| +        ldrbeq  r5, [r8], #1
 | |
| +        beq     skip_brackets
 | |
| +
 | |
| +        cmp     r5, #76                 /* 'L' */
 | |
| +        bne     int
 | |
| +
 | |
| +skip_ref:
 | |
| +        ldrb    r5, [r8], #1
 | |
| +        cmp     r5, #59                 /* ';' */
 | |
| +        bne     skip_ref
 | |
| +
 | |
| +int:
 | |
| +        cbz     r7, stack_int
 | |
| +
 | |
| +        subs    r7, r7, #1
 | |
| +        ite     ne
 | |
| +        ldrne   r2, [lr], #4
 | |
| +        ldreq   r3, [lr], #4
 | |
| +
 | |
| +        b       scan_sig
 | |
| +
 | |
| +float:
 | |
| +        cbz     r6, no_backfill
 | |
| +
 | |
| +        sub     r5, r6, #1
 | |
| +        mov     r6, #0
 | |
| +        b       load_float
 | |
| +
 | |
| +no_backfill:
 | |
| +        cbz     r4, stack_int
 | |
| +        
 | |
| +        sub     r4, r4, #1
 | |
| +        mov     r5, r4
 | |
| +
 | |
| +load_float:
 | |
| +        add     lr, lr, #4
 | |
| +        tbb     [pc, r5]
 | |
| +
 | |
| +float_table:
 | |
| +        .byte (s15-float_table)/2
 | |
| +        .byte (s14-float_table)/2
 | |
| +        .byte (s13-float_table)/2
 | |
| +        .byte (s12-float_table)/2
 | |
| +        .byte (s11-float_table)/2
 | |
| +        .byte (s10-float_table)/2
 | |
| +        .byte (s9-float_table)/2
 | |
| +        .byte (s8-float_table)/2
 | |
| +        .byte (s7-float_table)/2
 | |
| +        .byte (s6-float_table)/2
 | |
| +        .byte (s5-float_table)/2
 | |
| +        .byte (s4-float_table)/2
 | |
| +        .byte (s3-float_table)/2
 | |
| +        .byte (s2-float_table)/2
 | |
| +        .byte (s1-float_table)/2
 | |
| +        .byte (s0-float_table)/2
 | |
| +
 | |
| +stack_int:
 | |
| +        ldr     r5, [lr], #4
 | |
| +        str     r5, [ip], #4
 | |
| +        b       scan_sig
 | |
| +
 | |
| +s0:
 | |
| +        vldr    s0, [lr, #-4]
 | |
| +        b       scan_sig
 | |
| +s1:
 | |
| +        vldr    s1, [lr, #-4]
 | |
| +        b       scan_sig
 | |
| +s2:
 | |
| +        vldr    s2, [lr, #-4]
 | |
| +        b       scan_sig
 | |
| +s3:
 | |
| +        vldr    s3, [lr, #-4]
 | |
| +        b       scan_sig
 | |
| +s4:
 | |
| +        vldr    s4, [lr, #-4]
 | |
| +        b       scan_sig
 | |
| +s5:
 | |
| +        vldr    s5, [lr, #-4]
 | |
| +        b       scan_sig
 | |
| +s6:
 | |
| +        vldr    s6, [lr, #-4]
 | |
| +        b       scan_sig
 | |
| +s7:
 | |
| +        vldr    s7, [lr, #-4]
 | |
| +        b       scan_sig
 | |
| +s8:
 | |
| +        vldr    s8, [lr, #-4]
 | |
| +        b       scan_sig
 | |
| +s9:
 | |
| +        vldr    s9, [lr, #-4]
 | |
| +        b       scan_sig
 | |
| +s10:
 | |
| +        vldr    s10, [lr, #-4]
 | |
| +        b       scan_sig
 | |
| +s11:
 | |
| +        vldr    s11, [lr, #-4]
 | |
| +        b       scan_sig
 | |
| +s12:
 | |
| +        vldr    s12, [lr, #-4]
 | |
| +        b       scan_sig
 | |
| +s13:
 | |
| +        vldr    s13, [lr, #-4]
 | |
| +        b       scan_sig
 | |
| +s14:
 | |
| +        vldr    s14, [lr, #-4]
 | |
| +        b       scan_sig
 | |
| +s15:
 | |
| +        vldr    s15, [lr, #-4]
 | |
| +        b       scan_sig
 | |
| +
 | |
| +long:
 | |
| +        cmp     r7, #2
 | |
| +        mov     r7, #0
 | |
| +        bne     stack_long
 | |
| +
 | |
| +        ldmia   lr!, {r2, r3}
 | |
| +        b       scan_sig
 | |
| +
 | |
| +double:
 | |
| +        lsrs    r5, r4, #1
 | |
| +        it      cs
 | |
| +        movcs   r6, r4
 | |
| +
 | |
| +        lsls    r4, r5, #1
 | |
| +        beq     stack_double
 | |
| +
 | |
| +        sub     r4, r4, #2
 | |
| +        add     lr, lr, #8
 | |
| +        tbb     [pc, r5]
 | |
| +
 | |
| +double_table:
 | |
| +        .byte 0
 | |
| +        .byte (d7-double_table)/2
 | |
| +        .byte (d6-double_table)/2
 | |
| +        .byte (d5-double_table)/2
 | |
| +        .byte (d4-double_table)/2
 | |
| +        .byte (d3-double_table)/2
 | |
| +        .byte (d2-double_table)/2
 | |
| +        .byte (d1-double_table)/2
 | |
| +        .byte (d0-double_table)/2
 | |
| +        .align 2
 | |
| +d0:
 | |
| +        vldr    d0, [lr, #-8]
 | |
| +        b       scan_sig
 | |
| +d1:
 | |
| +        vldr    d1, [lr, #-8]
 | |
| +        b       scan_sig
 | |
| +d2:
 | |
| +        vldr    d2, [lr, #-8]
 | |
| +        b       scan_sig
 | |
| +d3:
 | |
| +        vldr    d3, [lr, #-8]
 | |
| +        b       scan_sig
 | |
| +d4:
 | |
| +        vldr    d4, [lr, #-8]
 | |
| +        b       scan_sig
 | |
| +d5:
 | |
| +        vldr    d5, [lr, #-8]
 | |
| +        b       scan_sig
 | |
| +d6:
 | |
| +        vldr    d6, [lr, #-8]
 | |
| +        b       scan_sig
 | |
| +d7:
 | |
| +        vldr    d7, [lr, #-8]
 | |
| +        b       scan_sig
 | |
| +
 | |
| +stack_double:
 | |
| +        mov     r6, #0
 | |
| +
 | |
| +stack_long:
 | |
| +        /* Ensure address is 8 byte aligned */
 | |
| +        add     ip, ip, #7
 | |
| +        bic     ip, ip, #7
 | |
| +        
 | |
| +        ldr     r5, [lr], #4
 | |
| +        str     r5, [ip], #4
 | |
| +        ldr     r5, [lr], #4
 | |
| +        str     r5, [ip], #4
 | |
| +        b       scan_sig
 | |
| +
 | |
| +done:
 | |
| +        /* Call the function */
 | |
| +        blx     r11
 | |
| +
 | |
| +        add     sp, sp, r10             /* Pop argument area */
 | |
| +
 | |
| +        ldr     r4, [sp, #32]           /* Reload ostack for */
 | |
| +                                        /* address of return value */
 | |
| +
 | |
| +        ldrb    r5, [r8]                /* Return type */
 | |
| +
 | |
| +        cmp     r5, #86                 /* 'V' */
 | |
| +        beq     return
 | |
| +
 | |
| +        cmp     r5, #68                 /* 'D' */
 | |
| +        beq     return_double
 | |
| +
 | |
| +        cmp     r5, #70                 /* 'F' */
 | |
| +        beq     return_float
 | |
| +
 | |
| +        str     r0, [r4], #4            /* Low word */
 | |
| +
 | |
| +        cmp     r5, #74                 /* 'J' */
 | |
| +        it      eq
 | |
| +        streq   r1, [r4], #4            /* High word */
 | |
| +
 | |
| +return:
 | |
| +        mov     r0, r4                  /* return ostack */
 | |
| +        ldmfd   sp!, {r4, r5, r6, r7, r8, r10, r11, lr}
 | |
| +        bx      lr
 | |
| +
 | |
| +return_float:
 | |
| +        vstr    s0, [r4]
 | |
| +        add     r4, r4, #4
 | |
| +        b       return
 | |
| +
 | |
| +return_double:
 | |
| +        vstr    d0, [r4]
 | |
| +        add     r4, r4, #8
 | |
| +        b       return
 | |
| diff --git a/src/os/linux/arm/callNativeEABIHardARM.S b/src/os/linux/arm/callNativeEABIHardARM.S
 | |
| new file mode 100644
 | |
| index 0000000..3a31acd
 | |
| --- /dev/null
 | |
| +++ b/src/os/linux/arm/callNativeEABIHardARM.S
 | |
| @@ -0,0 +1,266 @@
 | |
| +/*
 | |
| + * Copyright (C) 2011, 2012 Robert Lougher <rob@jamvm.org.uk>.
 | |
| + *
 | |
| + * This file is part of JamVM.
 | |
| + *
 | |
| + * This program is free software; you can redistribute it and/or
 | |
| + * modify it under the terms of the GNU General Public License
 | |
| + * as published by the Free Software Foundation; either version 2,
 | |
| + * or (at your option) any later version.
 | |
| + *
 | |
| + * This program is distributed in the hope that it will be useful,
 | |
| + * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | |
| + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | |
| + * GNU General Public License for more details.
 | |
| + *
 | |
| + * You should have received a copy of the GNU General Public License
 | |
| + * along with this program; if not, write to the Free Software
 | |
| + * Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 | |
| + */
 | |
| +
 | |
| +        .text
 | |
| +        .align  2
 | |
| +        .global callJNIMethod
 | |
| +        .type   callJNIMethod,function
 | |
| +
 | |
| +/*
 | |
| + * Arguments passed in:
 | |
| + *
 | |
| + * r0 JNIEnv
 | |
| + * r1 class or NULL
 | |
| + * r2 sig
 | |
| + * r3 extra arg
 | |
| + * sp + 0 ostack
 | |
| + * sp + 4 function pntr
 | |
| + * sp + 8 args count
 | |
| + */
 | |
| +
 | |
| +/* Register usage :
 | |
| + *
 | |
| + * lr ostack pntr
 | |
| + * ip scratch
 | |
| + * r11 function pntr
 | |
| + * r10 fp backfill 
 | |
| + * r8 fp reg
 | |
| + * r7 int reg
 | |
| + * r6 args pntr
 | |
| + * r5 sig pntr
 | |
| + * r4 extra stack
 | |
| + * r3, r2 outgoing int args
 | |
| + * r1 outgoing class or this pntr
 | |
| + * r0 outgoing JNIEnv (as passed in)
 | |
| + *
 | |
| + * s0 - s16 (d0 - d7) outgoing float args
 | |
| + */
 | |
| +
 | |
| +callJNIMethod:
 | |
| +        stmfd   sp!, {r4, r5, r6, r7, r8, r10, r11, lr}
 | |
| +        ldr     lr, [sp, #32]           /* get ostack pntr */
 | |
| +        ldr     r11, [sp, #36]          /* get function pntr */
 | |
| +
 | |
| +        cmp     r1, #0                  /* is method non-static? */
 | |
| +        ldreq   r1, [lr], #4            /* yes, load r1 with "this" */
 | |
| +
 | |
| +        mov     r4, r3
 | |
| +        sub     sp, sp, r4              /* allocate room for stacked */
 | |
| +        add     r5, r2, #1              /* init sig pntr -- skipping '(' */
 | |
| +
 | |
| +        mov     r6, sp                  /* init loop pntr */
 | |
| +
 | |
| +        mov     r7, #2
 | |
| +        mov     r8, #16
 | |
| +        mov     r10, #0
 | |
| +
 | |
| +scan_sig:
 | |
| +        ldrb    ip, [r5], #1
 | |
| +
 | |
| +        cmp     ip, #41                 /* ')' */
 | |
| +        beq     done
 | |
| +
 | |
| +        cmp     ip, #70                 /* 'F' */
 | |
| +        beq     float
 | |
| +
 | |
| +        cmp     ip, #68                 /* 'D' */
 | |
| +        beq     double
 | |
| +
 | |
| +        cmp     ip, #74                 /* 'J' */
 | |
| +        beq     long
 | |
| +
 | |
| +skip_brackets:
 | |
| +        cmp     ip, #91                 /* '[' */
 | |
| +        ldreqb  ip, [r5], #1
 | |
| +        beq     skip_brackets
 | |
| +
 | |
| +        cmp     ip, #76                 /* 'L' */
 | |
| +        bne     int
 | |
| +
 | |
| +skip_ref:
 | |
| +        ldrb    ip, [r5], #1
 | |
| +        cmp     ip, #59                 /* ';' */
 | |
| +        bne     skip_ref
 | |
| +
 | |
| +int:
 | |
| +        cmp     r7, #0
 | |
| +        beq     stack_int
 | |
| +
 | |
| +        subs    r7, r7, #1
 | |
| +
 | |
| +        ldrne   r2, [lr], #4
 | |
| +        ldreq   r3, [lr], #4
 | |
| +
 | |
| +        b       scan_sig
 | |
| +
 | |
| +stack_int:
 | |
| +        ldr     ip, [lr], #4
 | |
| +        str     ip, [r6], #4
 | |
| +        b       scan_sig
 | |
| +
 | |
| +float:
 | |
| +        cmp     r10, #0
 | |
| +        beq     no_backfill
 | |
| +
 | |
| +        sub     ip, r10, #1
 | |
| +        mov     r10, #0
 | |
| +        b       load_float
 | |
| +
 | |
| +no_backfill:
 | |
| +        cmp     r8, #0
 | |
| +        beq     stack_int
 | |
| +        
 | |
| +        sub     r8, r8, #1
 | |
| +        mov     ip, r8
 | |
| +
 | |
| +load_float:
 | |
| +        add     lr, lr, #4
 | |
| +        add     pc, pc, ip, lsl #3
 | |
| +        nop
 | |
| +
 | |
| +        flds    s15, [lr, #-4]
 | |
| +        b       scan_sig
 | |
| +        flds    s14, [lr, #-4]
 | |
| +        b       scan_sig
 | |
| +        flds    s13, [lr, #-4]
 | |
| +        b       scan_sig
 | |
| +        flds    s12, [lr, #-4]
 | |
| +        b       scan_sig
 | |
| +        flds    s11, [lr, #-4]
 | |
| +        b       scan_sig
 | |
| +        flds    s10, [lr, #-4]
 | |
| +        b       scan_sig
 | |
| +        flds    s9, [lr, #-4]
 | |
| +        b       scan_sig
 | |
| +        flds    s8, [lr, #-4]
 | |
| +        b       scan_sig
 | |
| +        flds    s7, [lr, #-4]
 | |
| +        b       scan_sig
 | |
| +        flds    s6, [lr, #-4]
 | |
| +        b       scan_sig
 | |
| +        flds    s5, [lr, #-4]
 | |
| +        b       scan_sig
 | |
| +        flds    s4, [lr, #-4]
 | |
| +        b       scan_sig
 | |
| +        flds    s3, [lr, #-4]
 | |
| +        b       scan_sig
 | |
| +        flds    s2, [lr, #-4]
 | |
| +        b       scan_sig
 | |
| +        flds    s1, [lr, #-4]
 | |
| +        b       scan_sig
 | |
| +        flds    s0, [lr, #-4]
 | |
| +        b       scan_sig
 | |
| +
 | |
| +long:
 | |
| +        cmp     r7, #2
 | |
| +        mov     r7, #0
 | |
| +        bne     stack_long
 | |
| +
 | |
| +        ldr     r2, [lr], #4
 | |
| +        ldr     r3, [lr], #4
 | |
| +        b       scan_sig
 | |
| +
 | |
| +double:
 | |
| +        lsrs    ip, r8, #1
 | |
| +        movcs   r10, r8
 | |
| +
 | |
| +        lsls    r8, ip, #1
 | |
| +        beq     stack_double
 | |
| +
 | |
| +        sub     r8, r8, #2
 | |
| +        add     lr, lr, #8
 | |
| +        add     pc, pc, ip, lsl #3
 | |
| +        nop
 | |
| +        nop
 | |
| +        nop
 | |
| +
 | |
| +        fldd    d7, [lr, #-8]
 | |
| +        b       scan_sig
 | |
| +        fldd    d6, [lr, #-8]
 | |
| +        b       scan_sig
 | |
| +        fldd    d5, [lr, #-8]
 | |
| +        b       scan_sig
 | |
| +        fldd    d4, [lr, #-8]
 | |
| +        b       scan_sig
 | |
| +        fldd    d3, [lr, #-8]
 | |
| +        b       scan_sig
 | |
| +        fldd    d2, [lr, #-8]
 | |
| +        b       scan_sig
 | |
| +        fldd    d1, [lr, #-8]
 | |
| +        b       scan_sig
 | |
| +        fldd    d0, [lr, #-8]
 | |
| +        b       scan_sig
 | |
| +
 | |
| +stack_double:
 | |
| +        mov     r10, #0
 | |
| +
 | |
| +stack_long:
 | |
| +        /* Ensure address is 8 byte aligned */
 | |
| +        add     r6, r6, #7
 | |
| +        bic     r6, r6, #7
 | |
| +        
 | |
| +        ldr     ip, [lr], #4
 | |
| +        str     ip, [r6], #4
 | |
| +        ldr     ip, [lr], #4
 | |
| +        str     ip, [r6], #4
 | |
| +        b       scan_sig
 | |
| +
 | |
| +done:
 | |
| +        /* Call the function */
 | |
| +#if defined(__ARM_ARCH_4__) || defined(__ARM_ARCH_4T__)
 | |
| +        mov     lr, pc
 | |
| +        bx      r11
 | |
| +#else
 | |
| +        blx     r11
 | |
| +#endif
 | |
| +
 | |
| +        add     sp, sp, r4              /* Pop argument area */
 | |
| +        ldr     r4, [sp, #32]           /* Reload ostack for */
 | |
| +                                        /* address of return value */
 | |
| +        ldrb    ip, [r5]                /* Return type */
 | |
| +
 | |
| +        cmp     ip, #86                 /* 'V' */
 | |
| +        beq     return
 | |
| +
 | |
| +        cmp     ip, #68                 /* 'D' */
 | |
| +        beq     return_double
 | |
| +
 | |
| +        cmp     ip, #70                 /* 'F' */
 | |
| +        beq     return_float
 | |
| +
 | |
| +        str     r0, [r4], #4            /* Low word */
 | |
| +
 | |
| +        cmp     ip, #74                 /* 'J' */
 | |
| +        streq   r1, [r4], #4            /* High word */
 | |
| +
 | |
| +return:
 | |
| +        mov     r0, r4                  /* return ostack */
 | |
| +        ldmfd   sp!, {r4, r5, r6, r7, r8, r10, r11, lr}
 | |
| +        bx      lr
 | |
| +
 | |
| +return_float:
 | |
| +        add     r4, r4, #4
 | |
| +        fsts    s0, [r4, #-4]
 | |
| +        b       return
 | |
| +
 | |
| +return_double:
 | |
| +        add     r4, r4, #8
 | |
| +        fstd    d0, [r4, #-8]
 | |
| +        b       return
 | |
| diff --git a/src/os/linux/arm/dll_md.c b/src/os/linux/arm/dll_md.c
 | |
| index f5df90e..39bdf7c 100644
 | |
| --- a/src/os/linux/arm/dll_md.c
 | |
| +++ b/src/os/linux/arm/dll_md.c
 | |
| @@ -1,6 +1,6 @@
 | |
|  /*
 | |
| - * Copyright (C) 2003, 2004, 2005, 2006, 2007
 | |
| - * Robert Lougher <rob@lougher.org.uk>.
 | |
| + * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2011
 | |
| + * Robert Lougher <rob@jamvm.org.uk>.
 | |
|   *
 | |
|   * This file is part of JamVM.
 | |
|   *
 | |
| @@ -31,6 +31,61 @@
 | |
|   * out stack requirements and then to push arguments.  To
 | |
|   * save the first scan at call time, the signature is pre-
 | |
|   * scanned and stack requirement stored in the extra argument. */
 | |
| +
 | |
| +#ifdef __ARM_PCS_VFP
 | |
| +int nativeExtraArg(MethodBlock *mb) {
 | |
| +    char *sig = mb->type;
 | |
| +    int fp_backfill = 0;
 | |
| +    int stack_args = 0;
 | |
| +    int int_args = 2;
 | |
| +    int fp_args = 16;
 | |
| +
 | |
| +    while(*++sig != ')')
 | |
| +        switch(*sig) {
 | |
| +            case 'J':
 | |
| +                if(int_args < 2)
 | |
| +                    stack_args = (stack_args + 15) & ~7;
 | |
| +                int_args = 0;
 | |
| +                break;
 | |
| +
 | |
| +            case 'D':
 | |
| +                fp_backfill |= fp_args & 1;
 | |
| +                fp_args &= ~1;
 | |
| +
 | |
| +                if(fp_args == 0) {
 | |
| +                    stack_args = (stack_args + 15) & ~7;
 | |
| +                    fp_backfill = 0;
 | |
| +                } else
 | |
| +                    fp_args -= 2;
 | |
| +                break;
 | |
| +
 | |
| +            case 'F':
 | |
| +                if(fp_backfill)
 | |
| +                    fp_backfill = 0;
 | |
| +                else {
 | |
| +                    if(fp_args == 0) 
 | |
| +                        stack_args += 4;
 | |
| +                    else
 | |
| +                        fp_args--;
 | |
| +                }
 | |
| +                break;
 | |
| +
 | |
| +            default:
 | |
| +                if(int_args == 0)
 | |
| +                    stack_args += 4;
 | |
| +                else
 | |
| +                    int_args--;
 | |
| +
 | |
| +                if(*sig == '[')
 | |
| +                    while(*++sig == '[');
 | |
| +                if(*sig == 'L')
 | |
| +                    while(*++sig != ';');
 | |
| +                break;
 | |
| +        }
 | |
| +
 | |
| +    return (stack_args + 7) & ~7;
 | |
| +}
 | |
| +#else
 | |
|  int nativeExtraArg(MethodBlock *mb) {
 | |
|      char *sig = mb->type;
 | |
|      int args = 0;
 | |
| @@ -57,7 +112,7 @@ int nativeExtraArg(MethodBlock *mb) {
 | |
|         native method, so minimum stack requirement is 8 bytes. */
 | |
|      return args < 8 ? 8 : args;
 | |
|  }
 | |
| -
 | |
| +#endif
 | |
|  #else
 | |
|  
 | |
|  /* Under OABI, arguments can be copied onto the stack "as is"
 | |
| -- 
 | |
| 2.17.1
 | |
| 
 |