]> git.sur5r.net Git - freertos/blob - FreeRTOS/Demo/lwIP_Demo_Rowley_ARM7/crt0.s
Add FreeRTOS-Plus directory.
[freertos] / FreeRTOS / Demo / lwIP_Demo_Rowley_ARM7 / crt0.s
1 /*****************************************************************************\r
2  * Copyright (c) 2001, 2002 Rowley Associates Limited.                       *\r
3  *                                                                           *\r
4  * This file may be distributed under the terms of the License Agreement     *\r
5  * provided with this software.                                              *\r
6  *                                                                           *\r
7  * THIS FILE IS PROVIDED AS IS WITH NO WARRANTY OF ANY KIND, INCLUDING THE   *\r
8  * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. *\r
9  *****************************************************************************/\r
10   .section .init, "ax"\r
11   .code 32\r
12   .align 0\r
13                 \r
14   .weak _start\r
15   .global __start\r
16   .global __gccmain\r
17   .extern main\r
18   .extern exit\r
19 \r
20 /*****************************************************************************\r
21  * Function    : _start                                                      *\r
22  * Description : Main entry point and startup code for C system.             *\r
23  *****************************************************************************/\r
24 _start:\r
25 __start:                        \r
26   mrs r0, cpsr\r
27   bic r0, r0, #0x1F\r
28 \r
29   /* Setup stacks */ \r
30   orr r1, r0, #0x1B /* Undefined mode */\r
31   msr cpsr_cxsf, r1\r
32   ldr sp, =__stack_und_end__\r
33   \r
34   orr r1, r0, #0x17 /* Abort mode */\r
35   msr cpsr_cxsf, r1\r
36   ldr sp, =__stack_abt_end__\r
37 \r
38   orr r1, r0, #0x12 /* IRQ mode */\r
39   msr cpsr_cxsf, r1\r
40   ldr sp, =__stack_irq_end__\r
41 \r
42   orr r1, r0, #0x11 /* FIQ mode */\r
43   msr cpsr_cxsf, r1\r
44   ldr sp, =__stack_fiq_end__\r
45 \r
46   orr r1, r0, #0x13 /* Supervisor mode */\r
47   msr cpsr_cxsf, r1\r
48   ldr sp, =__stack_svc_end__\r
49 #ifdef SUPERVISOR_START\r
50   /* Start application in supervisor mode */\r
51   ldr r1, =__stack_end__ /* Setup user/system mode stack */ \r
52   mov r2, sp\r
53   stmfd r2!, {r1}\r
54   ldmfd r2, {sp}^\r
55 #else\r
56   /* Start application in system mode */\r
57   orr r1, r0, #0x1F /* System mode */\r
58   msr cpsr_cxsf, r1\r
59   ldr sp, =__stack_end__\r
60 #endif\r
61   \r
62   /* Copy from initialised data section to data section (if necessary). */\r
63   ldr r0, =__data_load_start__\r
64   ldr r1, =__data_start__\r
65   cmp r0, r1\r
66   beq copy_data_end\r
67   \r
68   ldr r2, =__data_end__\r
69   subs r2, r2, r1\r
70   beq copy_data_end\r
71   \r
72 copy_data_loop:\r
73   ldrb r3, [r0], #+1\r
74   strb r3, [r1], #+1\r
75   subs r2, r2, #1\r
76   bne copy_data_loop\r
77 copy_data_end:  \r
78 \r
79   /* Copy from initialised text section to text section (if necessary). */\r
80   ldr r0, =__text_load_start__\r
81   ldr r1, =__text_start__\r
82   cmp r0, r1\r
83   beq copy_text_end\r
84   \r
85   ldr r2, =__text_end__\r
86   subs r2, r2, r1\r
87   beq copy_text_end\r
88   \r
89 copy_text_loop:\r
90   ldrb r3, [r0], #+1\r
91   strb r3, [r1], #+1\r
92   subs r2, r2, #1\r
93   bne copy_text_loop\r
94 copy_text_end:  \r
95 \r
96   /* Copy from initialised fast_text section to fast_text section (if necessary). */\r
97   ldr r0, =__fast_load_start__\r
98   ldr r1, =__fast_start__\r
99   cmp r0, r1\r
100   beq copy_fast_end\r
101   \r
102   ldr r2, =__fast_end__\r
103   subs r2, r2, r1\r
104   beq copy_fast_end\r
105   \r
106 copy_fast_loop:\r
107   ldrb r3, [r0], #+1\r
108   strb r3, [r1], #+1\r
109   subs r2, r2, #1\r
110   bne copy_fast_loop\r
111 copy_fast_end:  \r
112 \r
113   /* Zero the bss. */\r
114   ldr r0, =__bss_start__\r
115   ldr r1, =__bss_end__\r
116   mov r2, #0\r
117 zero_bss_loop:\r
118   cmp r0, r1\r
119   beq zero_bss_end\r
120   strb r2, [r0], #+1\r
121   b zero_bss_loop\r
122 zero_bss_end:    \r
123 \r
124 #ifdef CHECK  \r
125   /* Check data */\r
126   ldr r0, =__data_load_start__\r
127   ldr r1, =__data_start__\r
128   cmp r0, r1\r
129   beq check_data_end\r
130   ldr r2, =__data_end__\r
131   subs r2, r2, r1\r
132   beq check_data_end\r
133   \r
134 check_data_loop:\r
135   ldrb r3, [r0], #+1\r
136   ldrb r4, [r1], #+1\r
137   cmp r3, r4\r
138   bne data_error_loop\r
139   subs r2, r2, #1\r
140   bne check_data_loop\r
141 check_data_end:  \r
142 \r
143   /* Check text */\r
144   ldr r0, =__text_load_start__\r
145   ldr r1, =__text_start__\r
146   cmp r0, r1\r
147   beq check_text_end\r
148   ldr r2, =__text_end__\r
149   subs r2, r2, r1\r
150   beq check_text_end\r
151   \r
152 check_text_loop:\r
153   ldrb r3, [r0], #+1\r
154   ldrb r4, [r1], #+1\r
155   cmp r3, r4\r
156   bne text_error_loop\r
157   subs r2, r2, #1\r
158   bne check_text_loop\r
159 check_text_end:  \r
160 \r
161   /* Check fast */\r
162   ldr r0, =__fast_load_start__\r
163   ldr r1, =__fast_start__\r
164   cmp r0, r1\r
165   beq check_fast_end\r
166   ldr r2, =__fast_end__\r
167   subs r2, r2, r1\r
168   beq check_fast_end\r
169   \r
170 check_fast_loop:\r
171   ldrb r3, [r0], #+1\r
172   ldrb r4, [r1], #+1\r
173   cmp r3, r4\r
174   bne fast_error_loop\r
175   subs r2, r2, #1\r
176   bne check_fast_loop\r
177 check_fast_end:  \r
178 \r
179   /* Check bss */\r
180   ldr r0, =__bss_start__\r
181   ldr r1, =__bss_end__\r
182   mov r2, #0\r
183 check_bss_loop:\r
184   cmp r0, r1\r
185   beq check_bss_end\r
186   ldrb r2, [r0], #+1\r
187   cmp r2, #0\r
188   bne bss_error_loop  \r
189   b check_bss_loop\r
190 check_bss_end:    \r
191 #endif\r
192 \r
193   /* Initialise the heap */\r
194   ldr r0, = __heap_start__\r
195   ldr r1, = __heap_end__\r
196   sub r1, r1, r0     /* r1 = r1-r0 */ \r
197   mov r2, #0\r
198   str r2, [r0], #+4 /* *r0++ = 0 */\r
199   str r1, [r0]      /* *r0 = __heap_end__ - __heap_start__ */\r
200 \r
201   /* Call constructors */\r
202   ldr r0, =__ctors_start__\r
203   ldr r1, =__ctors_end__\r
204 ctor_loop:\r
205   cmp r0, r1\r
206   beq ctor_end\r
207   ldr r2, [r0], #+4\r
208   stmfd sp!, {r0-r1}\r
209   mov lr, pc\r
210   mov pc, r2\r
211   ldmfd sp!, {r0-r1}\r
212   b ctor_loop\r
213 ctor_end:\r
214 \r
215   /* Setup initial call frame */\r
216   mov lr, #4\r
217   mov r12, sp\r
218   stmfd sp!, {r11-r12, lr-pc}\r
219   sub r11, r12, #0x00000004\r
220 \r
221 start:\r
222   /* Jump to main entry point */\r
223   mov r0, #0\r
224   mov r1, #0\r
225   ldr r2, =main\r
226   mov lr, pc\r
227 #ifdef __ARM_ARCH_3__\r
228   mov pc, r2\r
229 #else    \r
230   bx r2\r
231 #endif\r
232 \r
233   /* Call destructors */\r
234   ldr r0, =__dtors_start__\r
235   ldr r1, =__dtors_end__\r
236 dtor_loop:\r
237   cmp r0, r1\r
238   beq dtor_end\r
239   ldr r2, [r0], #+4\r
240   stmfd sp!, {r0-r1}\r
241   mov lr, pc\r
242   mov pc, r2\r
243   ldmfd sp!, {r0-r1}\r
244   b dtor_loop\r
245 dtor_end:\r
246 \r
247   /* Return from main, loop forever. */\r
248 exit_loop:\r
249   b exit_loop\r
250 \r
251 #ifdef CHECK\r
252 data_error_loop:\r
253   b data_error_loop\r
254 \r
255 text_error_loop:\r
256   b text_error_loop\r
257   \r
258 fast_error_loop:\r
259   b fast_error_loop\r
260   \r
261 bss_error_loop:\r
262   b bss_error_loop  \r
263 #endif\r
264   \r
265                   \r