svn commit: r203101 - in projects/ppc64: etc/etc.powerpc64 gnu/usr.bin/cc gnu/usr.bin/gdb gnu/usr.bin/gdb/arch gnu/usr.bin/gdb/kgdb lib/bind lib/libc/powerpc64/gen lib/libdisk lib/libstand/powerpc6...

Nathan Whitehorn nwhitehorn at FreeBSD.org
Thu Jan 28 00:48:16 UTC 2010


Author: nwhitehorn
Date: Thu Jan 28 00:48:15 2010
New Revision: 203101
URL: http://svn.freebsd.org/changeset/base/203101

Log:
  Initial hash at userland. This allows make buildworld TARGET_ARCH=powerpc64
  to complete. Statically linked programs appear to partially work, but have
  intermittent problems with argument passing. RTLD segfaults.

Added:
  projects/ppc64/etc/etc.powerpc64/
     - copied from r202947, projects/ppc64/etc/etc.powerpc/
  projects/ppc64/gnu/usr.bin/gdb/arch/powerpc64   (contents, props changed)
  projects/ppc64/gnu/usr.bin/gdb/kgdb/trgt_powerpc64.c
     - copied, changed from r202947, projects/ppc64/gnu/usr.bin/gdb/kgdb/trgt_powerpc.c
  projects/ppc64/lib/libstand/powerpc64/
     - copied from r202947, projects/ppc64/lib/libstand/powerpc/
  projects/ppc64/lib/libthread_db/arch/powerpc64/
     - copied from r202947, projects/ppc64/lib/libthread_db/arch/powerpc/
  projects/ppc64/libexec/rtld-elf/powerpc64/
     - copied from r202947, projects/ppc64/libexec/rtld-elf/powerpc/
  projects/ppc64/usr.bin/truss/powerpc64-fbsd.c
     - copied, changed from r202947, projects/ppc64/usr.bin/truss/powerpc-fbsd.c
Modified:
  projects/ppc64/gnu/usr.bin/cc/Makefile.tgt
  projects/ppc64/gnu/usr.bin/gdb/Makefile.inc
  projects/ppc64/lib/bind/config.mk
  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/lib/libdisk/Makefile
  projects/ppc64/lib/libthr/arch/powerpc64/include/pthread_md.h
  projects/ppc64/libexec/rtld-elf/Makefile
  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/rescue/rescue/Makefile
  projects/ppc64/sys/powerpc/include/_stdint.h
  projects/ppc64/sys/powerpc/include/profile.h
  projects/ppc64/usr.sbin/crunch/crunchide/Makefile
  projects/ppc64/usr.sbin/crunch/crunchide/exec_elf32.c
  projects/ppc64/usr.sbin/named/Makefile
  projects/ppc64/usr.sbin/pmcstat/pmcstat_log.c

Modified: projects/ppc64/gnu/usr.bin/cc/Makefile.tgt
==============================================================================
--- projects/ppc64/gnu/usr.bin/cc/Makefile.tgt	Wed Jan 27 21:19:25 2010	(r203100)
+++ projects/ppc64/gnu/usr.bin/cc/Makefile.tgt	Thu Jan 28 00:48:15 2010	(r203101)
@@ -22,3 +22,6 @@ TARGET_CPU_DEFAULT= TARGET_CPU_ultraspar
 TARGET_CPU_DEFAULT= \"powerpc64\"
 .endif
 
+.if ${MACHINE_ARCH} == "powerpc64"
+CFLAGS+= -mminimal-toc
+.endif

Modified: projects/ppc64/gnu/usr.bin/gdb/Makefile.inc
==============================================================================
--- projects/ppc64/gnu/usr.bin/gdb/Makefile.inc	Wed Jan 27 21:19:25 2010	(r203100)
+++ projects/ppc64/gnu/usr.bin/gdb/Makefile.inc	Thu Jan 28 00:48:15 2010	(r203101)
@@ -38,6 +38,10 @@ CFLAGS+= -I${CNTRB_GDB}/include
 CFLAGS+= -I${CNTRB_BU}/include
 CFLAGS+= -I${CNTRB_BU}/bfd
 
+.if ${MACHINE_ARCH} == "powerpc64"
+CFLAGS+= -mminimal-toc
+.endif
+
 GENSRCS+= nm.h tm.h
 
 .if defined(GDB_CROSS_DEBUGGER)

Added: projects/ppc64/gnu/usr.bin/gdb/arch/powerpc64
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ projects/ppc64/gnu/usr.bin/gdb/arch/powerpc64	Thu Jan 28 00:48:15 2010	(r203101)
@@ -0,0 +1 @@
+link powerpc
\ No newline at end of file

Copied and modified: projects/ppc64/gnu/usr.bin/gdb/kgdb/trgt_powerpc64.c (from r202947, projects/ppc64/gnu/usr.bin/gdb/kgdb/trgt_powerpc.c)
==============================================================================
--- projects/ppc64/gnu/usr.bin/gdb/kgdb/trgt_powerpc.c	Sun Jan 24 20:15:59 2010	(r202947, copy source)
+++ projects/ppc64/gnu/usr.bin/gdb/kgdb/trgt_powerpc64.c	Thu Jan 28 00:48:15 2010	(r203101)
@@ -72,6 +72,8 @@ kgdb_trgt_fetch_registers(int regno __un
 
 	/* r1 is saved in the sp field */
 	supply_register(tdep->ppc_gp0_regnum + 1, (char *)&pcb.pcb_sp);
+	/* r2 is saved in the toc field */
+	supply_register(tdep->ppc_gp0_regnum + 2, (char *)&pcb.pcb_toc);
 
 	supply_register(tdep->ppc_lr_regnum, (char *)&pcb.pcb_lr);
 	supply_register(tdep->ppc_cr_regnum, (char *)&pcb.pcb_cr);
@@ -160,7 +162,7 @@ kgdb_trgt_trapframe_prev_register(struct
 		return;
 
 	cache = kgdb_trgt_frame_cache(next_frame, this_cache);
-	*addrp = cache->sp + 8 + ofs;
+	*addrp = cache->sp + 48 + ofs;
 	*lvalp = lval_memory;
 	target_read_memory(*addrp, valuep, regsz);
 }

Modified: projects/ppc64/lib/bind/config.mk
==============================================================================
--- projects/ppc64/lib/bind/config.mk	Wed Jan 27 21:19:25 2010	(r203100)
+++ projects/ppc64/lib/bind/config.mk	Thu Jan 28 00:48:15 2010	(r203101)
@@ -45,7 +45,7 @@ CFLAGS+=	-DOPENSSL
 CFLAGS+=	-DUSE_MD5
 
 # Endianness
-.if ${MACHINE_ARCH} == "powerpc" || ${MACHINE_ARCH} == "sparc64"
+.if ${MACHINE_ARCH} == "powerpc" || ${MACHINE_ARCH} == "powerpc64" || ${MACHINE_ARCH} == "sparc64"
 CFLAGS+=	-DWORDS_BIGENDIAN
 .endif
 
@@ -66,6 +66,8 @@ CFLAGS+=	-I${LIB_BIND_DIR}
 # Use the right version of the atomic.h file from lib/isc
 .if ${MACHINE_ARCH} == "amd64" || ${MACHINE_ARCH} == "i386"
 ISC_ATOMIC_ARCH=	x86_32
+.elif ${MACHINE_ARCH} == "powerpc64"
+ISC_ATOMIC_ARCH=	powerpc
 .else
 ISC_ATOMIC_ARCH=	${MACHINE_ARCH}
 .endif

Modified: projects/ppc64/lib/libc/powerpc64/gen/_setjmp.S
==============================================================================
--- projects/ppc64/lib/libc/powerpc64/gen/_setjmp.S	Wed Jan 27 21:19:25 2010	(r203100)
+++ projects/ppc64/lib/libc/powerpc64/gen/_setjmp.S	Thu Jan 28 00:48:15 2010	(r203101)
@@ -55,12 +55,57 @@ ENTRY(_setjmp)
 	mfcr	%r12
 	mr	%r10,%r1
 	mr	%r9,%r2
-	stmw	%r9,20(%r3)
+	std	%r9,40 + 0*8(%r3)
+	std	%r10,40 + 1*8(%r3)
+	std	%r11,40 + 2*8(%r3)
+	std	%r12,40 + 3*8(%r3)
+	std	%r13,40 + 4*8(%r3)
+	std	%r14,40 + 5*8(%r3)
+	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)
 	li	%r3,0
 	blr
 
 ENTRY(_longjmp)
-	lmw	%r9,20(%r3)
+	ld	%r9,40 + 0*8(%r3)
+	ld	%r10,40 + 1*8(%r3)
+	ld	%r11,40 + 2*8(%r3)
+	ld	%r12,40 + 3*8(%r3)
+	ld	%r13,40 + 4*8(%r3)
+	ld	%r14,40 + 5*8(%r3)
+	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)
+
 	mtlr	%r11
 	mtcr	%r12
 	mr	%r2,%r9

Modified: projects/ppc64/lib/libc/powerpc64/gen/setjmp.S
==============================================================================
--- projects/ppc64/lib/libc/powerpc64/gen/setjmp.S	Wed Jan 27 21:19:25 2010	(r203100)
+++ projects/ppc64/lib/libc/powerpc64/gen/setjmp.S	Thu Jan 28 00:48:15 2010	(r203101)
@@ -65,14 +65,62 @@ ENTRY(setjmp)
 	mfcr	%r12			/* r12 <- condition reg */
 	mr	%r10,%r1		/* r10 <- stackptr */
 	mr	%r9,%r2			/*  r9 <- global ptr */
-	stmw	%r9,20(%r6)
+
+	std	%r9,40 + 0*8(%r6)
+	std	%r10,40 + 1*8(%r6)
+	std	%r11,40 + 2*8(%r6)
+	std	%r12,40 + 3*8(%r6)
+	std	%r13,40 + 4*8(%r6)
+	std	%r14,40 + 5*8(%r6)
+	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)
+
 	li	%r3,0			/* return (0) */
 	blr
 
 	.weak CNAME(longjmp)
 	.set CNAME(longjmp),CNAME(__longjmp)
+	.weak CNAME(.longjmp)
+	.set CNAME(.longjmp),CNAME(.__longjmp)
 ENTRY(__longjmp)
-	lmw	%r9,20(%r3)		/* restore regs */
+	ld	%r9,40 + 0*8(%r3)
+	ld	%r10,40 + 1*8(%r3)
+	ld	%r11,40 + 2*8(%r3)
+	ld	%r12,40 + 3*8(%r3)
+	ld	%r13,40 + 4*8(%r3)
+	ld	%r14,40 + 5*8(%r3)
+	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)
 	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	Wed Jan 27 21:19:25 2010	(r203100)
+++ projects/ppc64/lib/libc/powerpc64/gen/sigsetjmp.S	Thu Jan 28 00:48:15 2010	(r203101)
@@ -70,12 +70,59 @@ ENTRY(sigsetjmp)
 	mfcr	%r12
 	mr	%r10,%r1
 	mr	%r9,%r2
-	stmw	%r9,20(%r6)
+
+	std	%r9,40 + 0*8(%r6)
+	std	%r10,40 + 1*8(%r6)
+	std	%r11,40 + 2*8(%r6)
+	std	%r12,40 + 3*8(%r6)
+	std	%r13,40 + 4*8(%r6)
+	std	%r14,40 + 5*8(%r6)
+	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)
+
 	li	%r3,0
 	blr
 
 ENTRY(siglongjmp)
-	lmw	%r9,20(%r3)
+	ld	%r9,40 + 0*8(%r3)
+	ld	%r10,40 + 1*8(%r3)
+	ld	%r11,40 + 2*8(%r3)
+	ld	%r12,40 + 3*8(%r3)
+	ld	%r13,40 + 4*8(%r3)
+	ld	%r14,40 + 5*8(%r3)
+	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)
+
 	lwz	%r7,0(%r3)
 	mr	%r6,%r4
 	mtlr	%r11

Modified: projects/ppc64/lib/libdisk/Makefile
==============================================================================
--- projects/ppc64/lib/libdisk/Makefile	Wed Jan 27 21:19:25 2010	(r203100)
+++ projects/ppc64/lib/libdisk/Makefile	Thu Jan 28 00:48:15 2010	(r203101)
@@ -12,6 +12,8 @@ SRCS=	blocks.c ${_change} chunk.c create
 	rules.c write_disk.c 
 .if ${MACHINE} == "sun4v"
 SRCS+=  write_sparc64_disk.c
+.elif ${MACHINE} == "powerpc64"
+SRCS+=  write_powerpc_disk.c
 .else
 SRCS+=  write_${MACHINE}_disk.c
 .endif

Modified: projects/ppc64/lib/libthr/arch/powerpc64/include/pthread_md.h
==============================================================================
--- projects/ppc64/lib/libthr/arch/powerpc64/include/pthread_md.h	Wed Jan 27 21:19:25 2010	(r203100)
+++ projects/ppc64/lib/libthr/arch/powerpc64/include/pthread_md.h	Thu Jan 28 00:48:15 2010	(r203101)
@@ -44,7 +44,7 @@
 /*
  * Variant I tcb. The structure layout is fixed, don't blindly
  * change it.
- * %r2 points to end of the structure.
+ * %r13 points to end of the structure.
  */
 struct tcb {
 	void			*tcb_dtv;

Modified: projects/ppc64/libexec/rtld-elf/Makefile
==============================================================================
--- projects/ppc64/libexec/rtld-elf/Makefile	Wed Jan 27 21:19:25 2010	(r203100)
+++ projects/ppc64/libexec/rtld-elf/Makefile	Thu Jan 28 00:48:15 2010	(r203101)
@@ -11,7 +11,11 @@ MAN=		rtld.1
 CSTD?=		gnu99
 CFLAGS+=	-Wall -DFREEBSD_ELF -DIN_RTLD
 CFLAGS+=	-I${.CURDIR}/${MACHINE_ARCH} -I${.CURDIR}
+.if ${MACHINE_ARCH} == "powerpc64"
+LDFLAGS+=	-nostdlib -e _rtld_start
+.else
 LDFLAGS+=	-nostdlib -e .rtld_start
+.endif
 WARNS?=		2
 INSTALLFLAGS=	-C -b
 PRECIOUSPROG=

Modified: projects/ppc64/libexec/rtld-elf/powerpc64/reloc.c
==============================================================================
--- projects/ppc64/libexec/rtld-elf/powerpc/reloc.c	Sun Jan 24 20:15:59 2010	(r202947)
+++ projects/ppc64/libexec/rtld-elf/powerpc64/reloc.c	Thu Jan 28 00:48:15 2010	(r203101)
@@ -43,9 +43,11 @@
 #include "debug.h"
 #include "rtld.h"
 
-#define _ppc_ha(x) ((((u_int32_t)(x) & 0x8000) ? \
-                        ((u_int32_t)(x) + 0x10000) : (u_int32_t)(x)) >> 16)
-#define _ppc_la(x) ((u_int32_t)(x) & 0xffff)
+struct funcdesc {
+	uint64_t addr;
+	uint64_t toc;
+	uint64_t env;
+};
 
 /*
  * Process the R_PPC_COPY relocations
@@ -262,7 +264,7 @@ reloc_nonplt_object(Obj_Entry *obj_rtld,
 		break;
 		
 	default:
-		_rtld_error("%s: Unsupported relocation type %d"
+		_rtld_error("%s: Unsupported relocation type %ld"
 			    " in non-PLT relocations\n", obj->path,
 			    ELF_R_TYPE(rela->r_info));
 		return (-1);
@@ -321,8 +323,6 @@ static int
 reloc_plt_object(Obj_Entry *obj, const Elf_Rela *rela)
 {
 	Elf_Word *where = (Elf_Word *)(obj->relocbase + rela->r_offset);
-	Elf_Addr *pltresolve;
-	Elf_Addr distance;
 	int reloff;
 
 	reloff = rela - obj->pltrela;
@@ -331,22 +331,13 @@ reloc_plt_object(Obj_Entry *obj, const E
 		return (-1);
 	}
 
-	pltresolve = obj->pltgot + 8;
-
-	distance = (Elf_Addr)pltresolve - (Elf_Addr)(where + 1);
-
 	dbg(" reloc_plt_object: where=%p,pltres=%p,reloff=%x,distance=%x",
 	    (void *)where, (void *)pltresolve, reloff, distance);
 
-	/* li   r11,reloff  */
-	/* b    pltresolve  */
-	where[0] = 0x39600000 | reloff;
-	where[1] = 0x48000000 | (distance & 0x03fffffc);
-
-	/*
-	 * The icache will be sync'd in init_pltgot, which is called
-	 * after all the slots have been updated
-	 */
+	((struct funcdesc *)(where))->addr =
+	    (uint64_t)_rtld_powerpc64_pltresolve;
+	((struct funcdesc *)(where))->toc = reloff;
+	((struct funcdesc *)(where))->env = (uint64_t)obj;
 
 	return (0);
 }
@@ -430,9 +421,6 @@ Elf_Addr
 reloc_jmpslot(Elf_Addr *wherep, Elf_Addr target, const Obj_Entry *defobj,
 	      const Obj_Entry *obj, const Elf_Rel *rel)
 {
-	Elf_Addr offset;
-	const Elf_Rela *rela = (const Elf_Rela *) rel;
-
 	dbg(" reloc_jmpslot: where=%p, target=%p",
 	    (void *)wherep, (void *)target);
 
@@ -441,112 +429,35 @@ reloc_jmpslot(Elf_Addr *wherep, Elf_Addr
 	 * a direct transfer to the now fully resolved function
 	 * address.
 	 */
-	offset = target - (Elf_Addr)wherep;
 
-	if (abs(offset) < 32*1024*1024) {     /* inside 32MB? */
-		/* b    value   # branch directly */
-		*wherep = 0x48000000 | (offset & 0x03fffffc);
-		__syncicache(wherep, 4);
-	} else {
-		Elf_Addr *pltcall, *jmptab;
-		int distance;
-		int N = obj->pltrelasize / sizeof(Elf_Rela);
-		int reloff = rela - obj->pltrela;
-
-		if ((reloff < 0) || (reloff >= 0x8000)) {
-			return (-1);
-		}
-
-		pltcall = obj->pltgot;
-
-		dbg(" reloc_jmpslot: indir, reloff=%d, N=%d\n",
-		    reloff, N);
-
-		jmptab = obj->pltgot + 18 + N * 2;
-		jmptab[reloff] = target;
-
-		distance = (Elf_Addr)pltcall - (Elf_Addr)(wherep + 1);
-
-		/* li   r11,reloff */
-		/* b    pltcall  # use indirect pltcall routine */
-		wherep[0] = 0x39600000 | reloff;
-		wherep[1] = 0x48000000 | (distance & 0x03fffffc);
-		__syncicache(wherep, 8);
-	}
+	memcpy(wherep, (void *)target, sizeof(struct funcdesc));
 
 	return (target);
 }
 
-
-/*
- * Setup the plt glue routines.
- */
-#define PLTCALL_SIZE    20
-#define PLTRESOLVE_SIZE 24
-
 void
 init_pltgot(Obj_Entry *obj)
 {
-	Elf_Word *pltcall, *pltresolve;
-	Elf_Word *jmptab;
+	struct funcdesc *pltcall;
 	int N = obj->pltrelasize / sizeof(Elf_Rela);
 
-	pltcall = obj->pltgot;
+	pltcall = (struct funcdesc *)obj->pltgot;
 
 	if (pltcall == NULL) {
 		return;
 	}
 
 	/*
-	 * From the SVR4 PPC ABI:
-	 *
-	 * 'The first 18 words (72 bytes) of the PLT are reserved for
-	 * use by the dynamic linker.
-	 *   ...
-	 * 'If the executable or shared object requires N procedure
-	 *  linkage table entries, the link editor shall reserve 3*N
-	 *  words (12*N bytes) following the 18 reserved words. The
-	 *  first 2*N of these words are the procedure linkage table
-	 *  entries themselves. The static linker directs calls to bytes
-	 *  (72 + (i-1)*8), for i between 1 and N inclusive. The remaining
-	 *  N words (4*N bytes) are reserved for use by the dynamic linker.'
-	 */
-
-	/*
-	 * Copy the absolute-call assembler stub into the first part of
-	 * the reserved PLT area.
+	 * Copy the function description into the PLT slot
 	 */
-	memcpy(pltcall, _rtld_powerpc_pltcall, PLTCALL_SIZE);
-
-	/*
-	 * Determine the address of the jumptable, which is the dyn-linker
-	 * reserved area after the call cells. Write the absolute address
-	 * of the jumptable into the absolute-call assembler code so it
-	 * can determine this address.
-	 */
-	jmptab = pltcall + 18 + N * 2;
-	pltcall[1] |= _ppc_ha(jmptab);	   /* addis 11,11,jmptab at ha */
-	pltcall[2] |= _ppc_la(jmptab);     /* lwz   11,jmptab at l(11) */
-
-	/*
-	 * Skip down 32 bytes into the initial reserved area and copy
-	 * in the standard resolving assembler call. Into this assembler,
-	 * insert the absolute address of the _rtld_bind_start routine
-	 * and the address of the relocation object.
-	 */
-	pltresolve = obj->pltgot + 8;
-
-	memcpy(pltresolve, _rtld_powerpc_pltresolve, PLTRESOLVE_SIZE);
-	pltresolve[0] |= _ppc_ha(_rtld_bind_start);
-	pltresolve[1] |= _ppc_la(_rtld_bind_start);
-	pltresolve[3] |= _ppc_ha(obj);
-	pltresolve[4] |= _ppc_la(obj);
+	memcpy(pltcall, _rtld_powerpc64_pltresolve, sizeof(*pltcall));
 
 	/*
-	 * Sync the icache for the byte range represented by the
-	 * trampoline routines and call slots.
+	 * Now fake the two arguments we get in the descriptor to
+	 * pass information to the resolver.
 	 */
-	__syncicache(pltcall, 72 + N * 8);
+	pltcall->toc = N;
+	pltcall->env = (uint64_t)obj;
 }
 
 void

Modified: projects/ppc64/libexec/rtld-elf/powerpc64/rtld_machdep.h
==============================================================================
--- projects/ppc64/libexec/rtld-elf/powerpc/rtld_machdep.h	Sun Jan 24 20:15:59 2010	(r202947)
+++ projects/ppc64/libexec/rtld-elf/powerpc64/rtld_machdep.h	Thu Jan 28 00:48:15 2010	(r203101)
@@ -57,8 +57,7 @@ void _rtld_bind_start(void);
  * PLT functions. Not really correct prototypes, but the
  * symbol values are needed.
  */
-void _rtld_powerpc_pltresolve(void);
-void _rtld_powerpc_pltcall(void);
+void _rtld_powerpc64_pltresolve(void);
 
 /*
  * TLS

Modified: projects/ppc64/libexec/rtld-elf/powerpc64/rtld_start.S
==============================================================================
--- projects/ppc64/libexec/rtld-elf/powerpc/rtld_start.S	Sun Jan 24 20:15:59 2010	(r202947)
+++ projects/ppc64/libexec/rtld-elf/powerpc64/rtld_start.S	Thu Jan 28 00:48:15 2010	(r203101)
@@ -34,53 +34,19 @@
 .extern _GLOBAL_OFFSET_TABLE_
 .extern _DYNAMIC
 
-_ENTRY(.rtld_start)
-	stwu    %r1,-48(%r1)	/* 16-byte aligned stack for reg saves +
+_ENTRY(_rtld_start)
+	stdu    %r1,-96(%r1)	/* 16-byte aligned stack for reg saves +
 				exit_proc & obj _rtld args +
 				backchain & lrsave stack frame */
-	stw     %r3,16(%r1)	/*  argc */
-	stw     %r4,20(%r1)	/*  argv */
-	stw     %r5,24(%r1)	/*  envp */
-/*	stw     %r6,28(%r1)   *//*  obj (always 0) */
-/*	stw     %r7,32(%r1)   *//*  cleanup (always 0) */
-	stw     %r8,36(%r1)	/*  ps_strings */
+	std     %r3,48(%r1)	/*  argc */
+	std     %r4,56(%r1)	/*  argv */
+	std     %r5,64(%r1)	/*  envp */
+/*	std     %r6,72(%r1)   *//*  obj (always 0) */
+/*	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.
-	 *  - sync icache to allow execution of the SVR4 ABI-specified
-	 *    blrl instruction preceding the GOT
-	 *  - Use this instruction to determine the GOT absolute address
-	 *  - read GOT[0], which is the SVR4 ABI-specified link-time
-	 *    value of _DYNAMIC. Subtract this value from the absolute
-	 *    value to determine the load address
-	 *  - call reloc_non_plt_self() to fix up ld-elf.so's relocations
-	 */
-	bl	1f
-	.long	_DYNAMIC-.
-	.long	_GLOBAL_OFFSET_TABLE_-.	/* branch lr + 4 */
-1:
-	mflr	%r3		/* PC value at .long */
-	lwz	%r4,4(%r3)
-	add	%r4,%r4,%r3	/* &_GLOBAL_OFFSET_TABLE-4, blrl insn. */
-	dcbst   %r0,%r4         /* sync i-cache with d-cache */
-	sync
-	icbi    %r0,%r4
-	isync
-
-	lwz	%r4,0(%r3)	/* offset to _DYNAMIC */
-	add	%r3,%r4,%r3	/* r3 = &_DYNAMIC, absolute value */
-
-	bl	_GLOBAL_OFFSET_TABLE_ at local-4
-	mflr	%r4		/* &_GLOBAL_OFFSET_TABLE_, absolute value */
-	lwz	%r4,0(%r4)	/* linker &_DYNAMIC, from got[0] */
-	subf	%r4,%r4,%r3	/* subtract to calculate relocbase */
-
-	bl	reloc_non_plt_self at plt /* reloc_non_plt_self(&_DYNAMIC,base) */
+	bl	.reloc_non_plt_self /* reloc_non_plt_self(&_DYNAMIC,base) */
+	nop
 
 	/*
 	 * The _rtld() function likes to see a stack layout containing
@@ -89,25 +55,26 @@ _ENTRY(.rtld_start)
 	 * original stack layout has to be found by moving back a word
 	 * from the argv pointer.
 	 */
-        lwz     %r4,20(%r1)	/* restore argv */
-        addi    %r3,%r4,-4	/* locate argc ptr, &argv[-1] */
+        ld     %r4,56(%r1)	/* restore argv */
+        addi    %r3,%r4,-8	/* locate argc ptr, &argv[-1] */
 
-	addi	%r4,%r1,8	/* &exit_proc on stack */
-	addi	%r5,%r1,12	/* &obj_main on stack */
+	addi	%r4,%r1,16	/* &exit_proc on stack */
+	addi	%r5,%r1,24	/* &obj_main on stack */
 
-	bl      _rtld at plt	/* &_start = _rtld(sp, &exit_proc, &obj_main)*/
+	bl      ._rtld		/* &_start = _rtld(sp, &exit_proc, &obj_main)*/
+	nop
 	mtlr    %r3
 
 	/*
 	 * Restore args, with new obj/exit proc
 	 */
-	lwz     %r3,16(%r1)     /* argc */
-	lwz     %r4,20(%r1)	/* argv */
-	lwz     %r5,24(%r1)	/* envp */
-	lwz     %r6,12(%r1)	/* obj */
-	lwz     %r7,8(%r1)	/* exit proc */
-	lwz     %r8,36(%r1)	/* ps_strings */
-        addi    %r1,%r1,48	/* restore original stackptr */
+	ld      %r3,48(%r1)     /* argc */
+	ld      %r4,56(%r1)	/* argv */
+	ld      %r5,64(%r1)	/* envp */
+	ld      %r6,72(%r1)	/* obj */
+	ld      %r7,80(%r1)	/* exit proc */
+	ld      %r8,88(%r1)	/* ps_strings */
+        addi    %r1,%r1,96	/* restore original stackptr */
 
 	blrl	/* _start(argc, argv, envp, obj, cleanup, ps_strings) */
 
@@ -119,7 +86,7 @@ _ENTRY(.rtld_start)
  *
  * Call into the MI binder. This routine is reached via the PLT call cell,
  * and then _rtld_powerpc_pltresolve().
- * On entry, %r11 contains the index of the PLT cell, and %r12 contains
+ * On entry, %r13 contains the index of the PLT cell, and %r12 contains
  * a pointer to the ELF object for the file.
  *  Save all registers, call into the binder to resolve and fixup the external
  * routine, and then transfer to the external routine on return.
@@ -137,7 +104,8 @@ _ENTRY(_rtld_bind_start)
 
 	mr      %r3,%r12		# obj
 	mulli   %r4,%r11,12		# rela index * sizeof(Elf_Rela)
-	bl      _rtld_bind at PLT		# target addr = _rtld_bind(obj, reloff)
+	bl      ._rtld_bind		# target addr = _rtld_bind(obj, reloff)
+	nop
 	mtctr   %r3			# move absolute target addr into ctr
 
         lmw     %r3,24(%r1)		# restore r3-r31
@@ -152,43 +120,20 @@ _ENTRY(_rtld_bind_start)
 
 
 /*
- * _rtld_powerpc_pltresolve()
+ * _rtld_powerpc64_pltresolve()
  *
- *  This routine is copied into the latter part of the 72-byte reserved
- * area at the start of the PLT. The absolute address of the _rtld_bind_start
- * routine, and the ELF object for the loaded file, are inserted into
- * the code by the reloc.c:init_pltgot() routine.
  *  The first time an external routine is called, the PLT slot will
- * set up %r11 to the offset of the slot, and will jump to this routine.
- * The ELF object is shifted into %r11, and _rtld_bind_start is called
+ * set up %r2 to the offset of the slot, and will jump to this routine.
+ * The ELF object is in %r11, and _rtld_bind_start is called
  * to complete the binding.
  */
-_ENTRY(_rtld_powerpc_pltresolve)
-        lis     %r12,0			# lis   12,_rtld_bind_start at ha
-        addi    %r12,%r12,0		# addi  12,12,_rtld_bind_start at l
+_ENTRY(_rtld_powerpc64_pltresolve)
+	mr	%r13,%r2
+	ld	%r2,40(%r1)
+	addis	%r12,%r2,_rtld_bind_start at toc@ha
+	addi	%r12,%r12,_rtld_bind_start at toc@l
+	ld	%r2,8(%r12)
+	ld	%r12,0(%r12)
         mtctr   %r12
-        lis     %r12,0			# lis   12,obj at ha
-        addi    %r12,%r12,0		# addi  12,12,obj at l
         bctr
 
-/*
- * _rtld_powerpc_pltcall()
- *
- *  This routine is copied into the 72-byte reserved area at the
- * start of the PLT. The reloc.c:init_pltgot() routine inserts
- * the absolute address of the jumptable.
- *  Control is transferred to this routine when the binder has
- * located the external routine, but determined that it is > 32Mb
- * from the PLT slot. Code is inserted into the PLT slot to set up
- * %r11 with the jumptable index, and jump to here, where the
- * absolute address of the external routine is loaded from the
- * jumptable and transferred to
- */
-_ENTRY(_rtld_powerpc_pltcall)
-        slwi    %r11,%r11,2		# jmptab offset = index * 4
-        addis   %r11,%r11,0		# addis 11,11,jmptab at ha
-        lwz     %r11,0(%r11)		# lwz   11,jmptab at l(11)
-        mtctr   %r11
-        bctr				# (*jmptab[index])()
-
-

Modified: projects/ppc64/rescue/rescue/Makefile
==============================================================================
--- projects/ppc64/rescue/rescue/Makefile	Wed Jan 27 21:19:25 2010	(r203100)
+++ projects/ppc64/rescue/rescue/Makefile	Thu Jan 28 00:48:15 2010	(r203101)
@@ -47,7 +47,11 @@ CLEANFILES+= dhclient_FIXED
 # Define Makefile variable RESCUE
 CRUNCH_BUILDOPTS+= -DRESCUE
 # Define compile-time RESCUE symbol when compiling components
+.if ${TARGET_ARCH} == powerpc64
+CRUNCH_BUILDOPTS+= CRUNCH_CFLAGS=\"-DRESCUE -mminimal-toc\"
+.else
 CRUNCH_BUILDOPTS+= CRUNCH_CFLAGS=-DRESCUE
+.endif
 
 # An experiment that failed: try overriding bsd.lib.mk and bsd.prog.mk
 # rather than incorporating rescue-specific logic into standard files.

Modified: projects/ppc64/sys/powerpc/include/_stdint.h
==============================================================================
--- projects/ppc64/sys/powerpc/include/_stdint.h	Wed Jan 27 21:19:25 2010	(r203100)
+++ projects/ppc64/sys/powerpc/include/_stdint.h	Thu Jan 28 00:48:15 2010	(r203101)
@@ -80,13 +80,21 @@
 #define	INT8_MAX	0x7f
 #define	INT16_MAX	0x7fff
 #define	INT32_MAX	0x7fffffff
+#ifdef __powerpc64__
+#define	INT64_MAX	0x7fffffffffffffffL
+#else
 #define	INT64_MAX	0x7fffffffffffffffLL
+#endif
 
 /* Maximum values of exact-width unsigned integer types. */
 #define	UINT8_MAX	0xff
 #define	UINT16_MAX	0xffff
 #define	UINT32_MAX	0xffffffffU
+#ifdef __powerpc64__
+#define	UINT64_MAX	0xffffffffffffffffUL
+#else
 #define	UINT64_MAX	0xffffffffffffffffULL
+#endif
 
 /*
  * ISO/IEC 9899:1999

Modified: projects/ppc64/sys/powerpc/include/profile.h
==============================================================================
--- projects/ppc64/sys/powerpc/include/profile.h	Wed Jan 27 21:19:25 2010	(r203100)
+++ projects/ppc64/sys/powerpc/include/profile.h	Thu Jan 28 00:48:15 2010	(r203101)
@@ -173,7 +173,11 @@ void __mcount(uintfptr_t frompc, uintfpt
 
 #else	/* !_KERNEL */
 
+#ifdef __powerpc64__
+typedef u_long	uintfptr_t;
+#else
 typedef u_int	uintfptr_t;
+#endif
 
 #endif	/* _KERNEL */
 

Copied and modified: projects/ppc64/usr.bin/truss/powerpc64-fbsd.c (from r202947, projects/ppc64/usr.bin/truss/powerpc-fbsd.c)
==============================================================================
--- projects/ppc64/usr.bin/truss/powerpc-fbsd.c	Sun Jan 24 20:15:59 2010	(r202947, copy source)
+++ projects/ppc64/usr.bin/truss/powerpc64-fbsd.c	Thu Jan 28 00:48:15 2010	(r203101)
@@ -118,9 +118,6 @@ powerpc_syscall_entry(struct trussinfo *
   unsigned int regargs;
   struct syscall *sc;
 
-  /* Account for a 64-bit argument with corresponding alignment. */
-  nargs += 2;
-
   cpid = trussinfo->curthread->tid;
 
   clear_fsc();
@@ -137,14 +134,10 @@ powerpc_syscall_entry(struct trussinfo *
   regargs = NARGREG;
   syscall_num = regs.fixreg[0];
   args = &regs.fixreg[3];
-  if (syscall_num == SYS_syscall) {
+  if (syscall_num == SYS_syscall || syscall_num == SYS___syscall) {
     args = &regs.fixreg[4];
     regargs -= 1;
     syscall_num = regs.fixreg[3];
-  } else if (syscall_num == SYS___syscall) {
-    args = &regs.fixreg[5];
-    regargs -= 2;
-    syscall_num = regs.fixreg[4];
   }
 
   fsc.number = syscall_num;
@@ -172,7 +165,7 @@ powerpc_syscall_entry(struct trussinfo *
     memmove(&fsc.args[0], args, regargs * sizeof(fsc.args[0]));
 
     iorequest.piod_op = PIOD_READ_D;
-    iorequest.piod_offs = (void *)(regs.fixreg[1] + 8);
+    iorequest.piod_offs = (void *)(regs.fixreg[1] + 48);
     iorequest.piod_addr = &fsc.args[regargs];
     iorequest.piod_len = (nargs - regargs) * sizeof(fsc.args[0]);
     ptrace(PT_IO, cpid, (caddr_t)&iorequest, 0);
@@ -292,14 +285,6 @@ powerpc_syscall_exit(struct trussinfo *t
       asprintf(&fsc.s_args[i], "0x%lx", fsc.args[i]);
   } else {
     /*
-     * On 32-bit big-endian, the low word of a 64-bit return is
-     * in the greater address. Switch to this. XXX note that
-     * print_syscall_ret can't handle 64-bit return values (llseek)
-     */
-    if (sc->ret_type == 2)
-      retval = regs.fixreg[4];
-
-    /*
      * Here, we only look for arguments that have OUT masked in --
      * otherwise, they were handled in the syscall_entry function.
      */

Modified: projects/ppc64/usr.sbin/crunch/crunchide/Makefile
==============================================================================
--- projects/ppc64/usr.sbin/crunch/crunchide/Makefile	Wed Jan 27 21:19:25 2010	(r203100)
+++ projects/ppc64/usr.sbin/crunch/crunchide/Makefile	Thu Jan 28 00:48:15 2010	(r203101)
@@ -10,7 +10,7 @@ CFLAGS+=-DNLIST_AOUT
 SRCS+=	exec_aout.c
 .endif
 
-.if ${TARGET_ARCH} == ia64 || \
+.if ${TARGET_ARCH} == ia64 || ${TARGET_ARCH} == powerpc64 || \
     ${TARGET_ARCH} == sparc64 || ${TARGET_ARCH} == amd64
 CFLAGS+=-DNLIST_ELF64
 SRCS+=	exec_elf64.c

Modified: projects/ppc64/usr.sbin/crunch/crunchide/exec_elf32.c
==============================================================================
--- projects/ppc64/usr.sbin/crunch/crunchide/exec_elf32.c	Wed Jan 27 21:19:25 2010	(r203100)
+++ projects/ppc64/usr.sbin/crunch/crunchide/exec_elf32.c	Thu Jan 28 00:48:15 2010	(r203101)
@@ -176,6 +176,10 @@ ELFNAMEEND(check)(int fd, const char *fn
 #define	EM_PPC		20
 #endif
 	case EM_PPC: break;
+#ifndef EM_PPC64
+#define	EM_PPC64	21
+#endif
+	case EM_PPC64: break;
 #ifndef EM_SPARCV9
 #define	EM_SPARCV9	43
 #endif

Modified: projects/ppc64/usr.sbin/named/Makefile
==============================================================================
--- projects/ppc64/usr.sbin/named/Makefile	Wed Jan 27 21:19:25 2010	(r203100)
+++ projects/ppc64/usr.sbin/named/Makefile	Thu Jan 28 00:48:15 2010	(r203101)
@@ -48,6 +48,10 @@ CFLAGS+=	-DCONFIGARGS="\"${CONFIGARGS}\"
 CFLAGS+=	-I${SRCDIR}/unix/include -I${SRCDIR}/include -I${LIB_BIND_DIR}
 CFLAGS+=	-I${BIND_DIR}/lib/isc/${ISC_ATOMIC_ARCH}/include
 
+.if ${MACHINE_ARCH} == powerpc64
+CFLAGS+=	-mminimal-toc
+.endif
+
 # Remove the date stamp to make it more obvious when real changes happen
 CFLAGS+=	-U__DATE__
 

Modified: projects/ppc64/usr.sbin/pmcstat/pmcstat_log.c
==============================================================================
--- projects/ppc64/usr.sbin/pmcstat/pmcstat_log.c	Wed Jan 27 21:19:25 2010	(r203100)
+++ projects/ppc64/usr.sbin/pmcstat/pmcstat_log.c	Thu Jan 28 00:48:15 2010	(r203101)
@@ -1965,6 +1965,9 @@ pmcstat_callgraph_do_gmon_arcs(void)
  * callgraph is generated if FLAG_DO_CALLGRAPHS is set.  gmon.out
  * files usable by gprof(1) are created if FLAG_DO_GPROF is set.
  */
+
+int foo[sizeof(uintfptr_t) - 7];
+
 static int
 pmcstat_analyze_log(struct pmcstat_args *a)
 {


More information about the svn-src-projects mailing list