]> git.sur5r.net Git - freertos/blob - Demo/lwIP_Demo_Rowley_ARM7/boot.s
Start to re-arrange files to include FreeRTOS+ in main download.
[freertos] / Demo / lwIP_Demo_Rowley_ARM7 / boot.s
1         /* Sample initialization file */\r
2 \r
3         .extern main\r
4         .extern exit\r
5         .extern AT91F_LowLevelInit\r
6 \r
7         .text\r
8         .code 32\r
9 \r
10 \r
11         .align  0\r
12 \r
13         .extern __stack_end__\r
14         .extern __bss_beg__\r
15         .extern __bss_end__\r
16         .extern __data_beg__\r
17         .extern __data_end__\r
18         .extern __data+beg_src__\r
19 \r
20         .global start\r
21         .global endless_loop\r
22 \r
23         /* Stack Sizes */\r
24     .set  UND_STACK_SIZE, 0x00000004\r
25     .set  ABT_STACK_SIZE, 0x00000004\r
26     .set  FIQ_STACK_SIZE, 0x00000004\r
27     .set  IRQ_STACK_SIZE, 0X00000400\r
28     .set  SVC_STACK_SIZE, 0x00000400\r
29 \r
30         /* Standard definitions of Mode bits and Interrupt (I & F) flags in PSRs */\r
31     .set  MODE_USR, 0x10            /* User Mode */\r
32     .set  MODE_FIQ, 0x11            /* FIQ Mode */\r
33     .set  MODE_IRQ, 0x12            /* IRQ Mode */\r
34     .set  MODE_SVC, 0x13            /* Supervisor Mode */\r
35     .set  MODE_ABT, 0x17            /* Abort Mode */\r
36     .set  MODE_UND, 0x1B            /* Undefined Mode */\r
37     .set  MODE_SYS, 0x1F            /* System Mode */\r
38 \r
39     .equ  I_BIT, 0x80               /* when I bit is set, IRQ is disabled */\r
40     .equ  F_BIT, 0x40               /* when F bit is set, FIQ is disabled */\r
41 \r
42 \r
43 start:\r
44 _start:\r
45 _mainCRTStartup:\r
46 \r
47         /* Setup a stack for each mode - note that this only sets up a usable stack\r
48         for system/user, SWI and IRQ modes.   Also each mode is setup with\r
49         interrupts initially disabled. */\r
50     ldr   r0, .LC6\r
51     msr   CPSR_c, #MODE_UND|I_BIT|F_BIT /* Undefined Instruction Mode */\r
52     mov   sp, r0\r
53     sub   r0, r0, #UND_STACK_SIZE\r
54     msr   CPSR_c, #MODE_ABT|I_BIT|F_BIT /* Abort Mode */\r
55     mov   sp, r0\r
56     sub   r0, r0, #ABT_STACK_SIZE\r
57     msr   CPSR_c, #MODE_FIQ|I_BIT|F_BIT /* FIQ Mode */\r
58     mov   sp, r0\r
59     sub   r0, r0, #FIQ_STACK_SIZE\r
60     msr   CPSR_c, #MODE_IRQ|I_BIT|F_BIT /* IRQ Mode */\r
61     mov   sp, r0\r
62     sub   r0, r0, #IRQ_STACK_SIZE\r
63     msr   CPSR_c, #MODE_SVC|I_BIT|F_BIT /* Supervisor Mode */\r
64     mov   sp, r0\r
65     sub   r0, r0, #SVC_STACK_SIZE\r
66     msr   CPSR_c, #MODE_SYS|I_BIT|F_BIT /* System Mode */\r
67     mov   sp, r0\r
68 \r
69         /* We want to start in supervisor mode.  Operation will switch to system\r
70         mode when the first task starts. */\r
71         msr   CPSR_c, #MODE_SVC|I_BIT|F_BIT\r
72 \r
73     bl          AT91F_LowLevelInit\r
74 \r
75         /* Clear BSS. */\r
76 \r
77         mov     a2, #0                  /* Fill value */\r
78         mov             fp, a2                  /* Null frame pointer */\r
79         mov             r7, a2                  /* Null frame pointer for Thumb */\r
80 \r
81         ldr             r1, .LC1                /* Start of memory block */\r
82         ldr             r3, .LC2                /* End of memory block */\r
83         subs    r3, r3, r1      /* Length of block */\r
84         beq             .end_clear_loop\r
85         mov             r2, #0\r
86 \r
87 .clear_loop:\r
88         strb    r2, [r1], #1\r
89         subs    r3, r3, #1\r
90         bgt             .clear_loop\r
91 \r
92 .end_clear_loop:\r
93 \r
94         /* Initialise data. */\r
95 \r
96         ldr             r1, .LC3                /* Start of memory block */\r
97         ldr             r2, .LC4                /* End of memory block */\r
98         ldr             r3, .LC5\r
99         subs    r3, r3, r1              /* Length of block */\r
100         beq             .end_set_loop\r
101 \r
102 .set_loop:\r
103         ldrb    r4, [r2], #1\r
104         strb    r4, [r1], #1\r
105         subs    r3, r3, #1\r
106         bgt             .set_loop\r
107 \r
108 .end_set_loop:\r
109 \r
110         mov             r0, #0          /* no arguments  */\r
111         mov             r1, #0          /* no argv either */\r
112 \r
113     ldr lr, =main       \r
114         bx      lr\r
115 \r
116 endless_loop:\r
117         b               endless_loop\r
118 \r
119 \r
120         .align 0\r
121 \r
122         .LC1:\r
123         .word   __bss_beg__\r
124         .LC2:\r
125         .word   __bss_end__\r
126         .LC3:\r
127         .word   __data_beg__\r
128         .LC4:\r
129         .word   __data_beg_src__\r
130         .LC5:\r
131         .word   __data_end__\r
132         .LC6:\r
133         .word   __stack_end__\r
134 \r
135 \r
136         /* Setup vector table.  Note that undf, pabt, dabt, fiq just execute\r
137         a null loop. */\r
138 \r
139 .section .startup,"ax"\r
140          .code 32\r
141          .align 0\r
142 \r
143         b     _start                                            /* reset - _start                       */\r
144         ldr   pc, _undf                                         /* undefined - _undf            */\r
145         ldr   pc, _swi                                          /* SWI - _swi                           */\r
146         ldr   pc, _pabt                                         /* program abort - _pabt        */\r
147         ldr   pc, _dabt                                         /* data abort - _dabt           */\r
148         nop                                                                     /* reserved                                     */\r
149         ldr   pc, [pc,#-0xF20]                          /* IRQ - read the AIC           */\r
150         ldr   pc, _fiq                                          /* FIQ - _fiq                           */\r
151 \r
152 _undf:  .word __undf                    /* undefined                            */\r
153 _swi:   .word swi_handler                               /* SWI                                          */\r
154 _pabt:  .word __pabt                    /* program abort                        */\r
155 _dabt:  .word __dabt                    /* data abort                           */\r
156 _fiq:   .word __fiq                     /* FIQ                                          */\r
157 \r
158 __undf: b     .                         /* undefined                            */\r
159 __pabt: b     .                         /* program abort                        */\r
160 __dabt: b     .                         /* data abort                           */\r
161 __fiq:  b     .                         /* FIQ                                          */\r