about summary refs log tree commit diff
path: root/sysdeps/ia64
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps/ia64')
-rw-r--r--sysdeps/ia64/elf/entry.h7
-rw-r--r--sysdeps/ia64/elf/start.S45
2 files changed, 38 insertions, 14 deletions
diff --git a/sysdeps/ia64/elf/entry.h b/sysdeps/ia64/elf/entry.h
new file mode 100644
index 0000000000..53ea9a2297
--- /dev/null
+++ b/sysdeps/ia64/elf/entry.h
@@ -0,0 +1,7 @@
+#ifndef __ASSEMBLY__
+extern void _start (void);
+#endif
+
+/* The function's entry point is stored in the first word of the
+   function descriptor (plabel) of _start().  */
+#define ENTRY_POINT (((long int *) _start)[0])
diff --git a/sysdeps/ia64/elf/start.S b/sysdeps/ia64/elf/start.S
index 5ba6196e3c..cc8b798b37 100644
--- a/sysdeps/ia64/elf/start.S
+++ b/sysdeps/ia64/elf/start.S
@@ -17,6 +17,8 @@
    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
    Boston, MA 02111-1307, USA.  */
 
+#include <sysdep.h>
+
 #include <asm/unistd.h>
 #include <asm/fpu.h>
 
@@ -31,10 +33,12 @@
  *	out6:	stack_end
  */
 
-	.global	_start
-	.proc	_start
+	.align 32
+	.global _start
 
+	.proc _start
 _start:
+	.prologue
 	{ .mlx
 	  alloc r2 = ar.pfs,0,0,7,0
 	  movl r3 = FPSR_DEFAULT
@@ -44,38 +48,46 @@ _start:
 	  movl gp = @gprel(0f)
 	  ;;
 	}
-0:	{ .mii
+0:	{ .mmi
 	  ld8 out1 = [out2], 8	/* load argc and move out2 to become argv */
+	  mov.m r10 = ar.bsp	/* fetch rbs base address */
 	  mov r9 = ip
 	  ;;
+	}
+	{ .mii
+	  mov ar.fpsr = r3
 	  sub gp = r9, gp	/* back-compute gp value */
+	  adds out6 = 16, sp	/* highest non-environment stack address */
 	  ;;
 	}
-	{ .mfi
-	  mov ar.fpsr = r3
+	{
+	  addl r11 = @ltoff(__libc_ia64_register_backing_store_base), gp
 	  addl out0 = @ltoff(@fptr(main)), gp
-	}
-	{ .mfi
-	  addl out4 = @ltoff(@fptr(_fini)), gp
 	  addl out3 = @ltoff(@fptr(_init)), gp
 	  ;;
 	}
 	{ .mmi
+	  ld8 r3 = [r11]	/* pointer to __libc_ia64_register_backing_store_base */
 	  ld8 out0 = [out0]	/* pointer to `main' function descriptor */
+	  addl out4 = @ltoff(@fptr(_fini)), gp
+	  ;;
+	}
+	{ .mmi
 	  ld8 out3 = [out3]	/* pointer to `init' function descriptor */
-	  adds out6 = 16, sp	/* highest non-environment stack address */
+	  ld8 out4 = [out4]	/* pointer to `fini' function descriptor */
+	  .save rp, r4
+	  mov r4 = r0		/* terminate unwind chain with a NULL return-pointer */
 	}
+	.body
 	{ .mib
-	  ld8 out4 = [out4]	/* pointer to `fini' function descriptor */
+	  st8 [r3] = r10
 	  mov out5 = ret0	/* dynamic linker destructor */
 	  br.call.sptk.few rp = __libc_start_main
 	}
 	{ .mib
-	  mov rp = r0
-	  br.ret.sptk.few rp	/* break miserably if we ever return */
-	  ;;
+	  break 0	/* break miserably if we ever return */
 	}
-	.endp	_start
+	.endp _start
 
 /* Define a symbol for the first piece of initialized data.  */
 	.data
@@ -84,3 +96,8 @@ __data_start:
 	.long 0
 	.weak data_start
 	data_start = __data_start
+
+	.global __libc_ia64_register_backing_store_base
+	.align 8
+__libc_ia64_register_backing_store_base:
+	.space 8