Module Name: src
Committed By: joerg
Date: Tue Nov 22 15:25:28 UTC 2011
Modified Files:
src/lib/libc/arch/m68k: Makefile.inc
src/lib/libc/arch/m68k/gen: Makefile.inc _lwp.c
src/libexec/ld.elf_so/arch/m68k: mdreloc.c
src/sys/arch/m68k/include: mcontext.h types.h
Added Files:
src/lib/libc/arch/m68k/sys: __m68k_read_tp.S
Log Message:
Add TLS support for m68k.
To generate a diff of this commit:
cvs rdiff -u -r1.13 -r1.14 src/lib/libc/arch/m68k/Makefile.inc
cvs rdiff -u -r1.30 -r1.31 src/lib/libc/arch/m68k/gen/Makefile.inc
cvs rdiff -u -r1.6 -r1.7 src/lib/libc/arch/m68k/gen/_lwp.c
cvs rdiff -u -r0 -r1.1 src/lib/libc/arch/m68k/sys/__m68k_read_tp.S
cvs rdiff -u -r1.28 -r1.29 src/libexec/ld.elf_so/arch/m68k/mdreloc.c
cvs rdiff -u -r1.8 -r1.9 src/sys/arch/m68k/include/mcontext.h
cvs rdiff -u -r1.29 -r1.30 src/sys/arch/m68k/include/types.h
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/arch/m68k/Makefile.inc
diff -u src/lib/libc/arch/m68k/Makefile.inc:1.13 src/lib/libc/arch/m68k/Makefile.inc:1.14
--- src/lib/libc/arch/m68k/Makefile.inc:1.13 Sat Feb 9 02:41:06 2008
+++ src/lib/libc/arch/m68k/Makefile.inc Tue Nov 22 15:25:28 2011
@@ -1,6 +1,6 @@
-# $NetBSD: Makefile.inc,v 1.13 2008/02/09 02:41:06 mrg Exp $
+# $NetBSD: Makefile.inc,v 1.14 2011/11/22 15:25:28 joerg Exp $
-SRCS+= __sigaction14_sigtramp.c __sigtramp2.S __mmap.S
+SRCS+= __sigaction14_sigtramp.c __sigtramp2.S __m68k_read_tp.S __mmap.S
ASM+= _lwp_getprivate.S mremap.S
Index: src/lib/libc/arch/m68k/gen/Makefile.inc
diff -u src/lib/libc/arch/m68k/gen/Makefile.inc:1.30 src/lib/libc/arch/m68k/gen/Makefile.inc:1.31
--- src/lib/libc/arch/m68k/gen/Makefile.inc:1.30 Sun Dec 6 07:12:17 2009
+++ src/lib/libc/arch/m68k/gen/Makefile.inc Tue Nov 22 15:25:28 2011
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile.inc,v 1.30 2009/12/06 07:12:17 uebayasi Exp $
+# $NetBSD: Makefile.inc,v 1.31 2011/11/22 15:25:28 joerg Exp $
SRCS+= alloca.S fabs.S
@@ -26,6 +26,7 @@ SRCS+= ashlsi3.S ashrsi3.S \
negdf2.S negsf2.S
SRCS+= bswap16.S bswap32.S bswap64.S
SRCS+= _lwp.c
+CPPFLAGS._lwp.c += -D_LIBC_SOURCE
# 68000-based machines build with a libgcc that includes
# much of the (soft)float and integer support that would
Index: src/lib/libc/arch/m68k/gen/_lwp.c
diff -u src/lib/libc/arch/m68k/gen/_lwp.c:1.6 src/lib/libc/arch/m68k/gen/_lwp.c:1.7
--- src/lib/libc/arch/m68k/gen/_lwp.c:1.6 Thu Feb 24 04:28:42 2011
+++ src/lib/libc/arch/m68k/gen/_lwp.c Tue Nov 22 15:25:28 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: _lwp.c,v 1.6 2011/02/24 04:28:42 joerg Exp $ */
+/* $NetBSD: _lwp.c,v 1.7 2011/11/22 15:25:28 joerg Exp $ */
/*-
* Copyright (c) 2001 The NetBSD Foundation, Inc.
@@ -31,18 +31,19 @@
#include <sys/cdefs.h>
#if defined(LIBC_SCCS) && !defined(lint)
-__RCSID("$NetBSD: _lwp.c,v 1.6 2011/02/24 04:28:42 joerg Exp $");
+__RCSID("$NetBSD: _lwp.c,v 1.7 2011/11/22 15:25:28 joerg Exp $");
#endif /* LIBC_SCCS and not lint */
#include "namespace.h"
#include <sys/types.h>
+#include <sys/tls.h>
#include <ucontext.h>
#include <lwp.h>
#include <stdlib.h>
void
_lwp_makecontext(ucontext_t *u, void (*start)(void *),
- void *arg, void *private, caddr_t stack_base, size_t stack_size)
+ void *arg, void *tcb, caddr_t stack_base, size_t stack_size)
{
void **sp;
@@ -60,6 +61,7 @@ _lwp_makecontext(ucontext_t *u, void (*s
*--sp = (void *) _lwp_exit;
u->uc_mcontext.__gregs[_REG_A7] = (int) sp;
- u->uc_mcontext._mc_tlsbase = (uintptr_t)private;
+ u->uc_mcontext._mc_tlsbase = (uintptr_t)tcb + TLS_TP_OFFSET +
+ sizeof(struct tls_tcb);
u->uc_flags |= _UC_TLSBASE;
}
Index: src/libexec/ld.elf_so/arch/m68k/mdreloc.c
diff -u src/libexec/ld.elf_so/arch/m68k/mdreloc.c:1.28 src/libexec/ld.elf_so/arch/m68k/mdreloc.c:1.29
--- src/libexec/ld.elf_so/arch/m68k/mdreloc.c:1.28 Fri Mar 25 18:07:05 2011
+++ src/libexec/ld.elf_so/arch/m68k/mdreloc.c Tue Nov 22 15:25:28 2011
@@ -1,13 +1,13 @@
-/* $NetBSD: mdreloc.c,v 1.28 2011/03/25 18:07:05 joerg Exp $ */
+/* $NetBSD: mdreloc.c,v 1.29 2011/11/22 15:25:28 joerg Exp $ */
#include <sys/cdefs.h>
#ifndef lint
-__RCSID("$NetBSD: mdreloc.c,v 1.28 2011/03/25 18:07:05 joerg Exp $");
+__RCSID("$NetBSD: mdreloc.c,v 1.29 2011/11/22 15:25:28 joerg Exp $");
#endif /* not lint */
#include <sys/cdefs.h>
#ifndef lint
-__RCSID("$NetBSD: mdreloc.c,v 1.28 2011/03/25 18:07:05 joerg Exp $");
+__RCSID("$NetBSD: mdreloc.c,v 1.29 2011/11/22 15:25:28 joerg Exp $");
#endif /* not lint */
#include <sys/types.h>
@@ -126,6 +126,47 @@ _rtld_relocate_nonplt_objects(Obj_Entry
rdbg(("COPY (avoid in main)"));
break;
+ case R_TYPE(TLS_DTPMOD32):
+ def = _rtld_find_symdef(symnum, obj, &defobj, false);
+ if (def == NULL)
+ return -1;
+
+ *where = (Elf_Addr)defobj->tlsindex;
+ rdbg(("DTPMOD32 %s in %s --> %p in %s",
+ obj->strtab + obj->symtab[symnum].st_name,
+ obj->path, (void *)*where, defobj->path));
+ break;
+
+ case R_TYPE(TLS_DTPREL32):
+ def = _rtld_find_symdef(symnum, obj, &defobj, false);
+ if (def == NULL)
+ return -1;
+
+ if (!defobj->tls_done && _rtld_tls_offset_allocate(obj))
+ return -1;
+
+ *where = (Elf_Addr)(def->st_value + rela->r_addend
+ - TLS_DTV_OFFSET);
+ rdbg(("DTPREL32 %s in %s --> %p in %s",
+ obj->strtab + obj->symtab[symnum].st_name,
+ obj->path, (void *)*where, defobj->path));
+ break;
+
+ case R_TYPE(TLS_TPREL32):
+ def = _rtld_find_symdef(symnum, obj, &defobj, false);
+ if (def == NULL)
+ return -1;
+
+ if (!defobj->tls_done && _rtld_tls_offset_allocate(obj))
+ return -1;
+
+ *where = (Elf_Addr)(def->st_value + rela->r_addend
+ + defobj->tlsoffset - TLS_TP_OFFSET);
+ rdbg(("TPREL32 %s in %s --> %p in %s",
+ obj->strtab + obj->symtab[symnum].st_name,
+ obj->path, (void *)*where, defobj->path));
+ break;
+
default:
rdbg(("sym = %lu, type = %lu, offset = %p, "
"addend = %p, contents = %p, symbol = %s",
Index: src/sys/arch/m68k/include/mcontext.h
diff -u src/sys/arch/m68k/include/mcontext.h:1.8 src/sys/arch/m68k/include/mcontext.h:1.9
--- src/sys/arch/m68k/include/mcontext.h:1.8 Thu Feb 24 04:28:46 2011
+++ src/sys/arch/m68k/include/mcontext.h Tue Nov 22 15:25:28 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: mcontext.h,v 1.8 2011/02/24 04:28:46 joerg Exp $ */
+/* $NetBSD: mcontext.h,v 1.9 2011/11/22 15:25:28 joerg Exp $ */
/*-
* Copyright (c) 2001 The NetBSD Foundation, Inc.
@@ -109,4 +109,31 @@ typedef struct {
#define __UCONTEXT_SIZE 1024
+#if defined(_LIBC_SOURCE) || defined(_RTLD_SOURCE) || defined(__LIBPTHREAD_SOURCE__)
+#define TLS_TP_OFFSET 0x7000
+#define TLS_DTV_OFFSET 0x8000
+
+#include <sys/tls.h>
+
+__CTASSERT(TLS_TP_OFFSET + sizeof(struct tls_tcb) < 0x8000);
+__CTASSERT(TLS_TP_OFFSET % sizeof(struct tls_tcb) == 0);
+
+void *_lwp_getprivate(void);
+void _lwp_setprivate(void *);
+
+static __inline struct tls_tcb *
+__lwp_gettcb_fast(void)
+{
+ unsigned int __tcb = (unsigned int)_lwp_getprivate();
+ return (void *)(__tcb - TLS_TP_OFFSET - sizeof(struct tls_tcb));
+}
+
+static inline void
+__lwp_settcb(struct tls_tcb *__tcb)
+{
+ __tcb += TLS_TP_OFFSET / sizeof(*__tcb) + 1;
+ _lwp_setprivate(__tcb);
+}
+#endif
+
#endif /* !_M68K_MCONTEXT_H_ */
Index: src/sys/arch/m68k/include/types.h
diff -u src/sys/arch/m68k/include/types.h:1.29 src/sys/arch/m68k/include/types.h:1.30
--- src/sys/arch/m68k/include/types.h:1.29 Wed Dec 22 02:42:28 2010
+++ src/sys/arch/m68k/include/types.h Tue Nov 22 15:25:28 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: types.h,v 1.29 2010/12/22 02:42:28 matt Exp $ */
+/* $NetBSD: types.h,v 1.30 2011/11/22 15:25:28 joerg Exp $ */
/*-
* Copyright (c) 1990 The Regents of the University of California.
@@ -73,6 +73,10 @@ typedef volatile unsigned char __cpu_sim
#define __HAVE_SYSCALL_INTERN
#define __HAVE_CPU_DATA_FIRST
+#define __HAVE_COMMON___TLS_GET_ADDR
+#define __HAVE___LWP_GETTCB_FAST
+#define __HAVE___LWP_SETTCB
+#define __HAVE_TLS_VARIANT_I
#if defined(_KERNEL)
#define __HAVE_RAS
Added files:
Index: src/lib/libc/arch/m68k/sys/__m68k_read_tp.S
diff -u /dev/null src/lib/libc/arch/m68k/sys/__m68k_read_tp.S:1.1
--- /dev/null Tue Nov 22 15:25:28 2011
+++ src/lib/libc/arch/m68k/sys/__m68k_read_tp.S Tue Nov 22 15:25:28 2011
@@ -0,0 +1,7 @@
+#include "SYS.h"
+
+ENTRY(__m68k_read_tp)
+ SYSTRAP(_lwp_getprivate)
+ movl %d0,%a0
+ rts
+ .size __m68k_read_tp, .-__m68k_read_tp