Home | History | Annotate | Line # | Download | only in powerpc
rtld_start.S revision 1.7
      1  1.7  mycroft /*	$NetBSD: rtld_start.S,v 1.7 2002/09/11 21:14:08 mycroft Exp $	*/
      2  1.1   tsubai 
      3  1.1   tsubai /*-
      4  1.1   tsubai  * Copyright (C) 1998	Tsubai Masanari
      5  1.1   tsubai  * All rights reserved.
      6  1.1   tsubai  *
      7  1.1   tsubai  * Redistribution and use in source and binary forms, with or without
      8  1.1   tsubai  * modification, are permitted provided that the following conditions
      9  1.1   tsubai  * are met:
     10  1.1   tsubai  * 1. Redistributions of source code must retain the above copyright
     11  1.1   tsubai  *    notice, this list of conditions and the following disclaimer.
     12  1.1   tsubai  * 2. Redistributions in binary form must reproduce the above copyright
     13  1.1   tsubai  *    notice, this list of conditions and the following disclaimer in the
     14  1.1   tsubai  *    documentation and/or other materials provided with the distribution.
     15  1.1   tsubai  * 3. The name of the author may not be used to endorse or promote products
     16  1.1   tsubai  *    derived from this software without specific prior written permission.
     17  1.1   tsubai  *
     18  1.1   tsubai  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
     19  1.1   tsubai  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
     20  1.1   tsubai  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     21  1.1   tsubai  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
     22  1.1   tsubai  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
     23  1.1   tsubai  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     24  1.1   tsubai  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     25  1.1   tsubai  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     26  1.1   tsubai  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     27  1.1   tsubai  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     28  1.1   tsubai  */
     29  1.1   tsubai 
     30  1.1   tsubai #include <machine/asm.h>
     31  1.1   tsubai 
     32  1.1   tsubai 	.globl	_rtld_start
     33  1.1   tsubai 	.globl	_rtld
     34  1.1   tsubai 
     35  1.1   tsubai 	.text
     36  1.1   tsubai 
     37  1.1   tsubai _rtld_start:
     38  1.1   tsubai 	stwu	1,-48(1)
     39  1.1   tsubai 	stw	3,12(1)			# argc
     40  1.1   tsubai 	stw	4,16(1)			# argv
     41  1.1   tsubai 	stw	5,20(1)			# envp
     42  1.1   tsubai /*	stw	6,24(1)			# obj		(always 0) */
     43  1.1   tsubai /*	stw	7,28(1)			# cleanup	(always 0) */
     44  1.1   tsubai 	stw	8,32(1)			# ps_strings
     45  1.1   tsubai 
     46  1.5  mycroft 	bl	_GLOBAL_OFFSET_TABLE_@local-4
     47  1.5  mycroft 	mflr	11			# r11 = (real) GOT
     48  1.1   tsubai 	lwz	10,_GLOBAL_OFFSET_TABLE_@got(11)
     49  1.1   tsubai 					# the linker thought GOT were ...
     50  1.7  mycroft 	lwz	3,_DYNAMIC@got(11)
     51  1.7  mycroft 	subf	4,10,11			# r4 = relocbase
     52  1.7  mycroft 	add	3,3,4			# r3 = &_DYNAMIC
     53  1.7  mycroft 	bl	_rtld_relocate_nonplt_self@plt
     54  1.1   tsubai 
     55  1.1   tsubai 	lwz	4,16(1)
     56  1.1   tsubai 	addi	3,4,-12			# sp = &argv[-3]	/* XXX */
     57  1.1   tsubai 
     58  1.1   tsubai 	bl	_rtld@plt		# _start = _rtld(sp)
     59  1.1   tsubai 	mtlr	3
     60  1.1   tsubai 
     61  1.1   tsubai 	lwz	3,12(1)			# argc
     62  1.1   tsubai 	lwz	4,16(1)			# argv
     63  1.1   tsubai 	lwz	5,20(1)			# envp
     64  1.1   tsubai 	lwz	6,-8(4)			# obj = sp[1] (== argv[-2])
     65  1.1   tsubai 	lwz	7,-12(4)		# cleanup = sp[0] (== argv[-3])
     66  1.1   tsubai 	lwz	8,32(1)			# ps_strings
     67  1.1   tsubai 
     68  1.1   tsubai 	addi	1,1,48
     69  1.1   tsubai 	blrl		# _start(argc, argv, envp, obj, cleanup, ps_strings)
     70  1.1   tsubai 
     71  1.1   tsubai 	li	0,1			# _exit()
     72  1.1   tsubai 	sc
     73  1.1   tsubai 
     74  1.1   tsubai 
     75  1.1   tsubai 	.globl	_rtld_bind_start
     76  1.1   tsubai 	.globl	_rtld_bind_powerpc
     77  1.1   tsubai 
     78  1.1   tsubai _rtld_bind_start:
     79  1.1   tsubai 	stwu	1,-160(1)
     80  1.4  mycroft 
     81  1.1   tsubai 	stw	0,20(1)
     82  1.1   tsubai 	mflr	0
     83  1.1   tsubai 	stw	0,16(1)			# save lr
     84  1.4  mycroft 	mfcr	0
     85  1.4  mycroft 	stw	0,12(1)			# save cr
     86  1.1   tsubai 	stmw	3,24(1)			# save r3-r31
     87  1.1   tsubai 
     88  1.1   tsubai 	mr	3,12			# obj
     89  1.1   tsubai 	mr	4,11			# reloff
     90  1.1   tsubai 	bl	_rtld_bind_powerpc@plt	# _rtld_bind(obj, reloff)
     91  1.1   tsubai 	mtctr	3
     92  1.1   tsubai 
     93  1.4  mycroft 	lmw	3,24(1)			# load r3-r31
     94  1.4  mycroft 	lwz	0,12(1)			# restore cr
     95  1.4  mycroft 	mtcr	0
     96  1.1   tsubai 	lwz	0,16(1)			# restore lr
     97  1.1   tsubai 	mtlr	0
     98  1.1   tsubai 	lwz	0,20(1)
     99  1.4  mycroft 
    100  1.1   tsubai 	addi	1,1,160
    101  1.1   tsubai 	bctr
    102  1.1   tsubai 
    103  1.1   tsubai 	.globl	_rtld_powerpc_pltcall
    104  1.1   tsubai 	.globl	_rtld_powerpc_pltresolve
    105  1.1   tsubai 
    106  1.1   tsubai _rtld_powerpc_pltcall:
    107  1.1   tsubai 	slwi	11,11,2
    108  1.1   tsubai 	addis	11,11,0			# addis	11,11,jmptab@ha
    109  1.1   tsubai 	lwz	11,0(11)		# lwz	11,jmptab@l(11)
    110  1.1   tsubai 	mtctr	11
    111  1.1   tsubai 	bctr
    112  1.1   tsubai 
    113  1.1   tsubai _rtld_powerpc_pltresolve:
    114  1.1   tsubai 	lis	12,0			# lis	12,_rtld_bind_start@ha
    115  1.1   tsubai 	addi	12,12,0			# addi	12,12,_rtld_bind_start@l
    116  1.1   tsubai 	mtctr	12
    117  1.1   tsubai 	lis	12,0			# lis	12,obj@ha
    118  1.1   tsubai 	addi	12,12,0			# addi	12,12,obj@l
    119  1.1   tsubai 	bctr
    120