newlib/libgloss/rs6000/xil-crt0.S

193 lines
5.4 KiB
ArmAsm

/*-----------------------------------------------------------------------------
//
// Copyright (c) 2004, 2009 Xilinx, Inc. All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// 1. Redistributions source code must retain the above copyright notice,
// this list of conditions and the following disclaimer.
//
// 2. Redistributions in binary form must reproduce the above copyright
// notice, this list of conditions and the following disclaimer in the
// documentation and/or other materials provided with the distribution.
//
// 3. Neither the name of Xilinx nor the names of its contributors may be
// used to endorse or promote products derived from this software without
// specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS "AS
// IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
// PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY 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) ARISING IN ANY WAY OUT OF THE USE OF THIS
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
//---------------------------------------------------------------------------*/
.file "xil-crt0.S"
.section ".got2","aw"
.align 2
.LCTOC1 = . + 32768
.Lsbss_start = .-.LCTOC1
.long __sbss_start
.Lsbss_end = .-.LCTOC1
.long __sbss_end
.Lbss_start = .-.LCTOC1
.long __bss_start
.Lbss_end = .-.LCTOC1
.long __bss_end
.Lstack = .-.LCTOC1
.long __stack
.Lsda = .-.LCTOC1
.long _SDA_BASE_ /* address of the first small data area */
.Lsda2 = .-.LCTOC1
.long _SDA2_BASE_ /* address of the second small data area */
.text
.globl _start
_start:
bl __cpu_init /* Initialize the CPU first (BSP provides this) */
lis 5,.LCTOC1@h
ori 5,5,.LCTOC1@l
lwz 13,.Lsda(5) /* load r13 with _SDA_BASE_ address */
lwz 2,.Lsda2(5) /* load r2 with _SDA2_BASE_ address */
#ifndef SIMULATOR
/* clear sbss */
lwz 6,.Lsbss_start(5) /* calculate beginning of the SBSS */
lwz 7,.Lsbss_end(5) /* calculate end of the SBSS */
cmplw 1,6,7
bc 4,4,.Lenclsbss /* If no SBSS, no clearing required */
li 0,0 /* zero to clear memory */
subf 8,6,7 /* number of bytes to zero */
srwi. 9,8,2 /* number of words to zero */
beq .Lstbyteloopsbss /* Check if the number of bytes was less than 4 */
mtctr 9
addi 6,6,-4 /* adjust so we can use stwu */
.Lloopsbss:
stwu 0,4(6) /* zero sbss */
bdnz .Lloopsbss
.Lstbyteloopsbss:
andi. 9,8,3 /* Calculate how many trailing bytes we have */
beq 0,.Lenclsbss
mtctr 9
addi 6,6,-1 /* adjust, so we can use stbu */
.Lbyteloopsbss:
stbu 0,1(6)
bdnz .Lbyteloopsbss
.Lenclsbss:
.Lstclbss:
/* clear bss */
lwz 6,.Lbss_start(5) /* calculate beginning of the BSS */
lwz 7,.Lbss_end(5) /* calculate end of the BSS */
cmplw 1,6,7
bc 4,4,.Lenclbss /* If no BSS, no clearing required */
li 0,0 /* zero to clear memory */
subf 8,6,7 /* number of bytes to zero */
srwi. 9,8,2 /* number of words to zero */
beq .Lstbyteloopbss /* Check if the number of bytes was less than 4 */
mtctr 9
addi 6,6,-4 /* adjust so we can use stwu */
.Lloopbss:
stwu 0,4(6) /* zero bss */
bdnz .Lloopbss
.Lstbyteloopbss:
andi. 9,8,3 /* Calculate how many trailing bytes we have */
beq 0,.Lenclbss /* If zero, we are done */
mtctr 9
addi 6,6,-1 /* adjust, so we can use stbu */
.Lbyteloopbss:
stbu 0,1(6)
bdnz .Lbyteloopbss
.Lenclbss:
#endif /* SIMULATOR */
/* set stack pointer */
lwz 1,.Lstack(5) /* stack address */
/* set up initial stack frame */
addi 1,1,-8 /* location of back chain */
lis 0,0
stw 0,0(1) /* set end of back chain */
/* initialize base timer to zero */
mtspr 0x11c,0
mtspr 0x11d,0
#ifdef HAVE_XFPU
/* On the Xilinx PPC405 and PPC440, the MSR
must be explicitly set to mark the prescence
of an FPU */
mfpvr 0
rlwinm 0,0,0,12,15
cmpwi 7,0,8192
mfmsr 0
ori 0,0,8192
beq- 7,fpu_init_done
do_405:
oris 0,0,512
fpu_init_done:
mtmsr 0
#endif
#ifdef PROFILING
/* Setup profiling stuff */
bl _profile_init
#endif /* PROFILING */
/* Call __init */
bl __init
/* Let her rip */
bl main
/* Invoke the language cleanup functions */
bl __fini
#ifdef PROFILING
/* Cleanup profiling stuff */
bl _profile_clean
#endif /* PROFILING */
/* Call __init */
/* All done */
bl exit
/* Trap has been removed for both simulation and hardware */
.globl _exit
_exit:
b _exit
.Lstart:
.size _start,.Lstart-_start