LE support: remove mixed endianness support, this causes libraries to be built with...
[zpugcc.git] / toolchain / gcc / libgloss / mips / crt0_cfe.S
blob9e920e2d5ad5eded5fcce369a86a19fd8061ebb9
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  */
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  */
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  */
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
71 #include "regs.S"
74  * Set up some room for a stack. We just grab a chunk of memory.
75  */
76 #define STARTUP_STACK_SIZE      (1 * 1024)              
78         .comm   _lstack, STARTUP_STACK_SIZE
80         .text
81         .align  4
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
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      */
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
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
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
135         sw              zero, 0(v0)
136         bltu    v0, v1, 3b
137         addiu   v0, v0, 4               /* Delay slot.  */
138         .end    _zerobss
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
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
170         .end    _stackinit
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
191         la              t9, software_init_hook  # init the software if needed
192         beq             t9, zero, 7f
193         nop
194         jal             t9
195         nop
197         la              a0, _fini
198         jal             atexit
199         nop
201 #ifdef GCRT0
202         .globl  _ftext
203         .globl  _extext
204         la              a0, _ftext
205         la              a1, _etext
206         jal             monstartup
207         nop
208 #endif
210         jal     _init                   # run global constructors
211         nop
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
223         jal     main                    # call the program start function
224         move    a0,zero                 # set argc to 0; delay slot.
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         
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:
241         move    s0, a0                  /* Save in case we loop.  */
243 #ifdef GCRT0
244         jal     _mcleanup
245         nop
246 #endif
248         la      t0, hardware_exit_hook
249         beq     t0,zero,1f
250         nop
251         jal     t0
252         nop
255         /* Call into the library to do the heavy lifting.  */
256         jal     __libcfe_exit
257         move    a0, s0                  /* Delay slot.  */
259         b       7b                      /* Loop back just in case.  */
260         nop
261         .end    _exit
263 /* EOF crt0_cfe.S */