gcl-devel
[Top][All Lists]
Advanced

[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




reply via email to

[Prev in Thread] Current Thread [Next in Thread]