Description: <short summary of the patch>
 TODO: Put a short summary on the line above and replace this paragraph
 with a longer explanation of this change. Complete the meta-information
 with other relevant fields (see below for details). To make it easier, the
 information below has been extracted from the changelog. Adjust it or drop
 it.
 .
 gcl (2.6.10-45) unstable; urgency=medium
 .
   * fix sh4 CLEAR_CACHE
Author: Camm Maguire <camm@debian.org>

---
The information above should follow the Patch Tagging Guidelines, please
checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here
are templates for supplementary fields that you might want to add:

Origin: <vendor|upstream|other>, <url of original patch>
Bug: <url in upstream bugtracker>
Bug-Debian: http://bugs.debian.org/<bugnumber>
Bug-Ubuntu: https://launchpad.net/bugs/<bugnumber>
Forwarded: <no|not-needed|url proving that it has been forwarded>
Reviewed-By: <name and email of someone who approved the patch>
Last-Update: <YYYY-MM-DD>

--- gcl-2.6.10.orig/configure.in
+++ gcl-2.6.10/configure.in
@@ -170,6 +170,9 @@ case $canonical in
      sparc*linux*)
      	use=sparc-linux;;
 
+     aarch64*linux*)
+        use=aarch64-linux;;
+
      arm*linux*)
      	use=arm-linux;;
 
@@ -597,6 +600,8 @@ case $use in
 			;;
 #		m68k*)
 #			TCFLAGS="$TCFLAGS -ffloat-store";;
+		aarch64*)
+			TLIBS="$TLIBS -lgcc_s";;
 		hppa*)
 			TCFLAGS="$TCFLAGS -mlong-calls "
 			TLIBS="$TLIBS -lgcc_s" # workaround hppa __moddi3 local func symbols with default linker flags
--- gcl-2.6.10.orig/configure
+++ gcl-2.6.10/configure
@@ -2890,6 +2890,9 @@ case $canonical in
      sparc*linux*)
      	use=sparc-linux;;
 
+     aarch64*linux*)
+        use=aarch64-linux;;
+
      arm*linux*)
      	use=arm-linux;;
 
@@ -4356,6 +4359,8 @@ case $use in
 			;;
 #		m68k*)
 #			TCFLAGS="$TCFLAGS -ffloat-store";;
+		aarch64*)
+			TLIBS="$TLIBS -lgcc_s";;
 		hppa*)
 			TCFLAGS="$TCFLAGS -mlong-calls "
 			TLIBS="$TLIBS -lgcc_s" # workaround hppa __moddi3 local func symbols with default linker flags
--- gcl-2.6.10.orig/o/cmpaux.c
+++ gcl-2.6.10/o/cmpaux.c
@@ -556,7 +556,7 @@ find_init_name1(char *s,unsigned len) {
   if (fread(tmp,1,ss.st_size,f)!=ss.st_size)
     FEerror("Error reading binary file",0);
   fclose(f);
-  for (s=tmp;s<tmp+ss.st_size && strncmp(s,"init_",5);q=strstr(s+1,"init_"),s=q ? q : s+strlen(s)+1);
+  for (s=tmp+1;s<tmp+ss.st_size && (strncmp(s,"init_",5) || s[-1]);q=strstr(s+1,"init_"),s=q ? q : s+strlen(s)+1);
   if (strncmp(s,"init_",5))
     FEerror("Init name not found",0);
   return make_simple_string(s);
--- gcl-2.6.10.orig/o/main.c
+++ gcl-2.6.10/o/main.c
@@ -312,7 +312,7 @@ DEFUN_NEW("SET-LOG-MAXPAGE-BOUND",object
 int
 main(int argc, char **argv, char **envp) {
 
-  gcl_init_alloc(&argc);
+  gcl_init_alloc(&argv);
 
 #ifdef CAN_UNRANDOMIZE_SBRK
 #include <stdio.h>
@@ -753,7 +753,7 @@ FFN(siLcatch_fatal)(int i) {
 
 LFD(siLreset_stack_limits)(void)
 {
-  int i=0;
+  long i=0;
 
   check_arg(0);
   if(catch_fatal <0) catch_fatal=1;
--- gcl-2.6.10.orig/h/elf32_arm_reloc.h
+++ gcl-2.6.10/h/elf32_arm_reloc.h
@@ -5,6 +5,18 @@
 #define R_ARM_THM_MOVW_ABS    48
 #define R_ARM_MOVW_ABS_NC 43
 #define R_ARM_MOVT_ABS    44
+    case R_ARM_THM_JUMP24:
+      s+=a; 
+      if (ELF_ST_TYPE(sym->st_info)==STT_FUNC) s|=1; 
+      s-=p+4; /*FIXME maybe drop 4 and add_val below*/
+      s=((long)s>>1); 
+      massert(!(abs(s)&0xff000000));  
+      store_val(where,MASK(11)<<16,(s&0x7ff)<<16); 
+      store_val(where,MASK(10),s>>11); 
+      store_val(where,MASK(1)<<(16+11),(~((s>>21&0x1)^(s>>23&0x1)))<<(16+11)); 
+      store_val(where,MASK(1)<<(16+13),(~((s>>22&0x1)^(s>>23&0x1)))<<(16+13)); 
+      store_val(where,MASK(1)<<10,(s>>23&0x1)<<10); 
+      break; 
     case R_ARM_THM_CALL: 
       s+=a; 
       if (ELF_ST_TYPE(sym->st_info)==STT_FUNC) s|=1; 
--- /dev/null
+++ gcl-2.6.10/h/elf64_aarch64_reloc.h
@@ -0,0 +1,43 @@
+    case R_AARCH64_ABS64: /* .xword: (S+A) */
+      store_val(where,~0L,s+a);
+      break;
+    case R_AARCH64_ABS32: /* .word:  (S+A) */
+      store_val(where,MASK(32),s+a);
+      break;
+    case R_AARCH64_JUMP26: /* B:      ((S+A-P) >> 2) & 0x3ffffff.  */
+    case R_AARCH64_CALL26: /* BL:     ((S+A-P) >> 2) & 0x3ffffff.  */
+      {
+	long x=((long)(s+a-p))/4;
+	if (abs(x)&(~MASK(26))) {
+	  got+=gotp;
+	  *got++=s+a;
+	  gotp++;
+	  memcpy(got,tramp,sizeof(tramp));
+	  gotp+=sizeof(tramp)/sizeof(*got);
+	  x=((long)(got+1))/4;
+	}
+	store_vals(where,MASK(26),x);
+      }
+      break;
+    case R_AARCH64_ADR_PREL_PG_HI21: /* ADRH:   ((PG(S+A)-PG(P)) >> 12) & 0x1fffff */
+#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: /* ADD:    (S+A) & 0xfff */
+      store_val(where,MASK(12) << 10,(s+a) << 10);
+      break;
+    case R_AARCH64_LDST8_ABS_LO12_NC: /* LD/ST8: (S+A) & 0xfff */
+      store_val(where,MASK(12) << 10,((s+a) & 0xfff) << 10);
+      break;
+    case R_AARCH64_LDST16_ABS_LO12_NC: /* LD/ST16: (S+A) & 0xffc */
+      store_val(where,MASK(12) << 10,((s+a) & 0xffe) << 9);
+      break;
+    case R_AARCH64_LDST32_ABS_LO12_NC: /* LD/ST32: (S+A) & 0xffc */
+      store_val(where,MASK(12) << 10,((s+a) & 0xffc) << 8);
+      break;
+    case R_AARCH64_LDST64_ABS_LO12_NC: /* LD/ST64: (S+A) & 0xff8 */
+      store_val(where,MASK(12) << 10,((s+a) & 0xff8) << 7);
+      break;
--- /dev/null
+++ gcl-2.6.10/h/elf64_aarch64_reloc_special.h
@@ -0,0 +1,41 @@
+/* #define R_AARCH64_TRAMP 1 */
+ul gotp;
+
+static int tramp[]={0x58ffffd0, /*ldr 19bit pc relative x16*/
+		    0xd61f0200};/*br x16*/
+
+static int
+find_special_params(void *v,Shdr *sec1,Shdr *sece,const char *sn,
+		    const char *st1,Sym *ds1,Sym *dse,Sym *sym,Sym *syme) {
+  
+  return 0;
+
+}
+
+static int
+label_got_symbols(void *v1,Shdr *sec1,Shdr *sece,Sym *sym1,Sym *syme,const char *st1,const char *sn,ul *gs) {
+
+  Rela *r;
+  Sym *sym;
+  Shdr *sec;
+  void *v,*ve;
+
+  gotp=0;
+  for (sym=sym1;sym<syme;sym++)
+    sym->st_other=sym->st_size=0;
+
+  for (*gs=0,sec=sec1;sec<sece;sec++)
+    if (sec->sh_type==SHT_RELA)
+      for (v=v1+sec->sh_offset,ve=v+sec->sh_size,r=v;v<ve;v+=sec->sh_entsize,r=v)
+	if (ELF_R_TYPE(r->r_info)==R_AARCH64_JUMP26 ||
+	    ELF_R_TYPE(r->r_info)==R_AARCH64_CALL26) {
+
+	  /*FIXME try to figure out earlier if this space is needed*/
+	  (*gs)+=1+(sizeof(tramp)/sizeof(*gs));
+	  /* r->r_info=ELF_R_INFO(ELF_R_SYM(r->r_info),R_AARCH64_TRAMP); */
+
+	}
+
+  return 0;
+  
+}
--- /dev/null
+++ gcl-2.6.10/h/aarch64-linux.h
@@ -0,0 +1,9 @@
+#include "linux.h"
+
+//#define SGC
+//#define NEED_STACK_CHK_GUARD
+//C_GC_OFFSET
+//PTR_ALIGN
+
+#define RELOC_H "elf64_aarch64_reloc.h"
+#define SPECIAL_RELOC_H "elf64_aarch64_reloc_special.h"
--- gcl-2.6.10.orig/h/frame.h
+++ gcl-2.6.10/h/frame.h
@@ -75,13 +75,14 @@ enum fr_class {
 
 EXTER int in_signal_handler;
 struct frame {
-	char		frs_jmpbuf[SIZEOF_JMP_BUF];
-	object		*frs_lex;
-	bds_ptr		frs_bds_top;
-	char 	frs_class;
-	char frs_in_signal_handler;
-	object		frs_val;
-	ihs_ptr		frs_ihs;
+  char     frs_jmpbuf[SIZEOF_JMP_BUF];
+  object  *frs_lex;
+  bds_ptr  frs_bds_top;
+  object   frs_val;
+  ihs_ptr  frs_ihs;
+  char     frs_class;
+  char     frs_in_signal_handler;
+  char     frs_pad[6]; /*Keep frs_jumpbuf 8 byte aligned*/
 };
 
 typedef struct frame *frame_ptr;
