Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'libgloss/riscv/crt0.S')
-rw-r--r--libgloss/riscv/crt0.S54
1 files changed, 54 insertions, 0 deletions
diff --git a/libgloss/riscv/crt0.S b/libgloss/riscv/crt0.S
new file mode 100644
index 000000000..35195690c
--- /dev/null
+++ b/libgloss/riscv/crt0.S
@@ -0,0 +1,54 @@
+/* Copyright (c) 2017 SiFive Inc. All rights reserved.
+
+ This copyrighted material is made available to anyone wishing to use,
+ modify, copy, or redistribute it subject to the terms and conditions
+ of the BSD License. This program is distributed in the hope that
+ it will be useful, but WITHOUT ANY WARRANTY expressed or implied,
+ including the implied warranties of MERCHANTABILITY or FITNESS FOR
+ A PARTICULAR PURPOSE. A copy of this license is available at
+ http://www.opensource.org/licenses.
+*/
+
+#=========================================================================
+# crt0.S : Entry point for RISC-V user programs
+#=========================================================================
+
+ .text
+ .global _start
+ .type _start, @function
+_start:
+ # Initialize global pointer
+.option push
+.option norelax
+1:auipc gp, %pcrel_hi(__global_pointer$)
+ addi gp, gp, %pcrel_lo(1b)
+.option pop
+
+ # Clear the bss segment
+ la a0, _edata
+ la a2, _end
+ sub a2, a2, a0
+ li a1, 0
+ call memset
+
+ la a0, __libc_fini_array # Register global termination functions
+ call atexit # to be called upon exit
+ call __libc_init_array # Run global initialization functions
+
+ lw a0, 0(sp) # a0 = argc
+ addi a1, sp, __SIZEOF_POINTER__ # a1 = argv
+ li a2, 0 # a2 = envp = NULL
+ call main
+ tail exit
+ .size _start, .-_start
+
+ .global _init
+ .type _init, @function
+ .global _fini
+ .type _fini, @function
+_init:
+_fini:
+ # These don't have to do anything since we use init_array/fini_array.
+ ret
+ .size _init, .-_init
+ .size _fini, .-_fini