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