/* * 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 */