1 | /* |
---|
2 | * crt0_cfe.S -- Runtime startup for MIPS targets running CFE. |
---|
3 | * |
---|
4 | * Copyright 2003 |
---|
5 | * Broadcom Corporation. All rights reserved. |
---|
6 | * |
---|
7 | * This software is furnished under license and may be used and copied only |
---|
8 | * in accordance with the following terms and conditions. Subject to these |
---|
9 | * conditions, you may download, copy, install, use, modify and distribute |
---|
10 | * modified or unmodified copies of this software in source and/or binary |
---|
11 | * form. No title or ownership is transferred hereby. |
---|
12 | * |
---|
13 | * 1) Any source code used, modified or distributed must reproduce and |
---|
14 | * retain this copyright notice and list of conditions as they appear in |
---|
15 | * the source file. |
---|
16 | * |
---|
17 | * 2) No right is granted to use any trade name, trademark, or logo of |
---|
18 | * Broadcom Corporation. The "Broadcom Corporation" name may not be |
---|
19 | * used to endorse or promote products derived from this software |
---|
20 | * without the prior written permission of Broadcom Corporation. |
---|
21 | * |
---|
22 | * 3) THIS SOFTWARE IS PROVIDED "AS-IS" AND ANY EXPRESS OR IMPLIED |
---|
23 | * WARRANTIES, INCLUDING BUT NOT LIMITED TO, ANY IMPLIED WARRANTIES OF |
---|
24 | * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR |
---|
25 | * NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL BROADCOM BE LIABLE |
---|
26 | * FOR ANY DAMAGES WHATSOEVER, AND IN PARTICULAR, BROADCOM SHALL NOT BE |
---|
27 | * LIABLE FOR DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
---|
28 | * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
---|
29 | * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR |
---|
30 | * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, |
---|
31 | * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE |
---|
32 | * OR OTHERWISE), EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
---|
33 | */ |
---|
34 | |
---|
35 | /* |
---|
36 | * Derived from crt0_cygmon.S: |
---|
37 | * |
---|
38 | * Copyright (c) 1995, 1996, 1997, 2000 Red Hat, Inc. |
---|
39 | * |
---|
40 | * The authors hereby grant permission to use, copy, modify, distribute, |
---|
41 | * and license this software and its documentation for any purpose, provided |
---|
42 | * that existing copyright notices are retained in all copies and that this |
---|
43 | * notice is included verbatim in any distributions. No written agreement, |
---|
44 | * license, or royalty fee is required for any of the authorized uses. |
---|
45 | * Modifications to this software may be copyrighted by their authors |
---|
46 | * and need not follow the licensing terms described here, provided that |
---|
47 | * the new terms are clearly indicated on the first page of each file where |
---|
48 | * they apply. |
---|
49 | */ |
---|
50 | |
---|
51 | /* |
---|
52 | * This file does minimal runtime startup for code running under |
---|
53 | * CFE firmware. |
---|
54 | * |
---|
55 | * It does minimal hardware initialization. In particular |
---|
56 | * it sets Status:FR to match the requested floating point |
---|
57 | * mode. |
---|
58 | * |
---|
59 | * It is meant to be linked with the other files provided by libcfe.a, |
---|
60 | * and calls routines in those files. |
---|
61 | */ |
---|
62 | |
---|
63 | #ifdef __mips16 |
---|
64 | /* This file contains 32 bit assembly code. */ |
---|
65 | .set nomips16 |
---|
66 | #endif |
---|
67 | #ifdef __mips_embedded_pic |
---|
68 | # error -membedded-pic is not supported. |
---|
69 | #endif |
---|
70 | |
---|
71 | #include "regs.S" |
---|
72 | |
---|
73 | /* |
---|
74 | * Set up some room for a stack. We just grab a chunk of memory. |
---|
75 | */ |
---|
76 | #define STARTUP_STACK_SIZE (1 * 1024) |
---|
77 | |
---|
78 | .comm _lstack, STARTUP_STACK_SIZE |
---|
79 | |
---|
80 | .text |
---|
81 | .align 4 |
---|
82 | |
---|
83 | /* |
---|
84 | * Without the following nop, GDB thinks _start is a data variable. |
---|
85 | * This is probably a bug in GDB in handling a symbol that is at the |
---|
86 | * start of the .text section. |
---|
87 | */ |
---|
88 | nop |
---|
89 | |
---|
90 | |
---|
91 | /* |
---|
92 | * On entry, the following values have been passed in registers |
---|
93 | * by the firmware: |
---|
94 | * |
---|
95 | * a0: firmware handle |
---|
96 | * a1: zero (unused) |
---|
97 | * a2: firmware callback entrypoint |
---|
98 | * a3: CFE entrypoint seal (unused) |
---|
99 | * |
---|
100 | * They must be preserved until the CFE entrypoint and handle |
---|
101 | * are passed to __libcfe_init(). |
---|
102 | */ |
---|
103 | |
---|
104 | .globl _start |
---|
105 | .ent _start |
---|
106 | _start: |
---|
107 | .set noreorder |
---|
108 | /* Set the global data pointer, defined in the linker script. */ |
---|
109 | la gp, _gp |
---|
110 | |
---|
111 | #ifndef __mips_soft_float |
---|
112 | /* If compiled for hard float, set the FPU mode based on the |
---|
113 | compilation flags. Note that this assumes that enough code |
---|
114 | will run after the mtc0 to clear any hazards. */ |
---|
115 | mfc0 t0, C0_SR |
---|
116 | or t0, t0, (SR_CU1 | SR_FR) |
---|
117 | #if (__mips_fpr == 32) |
---|
118 | xor t0, t0, SR_FR /* If 32-bit FP mode, clear FR. */ |
---|
119 | #endif |
---|
120 | mtc0 t0, C0_SR |
---|
121 | #endif |
---|
122 | .end _start |
---|
123 | |
---|
124 | /* |
---|
125 | * zero out the bss section. |
---|
126 | */ |
---|
127 | .globl _zerobss |
---|
128 | .ent _zerobss |
---|
129 | _zerobss: |
---|
130 | /* These variables are defined in the linker script. */ |
---|
131 | la v0, _fbss |
---|
132 | la v1, _end |
---|
133 | |
---|
134 | 3: |
---|
135 | sw zero, 0(v0) |
---|
136 | bltu v0, v1, 3b |
---|
137 | addiu v0, v0, 4 /* Delay slot. */ |
---|
138 | .end _zerobss |
---|
139 | |
---|
140 | /* |
---|
141 | * Setup a small stack so we can run some C code, and do |
---|
142 | * the library initialization. (32 bytes are saved for |
---|
143 | * the argument registers' stack slots.) |
---|
144 | */ |
---|
145 | .globl _stackinit |
---|
146 | .ent _stackinit |
---|
147 | _stackinit: |
---|
148 | la t0, _lstack |
---|
149 | addiu sp, t0, (STARTUP_STACK_SIZE - 32) |
---|
150 | jal __libcfe_init |
---|
151 | nop |
---|
152 | |
---|
153 | /* |
---|
154 | * Setup the stack pointer -- |
---|
155 | * __libcfe_init() returns the value to be used as the top of |
---|
156 | * the program's stack. |
---|
157 | * |
---|
158 | * We subtract 32 bytes for the 4 argument registers, in case |
---|
159 | * main() wants to write them back to the stack. The caller |
---|
160 | * allocates stack space for parameters in the old MIPS ABIs. |
---|
161 | * We must do this even though we aren't passing arguments, |
---|
162 | * because main might be declared to have them.) |
---|
163 | * |
---|
164 | * We subtract 32 more bytes for the argv/envp setup for the |
---|
165 | * call to main(). |
---|
166 | */ |
---|
167 | subu v0, v0, 64 |
---|
168 | move sp, v0 |
---|
169 | |
---|
170 | .end _stackinit |
---|
171 | |
---|
172 | /* |
---|
173 | * initialize target specific stuff. Only execute these |
---|
174 | * functions it they exist. |
---|
175 | */ |
---|
176 | .globl hardware_init_hook .text |
---|
177 | .globl software_init_hook .text |
---|
178 | .type _fini,@function |
---|
179 | .type _init,@function |
---|
180 | .globl atexit .text |
---|
181 | .globl exit .text |
---|
182 | .globl _crt0init |
---|
183 | .ent _crt0init |
---|
184 | _crt0init: |
---|
185 | la t9, hardware_init_hook # init the hardware if needed |
---|
186 | beq t9, zero, 6f |
---|
187 | nop |
---|
188 | jal t9 |
---|
189 | nop |
---|
190 | 6: |
---|
191 | la t9, software_init_hook # init the software if needed |
---|
192 | beq t9, zero, 7f |
---|
193 | nop |
---|
194 | jal t9 |
---|
195 | nop |
---|
196 | 7: |
---|
197 | la a0, _fini |
---|
198 | jal atexit |
---|
199 | nop |
---|
200 | |
---|
201 | #ifdef GCRT0 |
---|
202 | .globl _ftext |
---|
203 | .globl _extext |
---|
204 | la a0, _ftext |
---|
205 | la a1, _etext |
---|
206 | jal monstartup |
---|
207 | nop |
---|
208 | #endif |
---|
209 | |
---|
210 | jal _init # run global constructors |
---|
211 | nop |
---|
212 | |
---|
213 | addiu a1,sp,32 # argv = sp + 32 |
---|
214 | addiu a2,sp,40 # envp = sp + 40 |
---|
215 | #if __mips64 |
---|
216 | sd zero,(a1) # argv[argc] = 0 |
---|
217 | sd zero,(a2) # envp[0] = 0 |
---|
218 | #else |
---|
219 | sw zero,(a1) |
---|
220 | sw zero,(a2) |
---|
221 | #endif |
---|
222 | |
---|
223 | jal main # call the program start function |
---|
224 | move a0,zero # set argc to 0; delay slot. |
---|
225 | |
---|
226 | # fall through to the "exit" routine |
---|
227 | jal exit # call libc exit to run the G++ |
---|
228 | # destructors |
---|
229 | move a0, v0 # pass through the exit code |
---|
230 | .end _crt0init |
---|
231 | |
---|
232 | /* |
---|
233 | * _exit -- Exit from the application. This is provided in this file because |
---|
234 | * program exit should shut down profiling (if GCRT0 is defined), |
---|
235 | * and only this file is compiled with GCRT0 defined. |
---|
236 | */ |
---|
237 | .globl _exit |
---|
238 | .ent _exit |
---|
239 | _exit: |
---|
240 | 7: |
---|
241 | move s0, a0 /* Save in case we loop. */ |
---|
242 | |
---|
243 | #ifdef GCRT0 |
---|
244 | jal _mcleanup |
---|
245 | nop |
---|
246 | #endif |
---|
247 | |
---|
248 | la t0, hardware_exit_hook |
---|
249 | beq t0,zero,1f |
---|
250 | nop |
---|
251 | jal t0 |
---|
252 | nop |
---|
253 | |
---|
254 | 1: |
---|
255 | /* Call into the library to do the heavy lifting. */ |
---|
256 | jal __libcfe_exit |
---|
257 | move a0, s0 /* Delay slot. */ |
---|
258 | |
---|
259 | b 7b /* Loop back just in case. */ |
---|
260 | nop |
---|
261 | .end _exit |
---|
262 | |
---|
263 | /* EOF crt0_cfe.S */ |
---|