[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Gcl-devel] [PATCH 03/11] Add support for AArch64
From: |
Will Newton |
Subject: |
[Gcl-devel] [PATCH 03/11] Add support for AArch64 |
Date: |
Wed, 11 Jun 2014 17:27:16 +0100 |
From: Will Newton <address@hidden>
---
gcl/configure | 19 ++++++++++++++++++-
gcl/configure.in | 6 +++++-
gcl/h/aarch64-linux.h | 5 +++++
gcl/h/elf64_aarch64_reloc.h | 43 +++++++++++++++++++++++++++++++++++++++++++
4 files changed, 71 insertions(+), 2 deletions(-)
create mode 100755 gcl/h/aarch64-linux.h
create mode 100644 gcl/h/elf64_aarch64_reloc.h
diff --git a/gcl/configure b/gcl/configure
index 439f763..ebfbf1f 100755
--- a/gcl/configure
+++ b/gcl/configure
@@ -2885,6 +2885,9 @@ case $canonical in
arm*linux*)
use=arm-linux;;
+ aarch64*linux*)
+ use=aarch64-linux;;
+
s390*linux*)
use=s390-linux;;
@@ -10066,7 +10069,18 @@ _ACEOF
fi
- for ac_func in print_insn_alpha
+ for ac_func in print_insn_aarch64
+do :
+ ac_fn_c_check_func "$LINENO" "print_insn_aarch64"
"ac_cv_func_print_insn_aarch64"
+if test "x$ac_cv_func_print_insn_aarch64" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_PRINT_INSN_AARCH64 1
+_ACEOF
+
+$as_echo "#define PRINT_INSN print_insn_aarch64" >>confdefs.h
+
+else
+ for ac_func in print_insn_alpha
do :
ac_fn_c_check_func "$LINENO" "print_insn_alpha" "ac_cv_func_print_insn_alpha"
if test "x$ac_cv_func_print_insn_alpha" = xyes; then :
@@ -10290,6 +10304,9 @@ fi
done
fi
+done
+
+fi
done
diff --git a/gcl/configure.in b/gcl/configure.in
index da32815..17d863c 100644
--- a/gcl/configure.in
+++ b/gcl/configure.in
@@ -181,6 +181,9 @@ case $canonical in
arm*linux*)
use=arm-linux;;
+ aarch64*linux*)
+ use=aarch64-linux;;
+
s390*linux*)
use=s390-linux;;
@@ -2418,6 +2421,7 @@ AC_CHECK_FUNCS(feenableexcept)
AC_CHECK_HEADERS(dis-asm.h,
AC_CHECK_LIB(opcodes,init_disassemble_info)
+
AC_CHECK_FUNCS(print_insn_aarch64,AC_DEFINE([PRINT_INSN],[print_insn_aarch64],[instruction
disassemble routine]),
AC_CHECK_FUNCS(print_insn_alpha,AC_DEFINE([PRINT_INSN],[print_insn_alpha],[instruction
disassemble routine]),
AC_CHECK_FUNCS(print_insn_avr,AC_DEFINE([PRINT_INSN],[print_insn_avr],[instruction
disassemble routine]),
AC_CHECK_FUNCS(print_insn_big_arm,AC_DEFINE([PRINT_INSN],[insn_big_arm],[instruction
disassemble routine]),
@@ -2433,7 +2437,7 @@ AC_CHECK_HEADERS(dis-asm.h,
AC_CHECK_FUNCS(print_insn_s390,AC_DEFINE([PRINT_INSN],[print_insn_s390],[instruction
disassemble routine]),
AC_CHECK_FUNCS(print_insn_sh64,AC_DEFINE([PRINT_INSN],[print_insn_sh64],[instruction
disassemble routine]),
AC_CHECK_FUNCS(print_insn_sh,AC_DEFINE([PRINT_INSN],[print_insn_sh],[instruction
disassemble routine]),
-
AC_CHECK_FUNCS(print_insn_sparc,AC_DEFINE([PRINT_INSN],[print_insn_sparc],[instruction
disassemble routine]))))))))))))))))))
+
AC_CHECK_FUNCS(print_insn_sparc,AC_DEFINE([PRINT_INSN],[print_insn_sparc],[instruction
disassemble routine])))))))))))))))))))
#if test $use = "386-linux" ; then
AC_CHECK_HEADERS(asm/sigcontext.h)
diff --git a/gcl/h/aarch64-linux.h b/gcl/h/aarch64-linux.h
new file mode 100755
index 0000000..c2f0fe7
--- /dev/null
+++ b/gcl/h/aarch64-linux.h
@@ -0,0 +1,5 @@
+#include "linux.h"
+
+//#define SGC
+
+#define RELOC_H "elf64_aarch64_reloc.h"
diff --git a/gcl/h/elf64_aarch64_reloc.h b/gcl/h/elf64_aarch64_reloc.h
new file mode 100644
index 0000000..33bd60d
--- /dev/null
+++ b/gcl/h/elf64_aarch64_reloc.h
@@ -0,0 +1,43 @@
+/* .xword: (S+A) */
+#define R_AARCH64_ABS64 257
+/* .word: (S+A) */
+#define R_AARCH64_ABS32 258
+/* B: ((S+A-P) >> 2) & 0x3ffffff. */
+#define R_AARCH64_JUMP26 282
+/* BL: ((S+A-P) >> 2) & 0x3ffffff. */
+#define R_AARCH64_CALL26 283
+/* ADRH: ((PG(S+A)-PG(P)) >> 12) & 0x1fffff */
+#define R_AARCH64_ADR_PREL_PG_HI21 275
+/* ADD: (S+A) & 0xfff */
+#define R_AARCH64_ADD_ABS_LO12_NC 277
+/* LD/ST32: (S+A) & 0xffc */
+#define R_AARCH64_LDST32_ABS_LO12_NC 285
+/* LD/ST64: (S+A) & 0xff8 */
+#define R_AARCH64_LDST64_ABS_LO12_NC 286
+
+ case R_AARCH64_ABS64:
+ store_val(where,~0L,s+a);
+ break;
+ case R_AARCH64_ABS32:
+ store_val(where,MASK(32),s+a);
+ break;
+ case R_AARCH64_JUMP26:
+ case R_AARCH64_CALL26:
+ store_vals(where,MASK(26),((long)(s+a-p)) / 4);
+ break;
+ case R_AARCH64_ADR_PREL_PG_HI21:
+#define PG(x) ((x) & ~0xfff)
+ s = ((long)(PG(s+a)-PG(p))) / 0x1000;
+ store_val(where,MASK(2) << 29, (s & 0x3) << 29);
+ store_val(where,MASK(19) << 5, (s & 0x1ffffc) << 3);
+#undef PG
+ break;
+ case R_AARCH64_ADD_ABS_LO12_NC:
+ store_val(where,MASK(12) << 10,(s+a) << 10);
+ break;
+ case R_AARCH64_LDST32_ABS_LO12_NC:
+ store_val(where,MASK(12) << 10,((s+a) & 0xffc) << 8);
+ break;
+ case R_AARCH64_LDST64_ABS_LO12_NC:
+ store_val(where,MASK(12) << 10,((s+a) & 0xff8) << 7);
+ break;
--
1.9.3
- [Gcl-devel] [PATCH 00/11] Add support for AArch64, Will Newton, 2014/06/11
- [Gcl-devel] [PATCH 01/11] config.{sub, guess}: Update to latest versions of GNU config, Will Newton, 2014/06/11
- [Gcl-devel] [PATCH 03/11] Add support for AArch64,
Will Newton <=
- [Gcl-devel] [PATCH 04/11] Reorder code to avoid problems with dis-asm.h defining DEFUN., Will Newton, 2014/06/11
- [Gcl-devel] [PATCH 02/11] o/main.c: Ensure cs_org is always pointer aligned, Will Newton, 2014/06/11
- [Gcl-devel] [PATCH 06/11] Check for preceding NULL in find_init_name1, Will Newton, 2014/06/11
- [Gcl-devel] [PATCH 07/11] Fix handling of varargs in sSuniversal_error_handler, Will Newton, 2014/06/11
- [Gcl-devel] [PATCH 05/11] Always pass a va_list as the last arg of call_proc_new, Will Newton, 2014/06/11
- [Gcl-devel] [PATCH 10/11] Reduce threshold for increasing maxpage, Will Newton, 2014/06/11
- [Gcl-devel] [PATCH 09/11] Avoid looking up dynamic symbols in the executable, Will Newton, 2014/06/11
- [Gcl-devel] [PATCH 08/11] Handle dladdr failure correctly, Will Newton, 2014/06/11
- [Gcl-devel] [PATCH 11/11] Hack to disable x86 floating point code, Will Newton, 2014/06/11
- Re: [Gcl-devel] [PATCH 00/11] Add support for AArch64, Camm Maguire, 2014/06/11