Alexandre Julliard : ntdll: Get rid of the Linux legacy signal stack switching.

Alexandre Julliard julliard at wine.codeweavers.com
Mon Aug 7 13:15:06 CDT 2006


Module: wine
Branch: refs/heads/master
Commit: ea08ec55b2e17e615a4ed1f4c5d2579bf4593055
URL:    http://source.winehq.org/git/?p=wine.git;a=commit;h=ea08ec55b2e17e615a4ed1f4c5d2579bf4593055

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Mon Aug  7 16:45:45 2006 +0200

ntdll: Get rid of the Linux legacy signal stack switching.

It doesn't work right in 32-bit code anyway.

---

 dlls/ntdll/signal_i386.c |  159 +++++++++++++---------------------------------
 1 files changed, 45 insertions(+), 114 deletions(-)

diff --git a/dlls/ntdll/signal_i386.c b/dlls/ntdll/signal_i386.c
index 5db30b5..2055d93 100644
--- a/dlls/ntdll/signal_i386.c
+++ b/dlls/ntdll/signal_i386.c
@@ -120,56 +120,6 @@ #define FPU_sig(context)     ((FLOATING_
 
 #define FAULT_ADDRESS        ((void *)HANDLER_CONTEXT->cr2)
 
-/* this is the sigaction structure from the Linux 2.1.20 kernel.  */
-struct kernel_sigaction
-{
-    void (*ksa_handler)();
-    unsigned long ksa_mask;
-    unsigned long ksa_flags;
-    void *ksa_restorer;
-};
-
-#ifndef SYS_sigaction
-# ifndef __NR_sigaction
-#  error The sigaction syscall is part of the Linux i386 ABI, but your headers does not define it. Please raise a bug with your distribution.
-# endif
-# define SYS_sigaction __NR_sigaction
-#endif
-
-/* Similar to the sigaction function in libc, except it leaves alone the
-   restorer field, which is used to specify the signal stack address */
-static inline int wine_sigaction( int sig, struct kernel_sigaction *new,
-                                  struct kernel_sigaction *old )
-{
-    __asm__ __volatile__( "pushl %%ebx\n\t"
-                          "movl %2,%%ebx\n\t"
-                          "int $0x80\n\t"
-                          "popl %%ebx"
-                          : "=a" (sig)
-                          : "0" (SYS_sigaction), "S" (sig), "c" (new), "d" (old) );
-    if (sig>=0) return 0;
-    errno = -sig;
-    return -1;
-}
-
-#ifdef HAVE_SIGALTSTACK
-/* direct syscall for sigaltstack to work around glibc 2.0 brain-damage */
-static inline int wine_sigaltstack( const struct sigaltstack *new,
-                                    struct sigaltstack *old )
-{
-    int ret;
-    __asm__ __volatile__( "pushl %%ebx\n\t"
-                          "movl %2,%%ebx\n\t"
-                          "int $0x80\n\t"
-                          "popl %%ebx"
-                          : "=a" (ret)
-                          : "0" (SYS_sigaltstack), "q" (new), "c" (old) );
-    if (ret >= 0) return 0;
-    errno = -ret;
-    return -1;
-}
-#endif
-
 #define VM86_EAX 0 /* the %eax value while vm86_enter is executing */
 
 int vm86_enter( void **vm86_ptr );
@@ -1482,52 +1432,6 @@ size_t get_signal_stack_total_size(void)
 
 
 /***********************************************************************
- *           set_handler
- *
- * Set a signal handler
- */
-static int set_handler( int sig, int have_sigaltstack, void (*func)() )
-{
-    struct sigaction sig_act;
-
-#ifdef linux
-    if (!have_sigaltstack)
-    {
-        struct kernel_sigaction sig_act;
-        sig_act.ksa_handler = func;
-        sig_act.ksa_flags   = SA_RESTART;
-        sig_act.ksa_mask    = (1 << (SIGINT-1)) |
-                              (1 << (SIGUSR1-1)) |
-                              (1 << (SIGUSR2-1));
-        /* point to the top of the signal stack */
-        sig_act.ksa_restorer = (char *)get_signal_stack() + signal_stack_size;
-        return wine_sigaction( sig, &sig_act, NULL );
-    }
-#endif  /* linux */
-    sig_act.sa_handler = func;
-    sigemptyset( &sig_act.sa_mask );
-    sigaddset( &sig_act.sa_mask, SIGINT );
-    sigaddset( &sig_act.sa_mask, SIGUSR1 );
-    sigaddset( &sig_act.sa_mask, SIGUSR2 );
-
-#if defined(linux)
-    sig_act.sa_flags = SA_RESTART;
-#elif defined (__svr4__) || defined(_SCO_DS) || defined(__APPLE__) || \
-        defined(__NetBSD__) || defined(__OpenBSD__) || \
-        defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
-    sig_act.sa_flags = SA_SIGINFO | SA_RESTART;
-#else
-    sig_act.sa_flags = 0;
-#endif
-
-#ifdef SA_ONSTACK
-    if (have_sigaltstack) sig_act.sa_flags |= SA_ONSTACK;
-#endif
-    return sigaction( sig, &sig_act, NULL );
-}
-
-
-/***********************************************************************
  *           __wine_set_signal_handler   (NTDLL.@)
  */
 int __wine_set_signal_handler(unsigned int sig, wine_signal_handler wsh)
@@ -1544,38 +1448,65 @@ int __wine_set_signal_handler(unsigned i
  */
 BOOL SIGNAL_Init(void)
 {
-    int have_sigaltstack = 0;
+    struct sigaction sig_act;
 
 #ifdef HAVE_SIGALTSTACK
     struct sigaltstack ss;
     ss.ss_sp    = get_signal_stack();
     ss.ss_size  = signal_stack_size;
     ss.ss_flags = 0;
-    if (!sigaltstack(&ss, NULL)) have_sigaltstack = 1;
-#ifdef linux
-    /* sigaltstack may fail because the kernel is too old, or
-       because glibc is brain-dead. In the latter case a
-       direct system call should succeed. */
-    else if (!wine_sigaltstack(&ss, NULL)) have_sigaltstack = 1;
-#endif  /* linux */
+    if (sigaltstack(&ss, NULL) == -1)
+    {
+        perror( "sigaltstack" );
+        return FALSE;
+    }
 #endif  /* HAVE_SIGALTSTACK */
 
-    if (set_handler( SIGINT,  have_sigaltstack, (void (*)())int_handler ) == -1) goto error;
-    if (set_handler( SIGFPE,  have_sigaltstack, (void (*)())fpe_handler ) == -1) goto error;
-    if (set_handler( SIGSEGV, have_sigaltstack, (void (*)())segv_handler ) == -1) goto error;
-    if (set_handler( SIGILL,  have_sigaltstack, (void (*)())segv_handler ) == -1) goto error;
-    if (set_handler( SIGABRT, have_sigaltstack, (void (*)())abrt_handler ) == -1) goto error;
-    if (set_handler( SIGTERM, have_sigaltstack, (void (*)())term_handler ) == -1) goto error;
-    if (set_handler( SIGUSR1, have_sigaltstack, (void (*)())usr1_handler ) == -1) goto error;
+    sigemptyset( &sig_act.sa_mask );
+    sigaddset( &sig_act.sa_mask, SIGINT );
+    sigaddset( &sig_act.sa_mask, SIGUSR1 );
+    sigaddset( &sig_act.sa_mask, SIGUSR2 );
+
+#if defined(linux)
+    sig_act.sa_flags = SA_RESTART;
+#elif defined (__svr4__) || defined(_SCO_DS) || defined(__APPLE__) || \
+        defined(__NetBSD__) || defined(__OpenBSD__) || \
+        defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
+    sig_act.sa_flags = SA_SIGINFO | SA_RESTART;
+#else
+    sig_act.sa_flags = 0;
+#endif
+
+#ifdef SA_ONSTACK
+    sig_act.sa_flags |= SA_ONSTACK;
+#endif
+
+    sig_act.sa_handler = (void (*)())int_handler;
+    if (sigaction( SIGINT, &sig_act, NULL ) == -1) goto error;
+    sig_act.sa_handler = (void (*)())fpe_handler;
+    if (sigaction( SIGFPE, &sig_act, NULL ) == -1) goto error;
+    sig_act.sa_handler = (void (*)())abrt_handler;
+    if (sigaction( SIGABRT, &sig_act, NULL ) == -1) goto error;
+    sig_act.sa_handler = (void (*)())term_handler;
+    if (sigaction( SIGTERM, &sig_act, NULL ) == -1) goto error;
+    sig_act.sa_handler = (void (*)())usr1_handler;
+    if (sigaction( SIGUSR1, &sig_act, NULL ) == -1) goto error;
+
+    sig_act.sa_handler = (void (*)())segv_handler;
+    if (sigaction( SIGSEGV, &sig_act, NULL ) == -1) goto error;
+    if (sigaction( SIGILL, &sig_act, NULL ) == -1) goto error;
 #ifdef SIGBUS
-    if (set_handler( SIGBUS,  have_sigaltstack, (void (*)())segv_handler ) == -1) goto error;
+    if (sigaction( SIGBUS, &sig_act, NULL ) == -1) goto error;
 #endif
+
 #ifdef SIGTRAP
-    if (set_handler( SIGTRAP, have_sigaltstack, (void (*)())trap_handler ) == -1) goto error;
+    sig_act.sa_handler = (void (*)())trap_handler;
+    if (sigaction( SIGTRAP, &sig_act, NULL ) == -1) goto error;
 #endif
 
 #ifdef __HAVE_VM86
-    if (set_handler( SIGUSR2, have_sigaltstack, (void (*)())usr2_handler ) == -1) goto error;
+    sig_act.sa_handler = (void (*)())usr2_handler;
+    if (sigaction( SIGUSR2, &sig_act, NULL ) == -1) goto error;
 #endif
 
     return TRUE;




More information about the wine-cvs mailing list