diff options
-rw-r--r-- | nptl/ChangeLog | 8 | ||||
-rw-r--r-- | nptl/sysdeps/unix/sysv/linux/jmp-unwind.c | 3 | ||||
-rw-r--r-- | nptl/sysdeps/x86_64/pthreaddef.h | 7 | ||||
-rw-r--r-- | nptl/sysdeps/x86_64/tls.h | 12 |
4 files changed, 26 insertions, 4 deletions
diff --git a/nptl/ChangeLog b/nptl/ChangeLog index d7e2c4c..34d6686 100644 --- a/nptl/ChangeLog +++ b/nptl/ChangeLog @@ -1,3 +1,11 @@ +2003-03-15 Ulrich Drepper <drepper@redhat.com> + + * sysdeps/x86_64/pthreaddef.h (CURRENT_STACK_FRAME): Don't use + __builtin_frame_address, use stack pointer. + + * sysdeps/unix/sysv/linux/jmp-unwind.c: Use CURRENT_STACK_FRAME + instead of __builtin_frame_pointer. + 2003-03-14 Ulrich Drepper <drepper@redhat.com> * tst-basic1.c (do_test): Add cast to avoid warning. diff --git a/nptl/sysdeps/unix/sysv/linux/jmp-unwind.c b/nptl/sysdeps/unix/sysv/linux/jmp-unwind.c index d6fbcc3..67350c2 100644 --- a/nptl/sysdeps/unix/sysv/linux/jmp-unwind.c +++ b/nptl/sysdeps/unix/sysv/linux/jmp-unwind.c @@ -20,6 +20,7 @@ #include <setjmp.h> #include <stddef.h> #include <pthread-functions.h> +#include <pthreaddef.h> extern void __pthread_cleanup_upto (__jmp_buf env, char *targetframe); #pragma weak __pthread_cleanup_upto @@ -35,5 +36,5 @@ _longjmp_unwind (jmp_buf env, int val) #endif if (fptr != NULL) - fptr (env->__jmpbuf, __builtin_frame_address (0)); + fptr (env->__jmpbuf, CURRENT_STACK_FRAME); } diff --git a/nptl/sysdeps/x86_64/pthreaddef.h b/nptl/sysdeps/x86_64/pthreaddef.h index 697329c..8fe6100 100644 --- a/nptl/sysdeps/x86_64/pthreaddef.h +++ b/nptl/sysdeps/x86_64/pthreaddef.h @@ -1,4 +1,4 @@ -/* Copyright (C) 2002 Free Software Foundation, Inc. +/* Copyright (C) 2002, 2003 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. @@ -34,8 +34,9 @@ #define SIGCANCEL __SIGRTMIN -/* Location of current stack frame. */ -#define CURRENT_STACK_FRAME __builtin_frame_address (0) +/* Location of current stack frame. The frame pointer is not usable. */ +#define CURRENT_STACK_FRAME \ + ({ char *frame; asm ("movq %%rsp, %0" : "=r" (frame)); frame; }) /* XXX Until we have a better place keep the definitions here. */ diff --git a/nptl/sysdeps/x86_64/tls.h b/nptl/sysdeps/x86_64/tls.h index e7fab7a..f382db2 100644 --- a/nptl/sysdeps/x86_64/tls.h +++ b/nptl/sysdeps/x86_64/tls.h @@ -253,6 +253,18 @@ typedef struct }}) +#define CALL_THREAD_FCT(descr) \ + ({ void *__res; \ + asm volatile ("movq %%fs:%P2, %%rdi\n\t" \ + "callq *%%fs:%P1" \ + : "=a" (__res) \ + : "i" (offsetof (struct pthread, start_routine)), \ + "i" (offsetof (struct pthread, arg)) \ + : "di", "si", "cx", "dx", "r8", "r9", "r10", "r11", \ + "memory", "cc"); \ + __res; }) + + #endif /* __ASSEMBLER__ */ #endif /* tls.h */ |