diff options
Diffstat (limited to 'sysdeps')
-rw-r--r-- | sysdeps/mach/hurd/i386/pt-setup.c | 12 | ||||
-rw-r--r-- | sysdeps/mach/hurd/pt-sysdep.c | 5 | ||||
-rw-r--r-- | sysdeps/mach/hurd/pt-sysdep.h | 6 |
3 files changed, 13 insertions, 10 deletions
diff --git a/sysdeps/mach/hurd/i386/pt-setup.c b/sysdeps/mach/hurd/i386/pt-setup.c index 73fd43d..5420dc8 100644 --- a/sysdeps/mach/hurd/i386/pt-setup.c +++ b/sysdeps/mach/hurd/i386/pt-setup.c @@ -57,14 +57,16 @@ stack_setup (struct __pthread *thread, /* 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 -= 3; + top -= 2; top = (uintptr_t *) ((uintptr_t) top & ~0xf); - top[2] = (uintptr_t) arg; /* Argument to START_ROUTINE. */ - top[1] = (uintptr_t) start_routine; - top[0] = (uintptr_t) thread; + top[1] = (uintptr_t) arg; /* Argument to START_ROUTINE. */ + top[0] = (uintptr_t) start_routine; *--top = 0; /* Fake return address. */ } @@ -80,7 +82,7 @@ stack_setup (struct __pthread *thread, int __pthread_setup (struct __pthread *thread, - void (*entry_point)(struct __pthread *, void *(*)(void *), void *), + void (*entry_point)(void *(*)(void *), void *), void *(*start_routine)(void *), void *arg) { error_t err; diff --git a/sysdeps/mach/hurd/pt-sysdep.c b/sysdeps/mach/hurd/pt-sysdep.c index f40fee5..95a4d36 100644 --- a/sysdeps/mach/hurd/pt-sysdep.c +++ b/sysdeps/mach/hurd/pt-sysdep.c @@ -28,8 +28,6 @@ #include <pt-internal.h> -__thread struct __pthread *___pthread_self; - /* Forward. */ static void *init_routine (void); @@ -53,7 +51,8 @@ init_routine (void) err = __pthread_create_internal (&thread, 0, 0, 0); assert_perror (err); - ___pthread_self = thread; + ((void **) (__hurd_threadvar_stack_offset))[_HURD_THREADVAR_THREAD] + = thread; /* Decrease the number of threads, to take into account that the signal thread (which will be created by the glibc startup code diff --git a/sysdeps/mach/hurd/pt-sysdep.h b/sysdeps/mach/hurd/pt-sysdep.h index bec1b40..13e235d 100644 --- a/sysdeps/mach/hurd/pt-sysdep.h +++ b/sysdeps/mach/hurd/pt-sysdep.h @@ -35,13 +35,15 @@ mach_msg_header_t wakeupmsg; \ int have_kernel_resources; -extern __thread struct __pthread *___pthread_self; +#define _HURD_THREADVAR_THREAD _HURD_THREADVAR_DYNAMIC_USER + #define _pthread_self() \ ({ \ struct __pthread *thread; \ \ assert (__pthread_threads); \ - thread = ___pthread_self; \ + thread = *(struct __pthread **) \ + __hurd_threadvar_location (_HURD_THREADVAR_THREAD); \ \ assert (thread); \ assert (({ mach_port_t ktid = __mach_thread_self (); \ |