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