summaryrefslogtreecommitdiff
path: root/libc/sysdeps/linux/nios2/crt1.S
diff options
context:
space:
mode:
Diffstat (limited to 'libc/sysdeps/linux/nios2/crt1.S')
-rw-r--r--libc/sysdeps/linux/nios2/crt1.S70
1 files changed, 70 insertions, 0 deletions
diff --git a/libc/sysdeps/linux/nios2/crt1.S b/libc/sysdeps/linux/nios2/crt1.S
new file mode 100644
index 000000000..948eeb1ed
--- /dev/null
+++ b/libc/sysdeps/linux/nios2/crt1.S
@@ -0,0 +1,70 @@
+/*
+ * libc/sysdeps/linux/nios2/crt0.S -- entry point for linux/nios2
+ *
+ * Copyright (C) 2004,05,06 Microtronix Datacom Ltd
+ *
+ * This file is subject to the terms and conditions of the GNU Lesser
+ * General Public License. See the file COPYING.LIB in the main
+ * directory of this archive for more details.
+ *
+ * Written by Wentao Xu <wentao@microtronix.com>
+ * Updated by Thomas Chou <thomas@wytron.com.tw> for crt1.S
+ *
+ */
+
+#include <features.h>
+#include <asm/unistd.h>
+
+ .global _start
+ .type __start,@function
+ .weak _init
+ .weak _fini
+ .type main,@function
+ .type __uClibc_main,@function
+ .type __h_errno_location, @function
+ .type _stdio_init, @function
+ .type _stdio_term, @function
+ .text
+ .balign 4
+_start:
+ nop
+ br 0f
+ .long _stext /* start address of .text + 4 */
+ .long _etext /* start address of .data */
+ .long _edata /* start address of .bss */
+0:
+ /* load gp */
+ movhi gp, %hiadj(_gp)
+ addi gp, gp, %lo(_gp)
+
+ /* load main, argc, argv from stack */
+ movhi r4, %hi(main)
+ ori r4, r4, %lo(main) /* main */
+ ldw r5, 0(sp) /* argc */
+ ldw r6, 4(sp) /* argv */
+
+ /* load the 4th arg */
+ movhi r7, %hi(_init)
+ ori r7, r7, %lo(_init)
+
+ /* reuse the argc stack slot for the 5th arg */
+ movhi r8, %hi(_fini)
+ ori r8, r8, %lo(_fini)
+ stw r8, 0(sp)
+
+ stw r2, 4(sp) /* rtld_fini */
+ stw sp, 8(sp) /* stack_end */
+
+ /* call uClibc_main, shouldn't return */
+#ifdef __PIC__
+ /* just pray 16 bit offset is enough */
+ br __uClibc_main
+#else
+ call __uClibc_main
+#endif
+
+ /* crash in the event of return */
+__exit:
+ movui r2, TRAP_ID_SYSCALL
+ movui r3, __NR_exit
+ trap