gnu: jamvm-1-bootstrap: Add aarch64-linux support.
* gnu/packages/java.scm (jamvm-1-bootstrap)[source]: Add patch; update name of existing patch. [arguments]<#:phases>: Invoke autoreconf during bootstrap phase when building for aarch64. [native-inputs]: Include packages required for autoreconf when building for aarch64. * gnu/packages/patches/jamvm-1.5.1-aarch64-support.patch: New file. * gnu/packages/patches/jamvm-arm.patch: Rename to "jamvm-1.5.1-armv7-support.patch". * gnu/local.mk (dist_patch_DATA): Add file; update filename. Signed-off-by: Efraim Flashner <efraim@flashner.co.il>master
parent
25ceae92ea
commit
6c9dca5a9b
|
@ -1114,8 +1114,9 @@ dist_patch_DATA = \
|
|||
%D%/packages/patches/irrlicht-use-system-libs.patch \
|
||||
%D%/packages/patches/isl-0.11.1-aarch64-support.patch \
|
||||
%D%/packages/patches/jacal-fix-texinfo.patch \
|
||||
%D%/packages/patches/jamvm-1.5.1-aarch64-support.patch \
|
||||
%D%/packages/patches/jamvm-1.5.1-armv7-support.patch \
|
||||
%D%/packages/patches/jamvm-2.0.0-disable-branch-patching.patch \
|
||||
%D%/packages/patches/jamvm-arm.patch \
|
||||
%D%/packages/patches/java-apache-ivy-port-to-latest-bouncycastle.patch \
|
||||
%D%/packages/patches/java-commons-collections-fix-java8.patch \
|
||||
%D%/packages/patches/java-jeromq-fix-tests.patch \
|
||||
|
|
|
@ -288,7 +288,8 @@ language.")
|
|||
(uri (string-append "mirror://sourceforge/jamvm/jamvm/"
|
||||
"JamVM%20" version "/jamvm-"
|
||||
version ".tar.gz"))
|
||||
(patches (search-patches "jamvm-arm.patch"))
|
||||
(patches (search-patches "jamvm-1.5.1-aarch64-support.patch"
|
||||
"jamvm-1.5.1-armv7-support.patch"))
|
||||
(sha256
|
||||
(base32
|
||||
"06lhi03l3b0h48pc7x58bk9my2nrcf1flpmglvys3wyad6yraf36"))
|
||||
|
@ -304,13 +305,30 @@ language.")
|
|||
(assoc-ref %build-inputs "classpath"))
|
||||
"--disable-int-caching"
|
||||
"--enable-runtime-reloc-checks"
|
||||
"--enable-ffi")))
|
||||
"--enable-ffi")
|
||||
#:phases
|
||||
,(if (string-prefix? "aarch64" (or (%current-system)
|
||||
(%current-target-system)))
|
||||
;; Makefiles and the configure script need to be regenerated to
|
||||
;; incorporate support for AArch64.
|
||||
'(modify-phases %standard-phases
|
||||
(replace 'bootstrap
|
||||
(lambda _ (invoke "autoreconf" "-vif"))))
|
||||
'%standard-phases)))
|
||||
(inputs
|
||||
`(("classpath" ,classpath-bootstrap)
|
||||
("jikes" ,jikes)
|
||||
("libffi" ,libffi)
|
||||
("zip" ,zip)
|
||||
("zlib" ,zlib)))
|
||||
(native-inputs
|
||||
(if (string-prefix? "aarch64" (or (%current-system)
|
||||
(%current-target-system)))
|
||||
;; Additional packages needed for autoreconf.
|
||||
`(("autoconf" ,autoconf)
|
||||
("automake" ,automake)
|
||||
("libtool" ,libtool))
|
||||
'()))
|
||||
(home-page "http://jamvm.sourceforge.net/")
|
||||
(synopsis "Small Java Virtual Machine")
|
||||
(description "JamVM is a Java Virtual Machine conforming to the JVM
|
||||
|
|
|
@ -0,0 +1,572 @@
|
|||
From 9c83c3d3f443eb92f87dc87c7dcfe95577b95621 Mon Sep 17 00:00:00 2001
|
||||
From: Simon South <simon@simonsouth.net>
|
||||
Date: Thu, 28 May 2020 14:29:55 -0400
|
||||
Subject: [PATCH] Add support for aarch64 on GNU/Linux
|
||||
|
||||
---
|
||||
configure.ac | 10 +-
|
||||
src/arch/Makefile.am | 2 +-
|
||||
src/arch/aarch64.h | 110 ++++++++++++++++
|
||||
src/os/linux/Makefile.am | 2 +-
|
||||
src/os/linux/aarch64/Makefile.am | 28 ++++
|
||||
src/os/linux/aarch64/callNative.S | 212 ++++++++++++++++++++++++++++++
|
||||
src/os/linux/aarch64/dll_md.c | 59 +++++++++
|
||||
src/os/linux/aarch64/init.c | 51 +++++++
|
||||
8 files changed, 469 insertions(+), 5 deletions(-)
|
||||
create mode 100644 src/arch/aarch64.h
|
||||
create mode 100644 src/os/linux/aarch64/Makefile.am
|
||||
create mode 100644 src/os/linux/aarch64/callNative.S
|
||||
create mode 100644 src/os/linux/aarch64/dll_md.c
|
||||
create mode 100644 src/os/linux/aarch64/init.c
|
||||
|
||||
diff --git a/configure.ac b/configure.ac
|
||||
index ccd530f..707f281 100644
|
||||
--- a/configure.ac
|
||||
+++ b/configure.ac
|
||||
@@ -43,6 +43,7 @@ amd64-*-freebsd*) host_os=bsd libdl_needed=no ;;
|
||||
arm*-*-linux*) host_cpu=arm host_os=linux ;;
|
||||
arm*-*-openbsd*) host_cpu=arm host_os=bsd libdl_needed=no ;;
|
||||
arm*-*-freebsd*) host_cpu=arm host_os=bsd libdl_needed=no ;;
|
||||
+aarch64*-*-linux*) host_cpu=aarch64 host_os=linux ;;
|
||||
powerpc*-*-linux*) host_cpu=powerpc host_os=linux ;;
|
||||
powerpc*-*-openbsd*) host_cpu=powerpc host_os=bsd libdl_needed=no ;;
|
||||
powerpc*-*-freebsd*) host_cpu=powerpc host_os=bsd libdl_needed=no ;;
|
||||
@@ -149,9 +150,11 @@ AC_ARG_ENABLE(runtime-reloc-checks,
|
||||
|
||||
AC_ARG_ENABLE(int-inlining,
|
||||
[AS_HELP_STRING(--enable-int-inlining,enable inline threaded version of the interpreter
|
||||
- (by default enabled on x86_64, i386 and powerpc, disabled otherwise))],,
|
||||
- [if test "$host_cpu" = x86_64 -o "$host_cpu" = i386 -o "$host_cpu" = powerpc && \
|
||||
- test "$cross_compiling" = no -o "$enable_runtime_reloc_checks" != no; then
|
||||
+ (by default enabled on x86_64, i386, powerpc and aarch64,
|
||||
+ disabled otherwise))],,
|
||||
+ [if test "$host_cpu" = x86_64 -o "$host_cpu" = i386 -o "$host_cpu" = powerpc -o \
|
||||
+ "$host_cpu" = aarch64 && test "$cross_compiling" = no -o \
|
||||
+ "$enable_runtime_reloc_checks" != no; then
|
||||
enable_int_inlining=yes
|
||||
else
|
||||
enable_int_inlining=no
|
||||
@@ -298,6 +301,7 @@ AC_CONFIG_FILES(
|
||||
src/os/linux/x86_64/Makefile \
|
||||
src/os/linux/parisc/Makefile \
|
||||
src/os/linux/mips/Makefile \
|
||||
+ src/os/linux/aarch64/Makefile \
|
||||
src/os/darwin/i386/Makefile \
|
||||
src/os/darwin/arm/Makefile \
|
||||
src/os/darwin/powerpc/Makefile \
|
||||
diff --git a/src/arch/Makefile.am b/src/arch/Makefile.am
|
||||
index 078c1de..afb26d1 100644
|
||||
--- a/src/arch/Makefile.am
|
||||
+++ b/src/arch/Makefile.am
|
||||
@@ -19,4 +19,4 @@
|
||||
## Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
##
|
||||
|
||||
-EXTRA_DIST = powerpc.h arm.h i386.h x86_64.h parisc.h mips.h
|
||||
+EXTRA_DIST = powerpc.h arm.h i386.h x86_64.h parisc.h mips.h aarch64.h
|
||||
diff --git a/src/arch/aarch64.h b/src/arch/aarch64.h
|
||||
new file mode 100644
|
||||
index 0000000..c96aa9f
|
||||
--- /dev/null
|
||||
+++ b/src/arch/aarch64.h
|
||||
@@ -0,0 +1,110 @@
|
||||
+/*
|
||||
+ * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008
|
||||
+ * Robert Lougher <rob@lougher.org.uk>.
|
||||
+ * Copyright (C) 2020 Simon South <simon@simonsouth.net>.
|
||||
+ *
|
||||
+ * 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.
|
||||
+ */
|
||||
+
|
||||
+#include <stdint.h>
|
||||
+
|
||||
+#define OS_ARCH "aarch64"
|
||||
+
|
||||
+#define HANDLER_TABLE_T static const void
|
||||
+#define DOUBLE_1_BITS 0x3ff0000000000000LL
|
||||
+
|
||||
+#define READ_DBL(v,p,l) v = ((u8)p[0]<<56)|((u8)p[1]<<48)|((u8)p[2]<<40) \
|
||||
+ |((u8)p[3]<<32)|((u8)p[4]<<24)|((u8)p[5]<<16) \
|
||||
+ |((u8)p[6]<<8)|(u8)p[7]; p+=8
|
||||
+
|
||||
+/* Needed for i386 -- empty here */
|
||||
+#define FPU_HACK
|
||||
+
|
||||
+#define COMPARE_AND_SWAP_64(addr, old_val, new_val) \
|
||||
+({ \
|
||||
+ int result, read_val; \
|
||||
+ __asm__ __volatile__ (" \
|
||||
+ 1: ldaxr %2, %1; \
|
||||
+ cmp %2, %3; \
|
||||
+ b.ne 2f; \
|
||||
+ stlxr %w0, %4, %1; \
|
||||
+ cmp %w0, wzr; \
|
||||
+ b.ne 1b; \
|
||||
+ 2: cset %w0, eq;" \
|
||||
+ : "=&r" (result), "+Q" (*addr), "=&r" (read_val) \
|
||||
+ : "r" (old_val), "r" (new_val) \
|
||||
+ : "cc"); \
|
||||
+ result; \
|
||||
+})
|
||||
+
|
||||
+#define COMPARE_AND_SWAP(addr, old_val, new_val) \
|
||||
+ COMPARE_AND_SWAP_64(addr, old_val, new_val)
|
||||
+
|
||||
+#define LOCKWORD_READ(addr) \
|
||||
+({ \
|
||||
+ uintptr_t result; \
|
||||
+ __asm__ __volatile__ (" \
|
||||
+ ldar %0, %1;" \
|
||||
+ : "=r" (result) \
|
||||
+ : "Q" (*addr) \
|
||||
+ : "cc"); \
|
||||
+ result; \
|
||||
+})
|
||||
+
|
||||
+#define LOCKWORD_WRITE(addr, value) \
|
||||
+({ \
|
||||
+ __asm__ __volatile__ (" \
|
||||
+ stlr %1, %0;" \
|
||||
+ : "=Q" (*addr) \
|
||||
+ : "r" (value) \
|
||||
+ : "cc"); \
|
||||
+})
|
||||
+
|
||||
+#define LOCKWORD_COMPARE_AND_SWAP(addr, old_val, new_val) \
|
||||
+ COMPARE_AND_SWAP_64(addr, old_val, new_val)
|
||||
+
|
||||
+#define FLUSH_CACHE(addr, length) \
|
||||
+{ \
|
||||
+ uintptr_t start = (uintptr_t) (addr); \
|
||||
+ uintptr_t end = start + length; \
|
||||
+ uintptr_t i; \
|
||||
+ \
|
||||
+ for(i = start & aarch64_data_cache_line_mask; \
|
||||
+ i < end; \
|
||||
+ i += aarch64_data_cache_line_len) \
|
||||
+ __asm__ ("dc cvau, %0" :: "r" (i)); \
|
||||
+ \
|
||||
+ __asm__ ("dsb ish"); \
|
||||
+ \
|
||||
+ for(i = start & aarch64_instruction_cache_line_mask; \
|
||||
+ i < end; \
|
||||
+ i += aarch64_instruction_cache_line_len) \
|
||||
+ __asm__ ("ic ivau, %0" :: "r" (i)); \
|
||||
+ \
|
||||
+ __asm__ ("dsb ish; isb"); \
|
||||
+}
|
||||
+
|
||||
+#define MBARRIER() __asm__ ("dmb ish" ::: "memory")
|
||||
+#define UNLOCK_MBARRIER() __asm__ ("dmb ish" ::: "memory")
|
||||
+#define JMM_LOCK_MBARRIER() __asm__ ("dmb ish" ::: "memory")
|
||||
+#define JMM_UNLOCK_MBARRIER() JMM_LOCK_MBARRIER()
|
||||
+
|
||||
+/* Defined in src/os/linux/aarch64/init.c */
|
||||
+extern unsigned char aarch64_data_cache_line_len;
|
||||
+extern uintptr_t aarch64_data_cache_line_mask;
|
||||
+extern unsigned char aarch64_instruction_cache_line_len;
|
||||
+extern uintptr_t aarch64_instruction_cache_line_mask;
|
||||
diff --git a/src/os/linux/Makefile.am b/src/os/linux/Makefile.am
|
||||
index aa29be1..d582b97 100644
|
||||
--- a/src/os/linux/Makefile.am
|
||||
+++ b/src/os/linux/Makefile.am
|
||||
@@ -20,7 +20,7 @@
|
||||
##
|
||||
|
||||
SUBDIRS = @arch@
|
||||
-DIST_SUBDIRS = powerpc arm i386 x86_64 parisc mips
|
||||
+DIST_SUBDIRS = powerpc arm i386 x86_64 parisc mips aarch64
|
||||
|
||||
noinst_LTLIBRARIES = libos.la
|
||||
libos_la_SOURCES = os.c
|
||||
diff --git a/src/os/linux/aarch64/Makefile.am b/src/os/linux/aarch64/Makefile.am
|
||||
new file mode 100644
|
||||
index 0000000..1024c3a
|
||||
--- /dev/null
|
||||
+++ b/src/os/linux/aarch64/Makefile.am
|
||||
@@ -0,0 +1,28 @@
|
||||
+##
|
||||
+## Copyright (C) 2003, 2004, 2005, 2006, 2007, 2010, 2011, 2012
|
||||
+## Robert Lougher <rob@lougher.org.uk>.
|
||||
+##
|
||||
+## File added by Simon South <simon@simonsouth.net>.
|
||||
+##
|
||||
+## 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.
|
||||
+##
|
||||
+
|
||||
+noinst_LTLIBRARIES = libnative.la
|
||||
+libnative_la_SOURCES = init.c dll_md.c callNative.S
|
||||
+
|
||||
+AM_CPPFLAGS = -I$(top_builddir)/src -I$(top_srcdir)/src
|
||||
+AM_CCASFLAGS = -I$(top_builddir)/src
|
||||
diff --git a/src/os/linux/aarch64/callNative.S b/src/os/linux/aarch64/callNative.S
|
||||
new file mode 100644
|
||||
index 0000000..e067c4f
|
||||
--- /dev/null
|
||||
+++ b/src/os/linux/aarch64/callNative.S
|
||||
@@ -0,0 +1,212 @@
|
||||
+/*
|
||||
+ * Copyright (C) 2008, 2009, 2011, 2012 Robert Lougher <rob@jamvm.org.uk>.
|
||||
+ * Copyright (C) 2020 Simon South <simon@simonsouth.net>.
|
||||
+ *
|
||||
+ * 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.
|
||||
+ */
|
||||
+
|
||||
+#include "config.h"
|
||||
+
|
||||
+#ifndef USE_FFI
|
||||
+ .text
|
||||
+ .arch armv8-a
|
||||
+ .align 2
|
||||
+ .global callJNIMethod
|
||||
+ .type callJNIMethod,function
|
||||
+
|
||||
+/*
|
||||
+ * Arguments passed in:
|
||||
+ *
|
||||
+ * x0 JNIEnv
|
||||
+ * x1 class or NULL
|
||||
+ * x2 sig
|
||||
+ * w3 extra arg
|
||||
+ * x4 ostack
|
||||
+ * x5 function pntr
|
||||
+ * w6 args count
|
||||
+ */
|
||||
+
|
||||
+/* Register usage:
|
||||
+ *
|
||||
+ * x20 ostack
|
||||
+ * x19 sig pntr
|
||||
+ * x16 function pntr
|
||||
+ * x15 ostack pntr
|
||||
+ * x14 args pntr
|
||||
+ * x13 float/double handler
|
||||
+ * x12 int/long handler
|
||||
+ * w11 fp regs remaining
|
||||
+ * w10 int regs remaining
|
||||
+ * x9 scratch
|
||||
+ * x2-x7 outgoing int args
|
||||
+ * x1 outgoing class or this pntr
|
||||
+ * x0 outgoing JNIEnv (as passed in)
|
||||
+ *
|
||||
+ * d0 - d7 outgoing float args
|
||||
+ */
|
||||
+
|
||||
+callJNIMethod:
|
||||
+ stp x29, x30, [sp, #-32]!
|
||||
+ mov x29, sp
|
||||
+ stp x19, x20, [x29, #16]
|
||||
+
|
||||
+ sub sp, sp, w3 /* allocate room for stacked args */
|
||||
+ mov x14, sp
|
||||
+
|
||||
+ mov x20, x4 /* preserve ostack */
|
||||
+ add x19, x2, #1 /* init sig pntr -- skipping '(' */
|
||||
+
|
||||
+ mov x16, x5 /* save function pntr */
|
||||
+ mov x15, x20 /* init ostack pntr */
|
||||
+
|
||||
+ adr x13, fp_reg_handlers-8
|
||||
+ adr x12, int_reg_handlers-8
|
||||
+
|
||||
+ mov w11, #8 /* fp regs remaining */
|
||||
+ mov w10, #6 /* int regs remaining */
|
||||
+
|
||||
+ cbnz x1, scan_sig /* is method non-static? */
|
||||
+ ldr x1, [x15], #8 /* yes, load x1 with "this" */
|
||||
+
|
||||
+scan_sig:
|
||||
+ ldrb w9, [x19], #1 /* get next sig char */
|
||||
+
|
||||
+ cmp w9, #41 /* ')' */
|
||||
+ b.eq done
|
||||
+
|
||||
+ cmp w9, #74 /* 'J' */
|
||||
+ b.eq long
|
||||
+
|
||||
+ cmp w9, #70 /* 'F' */
|
||||
+ b.eq float
|
||||
+
|
||||
+ cmp w9, #68 /* 'D' */
|
||||
+ b.eq double
|
||||
+
|
||||
+skip_brackets:
|
||||
+ cmp w9, #91 /* '[' */
|
||||
+ b.ne 1f
|
||||
+ ldrb w9, [x19], #1
|
||||
+ b skip_brackets
|
||||
+1:
|
||||
+ cmp w9, #76 /* 'L' */
|
||||
+ b.ne int
|
||||
+
|
||||
+skip_ref:
|
||||
+ ldrb w9, [x19], #1
|
||||
+ cmp w9, #59 /* ';' */
|
||||
+ b.ne skip_ref
|
||||
+
|
||||
+int:
|
||||
+ ldr x9, [x15], #8
|
||||
+ cbz w10, stack_push
|
||||
+
|
||||
+load_int_reg:
|
||||
+ sub w10, w10, #1
|
||||
+ add x12, x12, #8
|
||||
+ br x12
|
||||
+
|
||||
+int_reg_handlers:
|
||||
+ mov x2, x9
|
||||
+ b scan_sig
|
||||
+ mov x3, x9
|
||||
+ b scan_sig
|
||||
+ mov x4, x9
|
||||
+ b scan_sig
|
||||
+ mov x5, x9
|
||||
+ b scan_sig
|
||||
+ mov x6, x9
|
||||
+ b scan_sig
|
||||
+ mov x7, x9
|
||||
+ b scan_sig
|
||||
+
|
||||
+long:
|
||||
+ ldr x9, [x15], #16
|
||||
+ cbz w10, stack_push
|
||||
+ b load_int_reg
|
||||
+
|
||||
+float:
|
||||
+ ldr w9, [x15], #8
|
||||
+ cbz w11, stack_push
|
||||
+ b load_fp_reg
|
||||
+
|
||||
+double:
|
||||
+ ldr x9, [x15], #16
|
||||
+ cbz w11, stack_push
|
||||
+
|
||||
+load_fp_reg:
|
||||
+ sub w11, w11, #1
|
||||
+ add x13, x13, #8
|
||||
+ br x13
|
||||
+
|
||||
+fp_reg_handlers:
|
||||
+ fmov d0, x9
|
||||
+ b scan_sig
|
||||
+ fmov d1, x9
|
||||
+ b scan_sig
|
||||
+ fmov d2, x9
|
||||
+ b scan_sig
|
||||
+ fmov d3, x9
|
||||
+ b scan_sig
|
||||
+ fmov d4, x9
|
||||
+ b scan_sig
|
||||
+ fmov d5, x9
|
||||
+ b scan_sig
|
||||
+ fmov d6, x9
|
||||
+ b scan_sig
|
||||
+ fmov d7, x9
|
||||
+ b scan_sig
|
||||
+
|
||||
+stack_push:
|
||||
+ str x9, [x14], #8
|
||||
+ b scan_sig
|
||||
+
|
||||
+done:
|
||||
+ /* Call the function */
|
||||
+ blr x16
|
||||
+
|
||||
+ mov sp, x29 /* Pop argument area */
|
||||
+
|
||||
+ ldrb w9, [x19] /* Return type */
|
||||
+
|
||||
+ cmp w9, #86 /* 'V' */
|
||||
+ b.eq return
|
||||
+
|
||||
+ cmp w9, #68 /* 'D' */
|
||||
+ b.ne 2f
|
||||
+ str d0, [x20], #16
|
||||
+ b return
|
||||
+2:
|
||||
+ cmp w9, #70 /* 'F' */
|
||||
+ b.ne 3f
|
||||
+ str s0, [x20], #8
|
||||
+ b return
|
||||
+3:
|
||||
+ cmp w9, #74 /* 'J' */
|
||||
+ b.ne 4f
|
||||
+ str x0, [x20], #16
|
||||
+ b return
|
||||
+4:
|
||||
+ str x0, [x20], #8
|
||||
+
|
||||
+return:
|
||||
+ mov x0, x20 /* return ostack */
|
||||
+
|
||||
+ ldp x19, x20, [x29, #16]
|
||||
+ ldp x29, x30, [sp], #32
|
||||
+ ret
|
||||
+#endif
|
||||
diff --git a/src/os/linux/aarch64/dll_md.c b/src/os/linux/aarch64/dll_md.c
|
||||
new file mode 100644
|
||||
index 0000000..189f8a8
|
||||
--- /dev/null
|
||||
+++ b/src/os/linux/aarch64/dll_md.c
|
||||
@@ -0,0 +1,59 @@
|
||||
+/*
|
||||
+ * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2010, 2011
|
||||
+ * Robert Lougher <rob@jamvm.org.uk>.
|
||||
+ * Copyright (C) 2020 Simon South <simon@simonsouth.net>.
|
||||
+ *
|
||||
+ * 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.
|
||||
+ */
|
||||
+
|
||||
+#include "jam.h"
|
||||
+
|
||||
+#ifndef USE_FFI
|
||||
+
|
||||
+int nativeExtraArg(MethodBlock *mb) {
|
||||
+ char *sig = mb->type;
|
||||
+ int stack_args = 0;
|
||||
+ int int_args = 6;
|
||||
+ int fp_args = 8;
|
||||
+
|
||||
+ while(*++sig != ')')
|
||||
+ switch(*sig) {
|
||||
+ case 'F':
|
||||
+ case 'D':
|
||||
+ if(fp_args == 0)
|
||||
+ stack_args += 8;
|
||||
+ else
|
||||
+ fp_args--;
|
||||
+
|
||||
+ default:
|
||||
+ if(int_args == 0)
|
||||
+ stack_args += 8;
|
||||
+ else
|
||||
+ int_args--;
|
||||
+
|
||||
+ if(*sig == '[')
|
||||
+ while(*++sig == '[');
|
||||
+ if(*sig == 'L')
|
||||
+ while(*++sig != ';');
|
||||
+ break;
|
||||
+ }
|
||||
+
|
||||
+ /* Ensure the stack remains 16 byte aligned. */
|
||||
+ return (stack_args + 15) & ~15;
|
||||
+}
|
||||
+
|
||||
+#endif
|
||||
diff --git a/src/os/linux/aarch64/init.c b/src/os/linux/aarch64/init.c
|
||||
new file mode 100644
|
||||
index 0000000..e03b446
|
||||
--- /dev/null
|
||||
+++ b/src/os/linux/aarch64/init.c
|
||||
@@ -0,0 +1,51 @@
|
||||
+/*
|
||||
+ * Copyright (C) 2003, 2004, 2005, 2006, 2007
|
||||
+ * Robert Lougher <rob@lougher.org.uk>.
|
||||
+ * Copyright (C) 2020 Simon South <simon@simonsouth.net>.
|
||||
+ *
|
||||
+ * 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.
|
||||
+ */
|
||||
+
|
||||
+#include "arch/aarch64.h"
|
||||
+
|
||||
+/* Length in bytes of the smallest line in the host system's data cache */
|
||||
+unsigned char aarch64_data_cache_line_len;
|
||||
+
|
||||
+/* Mask used to align a virtual address to a line in the data cache */
|
||||
+uintptr_t aarch64_data_cache_line_mask;
|
||||
+
|
||||
+/* Length in bytes of the smallest line in the host system's instruction
|
||||
+ cache */
|
||||
+unsigned char aarch64_instruction_cache_line_len;
|
||||
+
|
||||
+/* Mask used to align a virtual address to a line in the instruction cache */
|
||||
+uintptr_t aarch64_instruction_cache_line_mask;
|
||||
+
|
||||
+void initialisePlatform() {
|
||||
+ unsigned int cache_type;
|
||||
+
|
||||
+ /* Extract information from the cache-type register, which describes aspects
|
||||
+ of the host's cache configuration */
|
||||
+ __asm__ ("mrs %0, ctr_el0" : "=r" (cache_type));
|
||||
+
|
||||
+ aarch64_data_cache_line_len = 4 << ((cache_type >> 16) & 0x0f);
|
||||
+ aarch64_data_cache_line_mask = ~(aarch64_data_cache_line_len - 1);
|
||||
+
|
||||
+ aarch64_instruction_cache_line_len = 4 << (cache_type & 0x0f);
|
||||
+ aarch64_instruction_cache_line_mask =
|
||||
+ ~(aarch64_instruction_cache_line_len - 1);
|
||||
+}
|
||||
--
|
||||
2.26.2
|
||||
|
Reference in New Issue