Author: sthibault
Date: 2013-10-24 22:07:17 +0000 (Thu, 24 Oct 2013)
New Revision: 5737

Added:
   
glibc-package/trunk/debian/patches/hurd-i386/cvs-tls-threadvar-threadself.diff
Modified:
   glibc-package/trunk/debian/changelog
   glibc-package/trunk/debian/patches/series
Log:
  * patches/hurd-i386/cvs-tls-threadvar-threadself.diff: New patch, store
    pthread_self in TLS instead of threadvar.


Modified: glibc-package/trunk/debian/changelog
===================================================================
--- glibc-package/trunk/debian/changelog        2013-10-24 21:59:56 UTC (rev 
5736)
+++ glibc-package/trunk/debian/changelog        2013-10-24 22:07:17 UTC (rev 
5737)
@@ -14,6 +14,8 @@
     previous patch.
   * patches/hurd-i386/tg-extern_inline.diff: Do not expose some internals of
     libc outside libc.
+  * patches/hurd-i386/cvs-tls-threadvar-threadself.diff: New patch, store
+    pthread_self in TLS instead of threadvar.
 
  -- Adam Conrad <adcon...@0c3.net>  Sun, 22 Sep 2013 23:39:33 -0600
 

Added: 
glibc-package/trunk/debian/patches/hurd-i386/cvs-tls-threadvar-threadself.diff
===================================================================
--- 
glibc-package/trunk/debian/patches/hurd-i386/cvs-tls-threadvar-threadself.diff  
                            (rev 0)
+++ 
glibc-package/trunk/debian/patches/hurd-i386/cvs-tls-threadvar-threadself.diff  
    2013-10-24 22:07:17 UTC (rev 5737)
@@ -0,0 +1,216 @@
+commit 25260994c812050a5d7addf125cdc90c911ca5c1
+Author: Samuel Thibault <samuel.thiba...@ens-lyon.org>
+Date:   Fri Apr 27 01:32:54 2012 +0000
+
+    Store self in __thread variable instead of threadvar
+    
+    * sysdeps/mach/hurd/pt-sysdep.h (_HURD_THREADVAR_THREAD): Remove macro.
+    (___pthread_self): Declare new __thread variable.
+    (_pthread_self): Take self pointer from ___pthread_self instead of
+    threadvar.
+    * sysdeps/mach/hurd/pt-sysdep.c (___pthread_self): Define new __thread
+    variable.
+    (init_routine): Set ___pthread_self to initial thread structure.
+    * pthread/pt-internal.h (__pthread_setup): Add `self' parameter to
+    `entry_point' parameter.
+    * pthread/pt-create.c (entry_point): Add `self' parameter. Store it in
+    ___pthread_self.
+    * sysdeps/l4/hurd/ia32/pt-setup.c (stack_setup): Add `self parameter to
+    `entry_point' parameter. Pass it the `thread' parameter.
+    (__pthread_setup): Likewise.
+    * sysdeps/l4/hurd/powerpc/pt-setup.c (struct start_info): Add `self' field.
+    (first_entry_1): Pass `self' parameter.
+    (stack_setup): Add `self' parameter to `entry_point' parameter, pass it the
+    `thread' parameter.
+    (__pthread_setup): Likewise.
+    * sysdeps/mach/hurd/ia32/pt-setup.c (stack_setup): Pass `thread' parameter
+    to the start routine.
+    (stack_setup): Add `self' parameter to `entry_point' paramter.
+
+Index: eglibc-2.17/libpthread/pthread/pt-create.c
+===================================================================
+--- eglibc-2.17.orig/libpthread/pthread/pt-create.c    2013-10-20 
22:55:39.000000000 +0000
++++ eglibc-2.17/libpthread/pthread/pt-create.c 2013-10-20 22:55:39.000000000 
+0000
+@@ -41,8 +41,12 @@
+ 
+ /* The entry-point for new threads.  */
+ static void
+-entry_point (void *(*start_routine)(void *), void *arg)
++entry_point (struct __pthread *self, void *(*start_routine)(void *), void 
*arg)
+ {
++#ifdef ENABLE_TLS
++  ___pthread_self = self;
++#endif
++
+ #ifdef IS_IN_libpthread
+   /* Initialize pointers to locale data.  */
+   __ctype_init ();
+Index: eglibc-2.17/libpthread/pthread/pt-internal.h
+===================================================================
+--- eglibc-2.17.orig/libpthread/pthread/pt-internal.h  2013-10-20 
22:55:39.000000000 +0000
++++ eglibc-2.17/libpthread/pthread/pt-internal.h       2013-10-20 
22:55:39.000000000 +0000
+@@ -225,7 +225,8 @@
+ 
+ /* Setup thread THREAD's context.  */
+ extern int __pthread_setup (struct __pthread *__restrict thread,
+-                                void (*entry_point)(void *(*)(void *),
++                                void (*entry_point)(struct __pthread *,
++                                                    void *(*)(void *),
+                                                     void *),
+                                 void *(*start_routine)(void *),
+                                 void *__restrict arg);
+Index: eglibc-2.17/libpthread/sysdeps/l4/hurd/ia32/pt-setup.c
+===================================================================
+--- eglibc-2.17.orig/libpthread/sysdeps/l4/hurd/ia32/pt-setup.c        
2013-10-20 22:55:39.000000000 +0000
++++ eglibc-2.17/libpthread/sysdeps/l4/hurd/ia32/pt-setup.c     2013-10-20 
22:55:39.000000000 +0000
+@@ -65,7 +65,7 @@
+ static void *
+ stack_setup (struct __pthread *thread,
+            void *(*start_routine)(void *), void *arg,
+-           void (*entry_point)(void *(*)(void *), void *))
++           void (*entry_point)(struct __pthread *, void *(*)(void *), void *))
+ {
+   uintptr_t *top;
+ 
+@@ -80,6 +80,7 @@
+       /* Set up call frame.  */
+       *--top = (uintptr_t) arg;       /* Argument to START_ROUTINE.  */
+       *--top = (uintptr_t) start_routine;
++      *--top = (uintptr_t) thread;
+       *--top = 0;             /* Fake return address.  */
+       *--top = (uintptr_t) entry_point;
+     }
+@@ -89,7 +90,7 @@
+ 
+ int
+ __pthread_setup (struct __pthread *thread,
+-               void (*entry_point)(void *(*)(void *), void *),
++               void (*entry_point)(struct __pthread *, void *(*)(void *), 
void *),
+                void *(*start_routine)(void *), void *arg)
+ {
+   thread->mcontext.pc = (void *) &_pthread_entry_point;
+Index: eglibc-2.17/libpthread/sysdeps/l4/hurd/powerpc/pt-setup.c
+===================================================================
+--- eglibc-2.17.orig/libpthread/sysdeps/l4/hurd/powerpc/pt-setup.c     
2013-10-20 22:55:39.000000000 +0000
++++ eglibc-2.17/libpthread/sysdeps/l4/hurd/powerpc/pt-setup.c  2013-10-20 
22:55:39.000000000 +0000
+@@ -28,6 +28,7 @@
+ struct start_info
+ {
+   void (*entry_point) (void *(*)(void *), void *);
++  struct __pthread *self;
+   void *(*start_routine) (void *);
+   void *arg;
+ };
+@@ -41,6 +42,7 @@
+       lwz     0, 0(1)         ;\
+       lwz     3, 4(1)         ;\
+       lwz     4, 8(1)         ;\
++      lwz     5, 12(1)        ;\
+       mtctr   0               ;\
+       bctrl                   ;\
+ ");
+@@ -51,7 +53,7 @@
+    opportunity to install THREAD in our utcb.  */
+ static void *
+ stack_setup (struct __pthread *thread,
+-           void (*entry_point)(void *(*)(void *), void *),
++           void (*entry_point)(struct __pthread *, void *(*)(void *), void *),
+            void *(*start_routine)(void *), void *arg)
+ {
+   l4_word_t *top;
+@@ -68,6 +70,7 @@
+       struct start_info *info = ((struct start_info *) top) - 1;
+ 
+       info->entry_point = entry_point;
++      info->self = thread;
+       info->start_routine = start_routine;
+       info->arg = arg;
+       return (void *) info;
+@@ -77,7 +80,7 @@
+ 
+ int
+ __pthread_setup (struct __pthread *thread,
+-               void (*entry_point)(void *(*)(void *), void *),
++               void (*entry_point)(struct __pthread *, void *(*)(void *), 
void *),
+                void *(*start_routine)(void *), void *arg)
+ {
+   thread->mcontext.pc = first_entry_1;
+Index: eglibc-2.17/libpthread/sysdeps/mach/hurd/ia32/pt-setup.c
+===================================================================
+--- eglibc-2.17.orig/libpthread/sysdeps/mach/hurd/ia32/pt-setup.c      
2013-10-20 22:55:39.000000000 +0000
++++ eglibc-2.17/libpthread/sysdeps/mach/hurd/ia32/pt-setup.c   2013-10-20 
22:55:39.000000000 +0000
+@@ -57,16 +57,14 @@
+   /* Next, make room for the TSDs.  */
+   top -= __hurd_threadvar_max;
+ 
+-  /* Save the self pointer.  */
+-  top[_HURD_THREADVAR_THREAD] = (uintptr_t) thread;
+-
+   if (start_routine)
+     {
+       /* And then the call frame.  */
+-      top -= 2;
++      top -= 3;
+       top = (uintptr_t *) ((uintptr_t) top & ~0xf);
+-      top[1] = (uintptr_t) arg;       /* Argument to START_ROUTINE.  */
+-      top[0] = (uintptr_t) start_routine;
++      top[2] = (uintptr_t) arg;       /* Argument to START_ROUTINE.  */
++      top[1] = (uintptr_t) start_routine;
++      top[0] = (uintptr_t) thread;
+       *--top = 0;             /* Fake return address.  */
+     }
+ 
+@@ -82,7 +80,7 @@
+ 
+ int
+ __pthread_setup (struct __pthread *thread,
+-               void (*entry_point)(void *(*)(void *), void *),
++               void (*entry_point)(struct __pthread *, void *(*)(void *), 
void *),
+                void *(*start_routine)(void *), void *arg)
+ {
+   error_t err;
+Index: eglibc-2.17/libpthread/sysdeps/mach/hurd/pt-sysdep.c
+===================================================================
+--- eglibc-2.17.orig/libpthread/sysdeps/mach/hurd/pt-sysdep.c  2013-10-20 
22:55:39.000000000 +0000
++++ eglibc-2.17/libpthread/sysdeps/mach/hurd/pt-sysdep.c       2013-10-20 
22:55:39.000000000 +0000
+@@ -38,6 +38,8 @@
+ extern size_t __pthread_stack_default_size;
+ weak_extern(__pthread_stack_default_size);
+ 
++__thread struct __pthread *___pthread_self;
++
+ /* Forward.  */
+ static void *init_routine (void);
+ 
+@@ -65,8 +67,7 @@
+   err = __pthread_create_internal (&thread, 0, 0, 0);
+   assert_perror (err);
+ 
+-  ((void **) (__hurd_threadvar_stack_offset))[_HURD_THREADVAR_THREAD]
+-    = thread;
++  ___pthread_self = thread;
+ 
+   /* Decrease the number of threads, to take into account that the
+      signal thread (which will be created by the glibc startup code
+Index: eglibc-2.17/libpthread/sysdeps/mach/hurd/pt-sysdep.h
+===================================================================
+--- eglibc-2.17.orig/libpthread/sysdeps/mach/hurd/pt-sysdep.h  2013-10-20 
22:55:39.000000000 +0000
++++ eglibc-2.17/libpthread/sysdeps/mach/hurd/pt-sysdep.h       2013-10-20 
22:55:39.000000000 +0000
+@@ -35,15 +35,13 @@
+   mach_msg_header_t wakeupmsg; \
+   int have_kernel_resources;
+ 
+-#define _HURD_THREADVAR_THREAD _HURD_THREADVAR_DYNAMIC_USER
+-
++extern __thread struct __pthread *___pthread_self;
+ #define _pthread_self()                                            \
+       ({                                                         \
+         struct __pthread *thread;                                \
+                                                                  \
+         assert (__pthread_threads);                              \
+-        thread = *(struct __pthread **)                          \
+-          __hurd_threadvar_location (_HURD_THREADVAR_THREAD);    \
++        thread = ___pthread_self;                                \
+                                                                  \
+         assert (thread);                                         \
+         assert (({ mach_port_t ktid = __mach_thread_self ();     \

Modified: glibc-package/trunk/debian/patches/series
===================================================================
--- glibc-package/trunk/debian/patches/series   2013-10-24 21:59:56 UTC (rev 
5736)
+++ glibc-package/trunk/debian/patches/series   2013-10-24 22:07:17 UTC (rev 
5737)
@@ -132,6 +132,7 @@
 hurd-i386/tg-pthread-atfork.diff
 hurd-i386/cvs-pthread_atfork.diff
 hurd-i386/tg-pipe2.diff
+hurd-i386/cvs-tls-threadvar-threadself.diff
 
 i386/local-biarch.diff
 i386/local-cmov.diff


-- 
To UNSUBSCRIBE, email to debian-glibc-requ...@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org
Archive: http://lists.debian.org/e1vzt3l-0006jd...@vasks.debian.org

Reply via email to