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