1 /*****************************************************************************
\r
2 * Copyright (c) 2001, 2002 Rowley Associates Limited. *
\r
4 * This file may be distributed under the terms of the License Agreement *
\r
5 * provided with this software. *
\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
20 /*****************************************************************************
\r
21 * Function : _start *
\r
22 * Description : Main entry point and startup code for C system. *
\r
23 *****************************************************************************/
\r
30 orr r1, r0, #0x1B /* Undefined mode */
\r
32 ldr sp, =__stack_und_end__
\r
34 orr r1, r0, #0x17 /* Abort mode */
\r
36 ldr sp, =__stack_abt_end__
\r
38 orr r1, r0, #0x12 /* IRQ mode */
\r
40 ldr sp, =__stack_irq_end__
\r
42 orr r1, r0, #0x11 /* FIQ mode */
\r
44 ldr sp, =__stack_fiq_end__
\r
46 orr r1, r0, #0x13 /* Supervisor mode */
\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
56 /* Start application in system mode */
\r
57 orr r1, r0, #0x1F /* System mode */
\r
59 ldr sp, =__stack_end__
\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
68 ldr r2, =__data_end__
\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
85 ldr r2, =__text_end__
\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
102 ldr r2, =__fast_end__
\r
113 /* Zero the bss. */
\r
114 ldr r0, =__bss_start__
\r
115 ldr r1, =__bss_end__
\r
126 ldr r0, =__data_load_start__
\r
127 ldr r1, =__data_start__
\r
130 ldr r2, =__data_end__
\r
138 bne data_error_loop
\r
140 bne check_data_loop
\r
144 ldr r0, =__text_load_start__
\r
145 ldr r1, =__text_start__
\r
148 ldr r2, =__text_end__
\r
156 bne text_error_loop
\r
158 bne check_text_loop
\r
162 ldr r0, =__fast_load_start__
\r
163 ldr r1, =__fast_start__
\r
166 ldr r2, =__fast_end__
\r
174 bne fast_error_loop
\r
176 bne check_fast_loop
\r
180 ldr r0, =__bss_start__
\r
181 ldr r1, =__bss_end__
\r
188 bne bss_error_loop
\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
198 str r2, [r0], #+4 /* *r0++ = 0 */
\r
199 str r1, [r0] /* *r0 = __heap_end__ - __heap_start__ */
\r
201 /* Call constructors */
\r
202 ldr r0, =__ctors_start__
\r
203 ldr r1, =__ctors_end__
\r
215 /* Setup initial call frame */
\r
218 stmfd sp!, {r11-r12, lr-pc}
\r
219 sub r11, r12, #0x00000004
\r
222 /* Jump to main entry point */
\r
227 #ifdef __ARM_ARCH_3__
\r
233 /* Call destructors */
\r
234 ldr r0, =__dtors_start__
\r
235 ldr r1, =__dtors_end__
\r
247 /* Return from main, loop forever. */
\r