summaryrefslogtreecommitdiff
path: root/debian
diff options
context:
space:
mode:
authorMichael Banck <mbanck@debian.org>2007-07-09 11:28:57 +0000
committerMichael Banck <mbanck@debian.org>2007-07-09 11:28:57 +0000
commit813bcc0aba0bf2b396c9edbba6957b48850d1c15 (patch)
tree3a85b9aa448bfab10ec4231fc2ea1be43fcbc6af /debian
parent5345afb97d108234eac3b316410736b36b63aaff (diff)
Updated debian/patches/libpthread_tls_transitional.patch with new version from Samuel Thibault
Diffstat (limited to 'debian')
-rw-r--r--debian/patches/libpthread_tls_transitional.patch260
1 files changed, 236 insertions, 24 deletions
diff --git a/debian/patches/libpthread_tls_transitional.patch b/debian/patches/libpthread_tls_transitional.patch
index 9814d966..de24ec34 100644
--- a/debian/patches/libpthread_tls_transitional.patch
+++ b/debian/patches/libpthread_tls_transitional.patch
@@ -4,16 +4,16 @@ RCS file: /cvsroot/hurd/hurd/libpthread/pthread/pt-create.c,v
retrieving revision 1.4
diff -u -p -r1.4 pt-create.c
--- libpthread/pthread/pt-create.c 4 May 2005 16:04:06 -0000 1.4
-+++ libpthread/pthread/pt-create.c 13 Jun 2007 03:42:13 -0000
-@@ -127,6 +127,15 @@
++++ libpthread/pthread/pt-create.c 8 Jul 2007 22:50:59 -0000
+@@ -127,6 +127,15 @@ __pthread_create_internal (struct __pthr
if (err)
goto failed_thread_alloc;
+ if (_dl_allocate_tls) {
+ pthread->tcb = _dl_allocate_tls (NULL);
-+ *pthread->tcb = pthread->tcb;
+ if (!pthread->tcb)
+ goto failed_thread_tls_alloc;
++ pthread->tcb->tcb = pthread->tcb;
+ } else {
+ pthread->tcb = NULL;
+ }
@@ -21,7 +21,7 @@ diff -u -p -r1.4 pt-create.c
/* And initialize the rest of the machine context. This may include
additional machine- and system-specific initializations that
prove convenient. */
-@@ -192,6 +201,9 @@
+@@ -192,6 +201,9 @@ __pthread_create_internal (struct __pthr
failed_sigstate:
__pthread_sigstate_destroy (pthread);
failed_setup:
@@ -35,9 +35,10 @@ Index: libpthread/pthread/pt-exit.c
===================================================================
RCS file: /cvsroot/hurd/hurd/libpthread/pthread/pt-exit.c,v
retrieving revision 1.2
+diff -u -p -r1.2 pt-exit.c
--- libpthread/pthread/pt-exit.c 4 May 2005 16:04:06 -0000 1.2
-+++ libpthread/pthread/pt-exit.c 13 Jun 2007 03:42:13 -0000
-@@ -70,6 +70,8 @@
++++ libpthread/pthread/pt-exit.c 8 Jul 2007 22:50:59 -0000
+@@ -70,6 +70,8 @@ pthread_exit (void *status)
if (self->cancel_state == PTHREAD_CANCEL_ENABLE && self->cancel_pending)
status = PTHREAD_CANCELED;
@@ -46,48 +47,85 @@ retrieving revision 1.2
__pthread_thread_dealloc (self);
switch (self->state)
+Index: libpthread/pthread/pt-initialize.c
+===================================================================
+RCS file: /cvsroot/hurd/hurd/libpthread/pthread/pt-initialize.c,v
+retrieving revision 1.1
+diff -u -p -r1.1 pt-initialize.c
+--- libpthread/pthread/pt-initialize.c 10 Oct 2002 23:05:06 -0000 1.1
++++ libpthread/pthread/pt-initialize.c 8 Jul 2007 22:50:59 -0000
+@@ -30,4 +30,10 @@ void
+ __pthread_initialize (void)
+ {
+ RUN_HOOK (__pthread_init, ());
++
++ if (__libc_setup_tls) {
++ __libc_setup_tls (sizeof(tcbhead_t), __alignof__(tcbhead_t));
++
++ asm volatile ("");
++ }
+ }
Index: libpthread/pthread/pt-internal.h
===================================================================
RCS file: /cvsroot/hurd/hurd/libpthread/pthread/pt-internal.h,v
retrieving revision 1.4
+diff -u -p -r1.4 pt-internal.h
--- libpthread/pthread/pt-internal.h 4 Mar 2007 00:05:21 -0000 1.4
-+++ libpthread/pthread/pt-internal.h 13 Jun 2007 03:42:13 -0000
-@@ -85,6 +85,8 @@
++++ libpthread/pthread/pt-internal.h 8 Jul 2007 22:50:59 -0000
+@@ -50,6 +50,14 @@ enum pthread_state
+ # define PTHREAD_SYSDEP_MEMBERS
+ #endif
+
++/* Type of the TCB. */
++typedef struct
++{
++ void *tcb; /* Points to this structure. */
++ void *dtv; /* Vector of pointers to TLS data. */
++ thread_t self; /* This thread's control port. */
++} tcbhead_t;
++
+ /* This structure describes a POSIX thread. */
+ struct __pthread
+ {
+@@ -85,6 +93,8 @@ struct __pthread
PTHREAD_SYSDEP_MEMBERS
-+ void **tcb;
++ tcbhead_t *tcb;
+
struct __pthread *next, **prevp;
};
-@@ -272,4 +274,19 @@
+@@ -272,4 +282,21 @@ const struct __pthread_rwlockattr __pthr
/* Default condition attributes. */
const struct __pthread_condattr __pthread_default_condattr;
+
++/* From glibc. */
+#ifdef __i386__
+#define libc_internal_function __attribute__ ((regparm (3), stdcall))
+#else
-+#error oups
+#define libc_internal_function
+#endif
++
+/* Dynamic linker TLS allocation. */
-+#pragma weak _dl_allocate_tls
-+extern void *_dl_allocate_tls(void *) libc_internal_function;
++extern void *_dl_allocate_tls(void *) libc_internal_function __attribute__((weak));
+
+/* Dynamic linker TLS deallocation. */
-+#pragma weak _dl_deallocate_tls
-+extern void _dl_deallocate_tls(void *, int) libc_internal_function;
++extern void _dl_deallocate_tls(void *, int) libc_internal_function __attribute__((weak));
++
++/* Static TLS setup. */
++extern void __libc_setup_tls(size_t, size_t) __attribute__((weak));
+
#endif /* pt-internal.h */
Index: libpthread/sysdeps/mach/hurd/pt-docancel.c
===================================================================
RCS file: /cvsroot/hurd/hurd/libpthread/sysdeps/mach/hurd/pt-docancel.c,v
retrieving revision 1.2
+diff -u -p -r1.2 pt-docancel.c
--- libpthread/sysdeps/mach/hurd/pt-docancel.c 18 Nov 2002 22:20:58 -0000 1.2
-+++ libpthread/sysdeps/mach/hurd/pt-docancel.c 13 Jun 2007 03:42:13 -0000
-@@ -52,8 +52,8 @@
++++ libpthread/sysdeps/mach/hurd/pt-docancel.c 8 Jul 2007 22:50:59 -0000
+@@ -52,8 +52,8 @@ __pthread_do_cancel (struct __pthread *p
err = __thread_abort (p->kernel_thread);
assert_perror (err);
@@ -102,9 +140,10 @@ Index: libpthread/sysdeps/mach/hurd/pt-sysdep.h
===================================================================
RCS file: /cvsroot/hurd/hurd/libpthread/sysdeps/mach/hurd/pt-sysdep.h,v
retrieving revision 1.3
+diff -u -p -r1.3 pt-sysdep.h
--- libpthread/sysdeps/mach/hurd/pt-sysdep.h 18 Jan 2005 10:08:52 -0000 1.3
-+++ libpthread/sysdeps/mach/hurd/pt-sysdep.h 13 Jun 2007 03:42:13 -0000
-@@ -59,11 +59,13 @@
++++ libpthread/sysdeps/mach/hurd/pt-sysdep.h 8 Jul 2007 22:50:59 -0000
+@@ -59,11 +59,13 @@ __pthread_stack_dealloc (void *stackaddr
__vm_deallocate (__mach_task_self (), (vm_offset_t) stackaddr, stacksize);
}
@@ -126,8 +165,9 @@ Index: libpthread/sysdeps/mach/hurd/i386/pt-machdep.c
===================================================================
RCS file: /cvsroot/hurd/hurd/libpthread/sysdeps/mach/hurd/i386/pt-machdep.c,v
retrieving revision 1.1
+diff -u -p -r1.1 pt-machdep.c
--- libpthread/sysdeps/mach/hurd/i386/pt-machdep.c 10 Oct 2002 23:05:05 -0000 1.1
-+++ libpthread/sysdeps/mach/hurd/i386/pt-machdep.c 13 Jun 2007 03:42:13 -0000
++++ libpthread/sysdeps/mach/hurd/i386/pt-machdep.c 8 Jul 2007 22:50:59 -0000
@@ -21,12 +21,28 @@
#include <mach.h>
@@ -159,7 +199,7 @@ retrieving revision 1.1
{
error_t err;
struct i386_thread_state state;
-@@ -34,7 +50,7 @@
+@@ -34,7 +50,7 @@ __thread_set_pcsp (thread_t thread,
state_count = i386_THREAD_STATE_COUNT;
@@ -168,7 +208,7 @@ retrieving revision 1.1
(thread_state_t) &state, &state_count);
if (err)
return err;
-@@ -43,8 +59,26 @@
+@@ -43,8 +59,26 @@ __thread_set_pcsp (thread_t thread,
state.uesp = (unsigned int) sp;
if (set_ip)
state.eip = (unsigned int) ip;
@@ -200,9 +240,10 @@ Index: libpthread/sysdeps/mach/hurd/i386/pt-setup.c
===================================================================
RCS file: /cvsroot/hurd/hurd/libpthread/sysdeps/mach/hurd/i386/pt-setup.c,v
retrieving revision 1.4
+diff -u -p -r1.4 pt-setup.c
--- libpthread/sysdeps/mach/hurd/i386/pt-setup.c 12 May 2005 20:55:37 -0000 1.4
-+++ libpthread/sysdeps/mach/hurd/i386/pt-setup.c 13 Jun 2007 03:42:13 -0000
-@@ -92,9 +92,10 @@
++++ libpthread/sysdeps/mach/hurd/i386/pt-setup.c 8 Jul 2007 22:50:59 -0000
+@@ -92,9 +92,10 @@ __pthread_setup (struct __pthread *threa
ktid = __mach_thread_self ();
if (thread->kernel_thread != ktid)
{
@@ -215,3 +256,174 @@ retrieving revision 1.4
assert_perror (err);
}
__mach_port_deallocate (__mach_task_self (), ktid);
+Index: libthreads/cprocs.c
+===================================================================
+RCS file: /cvsroot/hurd/hurd/libthreads/cprocs.c,v
+retrieving revision 1.17
+diff -u -p -r1.17 cprocs.c
+--- libthreads/cprocs.c 29 May 2002 00:01:24 -0000 1.17
++++ libthreads/cprocs.c 8 Jul 2007 22:51:00 -0000
+@@ -434,6 +434,11 @@ cproc_init(void)
+ {
+ kern_return_t r;
+
++ if (__libc_setup_tls) {
++ __libc_setup_tls (sizeof(tcbhead_t), __alignof__(tcbhead_t));
++ asm volatile ("");
++ }
++
+ cproc_t p = cproc_alloc();
+
+ cthread_kernel_threads = 1;
+@@ -725,15 +730,22 @@ cproc_create(void)
+ extern void cproc_prepare();
+ extern void cthread_body();
+ thread_t n;
++ tcbhead_t *tcb;
+
+ alloc_stack(child);
++ if (_dl_allocate_tls) {
++ tcb = _dl_allocate_tls(NULL);
++ tcb->tcb = tcb;
++ } else {
++ tcb = NULL;
++ }
+ spin_lock(&n_kern_lock);
+ if (cthread_max_kernel_threads == 0 ||
+ cthread_kernel_threads < cthread_max_kernel_threads) {
+ cthread_kernel_threads++;
+ spin_unlock(&n_kern_lock);
+ MACH_CALL(thread_create(mach_task_self(), &n), r);
+- cproc_setup(child, n, cthread_body); /* machine dependent */
++ cproc_setup(child, n, tcb, cthread_body); /* machine dependent */
+ MACH_CALL(thread_resume(n), r);
+ #ifdef STATISTICS
+ spin_lock(&ready_lock);
+Index: libthreads/cthread_internals.h
+===================================================================
+RCS file: /cvsroot/hurd/hurd/libthreads/cthread_internals.h,v
+retrieving revision 1.7
+diff -u -p -r1.7 cthread_internals.h
+--- libthreads/cthread_internals.h 14 Jun 2007 17:24:13 -0000 1.7
++++ libthreads/cthread_internals.h 8 Jul 2007 22:51:00 -0000
+@@ -166,6 +166,14 @@
+ # endif
+ #endif
+
++/* Type of the TCB. */
++typedef struct
++{
++ void *tcb; /* Points to this structure. */
++ void *dtv; /* Vector of pointers to TLS data. */
++ thread_t self; /* This thread's control port. */
++} tcbhead_t;
++
+ /*
+ * Low-level thread implementation.
+ * This structure must agree with struct ur_cthread in cthreads.h
+@@ -312,4 +320,21 @@ extern void cproc_prepare(cproc_t _chil
+ void (*cthread_body_pc)());
+
+ extern void cproc_setup(cproc_t _child, thread_t _mach_thread,
+- void (*_routine)(cproc_t));
++ tcbhead_t *tcb, void (*_routine)(cproc_t));
++
++
++/* From glibc. */
++#ifdef __i386__
++#define libc_internal_function __attribute__ ((regparm (3), stdcall))
++#else
++#define libc_internal_function
++#endif
++
++/* Dynamic linker TLS allocation. */
++extern void *_dl_allocate_tls(void *) libc_internal_function __attribute__((weak));
++
++/* Dynamic linker TLS deallocation. */
++extern void _dl_deallocate_tls(void *, int) libc_internal_function __attribute__((weak));
++
++/* Static TLS setup. */
++extern void __libc_setup_tls(size_t, size_t) __attribute__((weak));
+Index: libthreads/alpha/thread.c
+===================================================================
+RCS file: /cvsroot/hurd/hurd/libthreads/alpha/thread.c,v
+retrieving revision 1.2
+diff -u -p -r1.2 thread.c
+--- libthreads/alpha/thread.c 27 May 2002 02:50:13 -0000 1.2
++++ libthreads/alpha/thread.c 8 Jul 2007 22:51:00 -0000
+@@ -74,6 +74,7 @@ void
+ cproc_setup(
+ register cproc_t child,
+ thread_t thread,
++ tcbhead_t *tcb, /* TODO */
+ void (*routine)(cproc_t))
+ {
+ register integer_t *top;
+Index: libthreads/i386/thread.c
+===================================================================
+RCS file: /cvsroot/hurd/hurd/libthreads/i386/thread.c,v
+retrieving revision 1.7
+diff -u -p -r1.7 thread.c
+--- libthreads/i386/thread.c 27 May 2002 02:50:10 -0000 1.7
++++ libthreads/i386/thread.c 8 Jul 2007 22:51:00 -0000
+@@ -75,6 +75,21 @@ char rcs_id[] = "$Header: /cvsroot/hurd/
+ #include <cthreads.h>
+ #include "cthread_internals.h"
+ #include <mach.h>
++#include <mach/i386/mach_i386.h>
++#include <mach/mig_errors.h>
++
++#define HURD_TLS_DESC_DECL(desc, tcb) \
++ struct descriptor desc = \
++ { /* low word: */ \
++ 0xffff /* limit 0..15 */ \
++ | (((unsigned int) (tcb)) << 16) /* base 0..15 */ \
++ , /* high word: */ \
++ ((((unsigned int) (tcb)) >> 16) & 0xff) /* base 16..23 */ \
++ | ((0x12 | 0x60 | 0x80) << 8) /* access = ACC_DATA_W|ACC_PL_U|ACC_P */ \
++ | (0xf << 16) /* limit 16..19 */ \
++ | ((4 | 8) << 20) /* granularity = SZ_32|SZ_G */ \
++ | (((unsigned int) (tcb)) & 0xff000000) /* base 24..31 */ \
++ }
+
+ /*
+ * Set up the initial state of a MACH thread
+@@ -82,7 +97,7 @@ char rcs_id[] = "$Header: /cvsroot/hurd/
+ * when it is resumed.
+ */
+ void
+-cproc_setup(register cproc_t child, thread_t thread, void (*routine)(cproc_t))
++cproc_setup(register cproc_t child, thread_t thread, tcbhead_t *tcb, void (*routine)(cproc_t))
+ {
+ extern unsigned int __hurd_threadvar_max; /* GNU */
+ register int *top = (int *)
+@@ -101,7 +116,7 @@ cproc_setup(register cproc_t child, thre
+ * Read registers first to get correct segment values.
+ */
+ count = i386_THREAD_STATE_COUNT;
+- MACH_CALL(thread_get_state(thread,i386_THREAD_STATE,(thread_state_t) &state,&count),r);
++ MACH_CALL(thread_get_state(thread,i386_REGS_SEGS_STATE,(thread_state_t) &state,&count),r);
+
+ ts->eip = (int) routine;
+ *--top = (int) child; /* argument to function */
+@@ -109,7 +124,19 @@ cproc_setup(register cproc_t child, thre
+ ts->uesp = (int) top; /* set stack pointer */
+ ts->ebp = 0; /* clear frame pointer */
+
+- MACH_CALL(thread_set_state(thread,i386_THREAD_STATE,(thread_state_t) &state,i386_THREAD_STATE_COUNT),r);
++ if (tcb) {
++ HURD_TLS_DESC_DECL(desc, tcb);
++ /* Get the first available selector. */
++ int sel = -1;
++ if (__i386_set_gdt (thread, &sel, desc) == MIG_BAD_ID) {
++ /* Old kernel, use a per-thread LDT. */
++ sel = 0x27;
++ __i386_set_ldt (thread, sel, &desc, 1);
++ }
++ ts->gs = (unsigned int)sel;
++ }
++
++ MACH_CALL(thread_set_state(thread,i386_REGS_SEGS_STATE,(thread_state_t) &state,i386_THREAD_STATE_COUNT),r);
+ }
+
+ #if defined(cthread_sp)