CVS commit: src/libexec/ld.elf_so/arch/powerpc

2020-05-23 Thread Michael Lorenz
Module Name:src
Committed By:   macallan
Date:   Sun May 24 02:33:11 UTC 2020

Modified Files:
src/libexec/ld.elf_so/arch/powerpc: ppc_reloc.c

Log Message:
new binutils/gcc started emitting R_PPC_UADDR32 reloc entries, so for now
treat them like R_PPC_ADDR32
XXX
these relocs have been observed in the xf86-video-radeon driver, but only in
the AtomBios support code, which is unused on PowerPC. This allows the driver
to load but it's not clear if the affected parts would actually function.


To generate a diff of this commit:
cvs rdiff -u -r1.60 -r1.61 src/libexec/ld.elf_so/arch/powerpc/ppc_reloc.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/libexec/ld.elf_so/arch/powerpc/ppc_reloc.c
diff -u src/libexec/ld.elf_so/arch/powerpc/ppc_reloc.c:1.60 src/libexec/ld.elf_so/arch/powerpc/ppc_reloc.c:1.61
--- src/libexec/ld.elf_so/arch/powerpc/ppc_reloc.c:1.60	Sun Dec  8 23:49:16 2019
+++ src/libexec/ld.elf_so/arch/powerpc/ppc_reloc.c	Sun May 24 02:33:11 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: ppc_reloc.c,v 1.60 2019/12/08 23:49:16 uwe Exp $	*/
+/*	$NetBSD: ppc_reloc.c,v 1.61 2020/05/24 02:33:11 macallan Exp $	*/
 
 /*-
  * Copyright (C) 1998	Tsubai Masanari
@@ -30,7 +30,7 @@
 
 #include 
 #ifndef lint
-__RCSID("$NetBSD: ppc_reloc.c,v 1.60 2019/12/08 23:49:16 uwe Exp $");
+__RCSID("$NetBSD: ppc_reloc.c,v 1.61 2020/05/24 02:33:11 macallan Exp $");
 #endif /* not lint */
 
 #include 
@@ -195,6 +195,7 @@ _rtld_relocate_nonplt_objects(Obj_Entry 
 		case R_TYPE(ADDR64):	/*  S + A */
 #else
 		case R_TYPE(ADDR32):	/*  S + A */
+		case R_TYPE(UADDR32):	/*  S + A */
 #endif
 		case R_TYPE(GLOB_DAT):	/*  S + A */
 		case R_TYPE(ADDR16_LO):
@@ -226,6 +227,7 @@ _rtld_relocate_nonplt_objects(Obj_Entry 
 		case R_TYPE(ADDR64):	/*  S + A */
 #else
 		case R_TYPE(ADDR32):	/*  S + A */
+		case R_TYPE(UADDR32):	/*  S + A */
 #endif
 		case R_TYPE(GLOB_DAT):	/*  S + A */
 			tmp = (Elf_Addr)(defobj->relocbase + def->st_value +



CVS commit: src/libexec/ld.elf_so/arch/powerpc

2019-12-08 Thread Valeriy E. Ushakov
Module Name:src
Committed By:   uwe
Date:   Sun Dec  8 23:49:16 UTC 2019

Modified Files:
src/libexec/ld.elf_so/arch/powerpc: ppc_reloc.c

Log Message:
Use existing lo() and hi() macros.  Same object code is generated.


To generate a diff of this commit:
cvs rdiff -u -r1.59 -r1.60 src/libexec/ld.elf_so/arch/powerpc/ppc_reloc.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/libexec/ld.elf_so/arch/powerpc/ppc_reloc.c
diff -u src/libexec/ld.elf_so/arch/powerpc/ppc_reloc.c:1.59 src/libexec/ld.elf_so/arch/powerpc/ppc_reloc.c:1.60
--- src/libexec/ld.elf_so/arch/powerpc/ppc_reloc.c:1.59	Sun Dec  8 22:57:51 2019
+++ src/libexec/ld.elf_so/arch/powerpc/ppc_reloc.c	Sun Dec  8 23:49:16 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: ppc_reloc.c,v 1.59 2019/12/08 22:57:51 uwe Exp $	*/
+/*	$NetBSD: ppc_reloc.c,v 1.60 2019/12/08 23:49:16 uwe Exp $	*/
 
 /*-
  * Copyright (C) 1998	Tsubai Masanari
@@ -30,7 +30,7 @@
 
 #include 
 #ifndef lint
-__RCSID("$NetBSD: ppc_reloc.c,v 1.59 2019/12/08 22:57:51 uwe Exp $");
+__RCSID("$NetBSD: ppc_reloc.c,v 1.60 2019/12/08 23:49:16 uwe Exp $");
 #endif /* not lint */
 
 #include 
@@ -246,7 +246,7 @@ _rtld_relocate_nonplt_objects(Obj_Entry 
 			tmp = (Elf_Addr)(defobj->relocbase + def->st_value +
 			rela->r_addend);
 
-			uint16_t tmp16 = (uint16_t)(tmp & 0x);
+			uint16_t tmp16 = lo(tmp);
 
 			uint16_t *where16 = (uint16_t *)where;
 			if (*where16 != tmp16)
@@ -262,10 +262,10 @@ _rtld_relocate_nonplt_objects(Obj_Entry 
 			tmp = (Elf_Addr)(defobj->relocbase + def->st_value +
 			rela->r_addend);
 
-			uint16_t tmp16 = (uint16_t)((tmp >> 16) & 0x);
+			uint16_t tmp16 = hi(tmp);
 			if (ELF_R_TYPE(rela->r_info) == R_TYPE(ADDR16_HA)
-			&& (tmp & 0x8000))
-++tmp16;
+			&& (tmp & __ha16))
+++tmp16; /* adjust to ha(tmp) */
 
 			uint16_t *where16 = (uint16_t *)where;
 			if (*where16 != tmp16)



CVS commit: src/libexec/ld.elf_so/arch/powerpc

2019-12-08 Thread Valeriy E. Ushakov
Module Name:src
Committed By:   uwe
Date:   Sun Dec  8 22:57:51 UTC 2019

Modified Files:
src/libexec/ld.elf_so/arch/powerpc: ppc_reloc.c

Log Message:
Resolve ADDR16_LO, ADDR16_HI, and ADDR16_HA relocs.

Recent GNU ld does not resolve them statically if the reloc is in a
writable section and the symbol is not already referenced from text.


To generate a diff of this commit:
cvs rdiff -u -r1.58 -r1.59 src/libexec/ld.elf_so/arch/powerpc/ppc_reloc.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/libexec/ld.elf_so/arch/powerpc/ppc_reloc.c
diff -u src/libexec/ld.elf_so/arch/powerpc/ppc_reloc.c:1.58 src/libexec/ld.elf_so/arch/powerpc/ppc_reloc.c:1.59
--- src/libexec/ld.elf_so/arch/powerpc/ppc_reloc.c:1.58	Sun Dec 30 03:23:46 2018
+++ src/libexec/ld.elf_so/arch/powerpc/ppc_reloc.c	Sun Dec  8 22:57:51 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: ppc_reloc.c,v 1.58 2018/12/30 03:23:46 christos Exp $	*/
+/*	$NetBSD: ppc_reloc.c,v 1.59 2019/12/08 22:57:51 uwe Exp $	*/
 
 /*-
  * Copyright (C) 1998	Tsubai Masanari
@@ -30,7 +30,7 @@
 
 #include 
 #ifndef lint
-__RCSID("$NetBSD: ppc_reloc.c,v 1.58 2018/12/30 03:23:46 christos Exp $");
+__RCSID("$NetBSD: ppc_reloc.c,v 1.59 2019/12/08 22:57:51 uwe Exp $");
 #endif /* not lint */
 
 #include 
@@ -197,6 +197,9 @@ _rtld_relocate_nonplt_objects(Obj_Entry 
 		case R_TYPE(ADDR32):	/*  S + A */
 #endif
 		case R_TYPE(GLOB_DAT):	/*  S + A */
+		case R_TYPE(ADDR16_LO):
+		case R_TYPE(ADDR16_HI):
+		case R_TYPE(ADDR16_HA):
 		case R_TYPE(DTPMOD):
 		case R_TYPE(DTPREL):
 		case R_TYPE(TPREL):
@@ -234,6 +237,50 @@ _rtld_relocate_nonplt_objects(Obj_Entry 
 			obj->path, (void *)*where, defobj->path));
 			break;
 
+		/*
+		 * Recent GNU ld does not resolve ADDR16_{LO,HI,HA} if
+		 * the reloc is in a writable section and the symbol
+		 * is not already referenced from text.
+		 */
+		case R_TYPE(ADDR16_LO): {
+			tmp = (Elf_Addr)(defobj->relocbase + def->st_value +
+			rela->r_addend);
+
+			uint16_t tmp16 = (uint16_t)(tmp & 0x);
+
+			uint16_t *where16 = (uint16_t *)where;
+			if (*where16 != tmp16)
+*where16 = tmp16;
+			rdbg(("ADDR16_LO %s in %s --> #lo(%p) = 0x%x in %s",
+			obj->strtab + obj->symtab[symnum].st_name,
+			  obj->path, (void *)tmp, tmp16, defobj->path));
+			break;
+		}
+
+		case R_TYPE(ADDR16_HI):
+		case R_TYPE(ADDR16_HA): {
+			tmp = (Elf_Addr)(defobj->relocbase + def->st_value +
+			rela->r_addend);
+
+			uint16_t tmp16 = (uint16_t)((tmp >> 16) & 0x);
+			if (ELF_R_TYPE(rela->r_info) == R_TYPE(ADDR16_HA)
+			&& (tmp & 0x8000))
+++tmp16;
+
+			uint16_t *where16 = (uint16_t *)where;
+			if (*where16 != tmp16)
+*where16 = tmp16;
+			rdbg(("ADDR16_H%c %s in %s --> #h%c(%p) = 0x%x in %s",
+			  (ELF_R_TYPE(rela->r_info) == R_TYPE(ADDR16_HI)
+			   ? 'I' : 'A'),
+			  obj->strtab + obj->symtab[symnum].st_name,
+			  obj->path,
+			  (ELF_R_TYPE(rela->r_info) == R_TYPE(ADDR16_HI)
+			   ? 'i' : 'a'),
+			  (void *)tmp, tmp16, defobj->path));
+			break;
+		}
+
 		case R_TYPE(RELATIVE):	/*  B + A */
 			*where = (Elf_Addr)(obj->relocbase + rela->r_addend);
 			rdbg(("RELATIVE in %s --> %p", obj->path,



CVS commit: src/libexec/ld.elf_so/arch/powerpc

2018-12-29 Thread Christos Zoulas
Module Name:src
Committed By:   christos
Date:   Sun Dec 30 03:23:46 UTC 2018

Modified Files:
src/libexec/ld.elf_so/arch/powerpc: ppc_reloc.c

Log Message:
- fix wrong reloc name in assert
- fix uninitialized


To generate a diff of this commit:
cvs rdiff -u -r1.57 -r1.58 src/libexec/ld.elf_so/arch/powerpc/ppc_reloc.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/libexec/ld.elf_so/arch/powerpc/ppc_reloc.c
diff -u src/libexec/ld.elf_so/arch/powerpc/ppc_reloc.c:1.57 src/libexec/ld.elf_so/arch/powerpc/ppc_reloc.c:1.58
--- src/libexec/ld.elf_so/arch/powerpc/ppc_reloc.c:1.57	Tue Apr  3 17:10:27 2018
+++ src/libexec/ld.elf_so/arch/powerpc/ppc_reloc.c	Sat Dec 29 22:23:46 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: ppc_reloc.c,v 1.57 2018/04/03 21:10:27 joerg Exp $	*/
+/*	$NetBSD: ppc_reloc.c,v 1.58 2018/12/30 03:23:46 christos Exp $	*/
 
 /*-
  * Copyright (C) 1998	Tsubai Masanari
@@ -30,7 +30,7 @@
 
 #include 
 #ifndef lint
-__RCSID("$NetBSD: ppc_reloc.c,v 1.57 2018/04/03 21:10:27 joerg Exp $");
+__RCSID("$NetBSD: ppc_reloc.c,v 1.58 2018/12/30 03:23:46 christos Exp $");
 #endif /* not lint */
 
 #include 
@@ -188,6 +188,7 @@ _rtld_relocate_nonplt_objects(Obj_Entry 
 		unsigned long	 symnum;
 
 		where = (Elf_Addr *)(obj->relocbase + rela->r_offset);
+		symnum = ELF_R_SYM(rela->r_info);
 
 		switch (ELF_R_TYPE(rela->r_info)) {
 #ifdef _LP64
@@ -199,7 +200,6 @@ _rtld_relocate_nonplt_objects(Obj_Entry 
 		case R_TYPE(DTPMOD):
 		case R_TYPE(DTPREL):
 		case R_TYPE(TPREL):
-			symnum = ELF_R_SYM(rela->r_info);
 			if (last_symnum != symnum) {
 last_symnum = symnum;
 def = _rtld_find_symdef(symnum, obj, ,
@@ -327,7 +327,7 @@ _rtld_relocate_plt_lazy(Obj_Entry *obj)
 		size_t reloff = rela - obj->pltrela;
 		Elf_Word *where = (Elf_Word *)(obj->relocbase + rela->r_offset);
 
-		assert(ELF_R_TYPE(rela->r_info) == R_TYPE(JUMP_SLOT) ||
+		assert(ELF_R_TYPE(rela->r_info) == R_TYPE(JMP_SLOT) ||
 		   ELF_R_TYPE(rela->r_info) == R_TYPE(IRELATIVE));
 
 		if (ELF_R_TYPE(rela->r_info) == R_TYPE(IRELATIVE)) {



CVS commit: src/libexec/ld.elf_so/arch/powerpc

2014-08-15 Thread Matt Thomas
Module Name:src
Committed By:   matt
Date:   Fri Aug 15 09:40:07 UTC 2014

Modified Files:
src/libexec/ld.elf_so/arch/powerpc: Makefile.inc

Log Message:
Use -fPIC since powerpc64 is always compiled as -fPIC and -fpic would cause
__PIC__ to change.


To generate a diff of this commit:
cvs rdiff -u -r1.14 -r1.15 src/libexec/ld.elf_so/arch/powerpc/Makefile.inc

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/libexec/ld.elf_so/arch/powerpc/Makefile.inc
diff -u src/libexec/ld.elf_so/arch/powerpc/Makefile.inc:1.14 src/libexec/ld.elf_so/arch/powerpc/Makefile.inc:1.15
--- src/libexec/ld.elf_so/arch/powerpc/Makefile.inc:1.14	Wed Aug 13 15:56:52 2014
+++ src/libexec/ld.elf_so/arch/powerpc/Makefile.inc	Fri Aug 15 09:40:07 2014
@@ -1,10 +1,9 @@
-#	$NetBSD: Makefile.inc,v 1.14 2014/08/13 15:56:52 joerg Exp $
+#	$NetBSD: Makefile.inc,v 1.15 2014/08/15 09:40:07 matt Exp $
 
 SRCS+=		ppc_reloc.c
 LDFLAGS+=	-Wl,-e,_rtld_start
 
-# XXX Should not be in CPPFLAGS!
-CPPFLAGS+=	-fpic
+CPPFLAGS+=	-fPIC
 
 .if ${LDELFSO_MACHINE_ARCH} == powerpc64
 SRCS+=		rtld_start64.S



CVS commit: src/libexec/ld.elf_so/arch/powerpc

2014-08-13 Thread Joerg Sonnenberger
Module Name:src
Committed By:   joerg
Date:   Wed Aug 13 15:56:52 UTC 2014

Modified Files:
src/libexec/ld.elf_so/arch/powerpc: Makefile.inc

Log Message:
Build position independent on PPC64, too.


To generate a diff of this commit:
cvs rdiff -u -r1.13 -r1.14 src/libexec/ld.elf_so/arch/powerpc/Makefile.inc

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/libexec/ld.elf_so/arch/powerpc/Makefile.inc
diff -u src/libexec/ld.elf_so/arch/powerpc/Makefile.inc:1.13 src/libexec/ld.elf_so/arch/powerpc/Makefile.inc:1.14
--- src/libexec/ld.elf_so/arch/powerpc/Makefile.inc:1.13	Thu Mar  6 07:47:39 2014
+++ src/libexec/ld.elf_so/arch/powerpc/Makefile.inc	Wed Aug 13 15:56:52 2014
@@ -1,16 +1,16 @@
-#	$NetBSD: Makefile.inc,v 1.13 2014/03/06 07:47:39 matt Exp $
+#	$NetBSD: Makefile.inc,v 1.14 2014/08/13 15:56:52 joerg Exp $
 
 SRCS+=		ppc_reloc.c
 LDFLAGS+=	-Wl,-e,_rtld_start
 
 # XXX Should not be in CPPFLAGS!
+CPPFLAGS+=	-fpic
+
 .if ${LDELFSO_MACHINE_ARCH} == powerpc64
 SRCS+=		rtld_start64.S
 CPPFLAGS+=	-DELFSIZE=64
 .else
 SRCS+=		rtld_start.S
-CPPFLAGS+=	-fpic
 CPPFLAGS+=	-DELFSIZE=32
 LDFLAGS+=	-Wl,--script,${.CURDIR}/arch/powerpc/ld.so.script
 .endif
-



CVS commit: src/libexec/ld.elf_so/arch/powerpc

2014-07-28 Thread Matt Thomas
Module Name:src
Committed By:   matt
Date:   Mon Jul 28 17:28:13 UTC 2014

Modified Files:
src/libexec/ld.elf_so/arch/powerpc: ppc_reloc.c

Log Message:
Fix parenthesis on __ha macro


To generate a diff of this commit:
cvs rdiff -u -r1.51 -r1.52 src/libexec/ld.elf_so/arch/powerpc/ppc_reloc.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/libexec/ld.elf_so/arch/powerpc/ppc_reloc.c
diff -u src/libexec/ld.elf_so/arch/powerpc/ppc_reloc.c:1.51 src/libexec/ld.elf_so/arch/powerpc/ppc_reloc.c:1.52
--- src/libexec/ld.elf_so/arch/powerpc/ppc_reloc.c:1.51	Thu Mar  6 19:19:40 2014
+++ src/libexec/ld.elf_so/arch/powerpc/ppc_reloc.c	Mon Jul 28 17:28:13 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: ppc_reloc.c,v 1.51 2014/03/06 19:19:40 matt Exp $	*/
+/*	$NetBSD: ppc_reloc.c,v 1.52 2014/07/28 17:28:13 matt Exp $	*/
 
 /*-
  * Copyright (C) 1998	Tsubai Masanari
@@ -30,7 +30,7 @@
 
 #include sys/cdefs.h
 #ifndef lint
-__RCSID($NetBSD: ppc_reloc.c,v 1.51 2014/03/06 19:19:40 matt Exp $);
+__RCSID($NetBSD: ppc_reloc.c,v 1.52 2014/07/28 17:28:13 matt Exp $);
 #endif /* not lint */
 
 #include stdarg.h
@@ -51,7 +51,7 @@ void _rtld_powerpc_pltresolve(Elf_Word, 
 #define __ha48		__u64(0x8000)
 #define __ha32		__u64(0x8000)
 #define __ha16		__u32(0x8000)
-#define __ha(x,n) x)  (n)) + ((x)  __ha##n) == __ha##n)  0x)
+#define __ha(x,n) x)  (n)) + (((x)  __ha##n) == __ha##n))  0x)
 #define __hi(x,n) (((x)  (n))  0x)
 #ifdef __LP64
 #define highesta(x)	__ha(__u64(x), 48)



CVS commit: src/libexec/ld.elf_so/arch/powerpc

2014-03-06 Thread Matt Thomas
Module Name:src
Committed By:   matt
Date:   Thu Mar  6 09:34:07 UTC 2014

Modified Files:
src/libexec/ld.elf_so/arch/powerpc: ppc_reloc.c

Log Message:
Make ELF64 aware.


To generate a diff of this commit:
cvs rdiff -u -r1.49 -r1.50 src/libexec/ld.elf_so/arch/powerpc/ppc_reloc.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/libexec/ld.elf_so/arch/powerpc/ppc_reloc.c
diff -u src/libexec/ld.elf_so/arch/powerpc/ppc_reloc.c:1.49 src/libexec/ld.elf_so/arch/powerpc/ppc_reloc.c:1.50
--- src/libexec/ld.elf_so/arch/powerpc/ppc_reloc.c:1.49	Fri Mar 25 18:07:06 2011
+++ src/libexec/ld.elf_so/arch/powerpc/ppc_reloc.c	Thu Mar  6 09:34:07 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: ppc_reloc.c,v 1.49 2011/03/25 18:07:06 joerg Exp $	*/
+/*	$NetBSD: ppc_reloc.c,v 1.50 2014/03/06 09:34:07 matt Exp $	*/
 
 /*-
  * Copyright (C) 1998	Tsubai Masanari
@@ -30,7 +30,7 @@
 
 #include sys/cdefs.h
 #ifndef lint
-__RCSID($NetBSD: ppc_reloc.c,v 1.49 2011/03/25 18:07:06 joerg Exp $);
+__RCSID($NetBSD: ppc_reloc.c,v 1.50 2014/03/06 09:34:07 matt Exp $);
 #endif /* not lint */
 
 #include stdarg.h
@@ -46,19 +46,37 @@ __RCSID($NetBSD: ppc_reloc.c,v 1.49 201
 void _rtld_powerpc_pltcall(Elf_Word);
 void _rtld_powerpc_pltresolve(Elf_Word, Elf_Word);
 
-#define ha(x) u_int32_t)(x)  0x8000) ? \
-			((u_int32_t)(x) + 0x1) : (u_int32_t)(x))  16)
-#define l(x) ((u_int32_t)(x)  0x)
-
+#define __u64(x)	((uint64_t)(x))
+#define __u32(x)	((uint32_t)(x))
+#define __ha48		__u64(0x8000)
+#define __ha32		__u64(0x8000)
+#define __ha16		__u32(0x8000)
+#define __ha(x,n) x)  (n)) + ((x)  __ha##n) == __ha##n)  0x)
+#define __hi(x,n) (((x)  (n))  0x)
+#ifdef __LP64
+#define highesta(x)	__ha(__u64(x), 48)
+#define highest(x)	__hi(__u64(x), 48)
+#define higher(x)	__ha(__u64(x), 32)
+#define higher(x)	__hi(__u64(x), 32)
+#endif
+#define ha(x)		__ha(__u32(x), 16)
+#define hi(x)		__hi(__u32(x), 16)
+#define lo(x)		(__u32(x)  0x)
+
+#ifdef _LP64
+/* function descriptor for _rtld_bind_start */
+extern const uint64_t _rtld_bind_start[3];
+#else
 void _rtld_bind_bssplt_start(void);
 void _rtld_bind_secureplt_start(void);
+#endif
 void _rtld_relocate_nonplt_self(Elf_Dyn *, Elf_Addr);
 caddr_t _rtld_bind(const Obj_Entry *, Elf_Word);
 static int _rtld_relocate_plt_object(const Obj_Entry *,
 const Elf_Rela *, int, Elf_Addr *);
 
 /*
- * The PPC PLT format consists of three sections:
+ * The PPC32 PLT format consists of three sections:
  * (1) The pltcall and pltresolve glue code.  This is always 18 words.
  * (2) The code part of the PLT entries.  There are 2 words per entry for
  * up to 8192 entries, then 4 words per entry for any additional entries.
@@ -67,15 +85,19 @@ static int _rtld_relocate_plt_object(con
  * per entry).
  */
 
-/*
- * Setup the plt glue routines (for bss-plt).
- */
-#define PLTCALL_SIZE	20
-#define PLTRESOLVE_SIZE	24
-
 void
 _rtld_setup_pltgot(const Obj_Entry *obj)
 {
+#ifdef _LP64
+	/*
+	 * For powerpc64, just copy the function descriptor to pltgot[0].
+	 */
+	if (obj-pltgot != NULL) {
+		obj-pltgot[0] = (Elf_Addr) _rtld_bind_start[0];
+		obj-pltgot[1] = (Elf_Addr) _rtld_bind_start[1];
+		obj-pltgot[2] = (Elf_Addr) obj;
+	}
+#else
 	/*
 	 * Secure-PLT is much more sane.
 	 */
@@ -86,6 +108,12 @@ _rtld_setup_pltgot(const Obj_Entry *obj)
 		obj-path, obj-gotptr,
 		(void *) obj-gotptr[1], (void *) obj-gotptr[2]));
 	} else {
+/*
+ * Setup the plt glue routines (for bss-plt).
+ */
+#define BSSPLTCALL_SIZE		20
+#define BSSPLTRESOLVE_SIZE	24
+
 		Elf_Word *pltcall, *pltresolve;
 		Elf_Word *jmptab;
 		int N = obj-pltrelalim - obj-pltrela;
@@ -101,17 +129,17 @@ _rtld_setup_pltgot(const Obj_Entry *obj)
 		pltcall = obj-pltgot;
 		jmptab = pltcall + 18 + N * 2;
 
-		memcpy(pltcall, _rtld_powerpc_pltcall, PLTCALL_SIZE);
+		memcpy(pltcall, _rtld_powerpc_pltcall, BSSPLTCALL_SIZE);
 		pltcall[1] |= ha(jmptab);
-		pltcall[2] |= l(jmptab);
+		pltcall[2] |= lo(jmptab);
 
 		pltresolve = obj-pltgot + 8;
 
-		memcpy(pltresolve, _rtld_powerpc_pltresolve, PLTRESOLVE_SIZE);
+		memcpy(pltresolve, _rtld_powerpc_pltresolve, BSSPLTRESOLVE_SIZE);
 		pltresolve[0] |= ha(_rtld_bind_bssplt_start);
-		pltresolve[1] |= l(_rtld_bind_bssplt_start);
+		pltresolve[1] |= lo(_rtld_bind_bssplt_start);
 		pltresolve[3] |= ha(obj);
-		pltresolve[4] |= l(obj);
+		pltresolve[4] |= lo(obj);
 
 		/*
 		 * Invalidate the icache for only the code part of the PLT
@@ -119,6 +147,7 @@ _rtld_setup_pltgot(const Obj_Entry *obj)
 		 */
 		__syncicache(pltcall, (char *)jmptab - (char *)pltcall);
 	}
+#endif
 }
 
 void
@@ -167,8 +196,12 @@ _rtld_relocate_nonplt_objects(Obj_Entry 
 		case R_TYPE(NONE):
 			break;
 
-		case R_TYPE(32):	/* word32 S + A */
-		case R_TYPE(GLOB_DAT):	/* word32 S + A */
+#ifdef _LP64
+		case R_TYPE(ADDR64):	/* address S + A */
+#else
+		case R_TYPE(ADDR32):	/* address S + A */
+#endif
+		case 

CVS commit: src/libexec/ld.elf_so/arch/powerpc

2014-03-06 Thread Matt Thomas
Module Name:src
Committed By:   matt
Date:   Fri Mar  7 05:57:46 UTC 2014

Modified Files:
src/libexec/ld.elf_so/arch/powerpc: ld.so.script

Log Message:
Change OUTPUT to powerpc:common to make powerpc64 ld happy


To generate a diff of this commit:
cvs rdiff -u -r1.3 -r1.4 src/libexec/ld.elf_so/arch/powerpc/ld.so.script

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/libexec/ld.elf_so/arch/powerpc/ld.so.script
diff -u src/libexec/ld.elf_so/arch/powerpc/ld.so.script:1.3 src/libexec/ld.elf_so/arch/powerpc/ld.so.script:1.4
--- src/libexec/ld.elf_so/arch/powerpc/ld.so.script:1.3	Mon Sep  9 14:45:37 2002
+++ src/libexec/ld.elf_so/arch/powerpc/ld.so.script	Fri Mar  7 05:57:46 2014
@@ -1,6 +1,6 @@
 OUTPUT_FORMAT(elf32-powerpc, elf32-powerpc,
 	  elf32-powerpc)
-OUTPUT_ARCH(powerpc)
+OUTPUT_ARCH(powerpc:common)
 ENTRY(_start)
 /* Do we need any of these for elf?
__DYNAMIC = 0;*/



CVS commit: src/libexec/ld.elf_so/arch/powerpc

2014-03-05 Thread Matt Thomas
Module Name:src
Committed By:   matt
Date:   Thu Mar  6 07:47:19 UTC 2014

Added Files:
src/libexec/ld.elf_so/arch/powerpc: rtld_start64.S

Log Message:
Startup file for powerpc64.  (too many difference with ppc32 to do
#ifdef dance)


To generate a diff of this commit:
cvs rdiff -u -r0 -r1.1 src/libexec/ld.elf_so/arch/powerpc/rtld_start64.S

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Added files:

Index: src/libexec/ld.elf_so/arch/powerpc/rtld_start64.S
diff -u /dev/null src/libexec/ld.elf_so/arch/powerpc/rtld_start64.S:1.1
--- /dev/null	Thu Mar  6 07:47:19 2014
+++ src/libexec/ld.elf_so/arch/powerpc/rtld_start64.S	Thu Mar  6 07:47:19 2014
@@ -0,0 +1,129 @@
+/*	$NetBSD: rtld_start64.S,v 1.1 2014/03/06 07:47:19 matt Exp $	*/
+
+/*-
+ * Copyright (C) 1998	Tsubai Masanari
+ * Portions copyright 2002 Charles M. Hannum r...@ihack.net
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *notice, this list of conditions and the following disclaimer in the
+ *documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ *derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include machine/asm.h
+
+	.globl	_rtld_relocate_nonplt_self
+	.globl	_rtld
+
+	.text
+ENTRY_NOPROFILE(_rtld_start)
+	mr	%r23,%r3		// argc
+	mr	%r24,%r4		// argv
+	mr	%r25,%r5		// envp
+/*	mr	%r26,%r6		// obj		(always 0) */
+/*	mr	%r27,%r7		// cleanup	(always 0) */
+	mr	%r28,%r8		// ps_strings
+	li	%r0,0
+	stdu	%r0,-64(%r1)		// terminate stack chain
+	std	%r2,40(%r1)		// save TOC
+	std	%r0,16(%r1)		// ditto
+
+	bcl	20,31,1f
+1:	mflr	%r30
+	ld	%r3,0(%r2)		// TOC[0] = TOC
+	sub	%r29,%r2,%r3		// compute relocbase
+
+	addis	%r3,%r3,_DYNAMIC-1b@ha	// get _DYNAMIC actual address
+	addi	%r3,%r3,_DYNAMIC-1b@l
+	mr	%r4,%r29		// r4 = relocbase
+	CALL(_rtld_relocate_nonplt_self)
+
+	addi	%r3,%r1,48		// sp = local variable space
+	mr	%r4,%r29		// r4 = relocbase
+	CALL(_rtld)			// _start = _rtld(sp, relocbase)
+
+	ld	%r0,0(%r3)		// func address
+	ld	%r2,8(%r3)		// TOC address
+	ld	%r11,16(%r3)		// environment pointer
+	mtctr	%r0			// so we can call it.
+
+	mr	%r3,%r23		// argc
+	mr	%r4,%r24		// argv
+	mr	%r5,%r25		// envp
+	ld	%r6,56(%r1)		// obj = localvar[1]
+	ld	%r7,48(%r1)		// cleanup = localvar[0]
+	mr	%r8,%r28		// ps_strings
+
+	bctrl		// _start(argc, argv, envp, obj, cleanup, ps_strings)
+	nop
+
+	li	%r0,1			// _exit()
+	sc
+END(_rtld_start)
+
+	.globl	_rtld_bind
+
+/*
+ * %r0 has the index of the rela, %r12 has a pointer to the plt entry.
+ */
+ENTRY_NOPROFILE(_rtld_bind_start)
+	std	%r3,-72(%r1)		// save argument register
+	std	%r4,-64(%r1)		// save argument register
+	std	%r5,-56(%r1)		// save argument register
+	std	%r6,-48(%r1)		// save argument register
+	std	%r7,-40(%r1)		// save argument register
+	std	%r8,-32(%r1)		// save argument register
+	std	%r9,-24(%r1)		// save argument register
+	std	%r10,-16(%r1)		// save argument register
+	std	%r31,-8(%r1)		// save register
+	stdu	%r1,-(48+80)(%r1)	// create back chain
+	mflr	%r10
+	std	%r10,16(%r1)		// save LR
+	mfcr	%r9
+	std	%r9,8(%r1)		// save CR to be safe
+
+	mr	%r31, %r12		// save this across bind call
+	mr	%r3, %r11 		// obj
+	mr	%r4, %r0		// reloff
+
+	CALL(_rtld_bind)		// _rtld_bind(obj, reloff)
+
+	mtctr	%r3
+	ld	%r2,8(%r31)		// load TOC for function
+	ld	%r11,16(%r31)		// load env ptr for function.
+
+	ld	%r0,8(%r1)		// get saved CR
+	mtcr	%r0			// restore it
+	ld	%r0,16(%r1)		// get saved LR
+	mtlr	%r0			// restore it
+
+	addi	%r1,%r1,(48+80)		// adjust stack
+	ld	%r3,-72(%r1)		// restore argument register
+	ld	%r4,-64(%r1)		// restore argument register
+	ld	%r5,-56(%r1)		// restore argument register
+	ld	%r6,-48(%r1)		// restore argument register
+	ld	%r7,-40(%r1)		// restore argument register
+	ld	

CVS commit: src/libexec/ld.elf_so/arch/powerpc

2014-03-05 Thread Matt Thomas
Module Name:src
Committed By:   matt
Date:   Thu Mar  6 07:47:39 UTC 2014

Modified Files:
src/libexec/ld.elf_so/arch/powerpc: Makefile.inc

Log Message:
powerpc64 changes


To generate a diff of this commit:
cvs rdiff -u -r1.12 -r1.13 src/libexec/ld.elf_so/arch/powerpc/Makefile.inc

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/libexec/ld.elf_so/arch/powerpc/Makefile.inc
diff -u src/libexec/ld.elf_so/arch/powerpc/Makefile.inc:1.12 src/libexec/ld.elf_so/arch/powerpc/Makefile.inc:1.13
--- src/libexec/ld.elf_so/arch/powerpc/Makefile.inc:1.12	Wed Oct 26 15:56:58 2011
+++ src/libexec/ld.elf_so/arch/powerpc/Makefile.inc	Thu Mar  6 07:47:39 2014
@@ -1,11 +1,16 @@
-#	$NetBSD: Makefile.inc,v 1.12 2011/10/26 15:56:58 chs Exp $
+#	$NetBSD: Makefile.inc,v 1.13 2014/03/06 07:47:39 matt Exp $
 
-SRCS+=		rtld_start.S ppc_reloc.c
+SRCS+=		ppc_reloc.c
+LDFLAGS+=	-Wl,-e,_rtld_start
 
 # XXX Should not be in CPPFLAGS!
+.if ${LDELFSO_MACHINE_ARCH} == powerpc64
+SRCS+=		rtld_start64.S
+CPPFLAGS+=	-DELFSIZE=64
+.else
+SRCS+=		rtld_start.S
 CPPFLAGS+=	-fpic
-
 CPPFLAGS+=	-DELFSIZE=32
-
-LDFLAGS+=	-Wl,-e,_rtld_start
 LDFLAGS+=	-Wl,--script,${.CURDIR}/arch/powerpc/ld.so.script
+.endif
+



CVS commit: src/libexec/ld.elf_so/arch/powerpc

2011-10-26 Thread Chuck Silvers
Module Name:src
Committed By:   chs
Date:   Wed Oct 26 15:56:58 UTC 2011

Modified Files:
src/libexec/ld.elf_so/arch/powerpc: Makefile.inc

Log Message:
avoid linker warnings with the new binutils by not forcing ld.elf_so
to be soft-float.  the floating-point usage in ld.elf_so is only
because of stdarg functions like printf(), and gcc 4.5 is good
about not actually executing the FP instructions in such functions
unless FP values are passed to them, which ld.elf_so doesn't do.


To generate a diff of this commit:
cvs rdiff -u -r1.11 -r1.12 src/libexec/ld.elf_so/arch/powerpc/Makefile.inc

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/libexec/ld.elf_so/arch/powerpc/Makefile.inc
diff -u src/libexec/ld.elf_so/arch/powerpc/Makefile.inc:1.11 src/libexec/ld.elf_so/arch/powerpc/Makefile.inc:1.12
--- src/libexec/ld.elf_so/arch/powerpc/Makefile.inc:1.11	Thu Oct 22 21:56:13 2009
+++ src/libexec/ld.elf_so/arch/powerpc/Makefile.inc	Wed Oct 26 15:56:58 2011
@@ -1,9 +1,9 @@
-#	$NetBSD: Makefile.inc,v 1.11 2009/10/22 21:56:13 skrll Exp $
+#	$NetBSD: Makefile.inc,v 1.12 2011/10/26 15:56:58 chs Exp $
 
 SRCS+=		rtld_start.S ppc_reloc.c
 
 # XXX Should not be in CPPFLAGS!
-CPPFLAGS+=	-fpic -msoft-float
+CPPFLAGS+=	-fpic
 
 CPPFLAGS+=	-DELFSIZE=32
 



CVS commit: src/libexec/ld.elf_so/arch/powerpc

2011-09-25 Thread matthew green
Module Name:src
Committed By:   mrg
Date:   Mon Sep 26 01:52:22 UTC 2011

Modified Files:
src/libexec/ld.elf_so/arch/powerpc: rtld_start.S

Log Message:
match END() with a relevant ENTRY*().  gas 2.21 complains about the
non-constant-ness of the symbol otherwise.


To generate a diff of this commit:
cvs rdiff -u -r1.16 -r1.17 src/libexec/ld.elf_so/arch/powerpc/rtld_start.S

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/libexec/ld.elf_so/arch/powerpc/rtld_start.S
diff -u src/libexec/ld.elf_so/arch/powerpc/rtld_start.S:1.16 src/libexec/ld.elf_so/arch/powerpc/rtld_start.S:1.17
--- src/libexec/ld.elf_so/arch/powerpc/rtld_start.S:1.16	Fri Mar  4 00:40:48 2011
+++ src/libexec/ld.elf_so/arch/powerpc/rtld_start.S	Mon Sep 26 01:52:22 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: rtld_start.S,v 1.16 2011/03/04 00:40:48 matt Exp $	*/
+/*	$NetBSD: rtld_start.S,v 1.17 2011/09/26 01:52:22 mrg Exp $	*/
 
 /*-
  * Copyright (C) 1998	Tsubai Masanari
@@ -124,7 +124,7 @@ ENTRY_NOPROFILE(_rtld_bind_bssplt_start)
 
 	addi	%r1,%r1,160
 	bctr
-END(_rtld_bind_start)
+END(_rtld_bind_secureplt_start)
 
 	.globl	_rtld_powerpc_pltcall
 	.globl	_rtld_powerpc_pltresolve



CVS commit: src/libexec/ld.elf_so/arch/powerpc

2011-03-03 Thread Matt Thomas
Module Name:src
Committed By:   matt
Date:   Fri Mar  4 00:40:49 UTC 2011

Modified Files:
src/libexec/ld.elf_so/arch/powerpc: rtld_start.S

Log Message:
Don't rely on 32bit math.


To generate a diff of this commit:
cvs rdiff -u -r1.15 -r1.16 src/libexec/ld.elf_so/arch/powerpc/rtld_start.S

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/libexec/ld.elf_so/arch/powerpc/rtld_start.S
diff -u src/libexec/ld.elf_so/arch/powerpc/rtld_start.S:1.15 src/libexec/ld.elf_so/arch/powerpc/rtld_start.S:1.16
--- src/libexec/ld.elf_so/arch/powerpc/rtld_start.S:1.15	Thu Feb 10 02:28:20 2011
+++ src/libexec/ld.elf_so/arch/powerpc/rtld_start.S	Fri Mar  4 00:40:48 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: rtld_start.S,v 1.15 2011/02/10 02:28:20 matt Exp $	*/
+/*	$NetBSD: rtld_start.S,v 1.16 2011/03/04 00:40:48 matt Exp $	*/
 
 /*-
  * Copyright (C) 1998	Tsubai Masanari
@@ -94,8 +94,8 @@
 	 * where inv(n) = (0x1 + n - 1) / n
 	 */
 	mr	%r0,%r11
-	lis	%r11,0x1000b/12@h	# load multiplicative inverse of 12
-	ori	%r11,%r11,0x1000b/12@l
+	lis	%r11,0x1556@h	# load multiplicative inverse of 12
+	ori	%r11,%r11,0x1556@l
 	mulhwu	%r11,%r11,%r0		# get high half of multiplication
 
 	b	1f



CVS commit: src/libexec/ld.elf_so/arch/powerpc

2009-10-22 Thread Nick Hudson
Module Name:src
Committed By:   skrll
Date:   Thu Oct 22 21:56:14 UTC 2009

Modified Files:
src/libexec/ld.elf_so/arch/powerpc: Makefile.inc

Log Message:
Fix start symbol for newer binutils.


To generate a diff of this commit:
cvs rdiff -u -r1.10 -r1.11 src/libexec/ld.elf_so/arch/powerpc/Makefile.inc

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/libexec/ld.elf_so/arch/powerpc/Makefile.inc
diff -u src/libexec/ld.elf_so/arch/powerpc/Makefile.inc:1.10 src/libexec/ld.elf_so/arch/powerpc/Makefile.inc:1.11
--- src/libexec/ld.elf_so/arch/powerpc/Makefile.inc:1.10	Sat Jun  4 16:17:17 2005
+++ src/libexec/ld.elf_so/arch/powerpc/Makefile.inc	Thu Oct 22 21:56:13 2009
@@ -1,4 +1,4 @@
-#	$NetBSD: Makefile.inc,v 1.10 2005/06/04 16:17:17 lukem Exp $
+#	$NetBSD: Makefile.inc,v 1.11 2009/10/22 21:56:13 skrll Exp $
 
 SRCS+=		rtld_start.S ppc_reloc.c
 
@@ -7,5 +7,5 @@
 
 CPPFLAGS+=	-DELFSIZE=32
 
-LDFLAGS+=	-Wl,-e,.rtld_start
+LDFLAGS+=	-Wl,-e,_rtld_start
 LDFLAGS+=	-Wl,--script,${.CURDIR}/arch/powerpc/ld.so.script



CVS commit: src/libexec/ld.elf_so/arch/powerpc

2009-05-24 Thread Havard Eidnes
Module Name:src
Committed By:   he
Date:   Sun May 24 20:35:41 UTC 2009

Modified Files:
src/libexec/ld.elf_so/arch/powerpc: ppc_reloc.c

Log Message:
Apply fix borrowed from i386:  Fix const issue (cast const pointers
to const uint8_t * instead of caddr_t).


To generate a diff of this commit:
cvs rdiff -u -r1.41 -r1.42 src/libexec/ld.elf_so/arch/powerpc/ppc_reloc.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/libexec/ld.elf_so/arch/powerpc/ppc_reloc.c
diff -u src/libexec/ld.elf_so/arch/powerpc/ppc_reloc.c:1.41 src/libexec/ld.elf_so/arch/powerpc/ppc_reloc.c:1.42
--- src/libexec/ld.elf_so/arch/powerpc/ppc_reloc.c:1.41	Thu Jul 24 04:39:25 2008
+++ src/libexec/ld.elf_so/arch/powerpc/ppc_reloc.c	Sun May 24 20:35:41 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: ppc_reloc.c,v 1.41 2008/07/24 04:39:25 matt Exp $	*/
+/*	$NetBSD: ppc_reloc.c,v 1.42 2009/05/24 20:35:41 he Exp $	*/
 
 /*-
  * Copyright (C) 1998	Tsubai Masanari
@@ -30,7 +30,7 @@
 
 #include sys/cdefs.h
 #ifndef lint
-__RCSID($NetBSD: ppc_reloc.c,v 1.41 2008/07/24 04:39:25 matt Exp $);
+__RCSID($NetBSD: ppc_reloc.c,v 1.42 2009/05/24 20:35:41 he Exp $);
 #endif /* not lint */
 
 #include stdarg.h
@@ -123,7 +123,7 @@
 			break;
 		}
 	}
-	relalim = (const Elf_Rela *)((caddr_t)rela + relasz);
+	relalim = (const Elf_Rela *)((const uint8_t *)rela + relasz);
 	for (; rela  relalim; rela++) {
 		where = (Elf_Addr *)(relocbase + rela-r_offset);
 		*where = (Elf_Addr)(relocbase + rela-r_addend);