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