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