summaryrefslogtreecommitdiffstats
path: root/newlib/libc/sys/arc/crt0.S
diff options
context:
space:
mode:
Diffstat (limited to 'newlib/libc/sys/arc/crt0.S')
-rw-r--r--newlib/libc/sys/arc/crt0.S75
1 files changed, 75 insertions, 0 deletions
diff --git a/newlib/libc/sys/arc/crt0.S b/newlib/libc/sys/arc/crt0.S
new file mode 100644
index 000000000..346339774
--- /dev/null
+++ b/newlib/libc/sys/arc/crt0.S
@@ -0,0 +1,75 @@
+; 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