/* Copyright (C) 1995-2014 Free Software Foundation, Inc.

   This file is part of the GNU C Library.

   The GNU C Library is free software; you can redistribute it and/or
   modify it under the terms of the GNU Lesser General Public License as
   published by the Free Software Foundation; either version 2.1 of the
   License, or (at your option) any later version.

   The GNU C Library is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   Lesser General Public License for more details.

   You should have received a copy of the GNU Lesser General Public
   License along with the GNU C Library.  If not, see
   <http://www.gnu.org/licenses/>.  */

/* This is the canonical entry point, usually the first thing in the text
   segment.

   Note that the code in the .init section has already been run.
   This includes _init and _libc_init


   At this entry point, most registers' values are unspecified, except:

   x0		Contains a function pointer to be registered with `atexit'.
		This is how the dynamic linker arranges to have DT_FINI
		functions called for shared libraries that have been loaded
		before this code runs.

   sp		The stack contains the arguments and environment:
		0(sp)			argc
		8(sp)			argv[0]
		...
		(8*argc)(sp)		NULL
		(8*(argc+1))(sp)	envp[0]
		...
					NULL
 */

	.text
	.globl _start
	.type _start,#function
_start:
	/* Create an initial frame with 0 LR and FP */
	mov	x29, #0
	mov	x30, #0
	mov	x29, sp

	/* Setup rtld_fini in argument register */
	mov	x5, x0

	/* Load argc and a pointer to argv */
	ldr	x1, [sp, #0]
	add	x2, sp, #8

	/* Setup stack limit in argument register */
	mov	x6, sp

#ifdef SHARED
        adrp    x0, :got:main
	ldr     x0, [x0, #:got_lo12:main]

        adrp    x3, :got:__libc_csu_init
	ldr     x3, [x3, #:got_lo12:__libc_csu_init]

        adrp    x4, :got:__libc_csu_fini
	ldr     x4, [x4, #:got_lo12:__libc_csu_fini]
#else
	/* Set up the other arguments in registers */
	ldr	x0, =main
	ldr	x3, =__libc_csu_init
	ldr	x4, =__libc_csu_fini
#endif

	/* __libc_start_main (main, argc, argv, init, fini, rtld_fini,
			      stack_end) */

	/* Let the libc call main and exit with its return code.  */
	bl	__libc_start_main

	/* should never get here....*/
	bl	abort

	/* Define a symbol for the first piece of initialized data.  */
	.data
	.globl __data_start
__data_start:
	.long 0
	.weak data_start
	data_start = __data_start
