1! crt1.s for sparc & sparcv9 (SunOS 5)
2
3!   Copyright (C) 1992 Free Software Foundation, Inc.
4!   Written By David Vinayak Henkel-Wallace, June 1992
5! 
6! This file is free software; you can redistribute it and/or modify it
7! under the terms of the GNU General Public License as published by the
8! Free Software Foundation; either version 2, or (at your option) any
9! later version.
10! 
11! In addition to the permissions in the GNU General Public License, the
12! Free Software Foundation gives you unlimited permission to link the
13! compiled version of this file with other programs, and to distribute
14! those programs without any restriction coming from the use of this
15! file.  (The General Public License restrictions do apply in other
16! respects; for example, they cover modification of the file, and
17! distribution when not linked into another program.)
18! 
19! This file is distributed in the hope that it will be useful, but
20! WITHOUT ANY WARRANTY; without even the implied warranty of
21! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
22! General Public License for more details.
23! 
24! You should have received a copy of the GNU General Public License
25! along with this program; see the file COPYING.  If not, write to
26! the Free Software Foundation, 51 Franklin Street, Fifth Floor,
27! Boston, MA 02110-1301, USA.
28! 
29!    As a special exception, if you link this library with files
30!    compiled with GCC to produce an executable, this does not cause
31!    the resulting executable to be covered by the GNU General Public License.
32!    This exception does not however invalidate any other reasons why
33!    the executable file might be covered by the GNU General Public License.
34! 
35
36! This file takes control of the process from the kernel, as specified
37! in section 3 of the SVr4 ABI.
38! This file is the first thing linked into any executable.
39
40#ifdef __sparcv9
41#define	CPTRSIZE	8
42#define	CPTRSHIFT	3
43#define	STACK_BIAS	2047
44#define	ldn		ldx
45#define	stn		stx
46#define setn(s, scratch, dst)	setx s, scratch, dst
47#else
48#define	CPTRSIZE	4
49#define	CPTRSHIFT	2
50#define	STACK_BIAS	0
51#define	ldn		ld
52#define	stn		st
53#define setn(s, scratch, dst)	set s, dst
54#endif
55
56	.section	".text"
57	.proc	022
58	.global	_start
59
60_start:
61	mov	0, %fp		! Mark bottom frame pointer
62	ldn	[%sp + (16 * CPTRSIZE) + STACK_BIAS], %l0	! argc
63	add	%sp, (17 * CPTRSIZE) + STACK_BIAS, %l1		! argv
64
65	! Leave some room for a call.  Sun leaves 32 octets (to sit on
66	! a cache line?) so we do too.
67#ifdef __sparcv9
68	sub	%sp, 48, %sp
69#else
70	sub	%sp, 32, %sp
71#endif
72
73	! %g1 may contain a function to be registered w/atexit
74	orcc	%g0, %g1, %g0
75#ifdef __sparcv9
76	be	%xcc, .nope
77#else
78	be	.nope
79#endif
80	mov	%g1, %o0
81	call	atexit
82	nop   
83.nope:
84	! Now make sure constructors and destructors are handled.
85	setn(_fini, %o1, %o0)
86	call	atexit, 1
87	nop
88	call	_init, 0
89	nop
90
91	! We ignore the auxiliary vector; there is no defined way to
92	! access those data anyway.  Instead, go straight to main:
93	mov	%l0, %o0	! argc
94	mov	%l1, %o1	! argv
95#ifdef GCRT1
96	setn(___Argv, %o4, %o3)
97	stn	%o1, [%o3]      ! *___Argv
98#endif
99	! Skip argc words past argv, to env:
100	sll	%l0, CPTRSHIFT, %o2
101	add	%o2, CPTRSIZE, %o2
102	add	%l1, %o2, %o2	! env
103	setn(_environ, %o4, %o3)
104	stn	%o2, [%o3]	! *_environ
105	call	main, 4
106	nop   
107	call	exit, 0
108	nop   
109	call	_exit, 0
110	nop   
111	! We should never get here.
112
113	.type	_start,#function
114	.size	_start,.-_start
115