1314 lines
39 KiB
Diff
1314 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
|
|
|