Module Name:    src
Committed By:   matt
Date:           Thu Apr  7 02:19:28 UTC 2011

Modified Files:
        src/lib/libc/tls: tls.c
        src/libexec/ld.elf_so: tls.c

Log Message:
Add a workaround for older crt0.o that overwrite r2 (tcb pointer).
(save tcb pointer using _lwp_setprivate in ld.elf_so and retrieve the tcb
via _lwp_getprivate in libc and use it to restore the value in r2).


To generate a diff of this commit:
cvs rdiff -u -r1.5 -r1.6 src/lib/libc/tls/tls.c
cvs rdiff -u -r1.5 -r1.6 src/libexec/ld.elf_so/tls.c

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

Modified files:

Index: src/lib/libc/tls/tls.c
diff -u src/lib/libc/tls/tls.c:1.5 src/lib/libc/tls/tls.c:1.6
--- src/lib/libc/tls/tls.c:1.5	Fri Mar 18 14:56:01 2011
+++ src/lib/libc/tls/tls.c	Thu Apr  7 02:19:28 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: tls.c,v 1.5 2011/03/18 14:56:01 he Exp $	*/
+/*	$NetBSD: tls.c,v 1.6 2011/04/07 02:19:28 matt Exp $	*/
 
 /*-
  * Copyright (c) 2011 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__RCSID("$NetBSD: tls.c,v 1.5 2011/03/18 14:56:01 he Exp $");
+__RCSID("$NetBSD: tls.c,v 1.6 2011/04/07 02:19:28 matt Exp $");
 
 #include "namespace.h"
 
@@ -154,8 +154,18 @@
 {
 	struct tls_tcb *tcb;
 
-	if (&rtld_DYNAMIC != NULL)
+	if (&rtld_DYNAMIC != NULL) {
+#ifdef __powerpc__
+		/*
+		 * Old powerpc crt0's are going to overwrite r2 so we need to
+		 * restore it but only do so if the saved value isn't NULL (if
+		 * it is NULL, ld.elf_so doesn't have the matching change).
+		 */
+		if ((tcb = _lwp_getprivate()) != NULL)
+			__lwp_settcb(tcb);
+#endif
 		return;
+	}
 
 	dl_iterate_phdr(__libc_static_tls_setup_cb, NULL);
 

Index: src/libexec/ld.elf_so/tls.c
diff -u src/libexec/ld.elf_so/tls.c:1.5 src/libexec/ld.elf_so/tls.c:1.6
--- src/libexec/ld.elf_so/tls.c:1.5	Tue Mar 29 20:56:35 2011
+++ src/libexec/ld.elf_so/tls.c	Thu Apr  7 02:19:28 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: tls.c,v 1.5 2011/03/29 20:56:35 joerg Exp $	*/
+/*	$NetBSD: tls.c,v 1.6 2011/04/07 02:19:28 matt Exp $	*/
 /*-
  * Copyright (c) 2011 The NetBSD Foundation, Inc.
  * All rights reserved.
@@ -29,7 +29,7 @@
  */
 
 #include <sys/cdefs.h>
-__RCSID("$NetBSD: tls.c,v 1.5 2011/03/29 20:56:35 joerg Exp $");
+__RCSID("$NetBSD: tls.c,v 1.6 2011/04/07 02:19:28 matt Exp $");
 
 #include <sys/param.h>
 #include <sys/ucontext.h>
@@ -104,6 +104,13 @@
 	tcb = _rtld_tls_allocate_locked();
 #ifdef __HAVE___LWP_SETTCB
 	__lwp_settcb(tcb);
+#ifdef __powerpc__
+	/*
+	 * Save the tcb pointer so that libc can retrieve it.  Older
+	 * crt0 will obliterate r2 so there is code in libc to restore it.
+	 */
+	_lwp_setprivate(tcb);
+#endif
 #else
 	_lwp_setprivate(tcb);
 #endif

Reply via email to