[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

r2626 - in glibc-package/branches/glibc-2.7/debian: . patches/hurd-i386



Author: aurel32
Date: 2007-10-27 13:45:33 +0000 (Sat, 27 Oct 2007)
New Revision: 2626

Modified:
   glibc-package/branches/glibc-2.7/debian/changelog
   glibc-package/branches/glibc-2.7/debian/patches/hurd-i386/local-tls-support.diff
Log:

  * Update hurd-i386/local-tls-support.diff.


Modified: glibc-package/branches/glibc-2.7/debian/changelog
===================================================================
--- glibc-package/branches/glibc-2.7/debian/changelog	2007-10-27 13:40:05 UTC (rev 2625)
+++ glibc-package/branches/glibc-2.7/debian/changelog	2007-10-27 13:45:33 UTC (rev 2626)
@@ -18,8 +18,9 @@
   * Update hppa/submitted-nptl-carlos.diff.
   * Update hurd-i386/submitted-libc_once.diff.
   * Remove hurd-i386/cvs-ioctl-delay.diff (merged).
+  * Update hurd-i386/local-tls-support.diff.
 
- -- Aurelien Jarno <aurel32@debian.org>  Sat, 27 Oct 2007 15:39:26 +0200
+ -- Aurelien Jarno <aurel32@debian.org>  Sat, 27 Oct 2007 15:44:29 +0200
 
 glibc (2.7-0exp1) experimental; urgency=low
 
@@ -58,7 +59,6 @@
     - Remove localedata/submitted-as_IN.diff (merged).
     - Remove hppa/submitted-multiple-threads.diff (merged).
     - Remove hppa/submitted-ustat.diff (merged).
-    - Disable hurd-i386/local-tls-support.diff.
     - Remove hurd-i386/cvs-sigsuspend-nocancel.diff (merged).
     - Remove hurd-i386/cvs-lock-intern.diff (merged).
     - Remove sparc/local-undefined-registers.diff (obsolete).

Modified: glibc-package/branches/glibc-2.7/debian/patches/hurd-i386/local-tls-support.diff
===================================================================
--- glibc-package/branches/glibc-2.7/debian/patches/hurd-i386/local-tls-support.diff	2007-10-27 13:40:05 UTC (rev 2625)
+++ glibc-package/branches/glibc-2.7/debian/patches/hurd-i386/local-tls-support.diff	2007-10-27 13:45:33 UTC (rev 2626)
@@ -1,6 +1,6 @@
---- csu/libc-start.c.orig
-+++ csu/libc-start.c
-@@ -134,11 +134,13 @@
+--- csu/libc-start.c.orig	
++++ csu/libc-start.c	2007-10-27 15:42:32.000000000 +0200
+@@ -134,10 +134,12 @@
      }
  # endif
  
@@ -9,11 +9,296 @@
       functions are using thread functions if these are available and
       we need to setup errno.  */
    __pthread_initialize_minimal ();
- #endif
 +#endif
  
- # ifndef SHARED
    /* Set up the stack checker's canary.  */
+   uintptr_t stack_chk_guard = _dl_setup_stack_chk_guard ();
+--- csu/libc-start.c.orig.orig
++++ csu/libc-start.c.orig
+@@ -0,0 +1,253 @@
++/* Copyright (C) 1998-2006, 2007 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++
++   The GNU C Library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Lesser General Public
++   License as published by the Free Software Foundation; either
++   version 2.1 of the License, or (at your option) any later version.
++
++   The GNU C Library is distributed in the hope that it will be useful,
++   but WITHOUT ANY WARRANTY; without even the implied warranty of
++   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++   Lesser General Public License for more details.
++
++   You should have received a copy of the GNU Lesser General Public
++   License along with the GNU C Library; if not, write to the Free
++   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
++   02111-1307 USA.  */
++
++#include <stdlib.h>
++#include <stdio.h>
++#include <unistd.h>
++#include <ldsodefs.h>
++#include <bp-start.h>
++#include <bp-sym.h>
++
++extern void __libc_init_first (int argc, char **argv, char **envp);
++
++extern int __libc_multiple_libcs;
++
++#include <tls.h>
++#ifndef SHARED
++# include <dl-osinfo.h>
++extern void __pthread_initialize_minimal (void);
++# ifndef THREAD_SET_STACK_GUARD
++/* Only exported for architectures that don't store the stack guard canary
++   in thread local area.  */
++uintptr_t __stack_chk_guard attribute_relro;
++# endif
++#endif
++
++#ifdef HAVE_PTR_NTHREADS
++/* We need atomic operations.  */
++# include <atomic.h>
++#endif
++
++
++#ifdef LIBC_START_MAIN
++# ifdef LIBC_START_DISABLE_INLINE
++#  define STATIC static
++# else
++#  define STATIC static inline __attribute__ ((always_inline))
++# endif
++#else
++# define STATIC
++# define LIBC_START_MAIN BP_SYM (__libc_start_main)
++#endif
++
++#ifdef MAIN_AUXVEC_ARG
++/* main gets passed a pointer to the auxiliary.  */
++# define MAIN_AUXVEC_DECL	, void *
++# define MAIN_AUXVEC_PARAM	, auxvec
++#else
++# define MAIN_AUXVEC_DECL
++# define MAIN_AUXVEC_PARAM
++#endif
++
++STATIC int LIBC_START_MAIN (int (*main) (int, char **, char **
++					 MAIN_AUXVEC_DECL),
++			    int argc,
++			    char *__unbounded *__unbounded ubp_av,
++#ifdef LIBC_START_MAIN_AUXVEC_ARG
++			    ElfW(auxv_t) *__unbounded auxvec,
++#endif
++			    __typeof (main) init,
++			    void (*fini) (void),
++			    void (*rtld_fini) (void),
++			    void *__unbounded stack_end)
++     __attribute__ ((noreturn));
++
++
++/* Note: the fini parameter is ignored here for shared library.  It
++   is registered with __cxa_atexit.  This had the disadvantage that
++   finalizers were called in more than one place.  */
++STATIC int
++LIBC_START_MAIN (int (*main) (int, char **, char ** MAIN_AUXVEC_DECL),
++		 int argc, char *__unbounded *__unbounded ubp_av,
++#ifdef LIBC_START_MAIN_AUXVEC_ARG
++		 ElfW(auxv_t) *__unbounded auxvec,
++#endif
++		 __typeof (main) init,
++		 void (*fini) (void),
++		 void (*rtld_fini) (void), void *__unbounded stack_end)
++{
++#if __BOUNDED_POINTERS__
++  char **argv;
++#else
++# define argv ubp_av
++#endif
++
++  /* Result of the 'main' function.  */
++  int result;
++
++  __libc_multiple_libcs = &_dl_starting_up && !_dl_starting_up;
++
++#ifndef SHARED
++  char *__unbounded *__unbounded ubp_ev = &ubp_av[argc + 1];
++
++  INIT_ARGV_and_ENVIRON;
++
++  /* Store the lowest stack address.  This is done in ld.so if this is
++     the code for the DSO.  */
++  __libc_stack_end = stack_end;
++
++# ifdef HAVE_AUX_VECTOR
++  /* First process the auxiliary vector since we need to find the
++     program header to locate an eventually present PT_TLS entry.  */
++#  ifndef LIBC_START_MAIN_AUXVEC_ARG
++  ElfW(auxv_t) *__unbounded auxvec;
++  {
++    char *__unbounded *__unbounded evp = ubp_ev;
++    while (*evp++ != NULL)
++      ;
++    auxvec = (ElfW(auxv_t) *__unbounded) evp;
++  }
++#  endif
++  _dl_aux_init (auxvec);
++# endif
++# ifdef DL_SYSDEP_OSCHECK
++  if (!__libc_multiple_libcs)
++    {
++      /* This needs to run to initiliaze _dl_osversion before TLS
++	 setup might check it.  */
++      DL_SYSDEP_OSCHECK (__libc_fatal);
++    }
++# endif
++
++  /* Initialize the thread library at least a bit since the libgcc
++     functions are using thread functions if these are available and
++     we need to setup errno.  */
++  __pthread_initialize_minimal ();
++
++  /* Set up the stack checker's canary.  */
++  uintptr_t stack_chk_guard = _dl_setup_stack_chk_guard ();
++# ifdef THREAD_SET_STACK_GUARD
++  THREAD_SET_STACK_GUARD (stack_chk_guard);
++# else
++  __stack_chk_guard = stack_chk_guard;
++# endif
++#endif
++
++  /* Register the destructor of the dynamic linker if there is any.  */
++  if (__builtin_expect (rtld_fini != NULL, 1))
++    __cxa_atexit ((void (*) (void *)) rtld_fini, NULL, NULL);
++
++#ifndef SHARED
++  /* Call the initializer of the libc.  This is only needed here if we
++     are compiling for the static library in which case we haven't
++     run the constructors in `_dl_start_user'.  */
++  __libc_init_first (argc, argv, __environ);
++
++  /* Register the destructor of the program, if any.  */
++  if (fini)
++    __cxa_atexit ((void (*) (void *)) fini, NULL, NULL);
++
++  /* Some security at this point.  Prevent starting a SUID binary where
++     the standard file descriptors are not opened.  We have to do this
++     only for statically linked applications since otherwise the dynamic
++     loader did the work already.  */
++  if (__builtin_expect (__libc_enable_secure, 0))
++    __libc_check_standard_fds ();
++#endif
++
++  /* Call the initializer of the program, if any.  */
++#ifdef SHARED
++  if (__builtin_expect (GLRO(dl_debug_mask) & DL_DEBUG_IMPCALLS, 0))
++    GLRO(dl_debug_printf) ("\ninitialize program: %s\n\n", argv[0]);
++#endif
++  if (init)
++    (*init) (argc, argv, __environ MAIN_AUXVEC_PARAM);
++
++#ifdef SHARED
++  /* Auditing checkpoint: we have a new object.  */
++  if (__builtin_expect (GLRO(dl_naudit) > 0, 0))
++    {
++      struct audit_ifaces *afct = GLRO(dl_audit);
++      struct link_map *head = GL(dl_ns)[LM_ID_BASE]._ns_loaded;
++      for (unsigned int cnt = 0; cnt < GLRO(dl_naudit); ++cnt)
++	{
++	  if (afct->preinit != NULL)
++	    afct->preinit (&head->l_audit[cnt].cookie);
++
++	  afct = afct->next;
++	}
++    }
++#endif
++
++#ifdef SHARED
++  if (__builtin_expect (GLRO(dl_debug_mask) & DL_DEBUG_IMPCALLS, 0))
++    GLRO(dl_debug_printf) ("\ntransferring control: %s\n\n", argv[0]);
++#endif
++
++#ifdef HAVE_CLEANUP_JMP_BUF
++  /* Memory for the cancellation buffer.  */
++  struct pthread_unwind_buf unwind_buf;
++
++  int not_first_call;
++  not_first_call = setjmp ((struct __jmp_buf_tag *) unwind_buf.cancel_jmp_buf);
++  if (__builtin_expect (! not_first_call, 1))
++    {
++      struct pthread *self = THREAD_SELF;
++
++      /* Store old info.  */
++      unwind_buf.priv.data.prev = THREAD_GETMEM (self, cleanup_jmp_buf);
++      unwind_buf.priv.data.cleanup = THREAD_GETMEM (self, cleanup);
++
++      /* Store the new cleanup handler info.  */
++      THREAD_SETMEM (self, cleanup_jmp_buf, &unwind_buf);
++
++      /* Run the program.  */
++      result = main (argc, argv, __environ MAIN_AUXVEC_PARAM);
++    }
++  else
++    {
++      /* Remove the thread-local data.  */
++# ifdef SHARED
++      PTHFCT_CALL (ptr__nptl_deallocate_tsd, ());
++# else
++      extern void __nptl_deallocate_tsd (void) __attribute ((weak));
++      __nptl_deallocate_tsd ();
++# endif
++
++      /* One less thread.  Decrement the counter.  If it is zero we
++	 terminate the entire process.  */
++      result = 0;
++# ifdef SHARED
++      unsigned int *ptr = __libc_pthread_functions.ptr_nthreads;
++      PTR_DEMANGLE (ptr);
++# else
++      extern unsigned int __nptl_nthreads __attribute ((weak));
++      unsigned int *const ptr = &__nptl_nthreads;
++# endif
++
++      if (! atomic_decrement_and_test (ptr))
++	/* Not much left to do but to exit the thread, not the process.  */
++	__exit_thread (0);
++    }
++#else
++  /* Nothing fancy, just call the function.  */
++  result = main (argc, argv, __environ MAIN_AUXVEC_PARAM);
++#endif
++
++  exit (result);
++}
+--- csu/libc-start.c.rej.orig
++++ csu/libc-start.c.rej
+@@ -0,0 +1,27 @@
++***************
++*** 134,144 ****
++      }
++  # endif
++  
++    /* Initialize the thread library at least a bit since the libgcc
++       functions are using thread functions if these are available and
++       we need to setup errno.  */
++    __pthread_initialize_minimal ();
++  #endif
++  
++  # ifndef SHARED
++    /* Set up the stack checker's canary.  */
++--- 134,146 ----
++      }
++  # endif
++  
+++ #ifndef __GNU__
++    /* Initialize the thread library at least a bit since the libgcc
++       functions are using thread functions if these are available and
++       we need to setup errno.  */
++    __pthread_initialize_minimal ();
++  #endif
+++ #endif
++  
++  # ifndef SHARED
++    /* Set up the stack checker's canary.  */
 --- hurd/hurdfault.c.orig
 +++ hurd/hurdfault.c
 @@ -206,6 +206,8 @@
@@ -25,10 +310,9 @@
    MACHINE_THREAD_STATE_SET_PC (&state, faulted);
    MACHINE_THREAD_STATE_SET_SP (&state, faultstack, sizeof faultstack);
  
-diff -u -p -r1.159 hurdsig.c
---- hurd/hurdsig.c	21 Dec 2005 22:16:20 -0000	1.159
-+++ hurd/hurdsig.c	9 Aug 2007 19:17:33 -0000
-@@ -1260,6 +1260,8 @@ _hurdsig_init (const int *intarray, size
+--- hurd/hurdsig.c.orig
++++ hurd/hurdsig.c
+@@ -1260,6 +1260,8 @@
  				 (vm_address_t *) &__hurd_sigthread_stack_base,
  				 &stacksize);
        assert_perror (err);
@@ -37,7 +321,7 @@
  
        __hurd_sigthread_stack_end = __hurd_sigthread_stack_base + stacksize;
        __hurd_sigthread_variables =
-@@ -1268,8 +1270,6 @@ _hurdsig_init (const int *intarray, size
+@@ -1268,8 +1270,6 @@
  	__libc_fatal ("hurd: Can't allocate threadvars for signal thread\n");
        memset (__hurd_sigthread_variables, 0,
  	      __hurd_threadvar_max * sizeof (unsigned long int));
@@ -46,10 +330,9 @@
  
        /* Reinitialize the MiG support routines so they will use a per-thread
  	 variable for the cached reply port.  */
-diff -u -p -r1.13 mach.h
---- mach/mach.h	30 Aug 2002 01:30:53 -0000	1.13
-+++ mach/mach.h	9 Aug 2007 19:17:33 -0000
-@@ -101,5 +101,8 @@ kern_return_t mach_setup_thread (task_t 
+--- mach/mach.h.orig
++++ mach/mach.h
+@@ -101,5 +101,8 @@
  				 vm_address_t *stack_base,
  				 vm_size_t *stack_size);
  
@@ -57,7 +340,115 @@
 +kern_return_t __mach_setup_tls (thread_t thread);
 +kern_return_t mach_setup_tls (thread_t thread);
  
- #endif /* mach.h */
+ #endif	/* mach.h */
+--- mach/mach.h.orig.orig
++++ mach/mach.h.orig
+@@ -0,0 +1,105 @@
++/* Standard header for all Mach programs.
++   Copyright (C) 1993,94,96,97,2002 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++
++   The GNU C Library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Lesser General Public
++   License as published by the Free Software Foundation; either
++   version 2.1 of the License, or (at your option) any later version.
++
++   The GNU C Library is distributed in the hope that it will be useful,
++   but WITHOUT ANY WARRANTY; without even the implied warranty of
++   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++   Lesser General Public License for more details.
++
++   You should have received a copy of the GNU Lesser General Public
++   License along with the GNU C Library; if not, write to the Free
++   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
++   02111-1307 USA.  */
++
++#ifndef	_MACH_H
++
++#define	_MACH_H	1
++
++/* We must include this before using __need_FILE with <stdio.h> below.  */
++#include <features.h>
++
++
++/* Get the basic types used by Mach.  */
++#include <mach/mach_types.h>
++
++/* This declares the basic variables and macros everything needs.  */
++#include <mach_init.h>
++
++/* This declares all the real system call functions.  */
++#include <mach/mach_traps.h>
++
++/* These are MiG-generated headers for the kernel interfaces commonly used.  */
++#include <mach/mach_interface.h> /* From <mach/mach.defs>.  */
++#include <mach/mach_port.h>
++#include <mach/mach_host.h>
++
++/* For the kernel RPCs which have system call shortcut versions,
++   the MiG-generated header in fact declares `CALL_rpc' rather than `CALL'.
++   This file declares the simple `CALL' functions.  */
++#include <mach-shortcuts.h>
++
++
++/* Receive RPC request messages on RCV_NAME and pass them to DEMUX, which
++   decodes them and produces reply messages.  MAX_SIZE is the maximum size
++   (in bytes) of the request and reply buffers.  */
++extern mach_msg_return_t
++__mach_msg_server (boolean_t (*__demux) (mach_msg_header_t *__request,
++					 mach_msg_header_t *__reply),
++		   mach_msg_size_t __max_size,
++		   mach_port_t __rcv_name),
++mach_msg_server (boolean_t (*__demux) (mach_msg_header_t *__request,
++				       mach_msg_header_t *__reply),
++		 mach_msg_size_t __max_size,
++		 mach_port_t __rcv_name);
++
++/* Just like `mach_msg_server', but the OPTION and TIMEOUT parameters are
++   passed on to `mach_msg'.  */
++extern mach_msg_return_t
++__mach_msg_server_timeout (boolean_t (*__demux) (mach_msg_header_t *__request,
++						 mach_msg_header_t *__reply),
++			   mach_msg_size_t __max_size,
++			   mach_port_t __rcv_name,
++			   mach_msg_option_t __option,
++			   mach_msg_timeout_t __timeout),
++mach_msg_server_timeout (boolean_t (*__demux) (mach_msg_header_t *__request,
++					       mach_msg_header_t *__reply),
++			 mach_msg_size_t __max_size,
++			 mach_port_t __rcv_name,
++			 mach_msg_option_t __option,
++			 mach_msg_timeout_t __timeout);
++
++
++/* Deallocate all port rights and out-of-line memory in MSG. */
++extern void
++__mach_msg_destroy (mach_msg_header_t *msg),
++mach_msg_destroy (mach_msg_header_t *msg);
++
++
++#define __need_FILE
++#include <stdio.h>
++
++/* Open a stream on a Mach device.  */
++extern FILE *mach_open_devstream (mach_port_t device_port, const char *mode);
++
++/* Give THREAD a stack and set it to run at PC when resumed.
++   If *STACK_SIZE is nonzero, that size of stack is allocated.
++   If *STACK_BASE is nonzero, that stack location is used.
++   If STACK_BASE is not null it is filled in with the chosen stack base.
++   If STACK_SIZE is not null it is filled in with the chosen stack size.
++   Regardless, an extra page of red zone is allocated off the end; this
++   is not included in *STACK_SIZE.  */
++kern_return_t __mach_setup_thread (task_t task, thread_t thread, void *pc,
++				   vm_address_t *stack_base,
++				   vm_size_t *stack_size);
++kern_return_t mach_setup_thread (task_t task, thread_t thread, void *pc,
++				 vm_address_t *stack_base,
++				 vm_size_t *stack_size);
++
++
++#endif	/* mach.h */
 --- mach/setup-thread.c.orig
 +++ mach/setup-thread.c
 @@ -20,6 +20,7 @@
@@ -68,7 +459,7 @@
  #include "sysdep.h"		/* Defines stack direction.  */
  
  #define	STACK_SIZE	(16 * 1024 * 1024) /* 16MB, arbitrary.  */
-@@ -73,8 +74,35 @@ __mach_setup_thread (task_t task, thread
+@@ -73,8 +74,35 @@
    if (error = __vm_protect (task, stack, __vm_page_size, 0, VM_PROT_NONE))
      return error;
  
@@ -115,18 +506,6 @@
  #define MACHINE_THREAD_STATE_FLAVOR	<machine>_THREAD_STATE
  #define MACHINE_THREAD_STATE_COUNT	<machine>_THREAD_STATE_COUNT
  
---- sysdeps/mach/thread_state.h.orig
-+++ sysdeps/mach/thread_state.h
-@@ -38,6 +38,9 @@
-   ((ts)->SP = (unsigned long int) (stack) + (size))
- #endif
- #endif
-+#ifndef MACHINE_THREAD_STATE_FIX_NEW
-+#define MACHINE_THREAD_STATE_FIX_NEW(ts)
-+#endif
- 
- /* These functions are of use in machine-dependent signal trampoline
-    implementations.  */
 --- sysdeps/mach/alpha/thread_state.h.orig
 +++ sysdeps/mach/alpha/thread_state.h
 @@ -19,6 +19,7 @@
@@ -137,58 +516,8 @@
  #define MACHINE_THREAD_STATE_FLAVOR	ALPHA_THREAD_STATE
  #define MACHINE_THREAD_STATE_COUNT	ALPHA_THREAD_STATE_COUNT
  
---- sysdeps/mach/hurd/fork.c.orig
-+++ sysdeps/mach/hurd/fork.c
-@@ -523,6 +523,11 @@
- #endif
-       MACHINE_THREAD_STATE_SET_PC (&state,
- 				   (unsigned long int) _hurd_msgport_receive);
-+
-+      /* Do special thread setup for TLS if needed.  */
-+      if (err = _hurd_tls_fork (sigthread, _hurd_msgport_thread, &state))
-+	LOSE;
-+
-       if (err = __thread_set_state (sigthread, MACHINE_THREAD_STATE_FLAVOR,
- 				    (natural_t *) &state, statecount))
- 	LOSE;
-@@ -533,7 +538,7 @@
-       _hurd_longjmp_thread_state (&state, env, 1);
- 
-       /* Do special thread setup for TLS if needed.  */
--      if (err = _hurd_tls_fork (thread, &state))
-+      if (err = _hurd_tls_fork (thread, __mach_thread_self (), &state))
- 	LOSE;
- 
-       if (err = __thread_set_state (thread, MACHINE_THREAD_STATE_FLAVOR,
---- sysdeps/mach/hurd/profil.c	16 Oct 2005 10:32:15 -0000	1.11
-+++ sysdeps/mach/hurd/profil.c	9 Aug 2007 19:17:34 -0000
-@@ -69,6 +69,8 @@ update_waiter (u_short *sample_buffer, s
-       if (! err)
- 	err = __mach_setup_thread (__mach_task_self (), profile_thread,
- 				   &profile_waiter, NULL, NULL);
-+      if (! err)
-+	err = __mach_setup_tls(profile_thread);
-     }
-   else
-     err = 0;
---- sysdeps/mach/hurd/setitimer.c	16 Oct 2005 10:32:15 -0000	1.23
-+++ sysdeps/mach/hurd/setitimer.c	9 Aug 2007 21:03:24 -0000
-@@ -223,11 +223,12 @@ setitimer_locked (const struct itimerval
- 	    return __hurd_fail (err);
- 	  _hurd_itimer_thread_stack_base = 0; /* Anywhere.  */
- 	  _hurd_itimer_thread_stack_size = __vm_page_size; /* Small stack.  */
--	  if (err = __mach_setup_thread (__mach_task_self (),
-+	  if ((err = __mach_setup_thread (__mach_task_self (),
- 					 _hurd_itimer_thread,
- 					 &timer_thread,
- 					 &_hurd_itimer_thread_stack_base,
- 					 &_hurd_itimer_thread_stack_size))
-+	      || (err = __mach_setup_tls(_hurd_itimer_thread)))
- 	    {
- 	      __thread_terminate (_hurd_itimer_thread);
- 	      _hurd_itimer_thread = MACH_PORT_NULL;
---- sysdeps/mach/hurd/bits/libc-tsd.h
-+++ /dev/null
+--- sysdeps/mach/hurd/bits/libc-tsd.h.orig
++++ sysdeps/mach/hurd/bits/libc-tsd.h
 @@ -1,34 +0,0 @@
 -/* libc-internal interface for thread-specific data.  Hurd version.
 -   Copyright (C) 1998,2002 Free Software Foundation, Inc.
@@ -224,6 +553,29 @@
 -
 -
 -#endif	/* bits/libc-tsd.h */
+--- sysdeps/mach/hurd/fork.c.orig
++++ sysdeps/mach/hurd/fork.c
+@@ -523,6 +523,11 @@
+ #endif
+       MACHINE_THREAD_STATE_SET_PC (&state,
+ 				   (unsigned long int) _hurd_msgport_receive);
++
++      /* Do special thread setup for TLS if needed.  */
++      if (err = _hurd_tls_fork (sigthread, _hurd_msgport_thread, &state))
++	LOSE;
++
+       if (err = __thread_set_state (sigthread, MACHINE_THREAD_STATE_FLAVOR,
+ 				    (natural_t *) &state, statecount))
+ 	LOSE;
+@@ -533,7 +538,7 @@
+       _hurd_longjmp_thread_state (&state, env, 1);
+ 
+       /* Do special thread setup for TLS if needed.  */
+-      if (err = _hurd_tls_fork (thread, &state))
++      if (err = _hurd_tls_fork (thread, __mach_thread_self (), &state))
+ 	LOSE;
+ 
+       if (err = __thread_set_state (thread, MACHINE_THREAD_STATE_FLAVOR,
 --- sysdeps/mach/hurd/i386/init-first.c.orig
 +++ sysdeps/mach/hurd/i386/init-first.c
 @@ -104,10 +104,6 @@
@@ -265,7 +617,7 @@
    _hurd_init_dtable = d->dtable;
    _hurd_init_dtablesize = d->dtablesize;
  
-@@ -172,13 +150,16 @@ init (int *data)
+@@ -172,13 +150,16 @@
    char **envp = &argv[argc + 1];
    struct hurd_startup_data *d;
    unsigned long int threadvars[_HURD_THREADVAR_MAX];
@@ -283,7 +635,7 @@
    __hurd_threadvar_stack_offset = (unsigned long int) threadvars;
  
    /* Since the cthreads initialization code uses malloc, and the
-@@ -192,6 +173,39 @@ init (int *data)
+@@ -192,6 +173,39 @@
      ++envp;
    d = (void *) ++envp;
  
@@ -404,6 +756,33 @@
  	}
      }
  
+--- sysdeps/mach/hurd/profil.c.orig
++++ sysdeps/mach/hurd/profil.c
+@@ -69,6 +69,8 @@
+       if (! err)
+ 	err = __mach_setup_thread (__mach_task_self (), profile_thread,
+ 				   &profile_waiter, NULL, NULL);
++      if (! err)
++	err = __mach_setup_tls(profile_thread);
+     }
+   else
+     err = 0;
+--- sysdeps/mach/hurd/setitimer.c.orig
++++ sysdeps/mach/hurd/setitimer.c
+@@ -223,11 +223,12 @@
+ 	    return __hurd_fail (err);
+ 	  _hurd_itimer_thread_stack_base = 0; /* Anywhere.  */
+ 	  _hurd_itimer_thread_stack_size = __vm_page_size; /* Small stack.  */
+-	  if (err = __mach_setup_thread (__mach_task_self (),
++	  if ((err = __mach_setup_thread (__mach_task_self (),
+ 					 _hurd_itimer_thread,
+ 					 &timer_thread,
+ 					 &_hurd_itimer_thread_stack_base,
+ 					 &_hurd_itimer_thread_stack_size))
++	      || (err = __mach_setup_tls(_hurd_itimer_thread)))
+ 	    {
+ 	      __thread_terminate (_hurd_itimer_thread);
+ 	      _hurd_itimer_thread = MACH_PORT_NULL;
 --- sysdeps/mach/i386/thread_state.h.orig
 +++ sysdeps/mach/i386/thread_state.h
 @@ -19,7 +19,8 @@
@@ -441,3 +820,15 @@
  #define MACHINE_THREAD_STATE_FLAVOR	PPC_THREAD_STATE
  #define MACHINE_THREAD_STATE_COUNT	PPC_THREAD_STATE_COUNT
  
+--- sysdeps/mach/thread_state.h.orig
++++ sysdeps/mach/thread_state.h
+@@ -38,6 +38,9 @@
+   ((ts)->SP = (unsigned long int) (stack) + (size))
+ #endif
+ #endif
++#ifndef MACHINE_THREAD_STATE_FIX_NEW
++#define MACHINE_THREAD_STATE_FIX_NEW(ts)
++#endif
+ 
+ /* These functions are of use in machine-dependent signal trampoline
+    implementations.  */



Reply to: