* mips/crt0_cfe.S: New file.
        * mips/cfe_mem.c: New file.
        * mips/cfe_prestart.S: Remove.
        * mips/cfe.ld: Adjust to use crt0_cfe.o as the startup file, and
        and use _start as the entry point.  Align BSS to 32-byte boundary.
        * mips/cfe.c: Reimplement to fit on top of a crt0_cfe.o file.
        * mips/cfe_api.h (__libcfe_stack_size, __libcfe_mem_limit)
        (__libcfe_meminit, __libcfe_stack_top): New prototypes.
        * mips/Makefile.in (CFEOBJS): Replace cfe_prestart.o with cfe_mem.o.
        (cfe.o, cfe_api.o, cfe_mem.o, crt0_cfe.o): New targets.
        * mips/configure.in: Build and install crt0_cfe.o when CFE support
        is built.
        * mips/configure: Regenerate.
		
	
		
			
				
	
	
		
			264 lines
		
	
	
		
			7.0 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			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 */
 |