0
|
1 ! crt1.s for sparc & sparcv9 (SunOS 5)
|
|
2
|
|
3 ! Copyright (C) 1992, 2009 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 3, or (at your option) any
|
|
9 ! later version.
|
|
10 !
|
|
11 ! This file is distributed in the hope that it will be useful, but
|
|
12 ! WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
13 ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
14 ! General Public License for more details.
|
|
15 !
|
|
16 ! Under Section 7 of GPL version 3, you are granted additional
|
|
17 ! permissions described in the GCC Runtime Library Exception, version
|
|
18 ! 3.1, as published by the Free Software Foundation.
|
|
19 !
|
|
20 ! You should have received a copy of the GNU General Public License and
|
|
21 ! a copy of the GCC Runtime Library Exception along with this program;
|
|
22 ! see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
|
|
23 ! <http://www.gnu.org/licenses/>.
|
|
24
|
|
25 ! This file takes control of the process from the kernel, as specified
|
|
26 ! in section 3 of the SVr4 ABI.
|
|
27 ! This file is the first thing linked into any executable.
|
|
28
|
|
29 #ifdef __sparcv9
|
|
30 #define CPTRSIZE 8
|
|
31 #define CPTRSHIFT 3
|
|
32 #define STACK_BIAS 2047
|
|
33 #define ldn ldx
|
|
34 #define stn stx
|
|
35 #define setn(s, scratch, dst) setx s, scratch, dst
|
|
36 #else
|
|
37 #define CPTRSIZE 4
|
|
38 #define CPTRSHIFT 2
|
|
39 #define STACK_BIAS 0
|
|
40 #define ldn ld
|
|
41 #define stn st
|
|
42 #define setn(s, scratch, dst) set s, dst
|
|
43 #endif
|
|
44
|
|
45 .section ".text"
|
|
46 .proc 022
|
|
47 .global _start
|
|
48
|
|
49 _start:
|
|
50 mov 0, %fp ! Mark bottom frame pointer
|
|
51 ldn [%sp + (16 * CPTRSIZE) + STACK_BIAS], %l0 ! argc
|
|
52 add %sp, (17 * CPTRSIZE) + STACK_BIAS, %l1 ! argv
|
|
53
|
|
54 ! Leave some room for a call. Sun leaves 32 octets (to sit on
|
|
55 ! a cache line?) so we do too.
|
|
56 #ifdef __sparcv9
|
|
57 sub %sp, 48, %sp
|
|
58 #else
|
|
59 sub %sp, 32, %sp
|
|
60 #endif
|
|
61
|
|
62 ! %g1 may contain a function to be registered w/atexit
|
|
63 orcc %g0, %g1, %g0
|
|
64 #ifdef __sparcv9
|
|
65 be %xcc, .nope
|
|
66 #else
|
|
67 be .nope
|
|
68 #endif
|
|
69 mov %g1, %o0
|
|
70 call atexit
|
|
71 nop
|
|
72 .nope:
|
|
73 ! Now make sure constructors and destructors are handled.
|
|
74 setn(_fini, %o1, %o0)
|
|
75 call atexit, 1
|
|
76 nop
|
|
77 call _init, 0
|
|
78 nop
|
|
79
|
|
80 ! We ignore the auxiliary vector; there is no defined way to
|
|
81 ! access those data anyway. Instead, go straight to main:
|
|
82 mov %l0, %o0 ! argc
|
|
83 mov %l1, %o1 ! argv
|
|
84 #ifdef GCRT1
|
|
85 setn(___Argv, %o4, %o3)
|
|
86 stn %o1, [%o3] ! *___Argv
|
|
87 #endif
|
|
88 ! Skip argc words past argv, to env:
|
|
89 sll %l0, CPTRSHIFT, %o2
|
|
90 add %o2, CPTRSIZE, %o2
|
|
91 add %l1, %o2, %o2 ! env
|
|
92 setn(_environ, %o4, %o3)
|
|
93 stn %o2, [%o3] ! *_environ
|
|
94 call main, 4
|
|
95 nop
|
|
96 call exit, 0
|
|
97 nop
|
|
98 call _exit, 0
|
|
99 nop
|
|
100 ! We should never get here.
|
|
101
|
|
102 .type _start,#function
|
|
103 .size _start,.-_start
|