From 6315004f6102dca44c4ba50654a36967b8b9c2a6 Mon Sep 17 00:00:00 2001 From: Rich Felker Date: Wed, 11 Jul 2012 04:22:13 -0400 Subject: initial version of mips (o32) port, based on work by Richard Pennington (rdp) basically, this version of the code was obtained by starting with rdp's work from his ellcc source tree, adapting it to musl's build system and coding style, auditing the bits headers for discrepencies with kernel definitions or glibc/LSB ABI or large file issues, fixing up incompatibility with the old binutils from aboriginal linux, and adding some new special cases to deal with the oddities of sigaction and pipe syscall interfaces on mips. at present, minimal test programs work, but some interfaces are broken or missing. threaded programs probably will not link. --- crt/mips/crt1.s | 25 +++++++++++++++++++++++++ crt/mips/crti.s | 15 +++++++++++++++ crt/mips/crtn.s | 13 +++++++++++++ 3 files changed, 53 insertions(+) create mode 100644 crt/mips/crt1.s create mode 100644 crt/mips/crti.s create mode 100644 crt/mips/crtn.s (limited to 'crt/mips') 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 -- cgit v1.2.1