1/*
2
3Copyright (c) 2009-2020 ARM Limited. All rights reserved.
4
5    SPDX-License-Identifier: Apache-2.0
6
7Licensed under the Apache License, Version 2.0 (the License); you may
8not use this file except in compliance with the License.
9You may obtain a copy of the License at
10
11    www.apache.org/licenses/LICENSE-2.0
12
13Unless required by applicable law or agreed to in writing, software
14distributed under the License is distributed on an AS IS BASIS, WITHOUT
15WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16See the License for the specific language governing permissions and
17limitations under the License.
18
19NOTICE: This file has been modified by Nordic Semiconductor ASA.
20
21*/
22
23    .syntax unified
24    .arch armv8-m.main
25
26#ifdef __STARTUP_CONFIG
27#include "startup_config.h"
28#ifndef __STARTUP_CONFIG_STACK_ALIGNEMENT
29#define __STARTUP_CONFIG_STACK_ALIGNEMENT 3
30#endif
31#endif
32
33    .section .stack
34#if defined(__STARTUP_CONFIG)
35    .align __STARTUP_CONFIG_STACK_ALIGNEMENT
36    .equ    Stack_Size, __STARTUP_CONFIG_STACK_SIZE
37#elif defined(__STACK_SIZE)
38    .align 3
39    .equ    Stack_Size, __STACK_SIZE
40#else
41    .align 3
42    .equ    Stack_Size, 4096
43#endif
44    .globl __StackTop
45    .globl __StackLimit
46__StackLimit:
47    .space Stack_Size
48    .size __StackLimit, . - __StackLimit
49__StackTop:
50    .size __StackTop, . - __StackTop
51
52    .section .heap
53    .align 3
54#if defined(__STARTUP_CONFIG)
55    .equ Heap_Size, __STARTUP_CONFIG_HEAP_SIZE
56#elif defined(__HEAP_SIZE)
57    .equ Heap_Size, __HEAP_SIZE
58#else
59    .equ Heap_Size, 4096
60#endif
61    .globl __HeapBase
62    .globl __HeapLimit
63__HeapBase:
64    .if Heap_Size
65    .space Heap_Size
66    .endif
67    .size __HeapBase, . - __HeapBase
68__HeapLimit:
69    .size __HeapLimit, . - __HeapLimit
70
71    .section .isr_vector, "ax"
72    .align 2
73    .globl __isr_vector
74__isr_vector:
75    .long   __StackTop                  /* Top of Stack */
76    .long   Reset_Handler
77    .long   NMI_Handler
78    .long   HardFault_Handler
79    .long   MemoryManagement_Handler
80    .long   BusFault_Handler
81    .long   UsageFault_Handler
82    .long   0                           /*Reserved */
83    .long   0                           /*Reserved */
84    .long   0                           /*Reserved */
85    .long   0                           /*Reserved */
86    .long   SVC_Handler
87    .long   DebugMon_Handler
88    .long   0                           /*Reserved */
89    .long   PendSV_Handler
90    .long   SysTick_Handler
91
92  /* External Interrupts */
93    .long   0                           /*Reserved */
94    .long   0                           /*Reserved */
95    .long   0                           /*Reserved */
96    .long   0                           /*Reserved */
97    .long   0                           /*Reserved */
98    .long   CLOCK_POWER_IRQHandler
99    .long   0                           /*Reserved */
100    .long   0                           /*Reserved */
101    .long   RADIO_IRQHandler
102    .long   RNG_IRQHandler
103    .long   GPIOTE_IRQHandler
104    .long   WDT_IRQHandler
105    .long   TIMER0_IRQHandler
106    .long   ECB_IRQHandler
107    .long   AAR_CCM_IRQHandler
108    .long   0                           /*Reserved */
109    .long   TEMP_IRQHandler
110    .long   RTC0_IRQHandler
111    .long   IPC_IRQHandler
112    .long   SPIM0_SPIS0_TWIM0_TWIS0_UARTE0_IRQHandler
113    .long   EGU0_IRQHandler
114    .long   0                           /*Reserved */
115    .long   RTC1_IRQHandler
116    .long   0                           /*Reserved */
117    .long   TIMER1_IRQHandler
118    .long   TIMER2_IRQHandler
119    .long   SWI0_IRQHandler
120    .long   SWI1_IRQHandler
121    .long   SWI2_IRQHandler
122    .long   SWI3_IRQHandler
123    .long   0                           /*Reserved */
124    .long   0                           /*Reserved */
125    .long   0                           /*Reserved */
126    .long   0                           /*Reserved */
127    .long   0                           /*Reserved */
128    .long   0                           /*Reserved */
129    .long   0                           /*Reserved */
130    .long   0                           /*Reserved */
131    .long   0                           /*Reserved */
132    .long   0                           /*Reserved */
133    .long   0                           /*Reserved */
134    .long   0                           /*Reserved */
135    .long   0                           /*Reserved */
136    .long   0                           /*Reserved */
137    .long   0                           /*Reserved */
138    .long   0                           /*Reserved */
139    .long   0                           /*Reserved */
140    .long   0                           /*Reserved */
141    .long   0                           /*Reserved */
142    .long   0                           /*Reserved */
143    .long   0                           /*Reserved */
144    .long   0                           /*Reserved */
145    .long   0                           /*Reserved */
146    .long   0                           /*Reserved */
147    .long   0                           /*Reserved */
148    .long   0                           /*Reserved */
149    .long   0                           /*Reserved */
150    .long   0                           /*Reserved */
151    .long   0                           /*Reserved */
152    .long   0                           /*Reserved */
153    .long   0                           /*Reserved */
154    .long   0                           /*Reserved */
155    .long   0                           /*Reserved */
156    .long   0                           /*Reserved */
157    .long   0                           /*Reserved */
158    .long   0                           /*Reserved */
159    .long   0                           /*Reserved */
160    .long   0                           /*Reserved */
161    .long   0                           /*Reserved */
162    .long   0                           /*Reserved */
163    .long   0                           /*Reserved */
164    .long   0                           /*Reserved */
165    .long   0                           /*Reserved */
166    .long   0                           /*Reserved */
167    .long   0                           /*Reserved */
168    .long   0                           /*Reserved */
169    .long   0                           /*Reserved */
170    .long   0                           /*Reserved */
171    .long   0                           /*Reserved */
172    .long   0                           /*Reserved */
173    .long   0                           /*Reserved */
174    .long   0                           /*Reserved */
175    .long   0                           /*Reserved */
176    .long   0                           /*Reserved */
177    .long   0                           /*Reserved */
178    .long   0                           /*Reserved */
179    .long   0                           /*Reserved */
180    .long   0                           /*Reserved */
181    .long   0                           /*Reserved */
182    .long   0                           /*Reserved */
183    .long   0                           /*Reserved */
184    .long   0                           /*Reserved */
185    .long   0                           /*Reserved */
186    .long   0                           /*Reserved */
187    .long   0                           /*Reserved */
188    .long   0                           /*Reserved */
189    .long   0                           /*Reserved */
190    .long   0                           /*Reserved */
191    .long   0                           /*Reserved */
192    .long   0                           /*Reserved */
193    .long   0                           /*Reserved */
194    .long   0                           /*Reserved */
195    .long   0                           /*Reserved */
196    .long   0                           /*Reserved */
197    .long   0                           /*Reserved */
198    .long   0                           /*Reserved */
199    .long   0                           /*Reserved */
200    .long   0                           /*Reserved */
201    .long   0                           /*Reserved */
202    .long   0                           /*Reserved */
203    .long   0                           /*Reserved */
204    .long   0                           /*Reserved */
205    .long   0                           /*Reserved */
206    .long   0                           /*Reserved */
207    .long   0                           /*Reserved */
208    .long   0                           /*Reserved */
209    .long   0                           /*Reserved */
210    .long   0                           /*Reserved */
211    .long   0                           /*Reserved */
212    .long   0                           /*Reserved */
213    .long   0                           /*Reserved */
214    .long   0                           /*Reserved */
215    .long   0                           /*Reserved */
216    .long   0                           /*Reserved */
217    .long   0                           /*Reserved */
218    .long   0                           /*Reserved */
219    .long   0                           /*Reserved */
220    .long   0                           /*Reserved */
221    .long   0                           /*Reserved */
222
223    .size __isr_vector, . - __isr_vector
224
225/* Reset Handler */
226
227
228    .text
229    .thumb
230    .thumb_func
231    .align 1
232    .globl Reset_Handler
233    .type Reset_Handler, %function
234Reset_Handler:
235
236
237/* Loop to copy data from read only memory to RAM.
238 * The ranges of copy from/to are specified by following symbols:
239 *      __etext: LMA of start of the section to copy from. Usually end of text
240 *      __data_start__: VMA of start of the section to copy to.
241 *      __bss_start__: VMA of end of the section to copy to. Normally __data_end__ is used, but by using __bss_start__
242 *                    the user can add their own initialized data section before BSS section with the INSERT AFTER command.
243 *
244 * All addresses must be aligned to 4 bytes boundary.
245 */
246#ifndef __STARTUP_SKIP_ETEXT
247    ldr r1, =__etext
248    ldr r2, =__data_start__
249    ldr r3, =__bss_start__
250
251    subs r3, r3, r2
252    ble .L_loop1_done
253
254.L_loop1:
255    subs r3, r3, #4
256    ldr r0, [r1,r3]
257    str r0, [r2,r3]
258    bgt .L_loop1
259
260.L_loop1_done:
261#endif
262
263/* This part of work usually is done in C library startup code. Otherwise,
264 * define __STARTUP_CLEAR_BSS to enable it in this startup. This section
265 * clears the RAM where BSS data is located.
266 *
267 * The BSS section is specified by following symbols
268 *    __bss_start__: start of the BSS section.
269 *    __bss_end__: end of the BSS section.
270 *
271 * All addresses must be aligned to 4 bytes boundary.
272 */
273#ifdef __STARTUP_CLEAR_BSS
274    ldr r1, =__bss_start__
275    ldr r2, =__bss_end__
276
277    movs r0, 0
278
279    subs r2, r2, r1
280    ble .L_loop3_done
281
282.L_loop3:
283    subs r2, r2, #4
284    str r0, [r1, r2]
285    bgt .L_loop3
286
287.L_loop3_done:
288#endif /* __STARTUP_CLEAR_BSS */
289
290/* Execute SystemInit function. */
291    bl SystemInit
292
293/* Call _start function provided by libraries.
294 * If those libraries are not accessible, define __START as your entry point.
295 */
296#ifndef __START
297#define __START _start
298#endif
299    bl __START
300
301    .pool
302    .size   Reset_Handler,.-Reset_Handler
303
304    .section ".text"
305
306
307/* Dummy Exception Handlers (infinite loops which can be modified) */
308
309    .weak   NMI_Handler
310    .type   NMI_Handler, %function
311NMI_Handler:
312    b       .
313    .size   NMI_Handler, . - NMI_Handler
314
315
316    .weak   HardFault_Handler
317    .type   HardFault_Handler, %function
318HardFault_Handler:
319    b       .
320    .size   HardFault_Handler, . - HardFault_Handler
321
322
323    .weak   MemoryManagement_Handler
324    .type   MemoryManagement_Handler, %function
325MemoryManagement_Handler:
326    b       .
327    .size   MemoryManagement_Handler, . - MemoryManagement_Handler
328
329
330    .weak   BusFault_Handler
331    .type   BusFault_Handler, %function
332BusFault_Handler:
333    b       .
334    .size   BusFault_Handler, . - BusFault_Handler
335
336
337    .weak   UsageFault_Handler
338    .type   UsageFault_Handler, %function
339UsageFault_Handler:
340    b       .
341    .size   UsageFault_Handler, . - UsageFault_Handler
342
343
344    .weak   SVC_Handler
345    .type   SVC_Handler, %function
346SVC_Handler:
347    b       .
348    .size   SVC_Handler, . - SVC_Handler
349
350
351    .weak   DebugMon_Handler
352    .type   DebugMon_Handler, %function
353DebugMon_Handler:
354    b       .
355    .size   DebugMon_Handler, . - DebugMon_Handler
356
357
358    .weak   PendSV_Handler
359    .type   PendSV_Handler, %function
360PendSV_Handler:
361    b       .
362    .size   PendSV_Handler, . - PendSV_Handler
363
364
365    .weak   SysTick_Handler
366    .type   SysTick_Handler, %function
367SysTick_Handler:
368    b       .
369    .size   SysTick_Handler, . - SysTick_Handler
370
371
372/* IRQ Handlers */
373
374    .globl  Default_Handler
375    .type   Default_Handler, %function
376Default_Handler:
377    b       .
378    .size   Default_Handler, . - Default_Handler
379
380    .macro  IRQ handler
381    .weak   \handler
382    .set    \handler, Default_Handler
383    .endm
384
385    IRQ  CLOCK_POWER_IRQHandler
386    IRQ  RADIO_IRQHandler
387    IRQ  RNG_IRQHandler
388    IRQ  GPIOTE_IRQHandler
389    IRQ  WDT_IRQHandler
390    IRQ  TIMER0_IRQHandler
391    IRQ  ECB_IRQHandler
392    IRQ  AAR_CCM_IRQHandler
393    IRQ  TEMP_IRQHandler
394    IRQ  RTC0_IRQHandler
395    IRQ  IPC_IRQHandler
396    IRQ  SPIM0_SPIS0_TWIM0_TWIS0_UARTE0_IRQHandler
397    IRQ  EGU0_IRQHandler
398    IRQ  RTC1_IRQHandler
399    IRQ  TIMER1_IRQHandler
400    IRQ  TIMER2_IRQHandler
401    IRQ  SWI0_IRQHandler
402    IRQ  SWI1_IRQHandler
403    IRQ  SWI2_IRQHandler
404    IRQ  SWI3_IRQHandler
405
406  .end
407