aboutsummaryrefslogtreecommitdiff
path: root/libexec/rtld-elf/mips/rtld_start.S
diff options
context:
space:
mode:
Diffstat (limited to 'libexec/rtld-elf/mips/rtld_start.S')
-rw-r--r--libexec/rtld-elf/mips/rtld_start.S127
1 files changed, 127 insertions, 0 deletions
diff --git a/libexec/rtld-elf/mips/rtld_start.S b/libexec/rtld-elf/mips/rtld_start.S
new file mode 100644
index 000000000000..138729dcaee3
--- /dev/null
+++ b/libexec/rtld-elf/mips/rtld_start.S
@@ -0,0 +1,127 @@
+/* $NetBSD: rtld_start.S,v 1.9 2002/10/05 11:59:05 mycroft Exp $ */
+/* $FreeBSD$ */
+
+/*
+ * Copyright 1997 Michael L. Hitch <mhitch@montana.edu>
+ * Portions copyright 2002 Charles M. Hannum <root@ihack.net>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <machine/asm.h>
+
+.globl _C_LABEL(_rtld_relocate_nonplt_self)
+.globl _C_LABEL(_rtld)
+
+LEAF(rtld_start)
+ .abicalls
+ .set noreorder
+
+ .cpload t9
+ addu sp, sp, -16 /* adjust stack pointer */
+ /* keep it aligned */
+ .cprestore 0 /* -> 0(sp) for gp */
+ /* -> 4(sp) for atexit */
+ /* -> 8(sp) for obj_main */
+ move s0,a0 /* save stack pointer from a0 */
+ move s1,a3 /* save ps_strings pointer */
+
+ la a1, 1f
+ bal 1f
+ nop
+1: subu a1, ra, a1 /* relocbase */
+ la t9,_C_LABEL(_rtld_relocate_nonplt_self)
+ move s2,a1
+ la a0,_DYNAMIC
+ addu t9, a1, t9
+ jalr t9
+ addu a0, a1, a0 /* &_DYNAMIC */
+
+
+ move a0, s0 /* stack pointer */
+ addu a1, sp, 4 /* &exit_proc */
+ addu a2, sp, 8 /* &objp */
+ addu sp, sp, -16 /* arguments slot */
+ jal _C_LABEL(_rtld) /* v0 = _rtld(sp, exit_proc, objp) */
+ nop
+ addu sp, sp, 16
+
+ move a0, s0 /* arguments pointer */
+ move a3, s1 /* arguments pointer */
+ lw a1, 4(sp) /* our atexit function */
+ lw a2, 8(sp) /* obj_main entry */
+ addu sp, sp, 16 /* readjust stack */
+ move t9,v0
+ move a2,s1 /* restore ps_strings */
+ jr t9 /* _start(ap, cleanup, obj, ps_strings); */
+ nop
+
+END(rtld_start)
+
+ .globl _rtld_bind_start
+ .ent _rtld_bind_start
+_rtld_bind_start:
+ /* ABI conventions for stubs:
+ * t8 contains symbol index
+ * t7 contains return address
+ */
+ .frame sp, 0, ra /* satisfy compiler */
+
+ move v1,gp /* save old GP */
+ add t9,8 /* modify T9 to point at .cpload */
+ .cpload t9
+ subu sp,48 /* save arguments and sp value */
+ .cprestore 36
+ sw a0,16(sp)
+ sw a1,20(sp)
+ sw a2,24(sp)
+ sw a3,28(sp)
+ sw s0,32(sp)
+ sw t7,40(sp)
+ move s0,sp
+ move a0,v1 /* old GP */
+ subu a0,a0,0x7ff0 /* The offset of $gp from the */
+ /* beginning of the .got section: */
+ /* $gp = .got + 0x7ff0, so */
+ /* .got = $gp - 0x7ff0 */
+ /* Simple math as you can see. */
+
+ lw a0,4(a0) /* object = pltgot[1] & 0x7fffffff */
+ and a0,a0,0x7fffffff
+ move a1,t8 /* symbol index */
+
+ jal _C_LABEL(_mips_rtld_bind)
+ nop
+ move sp,s0
+ lw ra,40(sp)
+ lw a0,16(sp)
+ lw a1,20(sp)
+ lw a2,24(sp)
+ lw a3,28(sp)
+ lw s0,32(sp)
+ addu sp,48
+ move t9,v0
+ jr t9
+ nop
+ .end _rtld_bind_start