newlib/libgloss/mips/crt0_cfe.S

264 lines
7.0 KiB
ArmAsm

/*
* crt0_cfe.S -- Runtime startup for MIPS targets running CFE.
*
* Copyright 2003
* Broadcom Corporation. All rights reserved.
*
* This software is furnished under license and may be used and copied only
* in accordance with the following terms and conditions. Subject to these
* conditions, you may download, copy, install, use, modify and distribute
* modified or unmodified copies of this software in source and/or binary
* form. No title or ownership is transferred hereby.
*
* 1) Any source code used, modified or distributed must reproduce and
* retain this copyright notice and list of conditions as they appear in
* the source file.
*
* 2) No right is granted to use any trade name, trademark, or logo of
* Broadcom Corporation. The "Broadcom Corporation" name may not be
* used to endorse or promote products derived from this software
* without the prior written permission of Broadcom Corporation.
*
* 3) THIS SOFTWARE IS PROVIDED "AS-IS" AND ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING BUT NOT LIMITED TO, ANY IMPLIED WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
* NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL BROADCOM BE LIABLE
* FOR ANY DAMAGES WHATSOEVER, AND IN PARTICULAR, BROADCOM SHALL NOT BE
* LIABLE FOR DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
* OR OTHERWISE), EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
/*
* Derived from crt0_cygmon.S:
*
* Copyright (c) 1995, 1996, 1997, 2000 Red Hat, Inc.
*
* The authors hereby grant permission to use, copy, modify, distribute,
* and license this software and its documentation for any purpose, provided
* that existing copyright notices are retained in all copies and that this
* notice is included verbatim in any distributions. No written agreement,
* license, or royalty fee is required for any of the authorized uses.
* Modifications to this software may be copyrighted by their authors
* and need not follow the licensing terms described here, provided that
* the new terms are clearly indicated on the first page of each file where
* they apply.
*/
/*
* This file does minimal runtime startup for code running under
* CFE firmware.
*
* It does minimal hardware initialization. In particular
* it sets Status:FR to match the requested floating point
* mode.
*
* It is meant to be linked with the other files provided by libcfe.a,
* and calls routines in those files.
*/
#ifdef __mips16
/* This file contains 32 bit assembly code. */
.set nomips16
#endif
#ifdef __mips_embedded_pic
# error -membedded-pic is not supported.
#endif
#include "regs.S"
/*
* Set up some room for a stack. We just grab a chunk of memory.
*/
#define STARTUP_STACK_SIZE (1 * 1024)
.comm _lstack, STARTUP_STACK_SIZE
.text
.align 4
/*
* Without the following nop, GDB thinks _start is a data variable.
* This is probably a bug in GDB in handling a symbol that is at the
* start of the .text section.
*/
nop
/*
* On entry, the following values have been passed in registers
* by the firmware:
*
* a0: firmware handle
* a1: zero (unused)
* a2: firmware callback entrypoint
* a3: CFE entrypoint seal (unused)
*
* They must be preserved until the CFE entrypoint and handle
* are passed to __libcfe_init().
*/
.globl _start
.ent _start
_start:
.set noreorder
/* Set the global data pointer, defined in the linker script. */
la gp, _gp
#ifndef __mips_soft_float
/* If compiled for hard float, set the FPU mode based on the
compilation flags. Note that this assumes that enough code
will run after the mtc0 to clear any hazards. */
mfc0 t0, C0_SR
or t0, t0, (SR_CU1 | SR_FR)
#if (__mips_fpr == 32)
xor t0, t0, SR_FR /* If 32-bit FP mode, clear FR. */
#endif
mtc0 t0, C0_SR
#endif
.end _start
/*
* zero out the bss section.
*/
.globl _zerobss
.ent _zerobss
_zerobss:
/* These variables are defined in the linker script. */
la v0, _fbss
la v1, _end
3:
sw zero, 0(v0)
bltu v0, v1, 3b
addiu v0, v0, 4 /* Delay slot. */
.end _zerobss
/*
* Setup a small stack so we can run some C code, and do
* the library initialization. (32 bytes are saved for
* the argument registers' stack slots.)
*/
.globl _stackinit
.ent _stackinit
_stackinit:
la t0, _lstack
addiu sp, t0, (STARTUP_STACK_SIZE - 32)
jal __libcfe_init
nop
/*
* Setup the stack pointer --
* __libcfe_init() returns the value to be used as the top of
* the program's stack.
*
* We subtract 32 bytes for the 4 argument registers, in case
* main() wants to write them back to the stack. The caller
* allocates stack space for parameters in the old MIPS ABIs.
* We must do this even though we aren't passing arguments,
* because main might be declared to have them.)
*
* We subtract 32 more bytes for the argv/envp setup for the
* call to main().
*/
subu v0, v0, 64
move sp, v0
.end _stackinit
/*
* initialize target specific stuff. Only execute these
* functions it they exist.
*/
.globl hardware_init_hook .text
.globl software_init_hook .text
.type _fini,@function
.type _init,@function
.globl atexit .text
.globl exit .text
.globl _crt0init
.ent _crt0init
_crt0init:
la t9, hardware_init_hook # init the hardware if needed
beq t9, zero, 6f
nop
jal t9
nop
6:
la t9, software_init_hook # init the software if needed
beq t9, zero, 7f
nop
jal t9
nop
7:
la a0, _fini
jal atexit
nop
#ifdef GCRT0
.globl _ftext
.globl _extext
la a0, _ftext
la a1, _etext
jal monstartup
nop
#endif
jal _init # run global constructors
nop
addiu a1,sp,32 # argv = sp + 32
addiu a2,sp,40 # envp = sp + 40
#if __mips64
sd zero,(a1) # argv[argc] = 0
sd zero,(a2) # envp[0] = 0
#else
sw zero,(a1)
sw zero,(a2)
#endif
jal main # call the program start function
move a0,zero # set argc to 0; delay slot.
# fall through to the "exit" routine
jal exit # call libc exit to run the G++
# destructors
move a0, v0 # pass through the exit code
.end _crt0init
/*
* _exit -- Exit from the application. This is provided in this file because
* program exit should shut down profiling (if GCRT0 is defined),
* and only this file is compiled with GCRT0 defined.
*/
.globl _exit
.ent _exit
_exit:
7:
move s0, a0 /* Save in case we loop. */
#ifdef GCRT0
jal _mcleanup
nop
#endif
la t0, hardware_exit_hook
beq t0,zero,1f
nop
jal t0
nop
1:
/* Call into the library to do the heavy lifting. */
jal __libcfe_exit
move a0, s0 /* Delay slot. */
b 7b /* Loop back just in case. */
nop
.end _exit
/* EOF crt0_cfe.S */