OpenCores
URL https://opencores.org/ocsvn/openrisc_me/openrisc_me/trunk

Subversion Repositories openrisc_me

[/] [openrisc/] [trunk/] [gnu-src/] [newlib-1.18.0/] [libgloss/] [mips/] [crt0_cfe.S] - Rev 308

Go to most recent revision | Compare with Previous | Blame | View Log

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

Go to most recent revision | Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.