1/* 2 3Copyright (c) 2009-2018 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, 8192 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, 8192 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 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 SecureFault_Handler 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 SPU_IRQHandler 97 .long 0 /*Reserved */ 98 .long CLOCK_POWER_IRQHandler 99 .long 0 /*Reserved */ 100 .long 0 /*Reserved */ 101 .long UARTE0_SPIM0_SPIS0_TWIM0_TWIS0_IRQHandler 102 .long UARTE1_SPIM1_SPIS1_TWIM1_TWIS1_IRQHandler 103 .long UARTE2_SPIM2_SPIS2_TWIM2_TWIS2_IRQHandler 104 .long UARTE3_SPIM3_SPIS3_TWIM3_TWIS3_IRQHandler 105 .long 0 /*Reserved */ 106 .long GPIOTE0_IRQHandler 107 .long SAADC_IRQHandler 108 .long TIMER0_IRQHandler 109 .long TIMER1_IRQHandler 110 .long TIMER2_IRQHandler 111 .long 0 /*Reserved */ 112 .long 0 /*Reserved */ 113 .long RTC0_IRQHandler 114 .long RTC1_IRQHandler 115 .long 0 /*Reserved */ 116 .long 0 /*Reserved */ 117 .long WDT_IRQHandler 118 .long 0 /*Reserved */ 119 .long 0 /*Reserved */ 120 .long EGU0_IRQHandler 121 .long EGU1_IRQHandler 122 .long EGU2_IRQHandler 123 .long EGU3_IRQHandler 124 .long EGU4_IRQHandler 125 .long EGU5_IRQHandler 126 .long PWM0_IRQHandler 127 .long PWM1_IRQHandler 128 .long PWM2_IRQHandler 129 .long PWM3_IRQHandler 130 .long 0 /*Reserved */ 131 .long PDM_IRQHandler 132 .long 0 /*Reserved */ 133 .long I2S_IRQHandler 134 .long 0 /*Reserved */ 135 .long IPC_IRQHandler 136 .long 0 /*Reserved */ 137 .long FPU_IRQHandler 138 .long 0 /*Reserved */ 139 .long 0 /*Reserved */ 140 .long 0 /*Reserved */ 141 .long 0 /*Reserved */ 142 .long GPIOTE1_IRQHandler 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 KMU_IRQHandler 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 CRYPTOCELL_IRQHandler 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 .long 0 /*Reserved */ 223 .long 0 /*Reserved */ 224 .long 0 /*Reserved */ 225 .long 0 /*Reserved */ 226 .long 0 /*Reserved */ 227 .long 0 /*Reserved */ 228 .long 0 /*Reserved */ 229 .long 0 /*Reserved */ 230 .long 0 /*Reserved */ 231 .long 0 /*Reserved */ 232 .long 0 /*Reserved */ 233 .long 0 /*Reserved */ 234 .long 0 /*Reserved */ 235 .long 0 /*Reserved */ 236 .long 0 /*Reserved */ 237 .long 0 /*Reserved */ 238 .long 0 /*Reserved */ 239 .long 0 /*Reserved */ 240 .long 0 /*Reserved */ 241 .long 0 /*Reserved */ 242 .long 0 /*Reserved */ 243 .long 0 /*Reserved */ 244 .long 0 /*Reserved */ 245 .long 0 /*Reserved */ 246 .long 0 /*Reserved */ 247 .long 0 /*Reserved */ 248 .long 0 /*Reserved */ 249 .long 0 /*Reserved */ 250 .long 0 /*Reserved */ 251 .long 0 /*Reserved */ 252 .long 0 /*Reserved */ 253 .long 0 /*Reserved */ 254 .long 0 /*Reserved */ 255 .long 0 /*Reserved */ 256 .long 0 /*Reserved */ 257 .long 0 /*Reserved */ 258 .long 0 /*Reserved */ 259 .long 0 /*Reserved */ 260 .long 0 /*Reserved */ 261 .long 0 /*Reserved */ 262 .long 0 /*Reserved */ 263 .long 0 /*Reserved */ 264 .long 0 /*Reserved */ 265 .long 0 /*Reserved */ 266 .long 0 /*Reserved */ 267 .long 0 /*Reserved */ 268 .long 0 /*Reserved */ 269 .long 0 /*Reserved */ 270 .long 0 /*Reserved */ 271 .long 0 /*Reserved */ 272 .long 0 /*Reserved */ 273 .long 0 /*Reserved */ 274 .long 0 /*Reserved */ 275 .long 0 /*Reserved */ 276 .long 0 /*Reserved */ 277 .long 0 /*Reserved */ 278 .long 0 /*Reserved */ 279 .long 0 /*Reserved */ 280 .long 0 /*Reserved */ 281 .long 0 /*Reserved */ 282 .long 0 /*Reserved */ 283 .long 0 /*Reserved */ 284 .long 0 /*Reserved */ 285 .long 0 /*Reserved */ 286 .long 0 /*Reserved */ 287 .long 0 /*Reserved */ 288 .long 0 /*Reserved */ 289 .long 0 /*Reserved */ 290 .long 0 /*Reserved */ 291 .long 0 /*Reserved */ 292 .long 0 /*Reserved */ 293 .long 0 /*Reserved */ 294 .long 0 /*Reserved */ 295 .long 0 /*Reserved */ 296 .long 0 /*Reserved */ 297 .long 0 /*Reserved */ 298 .long 0 /*Reserved */ 299 .long 0 /*Reserved */ 300 .long 0 /*Reserved */ 301 .long 0 /*Reserved */ 302 .long 0 /*Reserved */ 303 .long 0 /*Reserved */ 304 .long 0 /*Reserved */ 305 .long 0 /*Reserved */ 306 .long 0 /*Reserved */ 307 .long 0 /*Reserved */ 308 .long 0 /*Reserved */ 309 .long 0 /*Reserved */ 310 .long 0 /*Reserved */ 311 .long 0 /*Reserved */ 312 .long 0 /*Reserved */ 313 .long 0 /*Reserved */ 314 .long 0 /*Reserved */ 315 .long 0 /*Reserved */ 316 .long 0 /*Reserved */ 317 .long 0 /*Reserved */ 318 .long 0 /*Reserved */ 319 .long 0 /*Reserved */ 320 .long 0 /*Reserved */ 321 .long 0 /*Reserved */ 322 .long 0 /*Reserved */ 323 .long 0 /*Reserved */ 324 .long 0 /*Reserved */ 325 .long 0 /*Reserved */ 326 .long 0 /*Reserved */ 327 .long 0 /*Reserved */ 328 .long 0 /*Reserved */ 329 .long 0 /*Reserved */ 330 .long 0 /*Reserved */ 331 .long 0 /*Reserved */ 332 .long 0 /*Reserved */ 333 334 .size __isr_vector, . - __isr_vector 335 336/* Reset Handler */ 337 338 339 .text 340 .thumb 341 .thumb_func 342 .align 1 343 .globl Reset_Handler 344 .type Reset_Handler, %function 345Reset_Handler: 346 347 348/* Loop to copy data from read only memory to RAM. 349 * The ranges of copy from/to are specified by following symbols: 350 * __etext: LMA of start of the section to copy from. Usually end of text 351 * __data_start__: VMA of start of the section to copy to. 352 * __bss_start__: VMA of end of the section to copy to. Normally __data_end__ is used, but by using __bss_start__ 353 * the user can add their own initialized data section before BSS section with the INTERT AFTER command. 354 * 355 * All addresses must be aligned to 4 bytes boundary. 356 */ 357 ldr r1, =__etext 358 ldr r2, =__data_start__ 359 ldr r3, =__bss_start__ 360 361 subs r3, r3, r2 362 ble .L_loop1_done 363 364.L_loop1: 365 subs r3, r3, #4 366 ldr r0, [r1,r3] 367 str r0, [r2,r3] 368 bgt .L_loop1 369 370.L_loop1_done: 371 372/* This part of work usually is done in C library startup code. Otherwise, 373 * define __STARTUP_CLEAR_BSS to enable it in this startup. This section 374 * clears the RAM where BSS data is located. 375 * 376 * The BSS section is specified by following symbols 377 * __bss_start__: start of the BSS section. 378 * __bss_end__: end of the BSS section. 379 * 380 * All addresses must be aligned to 4 bytes boundary. 381 */ 382#ifdef __STARTUP_CLEAR_BSS 383 ldr r1, =__bss_start__ 384 ldr r2, =__bss_end__ 385 386 movs r0, 0 387 388 subs r2, r2, r1 389 ble .L_loop3_done 390 391.L_loop3: 392 subs r2, r2, #4 393 str r0, [r1, r2] 394 bgt .L_loop3 395 396.L_loop3_done: 397#endif /* __STARTUP_CLEAR_BSS */ 398 399/* Execute SystemInit function. */ 400 bl SystemInit 401 402/* Call _start function provided by libraries. 403 * If those libraries are not accessible, define __START as your entry point. 404 */ 405#ifndef __START 406#define __START _start 407#endif 408 bl __START 409 410 .pool 411 .size Reset_Handler,.-Reset_Handler 412 413 .section ".text" 414 415 416/* Dummy Exception Handlers (infinite loops which can be modified) */ 417 418 .weak NMI_Handler 419 .type NMI_Handler, %function 420NMI_Handler: 421 b . 422 .size NMI_Handler, . - NMI_Handler 423 424 425 .weak HardFault_Handler 426 .type HardFault_Handler, %function 427HardFault_Handler: 428 b . 429 .size HardFault_Handler, . - HardFault_Handler 430 431 432 .weak MemoryManagement_Handler 433 .type MemoryManagement_Handler, %function 434MemoryManagement_Handler: 435 b . 436 .size MemoryManagement_Handler, . - MemoryManagement_Handler 437 438 439 .weak BusFault_Handler 440 .type BusFault_Handler, %function 441BusFault_Handler: 442 b . 443 .size BusFault_Handler, . - BusFault_Handler 444 445 446 .weak UsageFault_Handler 447 .type UsageFault_Handler, %function 448UsageFault_Handler: 449 b . 450 .size UsageFault_Handler, . - UsageFault_Handler 451 452 453 .weak SecureFault_Handler 454 .type SecureFault_Handler, %function 455SecureFault_Handler: 456 b . 457 .size SecureFault_Handler, . - SecureFault_Handler 458 459 460 .weak SVC_Handler 461 .type SVC_Handler, %function 462SVC_Handler: 463 b . 464 .size SVC_Handler, . - SVC_Handler 465 466 467 .weak DebugMon_Handler 468 .type DebugMon_Handler, %function 469DebugMon_Handler: 470 b . 471 .size DebugMon_Handler, . - DebugMon_Handler 472 473 474 .weak PendSV_Handler 475 .type PendSV_Handler, %function 476PendSV_Handler: 477 b . 478 .size PendSV_Handler, . - PendSV_Handler 479 480 481 .weak SysTick_Handler 482 .type SysTick_Handler, %function 483SysTick_Handler: 484 b . 485 .size SysTick_Handler, . - SysTick_Handler 486 487 488/* IRQ Handlers */ 489 490 .globl Default_Handler 491 .type Default_Handler, %function 492Default_Handler: 493 b . 494 .size Default_Handler, . - Default_Handler 495 496 .macro IRQ handler 497 .weak \handler 498 .set \handler, Default_Handler 499 .endm 500 501 IRQ SPU_IRQHandler 502 IRQ CLOCK_POWER_IRQHandler 503 IRQ UARTE0_SPIM0_SPIS0_TWIM0_TWIS0_IRQHandler 504 IRQ UARTE1_SPIM1_SPIS1_TWIM1_TWIS1_IRQHandler 505 IRQ UARTE2_SPIM2_SPIS2_TWIM2_TWIS2_IRQHandler 506 IRQ UARTE3_SPIM3_SPIS3_TWIM3_TWIS3_IRQHandler 507 IRQ GPIOTE0_IRQHandler 508 IRQ SAADC_IRQHandler 509 IRQ TIMER0_IRQHandler 510 IRQ TIMER1_IRQHandler 511 IRQ TIMER2_IRQHandler 512 IRQ RTC0_IRQHandler 513 IRQ RTC1_IRQHandler 514 IRQ WDT_IRQHandler 515 IRQ EGU0_IRQHandler 516 IRQ EGU1_IRQHandler 517 IRQ EGU2_IRQHandler 518 IRQ EGU3_IRQHandler 519 IRQ EGU4_IRQHandler 520 IRQ EGU5_IRQHandler 521 IRQ PWM0_IRQHandler 522 IRQ PWM1_IRQHandler 523 IRQ PWM2_IRQHandler 524 IRQ PWM3_IRQHandler 525 IRQ PDM_IRQHandler 526 IRQ I2S_IRQHandler 527 IRQ IPC_IRQHandler 528 IRQ FPU_IRQHandler 529 IRQ GPIOTE1_IRQHandler 530 IRQ KMU_IRQHandler 531 IRQ CRYPTOCELL_IRQHandler 532 533 .end 534