source: trunk/libs/newlib/src/libgloss/mips/crt0_cfe.S @ 546

Last change on this file since 546 was 444, checked in by satin@…, 6 years ago

add newlib,libalmos-mkh, restructure shared_syscalls.h and mini-libc

File size: 7.0 KB
Line 
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
1343:
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
1906:
191        la              t9, software_init_hook  # init the software if needed
192        beq             t9, zero, 7f
193        nop
194        jal             t9
195        nop
1967:
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:
2407:
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
2541:
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 */
Note: See TracBrowser for help on using the repository browser.