/* ELF startup code for HPPA.
   Copyright (C) 2002-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.

   In addition to the permissions in the GNU Lesser General Public
   License, the Free Software Foundation gives you unlimited
   permission to link the compiled version of this file with other
   programs, and to distribute those programs without any restriction
   coming from the use of this file. (The GNU Lesser General Public
   License restrictions do apply in other respects; for example, they
   cover modification of the file, and distribution when not linked
   into another program.)

   Note that people who make modified versions of this file are not
   obligated to grant this special exception for their modified
   versions; it is their choice whether to do so. The GNU Lesser
   General Public License gives permission to release a modified
   version without this exception; this exception also makes it
   possible to release a modified version which carries forward this
   exception.

   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/>.  */

	.import main, code
	.import $global$, data
	.import __libc_start_main, code
	.import __libc_csu_fini, code
	.import __libc_csu_init, code

	/* Have the linker create plabel words so we get PLABEL32
	   relocs and not 21/14.  The use of 21/14 relocs is only
	   supported in the latest dynamic linker.  */
	.section	.rodata
	.align 4
.Lpmain:
	.word P%main
.Lp__libc_start_main:
	.word P%__libc_start_main
.Lp__libc_csu_fini:
	.word P%__libc_csu_fini
.Lp__libc_csu_init:
	.word P%__libc_csu_init

	.text
	.align 4
	.globl _start
	.export _start, ENTRY
	.type _start,@function
_start:
	/* At entry to the function we have:

		r26 - Unused
		r25 - argc
		r24 - argv
		r23 - False _dl_fini plabel address

	   This function is called from the lower half of RTLD_START.

	   The call to __libc_start_main expects:

		1. r26 - Application main
		2. r25 - argc
		3. r24 - argv
		4. r23 - __libc_csu_init
		5. sp-52 - __libc_csu_fini
		6. sp-56 - rtld_fini
		7. sp-60 - stackend  */

	.proc
	.callinfo
	/* Clear previous-sp.  */
	stw	%r0, -4(%sp)
	/* Setup the stack and frame.  */
	stw	%rp, -20(%sp)
	ldo	64(%sp), %sp
	stw	%sp, -4(%sp)
	stw	%r19, -32(%sp)

	/* argc and argv should be in 25 and 24 (2nd and 3rd argument) */
	/* void (*rtld_fini) (void) (6th argument) */
	stw	%r23, -56(%sp)
	/* Need to setup 1, 4, 5, and 7th arguments */

#if SHARED
	/* load main (1st argument) */
	addil	LT'.Lpmain, %r19
	ldw	RT'.Lpmain(%r1), %r26
	ldw	0(%r26),%r26
	/* void (*init) (void) (4th argument) */
	addil	LT'.Lp__libc_csu_init, %r19
	ldw	RT'.Lp__libc_csu_init(%r1), %r23
	ldw	0(%r23), %r23
	/* void (*fini) (void) (5th argument) */
	addil	LT'.Lp__libc_csu_fini, %r19
	ldw	RT'.Lp__libc_csu_fini(%r1), %r22
	ldw	0(%r22), %r22
#else
	/* load main (1st argument) */
	ldil	LR'.Lpmain, %r26
	ldw	RR'.Lpmain(%r26), %r26
	/* void (*init) (void) (4th argument) */
	ldil	LR'.Lp__libc_csu_init, %r23
	ldw	RR'.Lp__libc_csu_init(%r23), %r23
	/* void (*fini) (void) (5th argument) */
	ldil	LR'.Lp__libc_csu_fini, %r22
	ldw	RR'.Lp__libc_csu_fini(%r22), %r22
#endif
	/* Store 5th argument */
	stw	%r22, -52(%sp)
	/* void *stack_end (7th argument) */
	stw	%sp, -60(%sp)

	/* load global */
	ldil	L%$global$, %dp
	ldo	R%$global$(%dp), %dp

	bl	__libc_start_main,%r2
	nop
	/* die horribly if it returned (it shouldn't) */
	iitlbp %r0,(%sr0,%r0)
	nop

	.procend

/* 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
