فهرست منبع

x86: Fix __libc_sigaction implementation.

For x86 we have to copy only mask, handler and flags.
We haven't set SA_RESTORER bit in sa_flags anyway.
This patch fixes multiple test failures on x86.
Also we have to build uClibc with FP for x86 because
without FP NPTL and libgcc code cannot properly unwind
the stack during asynchronous cancellation of system calls.

Signed-off-by: Dmitry Chestnykh <dm.chestnykh@gmail.com>
Dmitry Chestnykh 3 هفته پیش
والد
کامیت
7e528892ba
2فایلهای تغییر یافته به همراه7 افزوده شده و 5 حذف شده
  1. 3 2
      Rules.mak
  2. 4 3
      libc/sysdeps/linux/i386/sigaction.c

+ 3 - 2
Rules.mak

@@ -336,8 +336,6 @@ $(eval $(call check-gcc-var,-ffunction-sections))
 
 
 # Some nice CPU specific optimizations
 # Some nice CPU specific optimizations
 ifeq ($(TARGET_ARCH),i386)
 ifeq ($(TARGET_ARCH),i386)
-$(eval $(call check-gcc-var,-fomit-frame-pointer))
-	OPTIMIZATION += $(CFLAG_-fomit-frame-pointer)
 
 
 ifeq ($(CONFIG_386)$(CONFIG_486)$(CONFIG_586),y)
 ifeq ($(CONFIG_386)$(CONFIG_486)$(CONFIG_586),y)
 	# TODO: Change this to a gcc version check.  This bug
 	# TODO: Change this to a gcc version check.  This bug
@@ -662,6 +660,9 @@ endif
 ifneq ($(strip $(UCLIBC_EXTRA_CFLAGS)),"")
 ifneq ($(strip $(UCLIBC_EXTRA_CFLAGS)),"")
 CFLAGS += $(call qstrip,$(UCLIBC_EXTRA_CFLAGS))
 CFLAGS += $(call qstrip,$(UCLIBC_EXTRA_CFLAGS))
 endif
 endif
+ifeq ($(TARGET_ARCH),i386)
+CFLAGS += -fno-omit-frame-pointer
+endif
 ifneq ($(strip $(UCLIBC_EXTRA_LDFLAGS)),"")
 ifneq ($(strip $(UCLIBC_EXTRA_LDFLAGS)),"")
 LDFLAGS += $(call qstrip,$(UCLIBC_EXTRA_LDFLAGS))
 LDFLAGS += $(call qstrip,$(UCLIBC_EXTRA_LDFLAGS))
 endif
 endif

+ 4 - 3
libc/sysdeps/linux/i386/sigaction.c

@@ -31,15 +31,16 @@
 extern void restore_rt(void) __asm__ ("__restore_rt") attribute_hidden;
 extern void restore_rt(void) __asm__ ("__restore_rt") attribute_hidden;
 extern void restore(void) __asm__ ("__restore") attribute_hidden;
 extern void restore(void) __asm__ ("__restore") attribute_hidden;
 
 
-/* If ACT is not NULL, change the action for SIG to *ACT.
+/* If ACT is not NULL, change mask, handler and flags for SIG to ACT's
    If OACT is not NULL, put the old action for SIG in *OACT.  */
    If OACT is not NULL, put the old action for SIG in *OACT.  */
 int __libc_sigaction(int sig, const struct sigaction *act, struct sigaction *oact)
 int __libc_sigaction(int sig, const struct sigaction *act, struct sigaction *oact)
 {
 {
 	struct sigaction kact;
 	struct sigaction kact;
 
 
 	if (act) {
 	if (act) {
-		memcpy(&kact, act, sizeof(kact));
-		kact.sa_flags |= SA_RESTORER;
+		memcpy(&kact.sa_mask, &act->sa_mask, sizeof(sigset_t));
+		kact.sa_handler = act->sa_handler;
+		kact.sa_flags = act->sa_flags;
 		kact.sa_restorer = (act->sa_flags & SA_SIGINFO) ? &restore_rt : &restore;
 		kact.sa_restorer = (act->sa_flags & SA_SIGINFO) ? &restore_rt : &restore;
 		act = &kact;
 		act = &kact;
 	}
 	}