From 363426243725d12c34498ca763734ef9d8c95e1a Mon Sep 17 00:00:00 2001
From: Jonas Maebe <jonas@freepascal.org>
Date: Fri, 29 May 2015 06:14:27 +0000
Subject: [PATCH]   + Linux/AArch64 gprof-enabled startup code (patch by Edmund
 Grimley Evans)

git-svn-id: trunk@30934 -
---
 rtl/linux/aarch64/gprt0.as | 110 ++++++++++++++++++++++++++++++++++++-
 1 file changed, 109 insertions(+), 1 deletion(-)

diff --git a/rtl/linux/aarch64/gprt0.as b/rtl/linux/aarch64/gprt0.as
index e3a1b59190..d7d6337e55 100644
--- a/rtl/linux/aarch64/gprt0.as
+++ b/rtl/linux/aarch64/gprt0.as
@@ -7,4 +7,112 @@
 
 	.text
 	.align 2
-	b	xx_aarch64_gprt0_unimplemented
+
+	.globl _start
+	.type  _start,#function
+_start:
+	/* Initialise FP to zero */
+	mov	x29,#0
+
+	/* This is rtld_fini */
+	mov	x5,x0
+
+	/* Get argc, argv, envp */
+	ldr	x1,[sp]
+	add	x2,sp,#8
+	add	x11,x1,#1
+	add	x11,x2,x11,lsl #3
+
+	/* Save argc, argv, envp, and initial stack pointer */
+	adrp	x10,:got:operatingsystem_parameter_argc
+	ldr	x10,[x10,#:got_lo12:operatingsystem_parameter_argc]
+	str	x1,[x10]
+	adrp	x10,:got:operatingsystem_parameter_argv
+	ldr	x10,[x10,#:got_lo12:operatingsystem_parameter_argv]
+	str	x2,[x10]
+	adrp	x10,:got:operatingsystem_parameter_envp
+	ldr	x10,[x10,#:got_lo12:operatingsystem_parameter_envp]
+	str	x11,[x10]
+	adrp	x10,:got:__stkptr
+	ldr	x10,[x10,#:got_lo12:__stkptr]
+	mov	x6,sp
+	str	x6,[x10]
+
+	/* __libc_start_main(main, argc, argv,
+	                     init, fini, rtld_fini, stack_end) */
+	adrp	x0,:got:main_stub
+	ldr	x0,[x0,#:got_lo12:main_stub]
+	adrp	x3,:got:_init_dummy
+	ldr	x3,[x3,#:got_lo12:_init_dummy]
+	adrp	x4,:got:_fini_dummy
+	ldr	x4,[x4,#:got_lo12:_fini_dummy]
+	bl	__libc_start_main
+
+	/* This should never happen */
+	b	abort
+
+	.globl	_init_dummy
+	.type	_init_dummy,#function
+_init_dummy:
+	ret
+
+	.globl	_fini_dummy
+	.type	_fini_dummy,#function
+_fini_dummy:
+	ret
+
+	.globl	main_stub
+	.type	main_stub,#function
+main_stub:
+	stp	x29,x30,[sp,#-16]!
+
+	/* Save initial stackpointer */
+	mov	x0,sp
+	adrp	x1,:got:__stkptr
+	ldr	x1,[x1,#:got_lo12:__stkptr]
+	str	x0,[x1]
+
+	/* Initialize gmon */
+	adrp	x0,:got:_start
+	ldr	x0,[x0,#:got_lo12:_start]
+	adrp	x1,:got:_etext
+	ldr	x1,[x1,#:got_lo12:_etext]
+	bl	__monstartup
+	adrp	x0,:got:_mcleanup
+	ldr	x0,[x0,#:got_lo12:_mcleanup]
+	bl	atexit
+
+	/* Start the program */
+	bl	 PASCALMAIN
+	b	 abort
+
+	.globl	_haltproc
+	.type	_haltproc,#function
+_haltproc:
+	/* Return to libc */
+	adrp	x1,:got:__stkptr
+	ldr	x1,[x1,#:got_lo12:__stkptr]
+	ldr	x1,[x1]
+	mov	sp,x1
+	ldp	x29,x30,[sp],#16
+	ret
+
+	/* Define a symbol for the first piece of initialized data. */
+	.data
+	.align 3
+	.globl __data_start
+__data_start:
+	.long 0
+	.weak data_start
+	data_start = __data_start
+
+	.bss
+	.align 3
+
+	.comm __stkptr,8
+
+	.comm operatingsystem_parameter_envp,8
+	.comm operatingsystem_parameter_argc,8
+	.comm operatingsystem_parameter_argv,8
+
+	.section .note.GNU-stack,"",%progbits