summaryrefslogtreecommitdiff
path: root/libc/sysdeps/linux/mips/crt0.S
diff options
context:
space:
mode:
Diffstat (limited to 'libc/sysdeps/linux/mips/crt0.S')
-rw-r--r--libc/sysdeps/linux/mips/crt0.S50
1 files changed, 50 insertions, 0 deletions
diff --git a/libc/sysdeps/linux/mips/crt0.S b/libc/sysdeps/linux/mips/crt0.S
new file mode 100644
index 000000000..a23a012ad
--- /dev/null
+++ b/libc/sysdeps/linux/mips/crt0.S
@@ -0,0 +1,50 @@
+/* When we enter this piece of code, the program stack looks like this:
+ argc argument counter (integer)
+ argv[0] program name (pointer)
+ argv[1...N] program args (pointers)
+ argv[argc-1] end of args (integer)
+ NULL
+ env[0...N] environment variables (pointers)
+ NULL
+*/
+
+#include <features.h>
+#include "regdef.h"
+
+.text
+.global __start
+.type __start,@function
+
+__start:
+#ifdef __PIC__
+ .set noreorder
+ bltzal zero,0f
+ nop
+0: .cpload $31
+ .set reorder
+#endif
+
+ move $31, zero
+ lw a0, 0($29) /* argc */
+ addu a1, $29, 4 /* argv */
+ addu a2, a0, 1 /* load envp */
+ sll a2, a2, 2
+ add a2, a2, a1
+ /* Ok, now run uClibc's main() -- shouldn't return */
+ jal __uClibc_main
+ hlt: b hlt /* Crash if somehow it does return. */
+
+#if 0 /* this should be provided by crtbegin/crtend in the compiler */
+/* a little bit of stuff to support C++ */
+ .section .ctors,"aw"
+ .align 4
+ .global __CTOR_LIST__
+__CTOR_LIST__:
+ .long -1
+
+ .section .dtors,"aw"
+ .align 4
+ .global __DTOR_LIST__
+__DTOR_LIST__:
+ .long -1
+#endif