diff options
Diffstat (limited to 'crt')
-rw-r--r-- | crt/mips/crt1.s | 25 | ||||
-rw-r--r-- | crt/mips/crti.s | 15 | ||||
-rw-r--r-- | crt/mips/crtn.s | 13 |
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 |