Module Name:    src
Committed By:   skrll
Date:           Fri Jan  6 10:38:57 UTC 2012

Modified Files:
        src/libexec/ld.elf_so: reloc.c
        src/libexec/ld.elf_so/arch/hppa: hppa_reloc.c rtld_start.S

Log Message:
Implement lazy binding on hppa. rump_server needs it!?!?!

Mostly from OpenBSD.


To generate a diff of this commit:
cvs rdiff -u -r1.105 -r1.106 src/libexec/ld.elf_so/reloc.c
cvs rdiff -u -r1.41 -r1.42 src/libexec/ld.elf_so/arch/hppa/hppa_reloc.c
cvs rdiff -u -r1.11 -r1.12 src/libexec/ld.elf_so/arch/hppa/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/reloc.c
diff -u src/libexec/ld.elf_so/reloc.c:1.105 src/libexec/ld.elf_so/reloc.c:1.106
--- src/libexec/ld.elf_so/reloc.c:1.105	Fri Dec  2 09:06:49 2011
+++ src/libexec/ld.elf_so/reloc.c	Fri Jan  6 10:38:56 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: reloc.c,v 1.105 2011/12/02 09:06:49 skrll Exp $	 */
+/*	$NetBSD: reloc.c,v 1.106 2012/01/06 10:38:56 skrll Exp $	 */
 
 /*
  * Copyright 1996 John D. Polstra.
@@ -39,7 +39,7 @@
 
 #include <sys/cdefs.h>
 #ifndef lint
-__RCSID("$NetBSD: reloc.c,v 1.105 2011/12/02 09:06:49 skrll Exp $");
+__RCSID("$NetBSD: reloc.c,v 1.106 2012/01/06 10:38:56 skrll Exp $");
 #endif /* not lint */
 
 #include <err.h>
@@ -195,9 +195,6 @@ _rtld_relocate_objects(Obj_Entry *first,
 		dbg(("doing lazy PLT binding"));
 		if (_rtld_relocate_plt_lazy(obj) < 0)
 			ok = 0;
-#if defined(__hppa__)
-		bind_now = 1;
-#endif
 		if (obj->z_now || bind_now) {
 			dbg(("doing immediate PLT binding"));
 			if (_rtld_relocate_plt_objects(obj) < 0)

Index: src/libexec/ld.elf_so/arch/hppa/hppa_reloc.c
diff -u src/libexec/ld.elf_so/arch/hppa/hppa_reloc.c:1.41 src/libexec/ld.elf_so/arch/hppa/hppa_reloc.c:1.42
--- src/libexec/ld.elf_so/arch/hppa/hppa_reloc.c:1.41	Sun Dec  4 16:53:08 2011
+++ src/libexec/ld.elf_so/arch/hppa/hppa_reloc.c	Fri Jan  6 10:38:57 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: hppa_reloc.c,v 1.41 2011/12/04 16:53:08 skrll Exp $	*/
+/*	$NetBSD: hppa_reloc.c,v 1.42 2012/01/06 10:38:57 skrll Exp $	*/
 
 /*-
  * Copyright (c) 2002, 2004 The NetBSD Foundation, Inc.
@@ -31,7 +31,7 @@
 
 #include <sys/cdefs.h>
 #ifndef lint
-__RCSID("$NetBSD: hppa_reloc.c,v 1.41 2011/12/04 16:53:08 skrll Exp $");
+__RCSID("$NetBSD: hppa_reloc.c,v 1.42 2012/01/06 10:38:57 skrll Exp $");
 #endif /* not lint */
 
 #include <stdlib.h>
@@ -82,6 +82,30 @@ store_ptr(void *where, Elf_Addr val)
 		(void)memcpy(where, &val, sizeof(val));
 }
 
+static __inline void
+fdc(void *addr)
+{
+	__asm volatile("fdc %%r0(%%sr0, %0)" : : "r" (addr));
+}
+
+static __inline void
+fic(void *addr)     
+{                   
+	__asm volatile("fic %%r0(%%sr0,%0)" : : "r" (addr));
+} 
+
+static __inline void
+sync(void)
+{
+	__asm volatile("sync" : : : "memory");
+}
+
+#define PLT_STUB_MAGIC1	0x00c0ffee
+#define PLT_STUB_MAGIC2	0xdeadbeef
+
+#define PLT_STUB_INSN1	0x0e801081	/* ldw	0(%r20), %r1 */
+#define PLT_STUB_INSN2	0xe820c000	/* bv	%r0(%r1) */
+
 /*
  * In the runtime architecture (ABI), PLABEL function pointers are
  * distinguished from normal function pointers by having the next-least-
@@ -355,7 +379,34 @@ _rtld_function_descriptor_function(const
 void
 _rtld_setup_pltgot(const Obj_Entry *obj)
 {
-	__rtld_setup_hppa_pltgot(obj, obj->pltgot);
+	Elf_Word *got = obj->pltgot;
+
+	assert(got[-2] == PLT_STUB_MAGIC1);
+	assert(got[-1] == PLT_STUB_MAGIC2);
+	
+	__rtld_setup_hppa_pltgot(obj, got);
+
+	fdc(&got[-2]);
+	fdc(&got[-1]);
+	fdc(&got[1]);
+	sync();
+	fic(&got[-2]);
+	fic(&got[-1]);
+	fic(&got[1]);
+	sync();
+
+	/*
+	 * libc makes use of %t1 (%r22) to pass errno values to __cerror. Fixup
+	 * the PLT stub to not use %r22.
+	 */
+	got[-7] = PLT_STUB_INSN1;
+	got[-6] = PLT_STUB_INSN2;
+	fdc(&got[-7]);
+	fdc(&got[-6]);
+	sync();
+	fic(&got[-7]);
+	fic(&got[-6]);
+	sync();
 }
 
 int

Index: src/libexec/ld.elf_so/arch/hppa/rtld_start.S
diff -u src/libexec/ld.elf_so/arch/hppa/rtld_start.S:1.11 src/libexec/ld.elf_so/arch/hppa/rtld_start.S:1.12
--- src/libexec/ld.elf_so/arch/hppa/rtld_start.S:1.11	Fri Sep 30 03:05:43 2011
+++ src/libexec/ld.elf_so/arch/hppa/rtld_start.S	Fri Jan  6 10:38:57 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: rtld_start.S,v 1.11 2011/09/30 03:05:43 mrg Exp $	*/
+/*	$NetBSD: rtld_start.S,v 1.12 2012/01/06 10:38:57 skrll Exp $	*/
 
 /*-
  * Copyright (c) 2002 The NetBSD Foundation, Inc.
@@ -181,6 +181,7 @@ ENTRY(_rtld_bind_start,HPPA_FRAME_SIZE)
 	/* 0(%r3) is filled with the saved %r3 above */
 	stw	%ret0, 4(%r3)
 	stw	%ret1, 8(%r3)
+	stw	%t1, 12(%r3)		/* %r22 */
 
 	/*
 	 * The linker PLT stub loads %r20 with (GOT - 8) for the object that
@@ -220,6 +221,7 @@ ENTRY(_rtld_bind_start,HPPA_FRAME_SIZE)
 	ldw	HPPA_FRAME_ARG(3)(%r3), %arg3
 	ldw	4(%r3), %ret0
 	ldw	8(%r3), %ret1
+	ldw	12(%r3), %t1		/* %r22 */
 
 	/* End stack calling convention. */
 	ldo	HPPA_FRAME_SIZE(%r3), %sp

Reply via email to