From 817f685f4c65ed1af6eef79749b1f158eedd5bfc Mon Sep 17 00:00:00 2001 From: Bernd Schmidt Date: Wed, 23 Feb 2011 02:57:49 +0100 Subject: Allow ABIs where SP points below the stack frame. On C6X, the stack pointer points to a word that is not part of the current function's stack frame. It may be overwritten by callees. Take this into account when creating the stack for a cloned thread. Signed-off-by: Bernd Schmidt --- libpthread/linuxthreads.old/manager.c | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/libpthread/linuxthreads.old/manager.c b/libpthread/linuxthreads.old/manager.c index 52c1ea9b6..85fee5ec5 100644 --- a/libpthread/linuxthreads.old/manager.c +++ b/libpthread/linuxthreads.old/manager.c @@ -35,6 +35,9 @@ #include "semaphore.h" #include "debug.h" /* PDEBUG, added by StS */ +#ifndef THREAD_STACK_OFFSET +#define THREAD_STACK_OFFSET 0 +#endif /* poll() is not supported in kernel <= 2.0, therefore is __NR_poll is * not available, we assume an old Linux kernel is in use and we will @@ -476,6 +479,7 @@ static int pthread_handle_create(pthread_t *thread, const pthread_attr_t *attr, int pid; pthread_descr new_thread; char * new_thread_bottom; + char * new_thread_top; pthread_t new_thread_id; char *guardaddr = NULL; size_t guardsize = 0; @@ -561,7 +565,7 @@ static int pthread_handle_create(pthread_t *thread, const pthread_attr_t *attr, /* Do the cloning. We have to use two different functions depending on whether we are debugging or not. */ pid = 0; /* Note that the thread never can have PID zero. */ - + new_thread_top = ((char *)new_thread - THREAD_STACK_OFFSET); /* ******************************************************** */ /* This code was moved from below to cope with running threads @@ -588,12 +592,12 @@ static int pthread_handle_create(pthread_t *thread, const pthread_attr_t *attr, /* We have to report this event. */ #ifdef __ia64__ - pid = __clone2(pthread_start_thread_event, (void **) new_thread, - (char *)new_thread - new_thread_bottom, + pid = __clone2(pthread_start_thread_event, new_thread_top, + new_thread_top - new_thread_bottom, CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND | __pthread_sig_cancel, new_thread); #else - pid = clone(pthread_start_thread_event, (void **) new_thread, + pid = clone(pthread_start_thread_event, new_thread_top, CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND | __pthread_sig_cancel, new_thread); #endif @@ -626,12 +630,12 @@ static int pthread_handle_create(pthread_t *thread, const pthread_attr_t *attr, { PDEBUG("cloning new_thread = %p\n", new_thread); #ifdef __ia64__ - pid = __clone2(pthread_start_thread, (void **) new_thread, - (char *)new_thread - new_thread_bottom, + pid = __clone2(pthread_start_thread, new_thread_top, + new_thread_top - new_thread_bottom, CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND | __pthread_sig_cancel, new_thread); #else - pid = clone(pthread_start_thread, (void **) new_thread, + pid = clone(pthread_start_thread, new_thread_top, CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND | __pthread_sig_cancel, new_thread); #endif -- cgit v1.2.3