ntdll/signal_i386: cleanup a bit and fix *BSD

Tijl Coosemans tijl at ulyssis.org
Sat Aug 5 15:34:11 CDT 2006


* reorganize ifdefs
* use correct trap codes in *BSD


PS: I'm pretty sure the trap codes can be different on other systems
as well, or at least partly. Trap code 19 indicates an SSE/SSE2 error
in OpenSolaris for instance, not a cache flush exception.

PPS: Please double check the Linux case as I don't have a Linux install
available for testing.


Index: dlls/ntdll/signal_i386.c
===================================================================
RCS file: /home/wine/wine/dlls/ntdll/signal_i386.c,v
retrieving revision 1.125
diff -u -r1.125 signal_i386.c
--- dlls/ntdll/signal_i386.c	23 May 2006 12:48:22 -0000	1.125
+++ dlls/ntdll/signal_i386.c	5 Aug 2006 20:16:02 -0000
@@ -94,6 +94,32 @@
 #define HANDLER_DEF(name) void name( int __signal, SIGCONTEXT __context )
 #define HANDLER_CONTEXT (&__context)
 
+#define EAX_sig(context)     ((context)->sc_eax)
+#define EBX_sig(context)     ((context)->sc_ebx)
+#define ECX_sig(context)     ((context)->sc_ecx)
+#define EDX_sig(context)     ((context)->sc_edx)
+#define ESI_sig(context)     ((context)->sc_esi)
+#define EDI_sig(context)     ((context)->sc_edi)
+#define EBP_sig(context)     ((context)->sc_ebp)
+
+#define CS_sig(context)      ((context)->sc_cs)
+#define DS_sig(context)      ((context)->sc_ds)
+#define ES_sig(context)      ((context)->sc_es)
+#define FS_sig(context)      ((context)->sc_fs)
+#define GS_sig(context)      ((context)->sc_gs)
+#define SS_sig(context)      ((context)->sc_ss)
+
+#define TRAP_sig(context)    ((context)->sc_trapno)
+#define ERROR_sig(context)   ((context)->sc_err)
+#define EFL_sig(context)     ((context)->sc_eflags)
+
+#define EIP_sig(context)     ((context)->sc_eip)
+#define ESP_sig(context)     ((context)->sc_esp)
+
+#define FPU_sig(context)     ((FLOATING_SAVE_AREA*)((context)->i387))
+
+#define FAULT_ADDRESS        ((void *)HANDLER_CONTEXT->cr2)
+
 /* this is the sigaction structure from the Linux 2.1.20 kernel.  */
 struct kernel_sigaction
 {
@@ -219,9 +245,33 @@
 
 typedef struct sigcontext SIGCONTEXT;
 
-#define HANDLER_DEF(name) void name( int __signal, int code, SIGCONTEXT *__context )
+#define HANDLER_DEF(name) void name( int __signal, siginfo_t *__siginfo, SIGCONTEXT *__context )
 #define HANDLER_CONTEXT __context
 
+#define EAX_sig(context)     ((context)->sc_eax)
+#define EBX_sig(context)     ((context)->sc_ebx)
+#define ECX_sig(context)     ((context)->sc_ecx)
+#define EDX_sig(context)     ((context)->sc_edx)
+#define ESI_sig(context)     ((context)->sc_esi)
+#define EDI_sig(context)     ((context)->sc_edi)
+#define EBP_sig(context)     ((context)->sc_ebp)
+
+#define CS_sig(context)      ((context)->sc_cs)
+#define DS_sig(context)      ((context)->sc_ds)
+#define ES_sig(context)      ((context)->sc_es)
+#define FS_sig(context)      ((context)->sc_fs)
+#define GS_sig(context)      ((context)->sc_gs)
+#define SS_sig(context)      ((context)->sc_ss)
+
+#define TRAP_sig(context)    ((context)->sc_trapno)
+#define ERROR_sig(context)   ((context)->sc_err)
+#define EFL_sig(context)     ((context)->sc_eflags)
+
+#define EIP_sig(context)     ((context)->sc_eip)
+#define ESP_sig(context)     ((context)->sc_esp)
+
+#define FAULT_ADDRESS        (__siginfo->si_addr)
+
 #endif  /* *BSD */
 
 #if defined(__svr4__) || defined(_SCO_DS) || defined(__sun)
@@ -238,6 +288,42 @@
 #define HANDLER_DEF(name) void name( int __signal, siginfo_t *__siginfo, SIGCONTEXT *__context )
 #define HANDLER_CONTEXT __context
 
+#ifdef _SCO_DS
+#define gregs regs
+#endif
+
+#define EAX_sig(context)     ((context)->uc_mcontext.gregs[EAX])
+#define EBX_sig(context)     ((context)->uc_mcontext.gregs[EBX])
+#define ECX_sig(context)     ((context)->uc_mcontext.gregs[ECX])
+#define EDX_sig(context)     ((context)->uc_mcontext.gregs[EDX])
+#define ESI_sig(context)     ((context)->uc_mcontext.gregs[ESI])
+#define EDI_sig(context)     ((context)->uc_mcontext.gregs[EDI])
+#define EBP_sig(context)     ((context)->uc_mcontext.gregs[EBP])
+
+#define CS_sig(context)      ((context)->uc_mcontext.gregs[CS])
+#define DS_sig(context)      ((context)->uc_mcontext.gregs[DS])
+#define ES_sig(context)      ((context)->uc_mcontext.gregs[ES])
+#define SS_sig(context)      ((context)->uc_mcontext.gregs[SS])
+
+#define FS_sig(context)      ((context)->uc_mcontext.gregs[FS])
+#define GS_sig(context)      ((context)->uc_mcontext.gregs[GS])
+
+#define EFL_sig(context)     ((context)->uc_mcontext.gregs[EFL])
+
+#define EIP_sig(context)     ((context)->uc_mcontext.gregs[EIP])
+#ifdef UESP
+#define ESP_sig(context)     ((context)->uc_mcontext.gregs[UESP])
+#elif defined(R_ESP)
+#define ESP_sig(context)     ((context)->uc_mcontext.gregs[R_ESP])
+#else
+#define ESP_sig(context)     ((context)->uc_mcontext.gregs[ESP])
+#endif
+#ifdef TRAPNO
+#define TRAP_sig(context)     ((context)->uc_mcontext.gregs[TRAPNO])
+#endif
+
+#define FAULT_ADDRESS         (__siginfo->si_addr)
+
 #endif  /* svr4 || SCO_DS */
 
 #ifdef __EMX__
@@ -264,6 +350,26 @@
     unsigned long sc_ss;
 } SIGCONTEXT;
 
+#define EAX_sig(context)     ((context)->sc_eax)
+#define EBX_sig(context)     ((context)->sc_ebx)
+#define ECX_sig(context)     ((context)->sc_ecx)
+#define EDX_sig(context)     ((context)->sc_edx)
+#define ESI_sig(context)     ((context)->sc_esi)
+#define EDI_sig(context)     ((context)->sc_edi)
+#define EBP_sig(context)     ((context)->sc_ebp)
+
+#define CS_sig(context)      ((context)->sc_cs)
+#define DS_sig(context)      ((context)->sc_ds)
+#define ES_sig(context)      ((context)->sc_es)
+#define FS_sig(context)      ((context)->sc_fs)
+#define GS_sig(context)      ((context)->sc_gs)
+#define SS_sig(context)      ((context)->sc_ss)
+
+#define EFL_sig(context)     ((context)->sc_eflags)
+
+#define EIP_sig(context)     ((context)->sc_eip)
+#define ESP_sig(context)     ((context)->sc_esp)
+
 #endif  /* __EMX__ */
 
 #ifdef __CYGWIN__
@@ -300,6 +406,28 @@
 #define HANDLER_DEF(name) void name( int __signal, SIGCONTEXT __context )
 #define HANDLER_CONTEXT (&__context)
 
+#define EAX_sig(context)     ((context)->sc_eax)
+#define EBX_sig(context)     ((context)->sc_ebx)
+#define ECX_sig(context)     ((context)->sc_ecx)
+#define EDX_sig(context)     ((context)->sc_edx)
+#define ESI_sig(context)     ((context)->sc_esi)
+#define EDI_sig(context)     ((context)->sc_edi)
+#define EBP_sig(context)     ((context)->sc_ebp)
+
+#define CS_sig(context)      ((context)->sc_cs)
+#define DS_sig(context)      ((context)->sc_ds)
+#define ES_sig(context)      ((context)->sc_es)
+#define FS_sig(context)      ((context)->sc_fs)
+#define GS_sig(context)      ((context)->sc_gs)
+#define SS_sig(context)      ((context)->sc_ss)
+
+#define TRAP_sig(context)    ((context)->sc_trapno)
+#define ERROR_sig(context)   ((context)->sc_err)
+#define EFL_sig(context)     ((context)->sc_eflags)
+
+#define EIP_sig(context)     ((context)->sc_eip)
+#define ESP_sig(context)     ((context)->sc_esp)
+
 #endif /* __CYGWIN__ */
 
 #ifdef __APPLE__
@@ -339,89 +467,6 @@
 
 #endif /* __APPLE__ */
 
-#if defined(linux) || defined(__NetBSD__) || defined(__FreeBSD__) || defined(__FreeBSD_kernel__) ||\
-    defined(__OpenBSD__) || defined(__EMX__) || defined(__CYGWIN__)
-
-#define EAX_sig(context)     ((context)->sc_eax)
-#define EBX_sig(context)     ((context)->sc_ebx)
-#define ECX_sig(context)     ((context)->sc_ecx)
-#define EDX_sig(context)     ((context)->sc_edx)
-#define ESI_sig(context)     ((context)->sc_esi)
-#define EDI_sig(context)     ((context)->sc_edi)
-#define EBP_sig(context)     ((context)->sc_ebp)
-
-#define CS_sig(context)      ((context)->sc_cs)
-#define DS_sig(context)      ((context)->sc_ds)
-#define ES_sig(context)      ((context)->sc_es)
-#define FS_sig(context)      ((context)->sc_fs)
-#define GS_sig(context)      ((context)->sc_gs)
-#define SS_sig(context)      ((context)->sc_ss)
-
-#define TRAP_sig(context)    ((context)->sc_trapno)
-
-#ifdef __NetBSD__
-#define ERROR_sig(context)   ((context)->sc_err)
-#endif
-
-#ifdef linux
-#define ERROR_sig(context)   ((context)->sc_err)
-#define FPU_sig(context)     ((FLOATING_SAVE_AREA*)((context)->i387))
-#define FAULT_ADDRESS        ((void *)HANDLER_CONTEXT->cr2)
-#endif
-
-#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
-#define EFL_sig(context)     ((context)->sc_efl)
-/* FreeBSD, see i386/i386/traps.c::trap_pfault va->err kludge  */
-#define FAULT_ADDRESS        ((void *)HANDLER_CONTEXT->sc_err)
-#else
-#define EFL_sig(context)     ((context)->sc_eflags)
-#endif
-
-#define EIP_sig(context)     (*((unsigned long*)&(context)->sc_eip))
-#define ESP_sig(context)     (*((unsigned long*)&(context)->sc_esp))
-
-#endif  /* linux || __NetBSD__ || __FreeBSD__ || __OpenBSD__ */
-
-#if defined(__svr4__) || defined(_SCO_DS) || defined(__sun)
-
-#ifdef _SCO_DS
-#define gregs regs
-#endif
-
-#define EAX_sig(context)     ((context)->uc_mcontext.gregs[EAX])
-#define EBX_sig(context)     ((context)->uc_mcontext.gregs[EBX])
-#define ECX_sig(context)     ((context)->uc_mcontext.gregs[ECX])
-#define EDX_sig(context)     ((context)->uc_mcontext.gregs[EDX])
-#define ESI_sig(context)     ((context)->uc_mcontext.gregs[ESI])
-#define EDI_sig(context)     ((context)->uc_mcontext.gregs[EDI])
-#define EBP_sig(context)     ((context)->uc_mcontext.gregs[EBP])
-
-#define CS_sig(context)      ((context)->uc_mcontext.gregs[CS])
-#define DS_sig(context)      ((context)->uc_mcontext.gregs[DS])
-#define ES_sig(context)      ((context)->uc_mcontext.gregs[ES])
-#define SS_sig(context)      ((context)->uc_mcontext.gregs[SS])
-
-#define FS_sig(context)      ((context)->uc_mcontext.gregs[FS])
-#define GS_sig(context)      ((context)->uc_mcontext.gregs[GS])
-
-#define EFL_sig(context)     ((context)->uc_mcontext.gregs[EFL])
-
-#define EIP_sig(context)     ((context)->uc_mcontext.gregs[EIP])
-#ifdef UESP
-#define ESP_sig(context)     ((context)->uc_mcontext.gregs[UESP])
-#elif defined(R_ESP)
-#define ESP_sig(context)     ((context)->uc_mcontext.gregs[R_ESP])
-#else
-#define ESP_sig(context)     ((context)->uc_mcontext.gregs[ESP])
-#endif
-#ifdef TRAPNO
-#define TRAP_sig(context)     ((context)->uc_mcontext.gregs[TRAPNO])
-#endif
-
-#define FAULT_ADDRESS         (__siginfo->si_addr)
-
-#endif  /* svr4 || SCO_DS */
-
 #include "wine/exception.h"
 #include "wine/debug.h"
 
@@ -439,6 +484,26 @@
 enum i386_trap_code
 {
     TRAP_x86_UNKNOWN    = -1,  /* Unknown fault (TRAP_sig not defined) */
+#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__)
+    TRAP_x86_DIVIDE     = T_DIVIDE,     /* Division by zero exception */
+    TRAP_x86_TRCTRAP    = T_TRCTRAP,    /* Single-step exception */
+    TRAP_x86_NMI        = T_NMI,        /* NMI interrupt */
+    TRAP_x86_BPTFLT     = T_BPTFLT,     /* Breakpoint exception */
+    TRAP_x86_OFLOW      = T_OFLOW,      /* Overflow exception */
+    TRAP_x86_BOUND      = T_BOUND,      /* Bound range exception */
+    TRAP_x86_PRIVINFLT  = T_PRIVINFLT,  /* Invalid opcode exception */
+    TRAP_x86_DNA        = T_DNA,        /* Device not available exception */
+    TRAP_x86_DOUBLEFLT  = T_DOUBLEFLT,  /* Double fault exception */
+    TRAP_x86_FPOPFLT    = T_FPOPFLT,    /* Coprocessor segment overrun */
+    TRAP_x86_TSSFLT     = T_TSSFLT,     /* Invalid TSS exception */
+    TRAP_x86_SEGNPFLT   = T_SEGNPFLT,   /* Segment not present exception */
+    TRAP_x86_STKFLT     = T_STKFLT,     /* Stack fault */
+    TRAP_x86_PROTFLT    = T_PROTFLT,    /* General protection fault */
+    TRAP_x86_PAGEFLT    = T_PAGEFLT,    /* Page fault */
+    TRAP_x86_ARITHTRAP  = T_ARITHTRAP,  /* Floating point exception */
+    TRAP_x86_ALIGNFLT   = T_ALIGNFLT,   /* Alignment check exception */
+    TRAP_x86_MCHK       = T_MCHK,       /* Machine check exception */
+#else
     TRAP_x86_DIVIDE     = 0,   /* Division by zero exception */
     TRAP_x86_TRCTRAP    = 1,   /* Single-step exception */
     TRAP_x86_NMI        = 2,   /* NMI interrupt */
@@ -458,6 +523,7 @@
     TRAP_x86_ALIGNFLT   = 17,  /* Alignment check exception */
     TRAP_x86_MCHK       = 18,  /* Machine check exception */
     TRAP_x86_CACHEFLT   = 19   /* Cache flush exception */
+#endif
 };
 
 
@@ -1000,9 +1066,10 @@
     if ((char *)stack >= (char *)get_signal_stack() &&
         (char *)stack < (char *)get_signal_stack() + signal_stack_size)
     {
-        ERR( "nested exception on signal stack in thread %04lx eip %08lx esp %08lx stack %p-%p\n",
-             GetCurrentThreadId(), EIP_sig(sigcontext), ESP_sig(sigcontext),
-             NtCurrentTeb()->Tib.StackLimit, NtCurrentTeb()->Tib.StackBase );
+        ERR( "nested exception on signal stack in thread %04lx eip %08x esp %08x stack %p-%p\n",
+             GetCurrentThreadId(), (unsigned int) EIP_sig(sigcontext),
+             (unsigned int) ESP_sig(sigcontext), NtCurrentTeb()->Tib.StackLimit,
+             NtCurrentTeb()->Tib.StackBase );
         server_abort_thread(1);
     }
 
@@ -1013,14 +1080,16 @@
         UINT diff = (char *)NtCurrentTeb()->Tib.StackLimit - (char *)stack;
         if (diff < 4096)
         {
-            ERR( "stack overflow %u bytes in thread %04lx eip %08lx esp %08lx stack %p-%p\n",
-                 diff, GetCurrentThreadId(), EIP_sig(sigcontext), ESP_sig(sigcontext),
-                 NtCurrentTeb()->Tib.StackLimit, NtCurrentTeb()->Tib.StackBase );
+            ERR( "stack overflow %u bytes in thread %04lx eip %08x esp %08x stack %p-%p\n",
+                 diff, GetCurrentThreadId(), (unsigned int) EIP_sig(sigcontext),
+                 (unsigned int) ESP_sig(sigcontext), NtCurrentTeb()->Tib.StackLimit,
+                 NtCurrentTeb()->Tib.StackBase );
             server_abort_thread(1);
         }
-        else WARN( "exception outside of stack limits in thread %04lx eip %08lx esp %08lx stack %p-%p\n",
-                   GetCurrentThreadId(), EIP_sig(sigcontext), ESP_sig(sigcontext),
-                   NtCurrentTeb()->Tib.StackLimit, NtCurrentTeb()->Tib.StackBase );
+        else WARN( "exception outside of stack limits in thread %04lx eip %08x esp %08x stack %p-%p\n",
+                   GetCurrentThreadId(), (unsigned int) EIP_sig(sigcontext),
+                   (unsigned int) ESP_sig(sigcontext), NtCurrentTeb()->Tib.StackLimit,
+                   NtCurrentTeb()->Tib.StackBase );
     }
 
     stack--;  /* push the stack_layout structure */
@@ -1265,7 +1334,9 @@
     case TRAP_x86_DOUBLEFLT: /* Double fault exception */
     case TRAP_x86_TSSFLT:    /* Invalid TSS exception */
     case TRAP_x86_MCHK:      /* Machine check exception */
+#if !defined(__FreeBSD__) && !defined(__FreeBSD_kernel__) && !defined(__NetBSD__) && !defined(__OpenBSD__)
     case TRAP_x86_CACHEFLT:  /* Cache flush exception */
+#endif
         rec->ExceptionCode = EXCEPTION_ILLEGAL_INSTRUCTION;
         break;
     }
@@ -1440,9 +1511,11 @@
     sigaddset( &sig_act.sa_mask, SIGUSR1 );
     sigaddset( &sig_act.sa_mask, SIGUSR2 );
 
-#if defined(linux) || defined(__NetBSD__) || defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__OpenBSD__)
+#if defined(linux)
     sig_act.sa_flags = SA_RESTART;
-#elif defined (__svr4__) || defined(_SCO_DS) || defined(__APPLE__)
+#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;



More information about the wine-patches mailing list