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