summaryrefslogtreecommitdiff
path: root/bsp/env/start.S
diff options
context:
space:
mode:
Diffstat (limited to 'bsp/env/start.S')
-rw-r--r--bsp/env/start.S51
1 files changed, 51 insertions, 0 deletions
diff --git a/bsp/env/start.S b/bsp/env/start.S
new file mode 100644
index 0000000..77e223d
--- /dev/null
+++ b/bsp/env/start.S
@@ -0,0 +1,51 @@
+// See LICENSE for license details.
+
+ .section .init
+ .globl _start
+ .type _start,@function
+
+_start:
+ la gp, _gp
+ la sp, _sp
+
+ /* Load data section */
+ la a0, _data_lma
+ la a1, _data
+ la a2, _edata
+ bgeu a1, a2, 2f
+1:
+ lw t0, (a0)
+ sw t0, (a1)
+ addi a0, a0, 4
+ addi a1, a1, 4
+ bltu a1, a2, 1b
+2:
+
+ /* Clear bss section */
+ la a0, __bss_start
+ la a1, _end
+ bgeu a0, a1, 2f
+1:
+ sw zero, (a0)
+ addi a0, a0, 4
+ bltu a0, a1, 1b
+2:
+
+ /* Call global constructors */
+ la a0, __libc_fini_array
+ call atexit
+ call __libc_init_array
+
+#ifndef __riscv_float_abi_soft
+ /* Enable FPU */
+ li t0, MSTATUS_FS
+ csrs mstatus, t0
+ csrr t1, mstatus
+ and t1, t1, t0
+ beqz t1, 1f
+ fssr x0
+1:
+#endif
+
+ call main
+ tail exit