123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405 |
- // SEGGER Embedded Studio, runtime support.
- //
- // Copyright (c) 2014-2017 SEGGER Microcontroller GmbH & Co KG
- // Copyright (c) 2001-2017 Rowley Associates Limited.
- //
- // This file may be distributed under the terms of the License Agreement
- // provided with this software.
- //
- // THIS FILE IS PROVIDED AS IS WITH NO WARRANTY OF ANY KIND, INCLUDING THE
- // WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
- //
- //
- // Preprocessor Definitions
- // ------------------------
- // APP_ENTRY_POINT
- //
- // Defines the application entry point function, if undefined this setting
- // defaults to "main".
- //
- // INITIALIZE_STACK
- //
- // If defined, the contents of the stack will be initialized to a the
- // value 0xCC.
- //
- // INITIALIZE_SECONDARY_SECTIONS
- //
- // If defined, the .data2, .text2, .rodata2 and .bss2 sections will be initialized.
- //
- // INITIALIZE_TCM_SECTIONS
- //
- // If defined, the .data_tcm, .text_tcm, .rodata_tcm and .bss_tcm sections
- // will be initialized.
- //
- // FULL_LIBRARY
- //
- // If defined then
- // - argc, argv are setup by the debug_getargs.
- // - the exit symbol is defined and executes on return from main.
- // - the exit symbol calls destructors, atexit functions and then debug_exit.
- //
- // If not defined then
- // - argc and argv are zero.
- // - the exit symbol is defined, executes on return from main and loops
- //
- #ifndef APP_ENTRY_POINT
- #define APP_ENTRY_POINT main
- #endif
- #ifndef ARGSSPACE
- #define ARGSSPACE 128
- #endif
- .syntax unified
- .global _start
- .extern APP_ENTRY_POINT
- .global exit
- .weak exit
- .section .init, "ax"
- .code 16
- .align 2
- .thumb_func
- _start:
- /* Set up main stack if size > 0 */
- ldr r1, =__stack_end__
- ldr r0, =__stack_start__
- subs r2, r1, r0
- beq 1f
- #ifdef __ARM_EABI__
- movs r2, #0x7
- bics r1, r2
- #endif
- mov sp, r1
- #ifdef INITIALIZE_STACK
- movs r2, #0xCC
- ldr r0, =__stack_start__
- bl memory_set
- #endif
- 1:
- /* Set up process stack if size > 0 */
- ldr r1, =__stack_process_end__
- ldr r0, =__stack_process_start__
- subs r2, r1, r0
- beq 1f
- #ifdef __ARM_EABI__
- movs r2, #0x7
- bics r1, r2
- #endif
- msr psp, r1
- movs r2, #2
- msr control, r2
- #ifdef INITIALIZE_STACK
- movs r2, #0xCC
- bl memory_set
- #endif
- 1:
- /* Copy initialised memory sections into RAM (if necessary). */
- ldr r0, =__data_load_start__
- ldr r1, =__data_start__
- ldr r2, =__data_end__
- bl memory_copy
- ldr r0, =__start_nrf_sections
- ldr r1, =__start_nrf_sections_run
- ldr r2, =__end_nrf_sections_run
- bl memory_copy
- ldr r0, =__text_load_start__
- ldr r1, =__text_start__
- ldr r2, =__text_end__
- bl memory_copy
- ldr r0, =__fast_load_start__
- ldr r1, =__fast_start__
- ldr r2, =__fast_end__
- bl memory_copy
- ldr r0, =__ctors_load_start__
- ldr r1, =__ctors_start__
- ldr r2, =__ctors_end__
- bl memory_copy
- ldr r0, =__dtors_load_start__
- ldr r1, =__dtors_start__
- ldr r2, =__dtors_end__
- bl memory_copy
- ldr r0, =__rodata_load_start__
- ldr r1, =__rodata_start__
- ldr r2, =__rodata_end__
- bl memory_copy
- ldr r0, =__tdata_load_start__
- ldr r1, =__tdata_start__
- ldr r2, =__tdata_end__
- bl memory_copy
- #ifdef INITIALIZE_SECONDARY_SECTIONS
- ldr r0, =__data2_load_start__
- ldr r1, =__data2_start__
- ldr r2, =__data2_end__
- bl memory_copy
- ldr r0, =__text2_load_start__
- ldr r1, =__text2_start__
- ldr r2, =__text2_end__
- bl memory_copy
- ldr r0, =__rodata2_load_start__
- ldr r1, =__rodata2_start__
- ldr r2, =__rodata2_end__
- bl memory_copy
- #endif /* #ifdef INITIALIZE_SECONDARY_SECTIONS */
- #ifdef INITIALIZE_TCM_SECTIONS
- ldr r0, =__data_tcm_load_start__
- ldr r1, =__data_tcm_start__
- ldr r2, =__data_tcm_end__
- bl memory_copy
- ldr r0, =__text_tcm_load_start__
- ldr r1, =__text_tcm_start__
- ldr r2, =__text_tcm_end__
- bl memory_copy
- ldr r0, =__rodata_tcm_load_start__
- ldr r1, =__rodata_tcm_start__
- ldr r2, =__rodata_tcm_end__
- bl memory_copy
- #endif /* #ifdef INITIALIZE_TCM_SECTIONS */
- /* Zero the bss. */
- ldr r0, =__bss_start__
- ldr r1, =__bss_end__
- movs r2, #0
- bl memory_set
- ldr r0, =__tbss_start__
- ldr r1, =__tbss_end__
- movs r2, #0
- bl memory_set
- #ifdef INITIALIZE_SECONDARY_SECTIONS
- ldr r0, =__bss2_start__
- ldr r1, =__bss2_end__
- mov r2, #0
- bl memory_set
- #endif /* #ifdef INITIALIZE_SECONDARY_SECTIONS */
- #ifdef INITIALIZE_TCM_SECTIONS
- ldr r0, =__bss_tcm_start__
- ldr r1, =__bss_tcm_end__
- mov r2, #0
- bl memory_set
- #endif /* #ifdef INITIALIZE_TCM_SECTIONS */
- /* Initialise the heap */
- ldr r0, = __heap_start__
- ldr r1, = __heap_end__
- subs r1, r1, r0
- cmp r1, #8
- blt 1f
- movs r2, #0
- str r2, [r0]
- adds r0, r0, #4
- str r1, [r0]
- 1:
- /* Call constructors */
- ldr r0, =__ctors_start__
- ldr r1, =__ctors_end__
- ctor_loop:
- cmp r0, r1
- beq ctor_end
- ldr r2, [r0]
- adds r0, #4
- push {r0-r1}
- blx r2
- pop {r0-r1}
- b ctor_loop
- ctor_end:
- /* Setup initial call frame */
- movs r0, #0
- mov lr, r0
- mov r12, sp
- .type start, function
- start:
- /* Jump to application entry point */
- #ifdef FULL_LIBRARY
- movs r0, #ARGSSPACE
- ldr r1, =args
- ldr r2, =debug_getargs
- blx r2
- ldr r1, =args
- #else
- movs r0, #0
- movs r1, #0
- #endif
- ldr r2, =APP_ENTRY_POINT
- blx r2
- .thumb_func
- exit:
- #ifdef FULL_LIBRARY
- mov r5, r0 // save the exit parameter/return result
- /* Call destructors */
- ldr r0, =__dtors_start__
- ldr r1, =__dtors_end__
- dtor_loop:
- cmp r0, r1
- beq dtor_end
- ldr r2, [r0]
- add r0, #4
- push {r0-r1}
- blx r2
- pop {r0-r1}
- b dtor_loop
- dtor_end:
- /* Call atexit functions */
- ldr r2, =_execute_at_exit_fns
- blx r2
- /* Call debug_exit with return result/exit parameter */
- mov r0, r5
- ldr r2, =debug_exit
- blx r2
- #endif
- /* Returned from application entry point, loop forever. */
- exit_loop:
- b exit_loop
- .thumb_func
- memory_copy:
- cmp r0, r1
- beq 2f
- subs r2, r2, r1
- beq 2f
- 1:
- ldrb r3, [r0]
- adds r0, r0, #1
- strb r3, [r1]
- adds r1, r1, #1
- subs r2, r2, #1
- bne 1b
- 2:
- bx lr
- .thumb_func
- memory_set:
- cmp r0, r1
- beq 1f
- strb r2, [r0]
- adds r0, r0, #1
- b memory_set
- 1:
- bx lr
- // default C/C++ library helpers
- .macro HELPER helper_name
- .section .text.\helper_name, "ax", %progbits
- .global \helper_name
- .weak \helper_name
- \helper_name:
- .thumb_func
- .endm
- .macro JUMPTO name
- #if defined(__thumb__) && !defined(__thumb2__)
- mov r12, r0
- ldr r0, =\name
- push {r0}
- mov r0, r12
- pop {pc}
- #else
- b \name
- #endif
- .endm
- HELPER __aeabi_read_tp
- ldr r0, =__tbss_start__-8
- bx lr
- HELPER __heap_lock
- bx lr
- HELPER __heap_unlock
- bx lr
- HELPER __printf_lock
- bx lr
- HELPER __printf_unlock
- bx lr
- HELPER __scanf_lock
- bx lr
- HELPER __scanf_unlock
- bx lr
- HELPER __debug_io_lock
- bx lr
- HELPER __debug_io_unlock
- bx lr
- HELPER abort
- b .
- HELPER __assert
- b .
- HELPER __aeabi_assert
- b .
- HELPER __cxa_pure_virtual
- b .
- HELPER __cxa_guard_acquire
- ldr r3, [r0]
- #if defined(__thumb__) && !defined(__thumb2__)
- movs r0, #1
- tst r3, r0
- #else
- tst r3, #1
- #endif
- beq 1f
- movs r0, #0
- bx lr
- 1:
- movs r0, #1
- bx lr
- HELPER __cxa_guard_release
- movs r3, #1
- str r3, [r0]
- bx lr
- HELPER __cxa_guard_abort
- bx lr
- HELPER __sync_synchronize
- bx lr
- HELPER __open
- JUMPTO debug_fopen
- HELPER __close
- JUMPTO debug_fclose
- HELPER __write
- mov r3, r0
- mov r0, r1
- movs r1, #1
- JUMPTO debug_fwrite
- HELPER __read
- mov r3, r0
- mov r0, r1
- movs r1, #1
- JUMPTO debug_fread
- HELPER __seek
- push {r4, lr}
- mov r4, r0
- bl debug_fseek
- cmp r0, #0
- bne 1f
- mov r0, r4
- bl debug_ftell
- pop {r4, pc}
- 1:
- ldr r0, =-1
- pop {r4, pc}
- // char __user_locale_name_buffer[];
- .section .bss.__user_locale_name_buffer, "aw", %nobits
- .global __user_locale_name_buffer
- .weak __user_locale_name_buffer
- __user_locale_name_buffer:
- .word 0x0
- #ifdef FULL_LIBRARY
- .bss
- args:
- .space ARGSSPACE
- #endif
- /* Setup attibutes of stack and heap sections so they don't take up room in the elf file */
- .section .stack, "wa", %nobits
- .section .stack_process, "wa", %nobits
- .section .heap, "wa", %nobits
|