summaryrefslogtreecommitdiff
path: root/ldso/ldso/mips/resolve.S
blob: 6dc89643ea8e21a878f1029e176bd276bab0ee2c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
/*
 * Linux dynamic resolving code for MIPS. Fixes up the GOT entry as
 * indicated in register t8 and jumps to the resolved address. Shamelessly
 * ripped from 'sysdeps/mips/dl-machine.h' in glibc-2.2.5.
 *
 * This file is subject to the terms and conditions of the GNU Lesser General
 * Public License.  See the file "COPYING.LIB" in the main directory of this
 * archive for more details.
 *
 * Copyright (C) 1996-2001 Kazumoto Kojima <kkojima@info.kanagawa-u.ac.jp>
 * Copyright (C) 2002 Steven J. Hill <sjhill@realitydiluted.com>
 *
 */

.text
.align	2
.globl	_dl_runtime_resolve
.type	_dl_runtime_resolve,@function
.ent	_dl_runtime_resolve
_dl_runtime_resolve:
	.frame	$29, 40, $31
	.set noreorder

	# Save GP.
	move	$3, $28

	# Save arguments and sp value on stack.
	subu	$29, 40

	# Modify t9 ($25) so as to point .cpload instruction.
	addiu	$25, 12

	# Compute GP.
	.set noreorder
	.cpload $25
	.set reorder

	# Save slot call pc.
	move	$2, $31
	.cprestore 32

	# Store function arguments from registers to stack
	sw	$15, 36($29)
	sw	$4, 16($29)
	sw	$5, 20($29)
	sw	$6, 24($29)
	sw	$7, 28($29)

	# Setup functions args and call __dl_runtime_resolve
	move	$4, $24
	move	$5, $3
	jal	__dl_runtime_resolve

	# Restore function arguments from stack to registers
	lw	$31, 36($29)
	lw	$4, 16($29)
	lw	$5, 20($29)
	lw	$6, 24($29)
	lw	$7, 28($29)

	# Do a tail call to the original function
	addiu	$29, 40
	move	$25, $2
	jr	$25
.end	_dl_runtime_resolve
.previous