svn commit: r204562 - user/jmallett/octeon/libexec/rtld-elf/mips

Juli Mallett jmallett at FreeBSD.org
Tue Mar 2 08:22:48 UTC 2010


Author: jmallett
Date: Tue Mar  2 08:22:48 2010
New Revision: 204562
URL: http://svn.freebsd.org/changeset/base/204562

Log:
  Bring in some of an n32 and n64 patch from imp at .  Fix some comments, whitespace
  and don't gratuitously adjust the stack.  This is incomplete wrt n64 at least,
  but is enough that n32 gets as far as trying to run libc's .init section and
  blowing up somewhere after that.

Modified:
  user/jmallett/octeon/libexec/rtld-elf/mips/rtld_start.S

Modified: user/jmallett/octeon/libexec/rtld-elf/mips/rtld_start.S
==============================================================================
--- user/jmallett/octeon/libexec/rtld-elf/mips/rtld_start.S	Tue Mar  2 08:13:11 2010	(r204561)
+++ user/jmallett/octeon/libexec/rtld-elf/mips/rtld_start.S	Tue Mar  2 08:22:48 2010	(r204562)
@@ -1,5 +1,4 @@
 /*	$NetBSD: rtld_start.S,v 1.9 2002/10/05 11:59:05 mycroft Exp $	*/
-/* $FreeBSD$ */
 
 /*
  * Copyright 1997 Michael L. Hitch <mhitch at montana.edu>
@@ -34,16 +33,32 @@
 .globl _C_LABEL(_rtld_relocate_nonplt_self)
 .globl _C_LABEL(_rtld)
 
+/*
+ *      a0      stack pointer
+ *      a1      rtld cleanup (filled in by dynamic loader)
+ *      a2      rtld object (filled in by dynamic loader)
+ *      a3      ps_strings
+ */
 LEAF(rtld_start)
 	.abicalls
 	.set	noreorder
 
+#if defined(__mips_n32) || defined(__mips_n64)
+	.cpsetup $25, $24, rtld_start
+#else
 	.cpload t9
+#endif
+
 	addu	sp, sp, -16		/* adjust stack pointer		*/
 					/*	keep it aligned		*/
+
+#if defined(__mips_n32) || defined(__mips_n64)
+	sw	gp, 0(sp)
+#else
 	.cprestore 0			/* -> 0(sp) for gp		*/
-					/* -> 4(sp) for atexit		*/
-					/* -> 8(sp) for obj_main	*/
+#endif
+	sw	a1, 4(sp)		/* -> 4(sp) for atexit		*/
+	sw	a2, 8(sp)		/* -> 8(sp) for obj_main	*/
 	move	s0, a0			/* save stack pointer from a0	*/
 	move	s1, a3			/* save ps_strings pointer	*/
 
@@ -51,32 +66,31 @@ LEAF(rtld_start)
 	bal	1f
 	nop
 1:	subu	a1, ra, a1		/* relocbase */
-	la	t9,_C_LABEL(_rtld_relocate_nonplt_self)
+	la	t9, _C_LABEL(_rtld_relocate_nonplt_self)
 	move	s2, a1
-	la	a0,_DYNAMIC
+	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			*/
 
-	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) */
+	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
 
+	move	a0, s0			/* restore stack pointer from a0*/
+	move	a3, s1			/* restore ps_strings		*/
+	jr      t9                      /* _start(ap, cleanup, obj, ps_strings);        */
+	nop
 END(rtld_start)
 
 	.globl	_rtld_bind_start
@@ -88,39 +102,73 @@ _rtld_bind_start:
 	 */
 	.frame sp, 0, ra		/* satisfy compiler		*/
 
-	move	v1,gp			/* save old GP			*/
-	add	t9,8			/* modify T9 to point at .cpload */
+	move	v1, gp			/* save old GP			 */
+	
+#if defined(__mips_n32) || defined(__mips_n64)
+	subu	sp, 60			/* save arguments and sp value	*/
+	sw	gp, 36(sp)
+	.cpsetup $25, $12, _rtld_bind_start  
+#else
+	add	t9, 8			/* modify T9 to point at .cpload */
 	.cpload	t9
-	subu	sp, 48			/* save arguments and sp value	*/
+	subu	sp, 44			/* save arguments and sp value	*/
 	.cprestore 36
+#endif
 	sw	a0, 16(sp)
 	sw	a1, 20(sp)
 	sw	a2, 24(sp)
 	sw	a3, 28(sp)
 	sw	s0, 32(sp)
+#if defined(__mips_n64) || defined(__mips_n32)
+	sw	t3, 40(sp)
+	sw	a4, 44(sp)
+	sw	a5, 48(sp)
+	sw	a6, 52(sp)
+	sw	a7, 56(sp)
+#else
 	sw	t7, 40(sp)
+#endif
 	move	s0, sp
 	move	a0, v1			/* old GP			*/
-	subu	a0, a0,0x7ff0		/* The offset of $gp from the	*/
+	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.	*/
-
+#if defined(__mips_n64) 
+	ld	a0, 8(a0)		/* object = pltgot[1] & 0x7fffffff */
+#else
 	lw	a0, 4(a0)		/* object = pltgot[1] & 0x7fffffff */
-	and	a0, a0,0x7fffffff
+#endif
+	and	a0, a0, 0x7fffffff
 	move	a1, t8			/* symbol index */
 					
 	jal	_C_LABEL(_mips_rtld_bind)
 	nop
+
 	move	sp, s0
+	
+#if defined(__mips_n64) || defined(__mips_n32)
+	lw	gp, 36(sp)
+#endif
+	
 	lw	ra, 40(sp)
 	lw	a0, 16(sp)
-	lw	a1, 20(sp)
+ 	lw	a1, 20(sp)
 	lw	a2, 24(sp)
 	lw	a3, 28(sp)
 	lw	s0, 32(sp)
-	addu	sp, 48
+	
+#if defined(__mips_n64) || defined(__mips_n32)
+	lw	a4, 44(sp)
+	lw	a5, 48(sp)
+	lw	a6, 52(sp)
+	lw	a7, 56(sp)
+	addu	sp, 60
+	
+#else
+	addu	sp, 44
+#endif
 	move	t9, v0
 	jr	t9
 	nop


More information about the svn-src-user mailing list