summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/libc/tls/tls.c13
-rw-r--r--libexec/ld.elf_so/tls.c11
-rw-r--r--sys/arch/powerpc/include/types.h3
-rw-r--r--sys/arch/powerpc/powerpc/sig_machdep.c28
4 files changed, 19 insertions, 36 deletions
diff --git a/lib/libc/tls/tls.c b/lib/libc/tls/tls.c
index d008e17da49..7f7b05018b0 100644
--- a/lib/libc/tls/tls.c
+++ b/lib/libc/tls/tls.c
@@ -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;
}
diff --git a/libexec/ld.elf_so/tls.c b/libexec/ld.elf_so/tls.c
index 9a5a7451512..261ffc42710 100644
--- a/libexec/ld.elf_so/tls.c
+++ b/libexec/ld.elf_so/tls.c
@@ -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
diff --git a/sys/arch/powerpc/include/types.h b/sys/arch/powerpc/include/types.h
index 4deeeab8c68..c5313a0ea57 100644
--- a/sys/arch/powerpc/include/types.h
+++ b/sys/arch/powerpc/include/types.h
@@ -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
diff --git a/sys/arch/powerpc/powerpc/sig_machdep.c b/sys/arch/powerpc/powerpc/sig_machdep.c
index e3441cdae01..0ec57594370 100644
--- a/sys/arch/powerpc/powerpc/sig_machdep.c
+++ b/sys/arch/powerpc/powerpc/sig_machdep.c
@@ -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.c,v 1.43 2012/09/11 00:15:19 matt Exp $"
#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_t *mcp, unsigned int *flagp)
#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 mcontext_t *mcp, unsigned int flags)
#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 mcontext_t *mcp, unsigned int flags)
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;
+}