Browse Source

fix pthread_cancel lead to segmentation fault for x86_64.

When x86_64 cpu contains 'cpu_has_xsave' flag(in kernel),call the
pthread_cancel will have a segmentation fault. Because gcc could
not find the end of stack in user signal stack.

Signed-off-by: Zhang Pu <glen4linux@gmail.com>
Signed-off-by: Bernhard Reutner-Fischer <rep.dot.nop@gmail.com>
Zhang Pu 11 years ago
parent
commit
1608819110
1 changed files with 9 additions and 1 deletions
  1. 9 1
      libc/sysdeps/linux/x86_64/sigaction.c

+ 9 - 1
libc/sysdeps/linux/x86_64/sigaction.c

@@ -111,11 +111,19 @@ libc_hidden_weak(sigaction)
    signal handlers work right.  Important are both the names
    signal handlers work right.  Important are both the names
    (__restore_rt) and the exact instruction sequence.
    (__restore_rt) and the exact instruction sequence.
    If you ever feel the need to make any changes, please notify the
    If you ever feel the need to make any changes, please notify the
-   appropriate GDB maintainer.  */
+   appropriate GDB maintainer.
+
+   The unwind information starts a byte before __restore_rt, so that
+   it is found when unwinding, to get an address the unwinder assumes
+   will be in the middle of a call instruction.  See the Linux kernel
+   (the i386 vsyscall, in particular) for an explanation of the complex
+   unwind information used here in order to get the traditional CFA.
+ */
 
 
 #define RESTORE(name, syscall) RESTORE2(name, syscall)
 #define RESTORE(name, syscall) RESTORE2(name, syscall)
 #define RESTORE2(name, syscall) \
 #define RESTORE2(name, syscall) \
 __asm__ (						\
 __asm__ (						\
+	"nop\n"						\
 	".text\n"					\
 	".text\n"					\
 	"__" #name ":\n"				\
 	"__" #name ":\n"				\
 	"	movq	$" #syscall ", %rax\n"		\
 	"	movq	$" #syscall ", %rax\n"		\