Demo apps refactoring
[lwext4.git] / demos / stm32f429_disco / startup.S
1 /******************************************************************************\r
2 * author: Freddie Chopin, http://www.freddiechopin.info/\r
3 * file: startup.S\r
4 * last change: 2012-03-18\r
5 *\r
6 * chip: ARMv7-M(E) (Cortex-M3 / Cortex-M4)\r
7 * compiler: arm-none-eabi-gcc (GNU Tools for ARM Embedded Processors) 4.6.2\r
8 *       20110921 (release) [ARM/embedded-4_6-branch revision 182083]\r
9 *\r
10 * description:\r
11 * ARMv7-M(E) (Cortex-M3 / Cortex-M4) assembly startup code\r
12 ******************************************************************************/\r
13 \r
14 \r
15 #define PRIMASK_MASK_EXCEPTIONS_bit         0\r
16 #define PRIMASK_MASK_EXCEPTIONS             (1 << PRIMASK_MASK_EXCEPTIONS_bit)\r
17 #define FAULTMASK_MASK_EXCEPTIONS_bit       0\r
18 #define FAULTMASK_MASK_EXCEPTIONS           (1 << FAULTMASK_MASK_EXCEPTIONS_bit)\r
19 #define CONTROL_THREAD_UNPRIVILEGED_bit     0\r
20 #define CONTROL_ALTERNATE_STACK_bit         1\r
21 #define CONTROL_THREAD_UNPRIVILEGED         (1 << CONTROL_THREAD_UNPRIVILEGED_bit)\r
22 #define CONTROL_ALTERNATE_STACK             (1 << CONTROL_ALTERNATE_STACK_bit)\r
23 \r
24 \r
25 /*\r
26 +=============================================================================+\r
27 | ARMv7-M(E) (Cortex-M3 / Cortex-M4) startup code\r
28 +=============================================================================+\r
29 */\r
30 \r
31 .text\r
32 .balign 2\r
33 .syntax unified\r
34 .thumb\r
35 .thumb_func\r
36 .global Reset_Handler\r
37 \r
38 Reset_Handler:\r
39 \r
40 /*\r
41 +-----------------------------------------------------------------------------+\r
42 | Initialize the process stack pointer\r
43 +-----------------------------------------------------------------------------+\r
44 */\r
45 \r
46         ldr             r0, =__process_stack_end\r
47         msr             PSP, r0\r
48 \r
49 /*\r
50 +-----------------------------------------------------------------------------+\r
51 | Thread mode uses process stack (PSP) and is privileged\r
52 +-----------------------------------------------------------------------------+\r
53 */\r
54 \r
55         movs    r0, #CONTROL_ALTERNATE_STACK\r
56         msr             CONTROL, r0\r
57         isb\r
58 \r
59 /*\r
60 +-----------------------------------------------------------------------------+\r
61 | Branch to low_level_init_0() function (.data and .bss are not initialized!)\r
62 +-----------------------------------------------------------------------------+\r
63 */\r
64 \r
65         ldr             r0, =low_level_init_0\r
66         blx             r0\r
67 \r
68 /*\r
69 +-----------------------------------------------------------------------------+\r
70 | Initialize .data section\r
71 +-----------------------------------------------------------------------------+\r
72 */\r
73 \r
74         ldr             r1, =__data_init_start\r
75     ldr         r2, =__data_start\r
76     ldr         r3, =__data_end\r
77 \r
78 1:      cmp             r2, r3\r
79         ittt    lo\r
80         ldrlo   r0, [r1], #4\r
81         strlo   r0, [r2], #4\r
82         blo             1b\r
83 \r
84 /*\r
85 +-----------------------------------------------------------------------------+\r
86 | Zero-init .bss section\r
87 +-----------------------------------------------------------------------------+\r
88 */\r
89 \r
90         movs    r0, #0\r
91         ldr             r1, =__bss_start\r
92         ldr             r2, =__bss_end\r
93 \r
94 1:      cmp             r1, r2\r
95         itt             lo\r
96         strlo   r0, [r1], #4\r
97         blo             1b\r
98 \r
99 /*\r
100 +-----------------------------------------------------------------------------+\r
101 | Call C++ constructors for global and static objects\r
102 +-----------------------------------------------------------------------------+\r
103 */\r
104 #ifdef __USES_CXX\r
105         ldr             r0, =__libc_init_array\r
106         blx             r0\r
107 #endif\r
108 \r
109 /*\r
110 +-----------------------------------------------------------------------------+\r
111 | Branch to low_level_init_1() function\r
112 +-----------------------------------------------------------------------------+\r
113 */\r
114 \r
115         ldr             r0, =low_level_init_1\r
116         blx             r0\r
117 \r
118 /*\r
119 +-----------------------------------------------------------------------------+\r
120 | Branch to main() with link\r
121 +-----------------------------------------------------------------------------+\r
122 */\r
123 \r
124         ldr             r0, =main\r
125         blx             r0\r
126 \r
127 /*\r
128 +-----------------------------------------------------------------------------+\r
129 | Call C++ destructors for global and static objects\r
130 +-----------------------------------------------------------------------------+\r
131 */\r
132 #ifdef __USES_CXX\r
133         ldr             r0, =__libc_fini_array\r
134         blx             r0\r
135 #endif\r
136 \r
137 /*\r
138 +-----------------------------------------------------------------------------+\r
139 | On return - loop till the end of the world\r
140 +-----------------------------------------------------------------------------+\r
141 */\r
142 \r
143         b               .\r
144 \r
145 /*\r
146 +=============================================================================+\r
147 | __default_low_level_init() - replacement for undefined low_level_init_0()\r
148 | and/or low_level_init_1(). This function just returns.\r
149 +=============================================================================+\r
150 */\r
151 \r
152 .text\r
153 .balign 2\r
154 .syntax unified\r
155 .thumb\r
156 .thumb_func\r
157 .global __default_low_level_init\r
158 \r
159 __default_low_level_init:\r
160         bx              lr\r
161 \r
162 /*\r
163 +=============================================================================+\r
164 | assign undefined low_level_init_0() and/or low_level_init_1() to\r
165 | __default_low_level_init()\r
166 +=============================================================================+\r
167 */\r
168 \r
169 .weak   low_level_init_0\r
170 .global low_level_init_0\r
171 .set    low_level_init_0, __default_low_level_init\r
172 \r
173 .weak   low_level_init_1\r
174 .global low_level_init_1\r
175 .set    low_level_init_1, __default_low_level_init\r
176 \r
177 /******************************************************************************\r
178 * END OF FILE\r
179 ******************************************************************************/\r