about summary refs log tree commit diff
path: root/crt
diff options
context:
space:
mode:
Diffstat (limited to 'crt')
-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