diff options
Diffstat (limited to 'libgloss/mips/crt0_cfe.S')
-rw-r--r-- | libgloss/mips/crt0_cfe.S | 263 |
1 files changed, 263 insertions, 0 deletions
diff --git a/libgloss/mips/crt0_cfe.S b/libgloss/mips/crt0_cfe.S new file mode 100644 index 000000000..9e920e2d5 --- /dev/null +++ b/libgloss/mips/crt0_cfe.S @@ -0,0 +1,263 @@ +/* + * 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 */ |