diff options
Diffstat (limited to 'libc/sysdeps/linux/nios2/crt0.S')
-rw-r--r-- | libc/sysdeps/linux/nios2/crt0.S | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/libc/sysdeps/linux/nios2/crt0.S b/libc/sysdeps/linux/nios2/crt0.S new file mode 100644 index 000000000..95c9450cd --- /dev/null +++ b/libc/sysdeps/linux/nios2/crt0.S @@ -0,0 +1,64 @@ +/* + * 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> + * + */ + +#include <features.h> +#include <asm/unistd.h> + + .global _start + .type __start,@function + .weak _init + .weak _fini + .type __uClibc_start_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 argc, argv, envp from stack */ + ldw r4, 0(sp) + ldw r5, 4(sp) + ldw r6, 8(sp) + + /* 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) + + /* call uClibc_main, shouldn't return */ +#ifdef __PIC__ + /* just pray 16 bit offset is enough */ + br __uClibc_start_main +#else + call __uClibc_start_main +#endif + + /* crash in the event of return */ +__exit: + movui r2, TRAP_ID_SYSCALL + movui r3, __NR_exit + trap
\ No newline at end of file |