Alexandre Julliard : ntdll: Use separate handlers for SIGSEGV/SIGILL/SIGBUS on ARM64.

Alexandre Julliard julliard at winehq.org
Wed Jul 15 16:44:45 CDT 2020


Module: wine
Branch: master
Commit: 82dc024a35a1a522b088df4e9355fa7752f40821
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=82dc024a35a1a522b088df4e9355fa7752f40821

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Wed Jul 15 10:52:52 2020 +0200

ntdll: Use separate handlers for SIGSEGV/SIGILL/SIGBUS on ARM64.

Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/ntdll/unix/signal_arm64.c | 72 +++++++++++++++++++++++++-----------------
 1 file changed, 43 insertions(+), 29 deletions(-)

diff --git a/dlls/ntdll/unix/signal_arm64.c b/dlls/ntdll/unix/signal_arm64.c
index 8353a70e52..e66952a29b 100644
--- a/dlls/ntdll/unix/signal_arm64.c
+++ b/dlls/ntdll/unix/signal_arm64.c
@@ -69,7 +69,9 @@
 #include "unix_private.h"
 #include "wine/debug.h"
 
+#ifdef HAVE_LIBUNWIND
 WINE_DEFAULT_DEBUG_CHANNEL(seh);
+#endif
 
 /***********************************************************************
  * signal context platform-specific definitions
@@ -596,49 +598,59 @@ void WINAPI call_user_exception_dispatcher( EXCEPTION_RECORD *rec, CONTEXT *cont
 /**********************************************************************
  *		segv_handler
  *
- * Handler for SIGSEGV and related errors.
+ * Handler for SIGSEGV.
  */
-static void segv_handler( int signal, siginfo_t *info, void *ucontext )
+static void segv_handler( int signal, siginfo_t *siginfo, void *sigcontext )
 {
     EXCEPTION_RECORD rec = { 0 };
-    ucontext_t *context = ucontext;
-
-    switch(signal)
-    {
-    case SIGILL:   /* Invalid opcode exception */
-        rec.ExceptionCode = EXCEPTION_ILLEGAL_INSTRUCTION;
-        break;
-    case SIGSEGV:  /* Segmentation fault */
-        rec.NumberParameters = 2;
-        rec.ExceptionInformation[0] = (get_fault_esr( context ) & 0x40) != 0;
-        rec.ExceptionInformation[1] = (ULONG_PTR)info->si_addr;
-        rec.ExceptionCode = virtual_handle_fault( info->si_addr, rec.ExceptionInformation[0],
-                                                  (void *)SP_sig(context) );
-        if (!rec.ExceptionCode) return;
-        break;
-    case SIGBUS:  /* Alignment check exception */
-        rec.ExceptionCode = EXCEPTION_DATATYPE_MISALIGNMENT;
-        break;
-    default:
-        ERR("Got unexpected signal %i\n", signal);
-        rec.ExceptionCode = EXCEPTION_ILLEGAL_INSTRUCTION;
-        break;
-    }
+    ucontext_t *context = sigcontext;
+
+    rec.NumberParameters = 2;
+    rec.ExceptionInformation[0] = (get_fault_esr( context ) & 0x40) != 0;
+    rec.ExceptionInformation[1] = (ULONG_PTR)siginfo->si_addr;
+    rec.ExceptionCode = virtual_handle_fault( siginfo->si_addr, rec.ExceptionInformation[0],
+                                              (void *)SP_sig(context) );
+    if (!rec.ExceptionCode) return;
     setup_exception( context, &rec );
 }
 
 
+/**********************************************************************
+ *		ill_handler
+ *
+ * Handler for SIGILL.
+ */
+static void ill_handler( int signal, siginfo_t *siginfo, void *sigcontext )
+{
+    EXCEPTION_RECORD rec = { EXCEPTION_ILLEGAL_INSTRUCTION };
+
+    setup_exception( sigcontext, &rec );
+}
+
+
+/**********************************************************************
+ *		bus_handler
+ *
+ * Handler for SIGBUS.
+ */
+static void bus_handler( int signal, siginfo_t *siginfo, void *sigcontext )
+{
+    EXCEPTION_RECORD rec = { EXCEPTION_DATATYPE_MISALIGNMENT };
+
+    setup_exception( sigcontext, &rec );
+}
+
+
 /**********************************************************************
  *		trap_handler
  *
  * Handler for SIGTRAP.
  */
-static void trap_handler( int signal, siginfo_t *info, void *ucontext )
+static void trap_handler( int signal, siginfo_t *siginfo, void *sigcontext )
 {
     EXCEPTION_RECORD rec = { 0 };
-    ucontext_t *context = ucontext;
 
-    switch (info->si_code)
+    switch (siginfo->si_code)
     {
     case TRAP_TRACE:
         rec.ExceptionCode = EXCEPTION_SINGLE_STEP;
@@ -648,7 +660,7 @@ static void trap_handler( int signal, siginfo_t *info, void *ucontext )
         rec.ExceptionCode = EXCEPTION_BREAKPOINT;
         break;
     }
-    setup_exception( context, &rec );
+    setup_exception( sigcontext, &rec );
 }
 
 
@@ -859,7 +871,9 @@ void signal_init_process(void)
     if (sigaction( SIGTRAP, &sig_act, NULL ) == -1) goto error;
     sig_act.sa_sigaction = segv_handler;
     if (sigaction( SIGSEGV, &sig_act, NULL ) == -1) goto error;
+    sig_act.sa_sigaction = ill_handler;
     if (sigaction( SIGILL, &sig_act, NULL ) == -1) goto error;
+    sig_act.sa_sigaction = bus_handler;
     if (sigaction( SIGBUS, &sig_act, NULL ) == -1) goto error;
     return;
 




More information about the wine-cvs mailing list