diff options
Diffstat (limited to 'sysdeps/mach/hurd/i386/pt-setup.c')
-rw-r--r-- | sysdeps/mach/hurd/i386/pt-setup.c | 12 |
1 files changed, 7 insertions, 5 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; |