Author: ludo
Date: Mon Jun 27 21:43:02 2011
New Revision: 27551
URL: https://svn.nixos.org/websvn/nix/?rev=27551&sc=1

Log:
hurd: Add libthreads patch for TLS support.

Added:
   hydra-config/gnu/trunk/hurd/libthreads-tls-support.patch
Modified:
   hydra-config/gnu/trunk/hurd/release.nix

Added: hydra-config/gnu/trunk/hurd/libthreads-tls-support.patch
==============================================================================
--- /dev/null   00:00:00 1970   (empty, because file is newly added)
+++ hydra-config/gnu/trunk/hurd/libthreads-tls-support.patch    Mon Jun 27 
21:43:02 2011        (r27551)
@@ -0,0 +1,128 @@
+Fix cthreads to cooperate with the GNU libc for thread-local storage
+support (TLS).
+
+Taken from <git://git.debian.org/pkg-hurd/hurd.git>,
+`debian/patches/libpthread_tls.patch', commit 40671bc.
+
+--- a/libthreads/cprocs.c
++++ b/libthreads/cprocs.c
+@@ -730,10 +730,11 @@ cproc_create(void)
+       spin_lock(&n_kern_lock);
+       if (cthread_max_kernel_threads == 0 ||
+           cthread_kernel_threads < cthread_max_kernel_threads) {
++              tcbhead_t *tcb = _dl_allocate_tls(NULL);
+               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);
+--- a/libthreads/cthread_internals.h
++++ b/libthreads/cthread_internals.h
+@@ -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,10 @@ 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.  */
++
++/* Dynamic linker TLS allocation.  */
++extern void *_dl_allocate_tls(void *);
+--- a/libthreads/alpha/thread.c
++++ b/libthreads/alpha/thread.c
+@@ -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;
+--- a/libthreads/i386/thread.c
++++ b/libthreads/i386/thread.c
+@@ -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 *)
+@@ -95,13 +110,15 @@ cproc_setup(register cproc_t child, thre
+       register struct i386_thread_state *ts = &state;
+       kern_return_t r;
+       unsigned int count;
++      HURD_TLS_DESC_DECL(desc, tcb);
++      int sel;
+ 
+       /*
+        * Set up i386 call frame and registers.
+        * 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 +126,16 @@ 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);
++      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);
+ }
+ 
+ #if   defined(cthread_sp)

Modified: hydra-config/gnu/trunk/hurd/release.nix
==============================================================================
--- hydra-config/gnu/trunk/hurd/release.nix     Mon Jun 27 10:15:26 2011        
(r27550)
+++ hydra-config/gnu/trunk/hurd/release.nix     Mon Jun 27 21:43:02 2011        
(r27551)
@@ -65,6 +65,7 @@
           '';
         buildNativeInputs = [ pkgs.machHeaders pkgs.mig pkgs.texinfo ];
         buildInputs = [ pkgs.parted /* not the cross-GNU one */ pkgs.libuuid ];
+        patches = [ ./libthreads-tls-support.patch ];
         inherit meta succeedOnFailure keepBuildDirectory;
       };
 
_______________________________________________
nix-commits mailing list
[email protected]
http://mail.cs.uu.nl/mailman/listinfo/nix-commits

Reply via email to