Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 31 Jan 2010 23:39:56 +0000 (UTC)
From:      Nathan Whitehorn <nwhitehorn@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   svn commit: r203330 - in projects/ppc64: lib/libc/powerpc64/gen libexec/rtld-elf/powerpc64 sys/sys
Message-ID:  <201001312339.o0VNdun7073321@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: nwhitehorn
Date: Sun Jan 31 23:39:55 2010
New Revision: 203330
URL: http://svn.freebsd.org/changeset/base/203330

Log:
  More hacking at RTLD. TLS is still broken, among other (unknown) things,
  but RTLD is making its first halting steps toward functionality. Very
  simple programs like /bin/echo now work.

Modified:
  projects/ppc64/lib/libc/powerpc64/gen/_set_tp.c
  projects/ppc64/lib/libc/powerpc64/gen/_setjmp.S
  projects/ppc64/lib/libc/powerpc64/gen/setjmp.S
  projects/ppc64/lib/libc/powerpc64/gen/sigsetjmp.S
  projects/ppc64/libexec/rtld-elf/powerpc64/reloc.c
  projects/ppc64/libexec/rtld-elf/powerpc64/rtld_machdep.h
  projects/ppc64/libexec/rtld-elf/powerpc64/rtld_start.S
  projects/ppc64/sys/sys/elf_common.h

Modified: projects/ppc64/lib/libc/powerpc64/gen/_set_tp.c
==============================================================================
--- projects/ppc64/lib/libc/powerpc64/gen/_set_tp.c	Sun Jan 31 23:16:10 2010	(r203329)
+++ projects/ppc64/lib/libc/powerpc64/gen/_set_tp.c	Sun Jan 31 23:39:55 2010	(r203330)
@@ -29,7 +29,7 @@
 void
 _set_tp(void *tpval)
 {
-	register void *tp __asm__("r2");
+	register void *tp __asm__("r13");
 
-	__asm __volatile("mr %0,%1" : "=r"(tp) : "r"((char*)tpval + 0x7008));
+	__asm __volatile("mr %0,%1" : "=r"(tp) : "r"((char*)tpval + 0x7016));
 }

Modified: projects/ppc64/lib/libc/powerpc64/gen/_setjmp.S
==============================================================================
--- projects/ppc64/lib/libc/powerpc64/gen/_setjmp.S	Sun Jan 31 23:16:10 2010	(r203329)
+++ projects/ppc64/lib/libc/powerpc64/gen/_setjmp.S	Sun Jan 31 23:39:55 2010	(r203330)
@@ -64,20 +64,20 @@ ENTRY(_setjmp)
 	std	%r15,40 + 6*8(%r3)
 	std	%r16,40 + 7*8(%r3)
 	std	%r17,40 + 8*8(%r3)
-	std	%r18,40 + 10*8(%r3)
-	std	%r19,40 + 11*8(%r3)
-	std	%r20,40 + 12*8(%r3)
-	std	%r21,40 + 13*8(%r3)
-	std	%r22,40 + 14*8(%r3)
-	std	%r23,40 + 15*8(%r3)
-	std	%r24,40 + 16*8(%r3)
-	std	%r25,40 + 17*8(%r3)
-	std	%r26,40 + 18*8(%r3)
-	std	%r27,40 + 19*8(%r3)
-	std	%r28,40 + 20*8(%r3)
-	std	%r29,40 + 21*8(%r3)
-	std	%r30,40 + 22*8(%r3)
-	std	%r31,40 + 23*8(%r3)
+	std	%r18,40 + 9*8(%r3)
+	std	%r19,40 + 10*8(%r3)
+	std	%r20,40 + 11*8(%r3)
+	std	%r21,40 + 12*8(%r3)
+	std	%r22,40 + 13*8(%r3)
+	std	%r23,40 + 14*8(%r3)
+	std	%r24,40 + 15*8(%r3)
+	std	%r25,40 + 16*8(%r3)
+	std	%r26,40 + 17*8(%r3)
+	std	%r27,40 + 18*8(%r3)
+	std	%r28,40 + 19*8(%r3)
+	std	%r29,40 + 20*8(%r3)
+	std	%r30,40 + 21*8(%r3)
+	std	%r31,40 + 22*8(%r3)
 	li	%r3,0
 	blr
 
@@ -91,20 +91,20 @@ ENTRY(_longjmp)
 	ld	%r15,40 + 6*8(%r3)
 	ld	%r16,40 + 7*8(%r3)
 	ld	%r17,40 + 8*8(%r3)
-	ld	%r18,40 + 10*8(%r3)
-	ld	%r19,40 + 11*8(%r3)
-	ld	%r20,40 + 12*8(%r3)
-	ld	%r21,40 + 13*8(%r3)
-	ld	%r22,40 + 14*8(%r3)
-	ld	%r23,40 + 15*8(%r3)
-	ld	%r24,40 + 16*8(%r3)
-	ld	%r25,40 + 17*8(%r3)
-	ld	%r26,40 + 18*8(%r3)
-	ld	%r27,40 + 19*8(%r3)
-	ld	%r28,40 + 20*8(%r3)
-	ld	%r29,40 + 21*8(%r3)
-	ld	%r30,40 + 22*8(%r3)
-	ld	%r31,40 + 23*8(%r3)
+	ld	%r18,40 + 9*8(%r3)
+	ld	%r19,40 + 10*8(%r3)
+	ld	%r20,40 + 11*8(%r3)
+	ld	%r21,40 + 12*8(%r3)
+	ld	%r22,40 + 13*8(%r3)
+	ld	%r23,40 + 14*8(%r3)
+	ld	%r24,40 + 15*8(%r3)
+	ld	%r25,40 + 16*8(%r3)
+	ld	%r26,40 + 17*8(%r3)
+	ld	%r27,40 + 18*8(%r3)
+	ld	%r28,40 + 19*8(%r3)
+	ld	%r29,40 + 20*8(%r3)
+	ld	%r30,40 + 21*8(%r3)
+	ld	%r31,40 + 22*8(%r3)
 
 	mtlr	%r11
 	mtcr	%r12

Modified: projects/ppc64/lib/libc/powerpc64/gen/setjmp.S
==============================================================================
--- projects/ppc64/lib/libc/powerpc64/gen/setjmp.S	Sun Jan 31 23:16:10 2010	(r203329)
+++ projects/ppc64/lib/libc/powerpc64/gen/setjmp.S	Sun Jan 31 23:39:55 2010	(r203330)
@@ -75,20 +75,20 @@ ENTRY(setjmp)
 	std	%r15,40 + 6*8(%r6)
 	std	%r16,40 + 7*8(%r6)
 	std	%r17,40 + 8*8(%r6)
-	std	%r18,40 + 10*8(%r6)
-	std	%r19,40 + 11*8(%r6)
-	std	%r20,40 + 12*8(%r6)
-	std	%r21,40 + 13*8(%r6)
-	std	%r22,40 + 14*8(%r6)
-	std	%r23,40 + 15*8(%r6)
-	std	%r24,40 + 16*8(%r6)
-	std	%r25,40 + 17*8(%r6)
-	std	%r26,40 + 18*8(%r6)
-	std	%r27,40 + 19*8(%r6)
-	std	%r28,40 + 20*8(%r6)
-	std	%r29,40 + 21*8(%r6)
-	std	%r30,40 + 22*8(%r6)
-	std	%r31,40 + 23*8(%r6)
+	std	%r18,40 + 9*8(%r6)
+	std	%r19,40 + 10*8(%r6)
+	std	%r20,40 + 11*8(%r6)
+	std	%r21,40 + 12*8(%r6)
+	std	%r22,40 + 13*8(%r6)
+	std	%r23,40 + 14*8(%r6)
+	std	%r24,40 + 15*8(%r6)
+	std	%r25,40 + 16*8(%r6)
+	std	%r26,40 + 17*8(%r6)
+	std	%r27,40 + 18*8(%r6)
+	std	%r28,40 + 19*8(%r6)
+	std	%r29,40 + 20*8(%r6)
+	std	%r30,40 + 21*8(%r6)
+	std	%r31,40 + 22*8(%r6)
 
 	li	%r3,0			/* return (0) */
 	blr
@@ -107,20 +107,20 @@ ENTRY(__longjmp)
 	ld	%r15,40 + 6*8(%r3)
 	ld	%r16,40 + 7*8(%r3)
 	ld	%r17,40 + 8*8(%r3)
-	ld	%r18,40 + 10*8(%r3)
-	ld	%r19,40 + 11*8(%r3)
-	ld	%r20,40 + 12*8(%r3)
-	ld	%r21,40 + 13*8(%r3)
-	ld	%r22,40 + 14*8(%r3)
-	ld	%r23,40 + 15*8(%r3)
-	ld	%r24,40 + 16*8(%r3)
-	ld	%r25,40 + 17*8(%r3)
-	ld	%r26,40 + 18*8(%r3)
-	ld	%r27,40 + 19*8(%r3)
-	ld	%r28,40 + 20*8(%r3)
-	ld	%r29,40 + 21*8(%r3)
-	ld	%r30,40 + 22*8(%r3)
-	ld	%r31,40 + 23*8(%r3)
+	ld	%r18,40 + 9*8(%r3)
+	ld	%r19,40 + 10*8(%r3)
+	ld	%r20,40 + 11*8(%r3)
+	ld	%r21,40 + 12*8(%r3)
+	ld	%r22,40 + 13*8(%r3)
+	ld	%r23,40 + 14*8(%r3)
+	ld	%r24,40 + 15*8(%r3)
+	ld	%r25,40 + 16*8(%r3)
+	ld	%r26,40 + 17*8(%r3)
+	ld	%r27,40 + 18*8(%r3)
+	ld	%r28,40 + 19*8(%r3)
+	ld	%r29,40 + 20*8(%r3)
+	ld	%r30,40 + 21*8(%r3)
+	ld	%r31,40 + 22*8(%r3)
 	mr	%r6,%r4			/* save val param */
 	mtlr	%r11			/* r11 -> link reg */
 	mtcr	%r12			/* r12 -> condition reg */

Modified: projects/ppc64/lib/libc/powerpc64/gen/sigsetjmp.S
==============================================================================
--- projects/ppc64/lib/libc/powerpc64/gen/sigsetjmp.S	Sun Jan 31 23:16:10 2010	(r203329)
+++ projects/ppc64/lib/libc/powerpc64/gen/sigsetjmp.S	Sun Jan 31 23:39:55 2010	(r203330)
@@ -80,20 +80,20 @@ ENTRY(sigsetjmp)
 	std	%r15,40 + 6*8(%r6)
 	std	%r16,40 + 7*8(%r6)
 	std	%r17,40 + 8*8(%r6)
-	std	%r18,40 + 10*8(%r6)
-	std	%r19,40 + 11*8(%r6)
-	std	%r20,40 + 12*8(%r6)
-	std	%r21,40 + 13*8(%r6)
-	std	%r22,40 + 14*8(%r6)
-	std	%r23,40 + 15*8(%r6)
-	std	%r24,40 + 16*8(%r6)
-	std	%r25,40 + 17*8(%r6)
-	std	%r26,40 + 18*8(%r6)
-	std	%r27,40 + 19*8(%r6)
-	std	%r28,40 + 20*8(%r6)
-	std	%r29,40 + 21*8(%r6)
-	std	%r30,40 + 22*8(%r6)
-	std	%r31,40 + 23*8(%r6)
+	std	%r18,40 + 9*8(%r6)
+	std	%r19,40 + 10*8(%r6)
+	std	%r20,40 + 11*8(%r6)
+	std	%r21,40 + 12*8(%r6)
+	std	%r22,40 + 13*8(%r6)
+	std	%r23,40 + 14*8(%r6)
+	std	%r24,40 + 15*8(%r6)
+	std	%r25,40 + 16*8(%r6)
+	std	%r26,40 + 17*8(%r6)
+	std	%r27,40 + 18*8(%r6)
+	std	%r28,40 + 19*8(%r6)
+	std	%r29,40 + 20*8(%r6)
+	std	%r30,40 + 21*8(%r6)
+	std	%r31,40 + 22*8(%r6)
 
 	li	%r3,0
 	blr
@@ -108,20 +108,20 @@ ENTRY(siglongjmp)
 	ld	%r15,40 + 6*8(%r3)
 	ld	%r16,40 + 7*8(%r3)
 	ld	%r17,40 + 8*8(%r3)
-	ld	%r18,40 + 10*8(%r3)
-	ld	%r19,40 + 11*8(%r3)
-	ld	%r20,40 + 12*8(%r3)
-	ld	%r21,40 + 13*8(%r3)
-	ld	%r22,40 + 14*8(%r3)
-	ld	%r23,40 + 15*8(%r3)
-	ld	%r24,40 + 16*8(%r3)
-	ld	%r25,40 + 17*8(%r3)
-	ld	%r26,40 + 18*8(%r3)
-	ld	%r27,40 + 19*8(%r3)
-	ld	%r28,40 + 20*8(%r3)
-	ld	%r29,40 + 21*8(%r3)
-	ld	%r30,40 + 22*8(%r3)
-	ld	%r31,40 + 23*8(%r3)
+	ld	%r18,40 + 9*8(%r3)
+	ld	%r19,40 + 10*8(%r3)
+	ld	%r20,40 + 11*8(%r3)
+	ld	%r21,40 + 12*8(%r3)
+	ld	%r22,40 + 13*8(%r3)
+	ld	%r23,40 + 14*8(%r3)
+	ld	%r24,40 + 15*8(%r3)
+	ld	%r25,40 + 16*8(%r3)
+	ld	%r26,40 + 17*8(%r3)
+	ld	%r27,40 + 18*8(%r3)
+	ld	%r28,40 + 19*8(%r3)
+	ld	%r29,40 + 20*8(%r3)
+	ld	%r30,40 + 21*8(%r3)
+	ld	%r31,40 + 22*8(%r3)
 
 	lwz	%r7,0(%r3)
 	mr	%r6,%r4

Modified: projects/ppc64/libexec/rtld-elf/powerpc64/reloc.c
==============================================================================
--- projects/ppc64/libexec/rtld-elf/powerpc64/reloc.c	Sun Jan 31 23:16:10 2010	(r203329)
+++ projects/ppc64/libexec/rtld-elf/powerpc64/reloc.c	Sun Jan 31 23:39:55 2010	(r203330)
@@ -44,9 +44,9 @@
 #include "rtld.h"
 
 struct funcdesc {
-	uint64_t addr;
-	uint64_t toc;
-	uint64_t env;
+	Elf_Addr addr;
+	Elf_Addr toc;
+	Elf_Addr env;
 };
 
 /*
@@ -104,7 +104,7 @@ do_copy_relocations(Obj_Entry *dstobj)
 
 		srcaddr = (const void *) (srcobj->relocbase+srcsym->st_value);
 		memcpy(dstaddr, srcaddr, size);
-		dbg("copy_reloc: src=%p,dst=%p,size=%d\n",srcaddr,dstaddr,size);
+		dbg("copy_reloc: src=%p,dst=%p,size=%zd\n",srcaddr,dstaddr,size);
 	}
 
 	return (0);
@@ -163,8 +163,8 @@ reloc_nonplt_object(Obj_Entry *obj_rtld,
 	case R_PPC_NONE:
 		break;
 
-        case R_PPC_ADDR32:    /* word32 S + A */
-        case R_PPC_GLOB_DAT:  /* word32 S + A */
+        case R_PPC64_ADDR64:    /* doubleword64 S + A */
+        case R_PPC_GLOB_DAT:
 		def = find_symdef(ELF_R_SYM(rela->r_info), obj, &defobj,
 				  false, cache);
 		if (def == NULL) {
@@ -180,7 +180,7 @@ reloc_nonplt_object(Obj_Entry *obj_rtld,
 		}
                 break;
 
-        case R_PPC_RELATIVE:  /* word32 B + A */
+        case R_PPC_RELATIVE:  /* doubleword64 B + A */
 		tmp = (Elf_Addr)(obj->relocbase + rela->r_addend);
 
 		/* As above, don't issue write unnecessarily */
@@ -211,7 +211,7 @@ reloc_nonplt_object(Obj_Entry *obj_rtld,
 		 */
 		break;
 
-	case R_PPC_DTPMOD32:
+	case R_PPC64_DTPMOD64:
 		def = find_symdef(ELF_R_SYM(rela->r_info), obj, &defobj,
 		    false, cache);
 
@@ -222,7 +222,7 @@ reloc_nonplt_object(Obj_Entry *obj_rtld,
 
 		break;
 
-	case R_PPC_TPREL32:
+	case R_PPC64_TPREL64:
 		def = find_symdef(ELF_R_SYM(rela->r_info), obj, &defobj,
 		    false, cache);
 
@@ -251,7 +251,7 @@ reloc_nonplt_object(Obj_Entry *obj_rtld,
 		
 		break;
 		
-	case R_PPC_DTPREL32:
+	case R_PPC64_DTPREL64:
 		def = find_symdef(ELF_R_SYM(rela->r_info), obj, &defobj,
 		    false, cache);
 
@@ -322,8 +322,8 @@ done:
 static int
 reloc_plt_object(Obj_Entry *obj, const Elf_Rela *rela)
 {
-	Elf_Word *where = (Elf_Word *)(obj->relocbase + rela->r_offset);
-	int reloff;
+	Elf_Addr *where = (Elf_Addr *)(obj->relocbase + rela->r_offset);
+	long reloff;
 
 	reloff = rela - obj->pltrela;
 
@@ -331,11 +331,9 @@ reloc_plt_object(Obj_Entry *obj, const E
 		return (-1);
 	}
 
-	dbg(" reloc_plt_object: where=%p,pltres=%p,reloff=%x,distance=%x",
-	    (void *)where, (void *)pltresolve, reloff, distance);
+	dbg(" reloc_plt_object: where=%p,reloff=%lx", (void *)where, reloff);
 
-	((struct funcdesc *)(where))->addr =
-	    (uint64_t)_rtld_powerpc64_pltresolve;
+	memcpy(where, _rtld_powerpc64_pltresolve, sizeof(struct funcdesc));
 	((struct funcdesc *)(where))->toc = reloff;
 	((struct funcdesc *)(where))->env = (uint64_t)obj;
 
@@ -413,16 +411,15 @@ reloc_jmpslots(Obj_Entry *obj)
 
 
 /*
- * Update the value of a PLT jump slot. Branch directly to the target if
- * it is within +/- 32Mb, otherwise go indirectly via the pltcall
- * trampoline call and jump table.
+ * Update the value of a PLT jump slot.
  */
 Elf_Addr
 reloc_jmpslot(Elf_Addr *wherep, Elf_Addr target, const Obj_Entry *defobj,
 	      const Obj_Entry *obj, const Elf_Rel *rel)
 {
-	dbg(" reloc_jmpslot: where=%p, target=%p",
-	    (void *)wherep, (void *)target);
+	dbg(" reloc_jmpslot: where=%p, target=%p (%#lx + %#lx)",
+	    (void *)wherep, (void *)target, *(Elf_Addr *)target,
+	    (Elf_Addr)defobj->relocbase);
 
 	/*
 	 * At the PLT entry pointed at by `wherep', construct
@@ -431,6 +428,18 @@ reloc_jmpslot(Elf_Addr *wherep, Elf_Addr
 	 */
 
 	memcpy(wherep, (void *)target, sizeof(struct funcdesc));
+	if (((struct funcdesc *)(wherep))->addr < (Elf_Addr)defobj->relocbase) {
+		/*
+		 * XXX: It is possible (e.g. LD_BIND_NOW) that the function
+		 * descriptor we are copying has not yet been relocated.
+		 * If this happens, fix it.
+		 */
+
+		((struct funcdesc *)(wherep))->addr +=
+		    (Elf_Addr)defobj->relocbase;
+		((struct funcdesc *)(wherep))->toc +=
+		    (Elf_Addr)defobj->relocbase;
+	}
 
 	return (target);
 }
@@ -438,8 +447,9 @@ reloc_jmpslot(Elf_Addr *wherep, Elf_Addr
 void
 init_pltgot(Obj_Entry *obj)
 {
+#if 0
 	struct funcdesc *pltcall;
-	int N = obj->pltrelasize / sizeof(Elf_Rela);
+	//int N = obj->pltrelasize / sizeof(Elf_Rela);
 
 	pltcall = (struct funcdesc *)obj->pltgot;
 
@@ -448,22 +458,16 @@ init_pltgot(Obj_Entry *obj)
 	}
 
 	/*
-	 * Copy the function description into the PLT slot
+	 * Copy the function description into the PLT0 slot
 	 */
 	memcpy(pltcall, _rtld_powerpc64_pltresolve, sizeof(*pltcall));
-
-	/*
-	 * Now fake the two arguments we get in the descriptor to
-	 * pass information to the resolver.
-	 */
-	pltcall->toc = N;
-	pltcall->env = (uint64_t)obj;
+#endif
 }
 
 void
 allocate_initial_tls(Obj_Entry *list)
 {
-	register Elf_Addr **tp __asm__("r2");
+	register Elf_Addr **tp __asm__("r13");
 	Elf_Addr **_tp;
 
 	/*
@@ -474,7 +478,7 @@ allocate_initial_tls(Obj_Entry *list)
 
 	tls_static_space = tls_last_offset + tls_last_size + RTLD_STATIC_TLS_EXTRA;
 
-	_tp = (Elf_Addr **) ((char *) allocate_tls(list, NULL, TLS_TCB_SIZE, 8) 
+	_tp = (Elf_Addr **) ((char *)allocate_tls(list, NULL, TLS_TCB_SIZE, 16) 
 	    + TLS_TP_OFFSET + TLS_TCB_SIZE);
 
 	/*
@@ -487,7 +491,7 @@ allocate_initial_tls(Obj_Entry *list)
 void*
 __tls_get_addr(tls_index* ti)
 {
-	register Elf_Addr **tp __asm__("r2");
+	register Elf_Addr **tp __asm__("r13");
 	char *p;
 
 	p = tls_get_addr_common((Elf_Addr**)((Elf_Addr)tp - TLS_TP_OFFSET 

Modified: projects/ppc64/libexec/rtld-elf/powerpc64/rtld_machdep.h
==============================================================================
--- projects/ppc64/libexec/rtld-elf/powerpc64/rtld_machdep.h	Sun Jan 31 23:16:10 2010	(r203329)
+++ projects/ppc64/libexec/rtld-elf/powerpc64/rtld_machdep.h	Sun Jan 31 23:39:55 2010	(r203330)
@@ -65,12 +65,12 @@ void _rtld_powerpc64_pltresolve(void);
 
 #define TLS_TP_OFFSET	0x7000
 #define TLS_DTV_OFFSET	0x8000
-#define TLS_TCB_SIZE	8
+#define TLS_TCB_SIZE	16
 
 #define round(size, align) \
     (((size) + (align) - 1) & ~((align) - 1))
 #define calculate_first_tls_offset(size, align) \
-    round(8, align)
+    round(16, align)
 #define calculate_tls_offset(prev_offset, prev_size, size, align) \
     round(prev_offset + prev_size, align)
 #define calculate_tls_end(off, size)    ((off) + (size))

Modified: projects/ppc64/libexec/rtld-elf/powerpc64/rtld_start.S
==============================================================================
--- projects/ppc64/libexec/rtld-elf/powerpc64/rtld_start.S	Sun Jan 31 23:16:10 2010	(r203329)
+++ projects/ppc64/libexec/rtld-elf/powerpc64/rtld_start.S	Sun Jan 31 23:39:55 2010	(r203330)
@@ -45,6 +45,26 @@ _ENTRY(_rtld_start)
 /*	std     %r7,80(%r1)   *//*  cleanup (always 0) */
 	std     %r8,88(%r1)	/*  ps_strings */
 
+	/*
+	 * Perform initial relocation of ld-elf.so. Not as easy as it
+	 * sounds.
+	 *  - perform small forward branch to put PC into link reg
+	 *  - use link-time constants to determine offset to the
+	 *    _DYNAMIC section and the GOT. Add these to the PC to
+	 *    convert to absolute addresses.
+	 *  - call reloc_non_plt_self() to fix up ld-elf.so's relocations
+	 */
+
+	bl	1f
+	.llong	_DYNAMIC-.
+1:
+	mflr	%r3		/* PC value at .llong */
+	ld	%r4,0(%r3)	/* offset to _DYNAMIC */
+	add	%r3,%r4,%r3	/* r3 = &_DYNAMIC, absolute value */
+
+	ld	%r4,-0x8000(%r2) /* First TOC entry is TOC base */
+	subf	%r4,%r4,%r2	/* Subtract from real TOC base to get base */
+
 	bl	.reloc_non_plt_self /* reloc_non_plt_self(&_DYNAMIC,base) */
 	nop
 
@@ -55,14 +75,16 @@ _ENTRY(_rtld_start)
 	 * original stack layout has to be found by moving back a word
 	 * from the argv pointer.
 	 */
-        ld     %r4,56(%r1)	/* restore argv */
+	ld	%r4,56(%r1)
         addi    %r3,%r4,-8	/* locate argc ptr, &argv[-1] */
-
-	addi	%r4,%r1,16	/* &exit_proc on stack */
-	addi	%r5,%r1,24	/* &obj_main on stack */
+	addi	%r4,%r1,80	/* &exit_proc on stack */
+	addi	%r5,%r1,72	/* &obj_main on stack */
 
 	bl      ._rtld		/* &_start = _rtld(sp, &exit_proc, &obj_main)*/
 	nop
+	ld	%r2,8(%r3)
+	ld	%r11,16(%r3)
+	ld	%r3,0(%r3)
 	mtlr    %r3
 
 	/*

Modified: projects/ppc64/sys/sys/elf_common.h
==============================================================================
--- projects/ppc64/sys/sys/elf_common.h	Sun Jan 31 23:16:10 2010	(r203329)
+++ projects/ppc64/sys/sys/elf_common.h	Sun Jan 31 23:39:55 2010	(r203330)
@@ -781,6 +781,27 @@ typedef struct {
 #define	R_PPC_SECTOFF_HA	36
 
 /*
+ * 64-bit relocations
+ */
+#define	R_PPC64_ADDR64		38
+#define	R_PPC64_ADDR16_HIGHER	39
+#define	R_PPC64_ADDR16_HIGHERA	40
+#define	R_PPC64_ADDR16_HIGHEST	41
+#define	R_PPC64_ADDR16_HIGHESTA	42
+#define	R_PPC64_UADDR64		43
+#define	R_PPC64_REL64		44
+#define	R_PPC64_PLT64		45
+#define	R_PPC64_PLTREL64	46
+#define	R_PPC64_TOC16		47
+#define	R_PPC64_TOC16_LO	48
+#define	R_PPC64_TOC16_HI	49
+#define	R_PPC64_TOC16_HA	50
+#define	R_PPC64_TOC		51
+#define	R_PPC64_DTPMOD64	68
+#define	R_PPC64_TPREL64		73
+#define	R_PPC64_DTPREL64	78
+
+/*
  * TLS relocations
  */
 #define	R_PPC_TLS		67



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201001312339.o0VNdun7073321>