| [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 |  | 
|---|