summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSamuel Thibault <sthibault@debian.org>2007-07-21 00:11:57 +0000
committerSamuel Thibault <sthibault@debian.org>2007-07-21 00:11:57 +0000
commit7faeed4661f96b91b9fa72aace9eedb47354b440 (patch)
tree4ba1feab6fcc3049ce065583bcc0ddf709a73449
parent4186eb92c819626a5ab86e599623969c13e938c2 (diff)
update patch to latest version
-rw-r--r--debian/patches/libpthread_tls_transitional.patch135
1 files changed, 64 insertions, 71 deletions
diff --git a/debian/patches/libpthread_tls_transitional.patch b/debian/patches/libpthread_tls_transitional.patch
index a9198647..03d0881b 100644
--- a/debian/patches/libpthread_tls_transitional.patch
+++ b/debian/patches/libpthread_tls_transitional.patch
@@ -4,8 +4,8 @@ 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 8 Jul 2007 22:50:59 -0000
-@@ -127,6 +127,15 @@ __pthread_create_internal (struct __pthr
++++ libpthread/pthread/pt-create.c 13 Jul 2007 01:43:42 -0000
+@@ -127,6 +127,15 @@
if (err)
goto failed_thread_alloc;
@@ -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 @@ __pthread_create_internal (struct __pthr
+@@ -192,6 +201,9 @@
failed_sigstate:
__pthread_sigstate_destroy (pthread);
failed_setup:
@@ -35,10 +35,9 @@ 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 8 Jul 2007 22:50:59 -0000
-@@ -70,6 +70,8 @@ pthread_exit (void *status)
++++ libpthread/pthread/pt-exit.c 13 Jul 2007 01:43:42 -0000
+@@ -70,6 +70,8 @@
if (self->cancel_state == PTHREAD_CANCEL_ENABLE && self->cancel_pending)
status = PTHREAD_CANCELED;
@@ -51,28 +50,31 @@ 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)
++++ libpthread/pthread/pt-initialize.c 13 Jul 2007 01:43:42 -0000
+@@ -31,3 +31,15 @@
{
RUN_HOOK (__pthread_init, ());
+ }
+
++void
++__pthread_initialize_minimal (void)
++{
++#ifndef PIC
+ if (__libc_setup_tls) {
+ __libc_setup_tls (sizeof(tcbhead_t), __alignof__(tcbhead_t));
+
+ asm volatile ("");
+ }
- }
++#endif
++}
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 8 Jul 2007 22:50:59 -0000
-@@ -50,6 +50,14 @@ enum pthread_state
++++ libpthread/pthread/pt-internal.h 13 Jul 2007 01:43:42 -0000
+@@ -50,6 +50,14 @@
# define PTHREAD_SYSDEP_MEMBERS
#endif
@@ -87,7 +89,7 @@ diff -u -p -r1.4 pt-internal.h
/* This structure describes a POSIX thread. */
struct __pthread
{
-@@ -85,6 +93,8 @@ struct __pthread
+@@ -85,6 +93,8 @@
PTHREAD_SYSDEP_MEMBERS
@@ -96,7 +98,7 @@ diff -u -p -r1.4 pt-internal.h
struct __pthread *next, **prevp;
};
-@@ -272,4 +282,21 @@ const struct __pthread_rwlockattr __pthr
+@@ -272,4 +282,21 @@
/* Default condition attributes. */
const struct __pthread_condattr __pthread_default_condattr;
@@ -122,10 +124,9 @@ 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 8 Jul 2007 22:50:59 -0000
-@@ -52,8 +52,8 @@ __pthread_do_cancel (struct __pthread *p
++++ libpthread/sysdeps/mach/hurd/pt-docancel.c 13 Jul 2007 01:43:43 -0000
+@@ -52,8 +52,8 @@
err = __thread_abort (p->kernel_thread);
assert_perror (err);
@@ -140,10 +141,9 @@ 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 8 Jul 2007 22:50:59 -0000
-@@ -59,11 +59,13 @@ __pthread_stack_dealloc (void *stackaddr
++++ libpthread/sysdeps/mach/hurd/pt-sysdep.h 13 Jul 2007 01:43:43 -0000
+@@ -59,11 +59,13 @@
__vm_deallocate (__mach_task_self (), (vm_offset_t) stackaddr, stacksize);
}
@@ -165,9 +165,8 @@ 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 8 Jul 2007 22:50:59 -0000
++++ libpthread/sysdeps/mach/hurd/i386/pt-machdep.c 13 Jul 2007 01:43:43 -0000
@@ -21,12 +21,28 @@
#include <mach.h>
@@ -199,7 +198,7 @@ diff -u -p -r1.1 pt-machdep.c
{
error_t err;
struct i386_thread_state state;
-@@ -34,7 +50,7 @@ __thread_set_pcsp (thread_t thread,
+@@ -34,7 +50,7 @@
state_count = i386_THREAD_STATE_COUNT;
@@ -208,27 +207,22 @@ diff -u -p -r1.1 pt-machdep.c
(thread_state_t) &state, &state_count);
if (err)
return err;
-@@ -43,8 +59,26 @@ __thread_set_pcsp (thread_t thread,
+@@ -43,8 +59,21 @@
state.uesp = (unsigned int) sp;
if (set_ip)
state.eip = (unsigned int) ip;
+ if (set_tp) {
+ HURD_TLS_DESC_DECL(desc, tp);
++ int sel;
+
-+ /* Get the first available selector. */
-+ int sel = -1;
-+ err = __i386_set_gdt (thread, &sel, desc);
-+ if (err == MIG_BAD_ID)
-+ {
-+ /* Old kernel, use a per-thread LDT. */
-+ sel = 0x27;
-+ err = __i386_set_ldt (thread, sel, &desc, 1);
-+ if (err)
-+ return err;
-+ }
-+ else if (err)
++ asm ("mov %%gs, %w0" : "=q" (sel) : "0" (0));
++ if (__builtin_expect (sel, 0x48) & 4) /* LDT selector */
++ err = __i386_set_ldt (thread, sel, &desc, 1);
++ else
++ err = __i386_set_gdt (thread, &sel, desc);
++ if (err)
+ return err;
-+ state.gs = (unsigned int) sel;
++ state.gs = sel;
+ }
- err = __thread_set_state (thread, i386_THREAD_STATE,
@@ -240,10 +234,15 @@ 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 8 Jul 2007 22:50:59 -0000
-@@ -92,9 +92,10 @@ __pthread_setup (struct __pthread *threa
++++ libpthread/sysdeps/mach/hurd/i386/pt-setup.c 13 Jul 2007 01:43:43 -0000
+@@ -89,12 +89,16 @@
+ thread->mcontext.pc = entry_point;
+ thread->mcontext.sp = stack_setup (thread, start_routine, arg);
+
++ if (thread->tcb)
++ thread->tcb->self = thread->kernel_thread;
++
ktid = __mach_thread_self ();
if (thread->kernel_thread != ktid)
{
@@ -260,22 +259,19 @@ 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
-@@ -725,15 +725,22 @@ cproc_create(void)
++++ libthreads/cprocs.c 13 Jul 2007 01:43:43 -0000
+@@ -725,15 +725,20 @@
extern void cproc_prepare();
extern void cthread_body();
thread_t n;
+ tcbhead_t *tcb;
alloc_stack(child);
-+ if (_dl_allocate_tls) {
++ if (_dl_allocate_tls)
+ tcb = _dl_allocate_tls(NULL);
-+ tcb->tcb = tcb;
-+ } else {
++ else
+ tcb = NULL;
-+ }
spin_lock(&n_kern_lock);
if (cthread_max_kernel_threads == 0 ||
cthread_kernel_threads < cthread_max_kernel_threads) {
@@ -291,9 +287,8 @@ 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
++++ libthreads/cthread_internals.h 13 Jul 2007 01:43:43 -0000
@@ -166,6 +166,14 @@
# endif
#endif
@@ -309,7 +304,7 @@ diff -u -p -r1.7 cthread_internals.h
/*
* 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
+@@ -312,4 +320,18 @@
void (*cthread_body_pc)());
extern void cproc_setup(cproc_t _child, thread_t _mach_thread,
@@ -329,17 +324,14 @@ diff -u -p -r1.7 cthread_internals.h
+
+/* 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
++++ libthreads/alpha/thread.c 13 Jul 2007 01:43:43 -0000
+@@ -74,6 +74,7 @@
cproc_setup(
register cproc_t child,
thread_t thread,
@@ -351,10 +343,9 @@ 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/
++++ libthreads/i386/thread.c 13 Jul 2007 01:43:43 -0000
+@@ -75,6 +75,21 @@
#include <cthreads.h>
#include "cthread_internals.h"
#include <mach.h>
@@ -376,7 +367,7 @@ diff -u -p -r1.7 thread.c
/*
* Set up the initial state of a MACH thread
-@@ -82,7 +97,7 @@ char rcs_id[] = "$Header: /cvsroot/hurd/
+@@ -82,7 +97,7 @@
* when it is resumed.
*/
void
@@ -385,7 +376,7 @@ diff -u -p -r1.7 thread.c
{
extern unsigned int __hurd_threadvar_max; /* GNU */
register int *top = (int *)
-@@ -101,7 +116,7 @@ cproc_setup(register cproc_t child, thre
+@@ -101,7 +116,7 @@
* Read registers first to get correct segment values.
*/
count = i386_THREAD_STATE_COUNT;
@@ -394,21 +385,23 @@ diff -u -p -r1.7 thread.c
ts->eip = (int) routine;
*--top = (int) child; /* argument to function */
-@@ -109,7 +124,19 @@ cproc_setup(register cproc_t child, thre
+@@ -109,7 +124,21 @@
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;
++ int sel;
++
++ asm ("mov %%gs, %w0" : "=q" (sel) : "0" (0));
++ tcb->tcb = tcb;
++ tcb->self = thread;
++ if (__builtin_expect (sel, 0x48) & 4) /* LDT selector */
++ __i386_set_ldt (thread, sel, &desc, 1);
++ else
++ __i386_set_gdt (thread, &sel, desc);
++ ts->gs = sel;
+ }
+
+ MACH_CALL(thread_set_state(thread,i386_REGS_SEGS_STATE,(thread_state_t) &state,i386_THREAD_STATE_COUNT),r);