libc/newlib/libc/sys/arc/crt0.S

76 lines
1.6 KiB
ArmAsm

; ARC start up file
; In the absence of a custom linker script, go with something simple.
; We do not support passing arguments to "main", but this is an embedded
; system anyway.
;
; We call init/fini here without cpu prefixes because there is always
; only one .init/.fini section per image.
.section .text
.align 4
.global start
start:
mov sp,end ; Round "sp" up to page after "end".
add sp,sp,4095
and sp,sp,-4096
ld r8,[stack_size] ; Add stack size to "sp".
add sp,sp,r8
st sp,[sbrk_start] ; Initialize malloc heap.
st sp,[sbrk_loc]
sub sp,sp,16 ; callee expects 16 bytes already "pushed".
mov fp,0 ; Top of stack frame indicator.
mov r0,edata ; Zero bss.
mov r2,end
sub r2,r2,r0
mov r1,0
#ifdef __base__
bl.nd _memset
bl.nd init ; .init section entry point.
mov r0,%st(fini) ; .fini section entry point.
bl.nd _atexit
mov r0,0 ; argc
mov r1,0 ; argv
bl.nd _main
bl.nd _exit
#endif
#ifdef __host__
bl.nd _host_memset
bl.nd init ; .init section entry point.
mov r0,%st(fini) ; .fini section entry point.
bl.nd _host_atexit
mov r0,0 ; argc
mov r1,0 ; argv
bl.nd _host_main
bl.nd _host_exit
#endif
#ifdef __graphics__
bl.nd _graphics_memset
bl.nd init ; .init section entry point.
mov r0,%st(fini) ; .fini section entry point.
bl.nd _graphics_atexit
mov r0,0 ; argc
mov r1,0 ; argv
bl.nd _graphics_main
bl.nd _graphics_exit
#endif
#ifdef __audio__
bl.nd _audio_memset
bl.nd init ; .init section entry point.
mov r0,%st(fini) ; .fini section entry point.
bl.nd _audio_atexit
mov r0,0 ; argc
mov r1,0 ; argv
bl.nd _audio_main
bl.nd _audio_exit
#endif