1/* $NetBSD: rtld_start.S,v 1.10 2009/12/14 00:41:19 matt Exp $ */ 2 3/* 4 * Copyright 1997 Michael L. Hitch <mhitch@montana.edu> 5 * Portions copyright 2002 Charles M. Hannum <root@ihack.net> 6 * All rights reserved. 7 * 8 * Redistribution and use in source and binary forms, with or without 9 * modification, are permitted provided that the following conditions 10 * are met: 11 * 1. Redistributions of source code must retain the above copyright 12 * notice, this list of conditions and the following disclaimer. 13 * 2. Redistributions in binary form must reproduce the above copyright 14 * notice, this list of conditions and the following disclaimer in the 15 * documentation and/or other materials provided with the distribution. 16 * 3. The name of the author may not be used to endorse or promote products 17 * derived from this software without specific prior written permission. 18 * 19 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 20 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 21 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 22 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 23 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 24 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 28 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29 */ 30 31#include <mips/asm.h> 32 33.globl _C_LABEL(_rtld_relocate_nonplt_self) 34.globl _C_LABEL(_rtld) 35 36#define PTR_SIZE (1<<PTR_SCALESHIFT) 37 38LEAF(rtld_start) 39 .frame sp, 4*PTR_SIZE, ra 40 .mask 0x10090000,-PTR_SIZE 41 .set noreorder 42 SETUP_GP 43 PTR_SUBU sp, 4*PTR_SIZE # adjust stack pointer 44 SETUP_GP64(s4, rtld_start) 45 SAVE_GP(0) 46 # -> 1*PTR_SIZE(sp) for atexit 47 # -> 2*PTR_SIZE(sp) for obj_main 48 move s0, a0 # save stack pointer from a0 49 move s3, a3 # save ps_strings pointer 50 51 PTR_LA a1, 1f 52 bal 1f 53 PTR_LA t0, _C_LABEL(_rtld_relocate_nonplt_self) 541: PTR_SUBU a1, ra, a1 # relocbase 55 move s2, a1 # save for _rtld 56 PTR_LA a0, _DYNAMIC 57 PTR_ADDU t9, a1, t0 58 jalr t9 # _rtld_relocate_nonplt_self(dynp, relocabase) 59 PTR_ADDU a0, a1, a0 # &_DYNAMIC 60 61 move a1, s2 # relocbase 62 PTR_ADDU a0, sp, 2*PTR_SIZE # sp 63 jal _C_LABEL(_rtld) # v0 = _rtld(sp, relocbase) 64 nop 65 66 PTR_L a1, 2*PTR_SIZE(sp) # our atexit function 67 PTR_L a2, 3*PTR_SIZE(sp) # obj_main entry 68 PTR_ADDU sp, 4*PTR_SIZE # readjust stack 69 move a0, s0 # stack pointer 70 move t9, v0 71 jr t9 # _start(sp, cleanup, obj); 72 move a3, s3 # restore ps_strings 73 74END(rtld_start) 75 76#define XCALLFRAME_SIZ (12*SZREG) 77#define XCALLFRAME_RA (10*SZREG) 78#define XCALLFRAME_GP (9*SZREG) 79#define XCALLFRAME_S0 (8*SZREG) 80#define XCALLFRAME_A3 (7*SZREG) 81#define XCALLFRAME_A2 (6*SZREG) 82#define XCALLFRAME_A1 (5*SZREG) 83#define XCALLFRAME_A0 (4*SZREG) 84#if defined(__mips_n32) || defined(__mips_n64) 85#define XCALLFRAME_A7 (3*SZREG) 86#define XCALLFRAME_A6 (2*SZREG) 87#define XCALLFRAME_A5 (1*SZREG) 88#define XCALLFRAME_A4 (0*SZREG) 89#endif 90 91 .globl _rtld_bind_start 92 .ent _rtld_bind_start 93_rtld_bind_start: 94 .frame sp, XCALLFRAME_SIZ, $15 95 move v1, gp # save old GP 96#if defined(__mips_o32) || defined(__mips_o64) 97 PTR_ADDU t9, 8 # modify T9 to point at .cpload 98#endif 99 SETUP_GP 100 PTR_SUBU sp, XCALLFRAME_SIZ # save arguments and sp value in stack 101 SETUP_GP64(XCALLFRAME_GP, _rtld_bind_start) 102 SAVE_GP(XCALLFRAME_GP) 103#if defined(__mips_n32) || defined(__mips_n64) 104 REG_S a4, XCALLFRAME_A4(sp) 105 REG_S a5, XCALLFRAME_A5(sp) 106 REG_S a6, XCALLFRAME_A6(sp) 107 REG_S a7, XCALLFRAME_A7(sp) 108#endif 109 REG_S a0, XCALLFRAME_A0(sp) 110 REG_S a1, XCALLFRAME_A1(sp) 111 REG_S a2, XCALLFRAME_A2(sp) 112 REG_S a3, XCALLFRAME_A3(sp) 113 REG_S $15, XCALLFRAME_RA(sp) # ra is in t7/t3 114 REG_S s0, XCALLFRAME_S0(sp) 115 move s0, sp 116 move a0, t8 # symbol index 117 move a1, $15 # old RA 118 move a2, v1 # old GP 119 move a3, ra # current RA 120 jal _C_LABEL(_rtld_bind) 121 nop 122 move sp, s0 123 REG_L ra, XCALLFRAME_RA(sp) 124 REG_L s0, XCALLFRAME_S0(sp) 125 REG_L a0, XCALLFRAME_A0(sp) 126 REG_L a1, XCALLFRAME_A1(sp) 127 REG_L a2, XCALLFRAME_A2(sp) 128 REG_L a3, XCALLFRAME_A3(sp) 129#if defined(__mips_n32) || defined(__mips_n64) 130 REG_L a4, XCALLFRAME_A4(sp) 131 REG_L a5, XCALLFRAME_A5(sp) 132 REG_L a6, XCALLFRAME_A6(sp) 133 REG_L a7, XCALLFRAME_A7(sp) 134#endif 135 RESTORE_GP64 136 PTR_ADDU sp, XCALLFRAME_SIZ 137 move t9, v0 138 jr t9 139 nop 140END(_rtld_bind_start) 141