From 1608819110a4f2a40c3781a9c4b8a8f4b2cea69a Mon Sep 17 00:00:00 2001 From: Zhang Pu Date: Wed, 21 May 2014 00:52:55 +0800 Subject: 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 Signed-off-by: Bernhard Reutner-Fischer --- libc/sysdeps/linux/x86_64/sigaction.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) (limited to 'libc/sysdeps/linux/x86_64') diff --git a/libc/sysdeps/linux/x86_64/sigaction.c b/libc/sysdeps/linux/x86_64/sigaction.c index 703b24c51..a4042a9c8 100644 --- a/libc/sysdeps/linux/x86_64/sigaction.c +++ b/libc/sysdeps/linux/x86_64/sigaction.c @@ -111,11 +111,19 @@ libc_hidden_weak(sigaction) signal handlers work right. Important are both the names (__restore_rt) and the exact instruction sequence. 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 RESTORE2(name, syscall) \ __asm__ ( \ + "nop\n" \ ".text\n" \ "__" #name ":\n" \ " movq $" #syscall ", %rax\n" \ -- cgit v1.2.3