rtld_start.S revision 177924
1/*	$NetBSD: rtld_start.S,v 1.9 2002/10/05 11:59:05 mycroft Exp $	*/
2/* $FreeBSD: head/libexec/rtld-elf/mips/rtld_start.S 177924 2008-04-04 20:59:26Z imp $ */
3
4/*
5 * Copyright 1997 Michael L. Hitch <mhitch@montana.edu>
6 * Portions copyright 2002 Charles M. Hannum <root@ihack.net>
7 * All rights reserved.
8 *
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions
11 * are met:
12 * 1. Redistributions of source code must retain the above copyright
13 *    notice, this list of conditions and the following disclaimer.
14 * 2. Redistributions in binary form must reproduce the above copyright
15 *    notice, this list of conditions and the following disclaimer in the
16 *    documentation and/or other materials provided with the distribution.
17 * 3. The name of the author may not be used to endorse or promote products
18 *    derived from this software without specific prior written permission.
19 *
20 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
21 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
22 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
23 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
24 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
25 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
29 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30 */
31
32#include <machine/asm.h>
33
34.globl _C_LABEL(_rtld_relocate_nonplt_self)
35.globl _C_LABEL(_rtld)
36
37LEAF(rtld_start)
38	.abicalls
39	.set	noreorder
40
41	.cpload t9
42	addu	sp, sp, -16		/* adjust stack pointer		*/
43					/*	keep it aligned		*/
44	.cprestore 0			/* -> 0(sp) for gp		*/
45					/* -> 4(sp) for atexit		*/
46					/* -> 8(sp) for obj_main	*/
47	move	s0,a0			/* save stack pointer from a0	*/
48	move	s1,a3			/* save ps_strings pointer	*/
49
50	la	a1, 1f
51	bal	1f
52	nop
531:	subu	a1, ra, a1		/* relocbase */
54	la	t9,_C_LABEL(_rtld_relocate_nonplt_self)
55	move	s2,a1
56	la	a0,_DYNAMIC
57	addu	t9, a1, t9
58	jalr	t9
59	addu	a0, a1, a0		/* &_DYNAMIC */
60
61
62	move	a0, s0			/* stack pointer		*/
63	addu	a1, sp, 4		/* &exit_proc			*/
64	addu	a2, sp, 8		/* &objp			*/
65	addu	sp, sp, -16		/* arguments slot		*/
66	jal	_C_LABEL(_rtld)		/* v0 = _rtld(sp, exit_proc, objp) */
67	nop
68	addu	sp, sp, 16
69
70	move	a0, s0			/* arguments pointer		*/
71	move	a3, s1			/* arguments pointer		*/
72	lw	a1, 4(sp)		/* our atexit function		*/
73	lw	a2, 8(sp)		/* obj_main entry		*/
74	addu	sp, sp, 16		/* readjust stack		*/
75	move	t9,v0
76	move	a2,s1			/* restore ps_strings		*/
77	jr	t9			/* _start(ap, cleanup, obj, ps_strings);	*/
78	nop
79
80END(rtld_start)
81
82	.globl	_rtld_bind_start
83	.ent	_rtld_bind_start
84_rtld_bind_start:
85	/* ABI conventions for stubs:
86	 *   t8 contains symbol index
87	 *   t7 contains return address
88	 */
89	.frame sp, 0, ra		/* satisfy compiler		*/
90
91	move	v1,gp			/* save old GP			*/
92	add	t9,8			/* modify T9 to point at .cpload */
93	.cpload	t9
94	subu	sp,48			/* save arguments and sp value	*/
95	.cprestore 36
96	sw	a0,16(sp)
97	sw	a1,20(sp)
98	sw	a2,24(sp)
99	sw	a3,28(sp)
100	sw	s0,32(sp)
101	sw	t7,40(sp)
102	move	s0,sp
103	move	a0,v1			/* old GP			*/
104	subu	a0,a0,0x7ff0		/* The offset of $gp from the	*/
105					/* beginning of the .got section: */
106					/* $gp = .got + 0x7ff0, so	*/
107					/* .got = $gp - 0x7ff0		*/
108					/* Simple math as you can see.	*/
109
110	lw	a0,4(a0)		/* object = pltgot[1] & 0x7fffffff */
111	and	a0,a0,0x7fffffff
112	move	a1,t8			/* symbol index */
113
114	jal	_C_LABEL(_mips_rtld_bind)
115	nop
116	move	sp,s0
117	lw	ra,40(sp)
118	lw	a0,16(sp)
119	lw	a1,20(sp)
120	lw	a2,24(sp)
121	lw	a3,28(sp)
122	lw	s0,32(sp)
123	addu	sp,48
124	move	t9,v0
125	jr	t9
126	nop
127	.end	_rtld_bind_start
128