]> git.sur5r.net Git - freertos/blob
a06617012e152e58c40b1b0656075fec19411bb1
[freertos] /
1 /******************************************************************************
2 *
3 * Copyright (C) 2009 - 2014 Xilinx, Inc.  All rights reserved.
4 *
5 * Permission is hereby granted, free of charge, to any person obtaining a copy
6 * of this software and associated documentation files (the "Software"), to deal
7 * in the Software without restriction, including without limitation the rights
8 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 * copies of the Software, and to permit persons to whom the Software is
10 * furnished to do so, subject to the following conditions:
11 *
12 * The above copyright notice and this permission notice shall be included in
13 * all copies or substantial portions of the Software.
14 *
15 * Use of the Software is limited solely to applications:
16 * (a) running on a Xilinx device, or
17 * (b) that interact with a Xilinx device through a bus or interconnect.
18 *
19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
22 * XILINX  BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
23 * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
24 * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
25 * SOFTWARE.
26 *
27 * Except as contained in this notice, the name of the Xilinx shall not be used
28 * in advertising or otherwise to promote the sale, use or other dealings in
29 * this Software without prior written authorization from Xilinx.
30 *
31 ******************************************************************************/
32 /*****************************************************************************/
33 /**
34 * @file xil-crt0.S
35 *
36 * <pre>
37 * MODIFICATION HISTORY:
38 *
39 * Ver   Who  Date     Changes
40 * ----- ---- -------- ---------------------------------------------------
41 * 1.00a ecm  10/20/09 Initial version
42 * 3.05a sdm  02/02/12 Added code for profiling
43 * 3.06a sgd  05/16/12 Added global constructors and cleanup code
44 *                     Uart initialization based on compiler flag
45 * 3.07a sgd  07/05/12 Updated with reset and start Global Timer
46 * 3.07a sgd      10/19/12 SMC NOR and SRAM initialization with build option
47 * </pre>
48 *
49 * @note
50 *
51 * None.
52 *
53 ******************************************************************************/
54
55 .extern XSmc_NorInit
56 .extern XSmc_SramInit
57
58         .file   "xil-crt0.S"
59         .section ".got2","aw"
60         .align  2
61
62         .text
63 .Lsbss_start:
64         .long   __sbss_start
65
66 .Lsbss_end:
67         .long   __sbss_end
68
69 .Lbss_start:
70         .long   __bss_start
71
72 .Lbss_end:      
73         .long   __bss_end
74
75 .Lstack:        
76         .long   __stack
77
78     
79         .globl  _start
80 _start:
81         bl      __cpu_init              /* Initialize the CPU first (BSP provides this) */
82
83         mov     r0, #0
84         
85         /* clear sbss */
86         ldr     r1,.Lsbss_start         /* calculate beginning of the SBSS */
87         ldr     r2,.Lsbss_end           /* calculate end of the SBSS */
88
89 .Lloop_sbss:
90         cmp     r1,r2
91         bge     .Lenclsbss              /* If no SBSS, no clearing required */
92         str     r0, [r1], #4
93         b       .Lloop_sbss
94
95 .Lenclsbss:  
96         /* clear bss */
97         ldr     r1,.Lbss_start          /* calculate beginning of the BSS */
98         ldr     r2,.Lbss_end            /* calculate end of the BSS */
99
100 .Lloop_bss:     
101         cmp     r1,r2
102         bge     .Lenclbss               /* If no BSS, no clearing required */
103         str     r0, [r1], #4
104         b       .Lloop_bss
105
106 .Lenclbss:
107
108         /* set stack pointer */
109         ldr     r13,.Lstack             /* stack address */
110
111     /* Reset and start Global Timer */
112         mov     r0, #0x0
113         mov     r1, #0x0
114     bl XTime_SetTime
115         
116 #ifdef PEEP
117         /* Initialize STDOUT */
118         bl      Init_Uart
119
120         /* Initialize the SMC interfaces for NOR */
121         bl      XSmc_NorInit
122
123     /* Initialize the SMC interfaces for SRAM */
124         bl      XSmc_SramInit
125 #endif
126
127 #ifdef PROFILING                        /* defined in Makefile */
128         /* Setup profiling stuff */
129         bl      _profile_init
130 #endif /* PROFILING */
131
132    /* run global constructors */ 
133    bl __libc_init_array 
134
135         /* make sure argc and argv are valid */
136         mov     r0, #0
137         mov     r1, #0
138
139         /* Let her rip */
140         bl      main
141
142    /* Cleanup global constructors */ 
143    bl __libc_fini_array 
144
145 #ifdef PROFILING
146         /* Cleanup profiling stuff */
147         bl      _profile_clean
148 #endif /* PROFILING */
149
150         /* All done */
151         bl      exit
152
153 .Lexit: /* should never get here */
154         b .Lexit
155
156 .Lstart:
157         .size   _start,.Lstart-_start