Module Name:    src
Committed By:   chs
Date:           Sun Dec 14 23:49:17 UTC 2014

Modified Files:
        src/lib/libc/tls: tls.c
        src/libexec/ld.elf_so: tls.c
        src/sys/arch/powerpc/include: types.h
        src/sys/arch/powerpc/powerpc: sig_machdep.c

Log Message:
fix powerpc TLS problems by removing the hacks for PPC EABI.
the kernel no longer treats R2 specially and its use as
the TLS register is now handled entirely in userland.


To generate a diff of this commit:
cvs rdiff -u -r1.7 -r1.8 src/lib/libc/tls/tls.c
cvs rdiff -u -r1.9 -r1.10 src/libexec/ld.elf_so/tls.c
cvs rdiff -u -r1.49 -r1.50 src/sys/arch/powerpc/include/types.h
cvs rdiff -u -r1.43 -r1.44 src/sys/arch/powerpc/powerpc/sig_machdep.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.7 src/lib/libc/tls/tls.c:1.8
--- src/lib/libc/tls/tls.c:1.7	Mon Aug 19 22:14:37 2013
+++ src/lib/libc/tls/tls.c	Sun Dec 14 23:49:17 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: tls.c,v 1.7 2013/08/19 22:14:37 matt Exp $	*/
+/*	$NetBSD: tls.c,v 1.8 2014/12/14 23:49:17 chs Exp $	*/
 
 /*-
  * Copyright (c) 2011 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__RCSID("$NetBSD: tls.c,v 1.7 2013/08/19 22:14:37 matt Exp $");
+__RCSID("$NetBSD: tls.c,v 1.8 2014/12/14 23:49:17 chs Exp $");
 
 #include "namespace.h"
 
@@ -155,15 +155,6 @@ __libc_static_tls_setup(void)
 	struct tls_tcb *tcb;
 
 	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;
 	}
 

Index: src/libexec/ld.elf_so/tls.c
diff -u src/libexec/ld.elf_so/tls.c:1.9 src/libexec/ld.elf_so/tls.c:1.10
--- src/libexec/ld.elf_so/tls.c:1.9	Mon Oct 21 19:14:15 2013
+++ src/libexec/ld.elf_so/tls.c	Sun Dec 14 23:49:17 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: tls.c,v 1.9 2013/10/21 19:14:15 joerg Exp $	*/
+/*	$NetBSD: tls.c,v 1.10 2014/12/14 23:49:17 chs 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.9 2013/10/21 19:14:15 joerg Exp $");
+__RCSID("$NetBSD: tls.c,v 1.10 2014/12/14 23:49:17 chs Exp $");
 
 #include <sys/param.h>
 #include <sys/ucontext.h>
@@ -106,13 +106,6 @@ _rtld_tls_initial_allocation(void)
 	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

Index: src/sys/arch/powerpc/include/types.h
diff -u src/sys/arch/powerpc/include/types.h:1.49 src/sys/arch/powerpc/include/types.h:1.50
--- src/sys/arch/powerpc/include/types.h:1.49	Tue Mar 18 18:20:41 2014
+++ src/sys/arch/powerpc/include/types.h	Sun Dec 14 23:49:17 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: types.h,v 1.49 2014/03/18 18:20:41 riastradh Exp $	*/
+/*	$NetBSD: types.h,v 1.50 2014/12/14 23:49:17 chs Exp $	*/
 
 /*-
  * Copyright (C) 1995 Wolfgang Solfrank.
@@ -81,6 +81,7 @@ typedef volatile int __cpu_simple_lock_t
 #ifdef _LP64
 #define	__HAVE_ATOMIC64_OPS
 #endif
+#define	__HAVE_CPU_LWP_SETPRIVATE
 #define	__HAVE_COMMON___TLS_GET_ADDR
 #define	__HAVE___LWP_GETTCB_FAST
 #define	__HAVE___LWP_SETTCB

Index: src/sys/arch/powerpc/powerpc/sig_machdep.c
diff -u src/sys/arch/powerpc/powerpc/sig_machdep.c:1.43 src/sys/arch/powerpc/powerpc/sig_machdep.c:1.44
--- src/sys/arch/powerpc/powerpc/sig_machdep.c:1.43	Tue Sep 11 00:15:19 2012
+++ src/sys/arch/powerpc/powerpc/sig_machdep.c	Sun Dec 14 23:49:17 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: sig_machdep.c,v 1.43 2012/09/11 00:15:19 matt Exp $	*/
+/*	$NetBSD: sig_machdep.c,v 1.44 2014/12/14 23:49:17 chs Exp $	*/
 
 /*
  * Copyright (C) 1995, 1996 Wolfgang Solfrank.
@@ -32,7 +32,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sig_machdep.c,v 1.43 2012/09/11 00:15:19 matt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sig_machdep.c,v 1.44 2014/12/14 23:49:17 chs Exp $");
 
 #include "opt_ppcarch.h"
 #include "opt_altivec.h"
@@ -43,6 +43,7 @@ __KERNEL_RCSID(0, "$NetBSD: sig_machdep.
 #include <sys/syscallargs.h>
 #include <sys/systm.h>
 #include <sys/ucontext.h>
+#include <sys/cpu.h>
 
 #include <uvm/uvm_extern.h>
 
@@ -172,8 +173,7 @@ cpu_getmcontext(struct lwp *l, mcontext_
 #endif
 
 	*flagp |= _UC_CPU;
-	if (gr[_REG_R2] == (uintptr_t)l->l_private)
-		*flagp |= _UC_TLSBASE;
+	*flagp |= _UC_TLSBASE;
 
 #ifdef PPC_HAVE_FPU
 	/* Save FPU context, if any. */
@@ -231,17 +231,6 @@ cpu_setmcontext(struct lwp *l, const mco
 #ifdef PPC_OEA
 		tf->tf_mq = gr[_REG_MQ];
 #endif
-		/*
-		 * If R2 contains the TLS base, make sure to update l->l_private.
-		 * If not, restore R2 from l->l_private if not null.  Since setcontext
-		 * existed before the TCB code, a static program could expect R2 to
-		 * the small data pointer.
-		 */
-		if (flags & _UC_TLSBASE) {
-			l->l_private = (void *) tf->tf_fixreg[_REG_R2];
-		} else if (l->l_private) {
-			tf->tf_fixreg[_REG_R2] = (uintptr_t)l->l_private;
-		}
 	}
 
 #ifdef PPC_HAVE_FPU
@@ -264,3 +253,12 @@ cpu_setmcontext(struct lwp *l, const mco
 
 	return (0);
 }
+
+int
+cpu_lwp_setprivate(lwp_t *l, void *addr)
+{
+	struct trapframe * const tf = l->l_md.md_utf;
+
+	tf->tf_fixreg[_REG_R2] = (register_t)addr;
+	return 0;
+}

Reply via email to