summaryrefslogtreecommitdiff
path: root/crt/mips
diff options
context:
space:
mode:
Diffstat (limited to 'crt/mips')
-rw-r--r--crt/mips/crt1.s25
-rw-r--r--crt/mips/crti.s15
-rw-r--r--crt/mips/crtn.s13
3 files changed, 53 insertions, 0 deletions
diff --git a/crt/mips/crt1.s b/crt/mips/crt1.s
new file mode 100644
index 00000000..bdb7c1a7
--- /dev/null
+++ b/crt/mips/crt1.s
@@ -0,0 +1,25 @@
+.set noreorder
+
+.weak _init
+.weak _fini
+.global __start
+.global _start
+__start:
+_start:
+ subu $fp, $fp, $fp # Zero the frame pointer.
+ lui $gp, %hi(_gp)
+ addi $gp, %lo(_gp)
+ #la $gp, _gp
+ lw $4, %call16(main)($gp) # Get main() ...
+ lw $5, ($sp) # Get argc...
+ addu $6, $sp, 4 # and argv ...
+ lw $7, %call16(_init)($gp) # and _init() ...
+ addi $sp, $sp, -4*6 # Leave space for arguments 0..3, arg4, and arg5.
+ lw $12, %call16(_fini)($gp) # and _fini() ...
+ sw $12, 4*4($sp) # Save arg4.
+ sw $0, 4*5($sp) # ldso_fini == NULL
+ lw $25, %call16(__libc_start_main)($gp)
+ jalr $25 # Let's go!
+ nop
+ b . # Never gets here.
+ nop
diff --git a/crt/mips/crti.s b/crt/mips/crti.s
new file mode 100644
index 00000000..cbc6e3e9
--- /dev/null
+++ b/crt/mips/crti.s
@@ -0,0 +1,15 @@
+.set noreorder
+
+.section .init
+.global _init
+_init:
+ subu $sp,$sp,32
+ sw $gp,24($sp)
+ sw $ra,28($sp)
+
+.section .fini
+.global _fini
+_fini:
+ subu $sp,$sp,32
+ sw $gp,24($sp)
+ sw $ra,28($sp)
diff --git a/crt/mips/crtn.s b/crt/mips/crtn.s
new file mode 100644
index 00000000..506a04b7
--- /dev/null
+++ b/crt/mips/crtn.s
@@ -0,0 +1,13 @@
+.set noreorder
+
+.section .init
+ lw $gp,24($sp)
+ lw $ra,28($sp)
+ j $ra
+ addu $sp,$sp,32
+
+.section .fini
+ lw $gp,24($sp)
+ lw $ra,28($sp)
+ j $ra
+ addu $sp,$sp,32