! crt1.s for solaris 2.0.

!   Copyright (C) 1992 Free Software Foundation, Inc.
!   Written By David Vinayak Henkel-Wallace, June 1992
! This file is free software; you can redistribute it and/or modify it
! under the terms of the GNU General Public License as published by the
! Free Software Foundation; either version 2, or (at your option) any
! later version.
! In addition to the permissions in the GNU 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 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.)
! This file is distributed in the hope that it will be useful, but
! WITHOUT ANY WARRANTY; without even the implied warranty of
! General Public License for more details.
! You should have received a copy of the GNU General Public License
! along with this program; see the file COPYING.  If not, write to
! the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
!    As a special exception, if you link this library with files
!    compiled with GCC to produce an executable, this does not cause
!    the resulting executable to be covered by the GNU General Public License.
!    This exception does not however invalidate any other reasons why
!    the executable file might be covered by the GNU General Public License.

! This file takes control of the process from the kernel, as specified
! in section 3 of the SVr4 ABI.
! This file is the first thing linked into any executable.

	.section	".text"
	.proc	022
	.global	_start

	mov	0, %fp		! Mark bottom frame pointer
	ld	[%sp + 64], %l0	! argc
	add	%sp, 68, %l1	! argv

	! Leave some room for a call.  Sun leaves 32 octets (to sit on
	! a cache line?) so we do too.
	sub	%sp, 32, %sp

	! %g1 may contain a function to be registered w/atexit
	orcc	%g0, %g1, %g0
	be	.nope
	mov	%g1, %o0
	call	atexit
	! Now make sure constructors and destructors are handled.
	set	_fini, %o0
	call	atexit, 1
	call	_init, 0

	! We ignore the auxiliary vector; there's no defined way to
	! access those data anyway.  Instead, go straight to main:
	mov	%l0, %o0	! argc
	mov	%l1, %o1	! argv
	! Skip argc words past argv, to env:
	sll	%l0, 2, %o2
	add	%o2, 4, %o2
	add	%l1, %o2, %o2	! env
	set	_environ, %o3
	st	%o2, [%o3]	! *_environ
	call	main, 4
	call	exit, 0
	call	_exit, 0
	! We should never get here.

	.type	_start,#function
	.size	_start,.-_start