diff options
Diffstat (limited to 'libc/sysdeps/linux')
-rw-r--r-- | libc/sysdeps/linux/cris/crt1.S | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/libc/sysdeps/linux/cris/crt1.S b/libc/sysdeps/linux/cris/crt1.S new file mode 100644 index 000000000..e0ba8a4dd --- /dev/null +++ b/libc/sysdeps/linux/cris/crt1.S @@ -0,0 +1,58 @@ +/* Startup code compliant to the ELF CRIS ABI */ + +#include <features.h> + +/* The first piece of initialized data. */ +.data +.global __data_start +.align 2 +.type __data_start, @object +.size __data_start, 4 +__data_start: + .dword 0 + +.text +.align 1 +.global _start +.type _start,%function +#if defined(__UCLIBC_CTOR_DTOR__) +.type _init,%function +.type _fini,%function +#else +.weak _init +.weak _fini +#endif +.type main,%function +.type __uClibc_main,%function + +/* + * On the stack we have argc. We can calculate argv/envp + * from that and the succeeding stack location, but fix so + * we get the right calling convention (regs in r10/r11). + * + * Please view linux/fs/binfmt_elf.c for a complete + * understanding of this. + */ + +/* + * Need to call __uClibc_main(main, argc, argv, _init, _fini) + */ + +_start: + pop $r10 + move.d $sp, $r11 + jump .L1 + +.L1: + Push $srp + Subq 4,$sp + move.d $r10,$r9 + move.d $r11,$r12 + move.d _fini,$r13 + move.d $r13,[$sp] + move.d main,$r10 + move.d $r9,$r11 + move.d _init,$r13 + /* Leave control to the libc */ + jsr __uClibc_main +.size _start,.-_start |