[444] | 1 | /*----------------------------------------------------------------------------- |
---|
| 2 | // |
---|
| 3 | // Copyright (c) 2004, 2009 Xilinx, Inc. All rights reserved. |
---|
| 4 | // |
---|
| 5 | // Redistribution and use in source and binary forms, with or without |
---|
| 6 | // modification, are permitted provided that the following conditions are |
---|
| 7 | // met: |
---|
| 8 | // |
---|
| 9 | // 1. Redistributions source code must retain the above copyright notice, |
---|
| 10 | // this list of conditions and the following disclaimer. |
---|
| 11 | // |
---|
| 12 | // 2. Redistributions in binary form must reproduce the above copyright |
---|
| 13 | // notice, this list of conditions and the following disclaimer in the |
---|
| 14 | // documentation and/or other materials provided with the distribution. |
---|
| 15 | // |
---|
| 16 | // 3. Neither the name of Xilinx nor the names of its contributors may be |
---|
| 17 | // used to endorse or promote products derived from this software without |
---|
| 18 | // specific prior written permission. |
---|
| 19 | // |
---|
| 20 | // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS "AS |
---|
| 21 | // IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED |
---|
| 22 | // TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A |
---|
| 23 | // PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
---|
| 24 | // HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
---|
| 25 | // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED |
---|
| 26 | // TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
---|
| 27 | // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
---|
| 28 | // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
---|
| 29 | // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
---|
| 30 | // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
---|
| 31 | // |
---|
| 32 | //---------------------------------------------------------------------------*/ |
---|
| 33 | |
---|
| 34 | .file "xil-crt0.S" |
---|
| 35 | .section ".got2","aw" |
---|
| 36 | .align 2 |
---|
| 37 | |
---|
| 38 | .LCTOC1 = . + 32768 |
---|
| 39 | |
---|
| 40 | .Lsbss_start = .-.LCTOC1 |
---|
| 41 | .long __sbss_start |
---|
| 42 | |
---|
| 43 | .Lsbss_end = .-.LCTOC1 |
---|
| 44 | .long __sbss_end |
---|
| 45 | |
---|
| 46 | .Lbss_start = .-.LCTOC1 |
---|
| 47 | .long __bss_start |
---|
| 48 | |
---|
| 49 | .Lbss_end = .-.LCTOC1 |
---|
| 50 | .long __bss_end |
---|
| 51 | |
---|
| 52 | .Lstack = .-.LCTOC1 |
---|
| 53 | .long __stack |
---|
| 54 | |
---|
| 55 | .Lsda = .-.LCTOC1 |
---|
| 56 | .long _SDA_BASE_ /* address of the first small data area */ |
---|
| 57 | |
---|
| 58 | .Lsda2 = .-.LCTOC1 |
---|
| 59 | .long _SDA2_BASE_ /* address of the second small data area */ |
---|
| 60 | |
---|
| 61 | |
---|
| 62 | .text |
---|
| 63 | .globl _start |
---|
| 64 | _start: |
---|
| 65 | bl __cpu_init /* Initialize the CPU first (BSP provides this) */ |
---|
| 66 | |
---|
| 67 | lis 5,.LCTOC1@h |
---|
| 68 | ori 5,5,.LCTOC1@l |
---|
| 69 | |
---|
| 70 | lwz 13,.Lsda(5) /* load r13 with _SDA_BASE_ address */ |
---|
| 71 | lwz 2,.Lsda2(5) /* load r2 with _SDA2_BASE_ address */ |
---|
| 72 | |
---|
| 73 | #ifndef SIMULATOR |
---|
| 74 | /* clear sbss */ |
---|
| 75 | lwz 6,.Lsbss_start(5) /* calculate beginning of the SBSS */ |
---|
| 76 | lwz 7,.Lsbss_end(5) /* calculate end of the SBSS */ |
---|
| 77 | |
---|
| 78 | cmplw 1,6,7 |
---|
| 79 | bc 4,4,.Lenclsbss /* If no SBSS, no clearing required */ |
---|
| 80 | |
---|
| 81 | li 0,0 /* zero to clear memory */ |
---|
| 82 | subf 8,6,7 /* number of bytes to zero */ |
---|
| 83 | srwi. 9,8,2 /* number of words to zero */ |
---|
| 84 | beq .Lstbyteloopsbss /* Check if the number of bytes was less than 4 */ |
---|
| 85 | mtctr 9 |
---|
| 86 | addi 6,6,-4 /* adjust so we can use stwu */ |
---|
| 87 | .Lloopsbss: |
---|
| 88 | stwu 0,4(6) /* zero sbss */ |
---|
| 89 | bdnz .Lloopsbss |
---|
| 90 | |
---|
| 91 | .Lstbyteloopsbss: |
---|
| 92 | andi. 9,8,3 /* Calculate how many trailing bytes we have */ |
---|
| 93 | beq 0,.Lenclsbss |
---|
| 94 | mtctr 9 |
---|
| 95 | addi 6,6,-1 /* adjust, so we can use stbu */ |
---|
| 96 | |
---|
| 97 | .Lbyteloopsbss: |
---|
| 98 | stbu 0,1(6) |
---|
| 99 | bdnz .Lbyteloopsbss |
---|
| 100 | |
---|
| 101 | .Lenclsbss: |
---|
| 102 | .Lstclbss: |
---|
| 103 | |
---|
| 104 | /* clear bss */ |
---|
| 105 | lwz 6,.Lbss_start(5) /* calculate beginning of the BSS */ |
---|
| 106 | lwz 7,.Lbss_end(5) /* calculate end of the BSS */ |
---|
| 107 | |
---|
| 108 | cmplw 1,6,7 |
---|
| 109 | bc 4,4,.Lenclbss /* If no BSS, no clearing required */ |
---|
| 110 | |
---|
| 111 | li 0,0 /* zero to clear memory */ |
---|
| 112 | subf 8,6,7 /* number of bytes to zero */ |
---|
| 113 | srwi. 9,8,2 /* number of words to zero */ |
---|
| 114 | beq .Lstbyteloopbss /* Check if the number of bytes was less than 4 */ |
---|
| 115 | mtctr 9 |
---|
| 116 | addi 6,6,-4 /* adjust so we can use stwu */ |
---|
| 117 | .Lloopbss: |
---|
| 118 | stwu 0,4(6) /* zero bss */ |
---|
| 119 | bdnz .Lloopbss |
---|
| 120 | |
---|
| 121 | .Lstbyteloopbss: |
---|
| 122 | andi. 9,8,3 /* Calculate how many trailing bytes we have */ |
---|
| 123 | beq 0,.Lenclbss /* If zero, we are done */ |
---|
| 124 | mtctr 9 |
---|
| 125 | addi 6,6,-1 /* adjust, so we can use stbu */ |
---|
| 126 | |
---|
| 127 | .Lbyteloopbss: |
---|
| 128 | stbu 0,1(6) |
---|
| 129 | bdnz .Lbyteloopbss |
---|
| 130 | |
---|
| 131 | .Lenclbss: |
---|
| 132 | #endif /* SIMULATOR */ |
---|
| 133 | |
---|
| 134 | /* set stack pointer */ |
---|
| 135 | lwz 1,.Lstack(5) /* stack address */ |
---|
| 136 | |
---|
| 137 | /* set up initial stack frame */ |
---|
| 138 | addi 1,1,-8 /* location of back chain */ |
---|
| 139 | lis 0,0 |
---|
| 140 | stw 0,0(1) /* set end of back chain */ |
---|
| 141 | |
---|
| 142 | /* initialize base timer to zero */ |
---|
| 143 | mtspr 0x11c,0 |
---|
| 144 | mtspr 0x11d,0 |
---|
| 145 | |
---|
| 146 | #ifdef HAVE_XFPU |
---|
| 147 | /* On the Xilinx PPC405 and PPC440, the MSR |
---|
| 148 | must be explicitly set to mark the prescence |
---|
| 149 | of an FPU */ |
---|
| 150 | mfpvr 0 |
---|
| 151 | rlwinm 0,0,0,12,15 |
---|
| 152 | cmpwi 7,0,8192 |
---|
| 153 | mfmsr 0 |
---|
| 154 | ori 0,0,8192 |
---|
| 155 | beq- 7,fpu_init_done |
---|
| 156 | do_405: |
---|
| 157 | oris 0,0,512 |
---|
| 158 | fpu_init_done: |
---|
| 159 | mtmsr 0 |
---|
| 160 | #endif |
---|
| 161 | |
---|
| 162 | #ifdef PROFILING |
---|
| 163 | /* Setup profiling stuff */ |
---|
| 164 | bl _profile_init |
---|
| 165 | #endif /* PROFILING */ |
---|
| 166 | |
---|
| 167 | /* Call __init */ |
---|
| 168 | bl __init |
---|
| 169 | |
---|
| 170 | /* Let her rip */ |
---|
| 171 | bl main |
---|
| 172 | |
---|
| 173 | /* Invoke the language cleanup functions */ |
---|
| 174 | bl __fini |
---|
| 175 | |
---|
| 176 | #ifdef PROFILING |
---|
| 177 | /* Cleanup profiling stuff */ |
---|
| 178 | bl _profile_clean |
---|
| 179 | #endif /* PROFILING */ |
---|
| 180 | |
---|
| 181 | /* Call __init */ |
---|
| 182 | /* All done */ |
---|
| 183 | bl exit |
---|
| 184 | |
---|
| 185 | /* Trap has been removed for both simulation and hardware */ |
---|
| 186 | .globl _exit |
---|
| 187 | _exit: |
---|
| 188 | b _exit |
---|
| 189 | |
---|
| 190 | .Lstart: |
---|
| 191 | .size _start,.Lstart-_start |
---|
| 192 | |
---|