Alexandre Julliard : ntdll: Add support for unwinding the signal stack on x86_64.

Alexandre Julliard julliard at winehq.org
Sat Aug 29 11:35:44 CDT 2009


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Fri Aug 28 18:24:06 2009 +0200

ntdll: Add support for unwinding the signal stack on x86_64.

---

 dlls/ntdll/signal_x86_64.c |   22 ++++++++++++++++++++--
 1 files changed, 20 insertions(+), 2 deletions(-)

diff --git a/dlls/ntdll/signal_x86_64.c b/dlls/ntdll/signal_x86_64.c
index 825fb47..eaa9970 100644
--- a/dlls/ntdll/signal_x86_64.c
+++ b/dlls/ntdll/signal_x86_64.c
@@ -976,6 +976,17 @@ static inline void *get_signal_stack(void)
 }
 
 /***********************************************************************
+ *           is_inside_signal_stack
+ *
+ * Check if pointer is inside the signal stack.
+ */
+static inline int is_inside_signal_stack( void *ptr )
+{
+    return ((char *)ptr >= (char *)get_signal_stack() &&
+            (char *)ptr < (char *)get_signal_stack() + signal_stack_size);
+}
+
+/***********************************************************************
  *           save_context
  *
  * Set the register values from a sigcontext.
@@ -1316,8 +1327,7 @@ static EXCEPTION_RECORD *setup_exception( ucontext_t *sigcontext, raise_func fun
 
     /* stack sanity checks */
 
-    if ((char *)stack >= (char *)get_signal_stack() &&
-        (char *)stack < (char *)get_signal_stack() + signal_stack_size)
+    if (is_inside_signal_stack( stack ))
     {
         ERR( "nested exception on signal stack in thread %04x eip %016lx esp %016lx stack %p-%p\n",
              GetCurrentThreadId(), RIP_sig(sigcontext), RSP_sig(sigcontext),
@@ -2424,6 +2434,14 @@ void WINAPI RtlUnwindEx( ULONG64 end_frame, ULONG64 target_ip, EXCEPTION_RECORD
 
         if (!dispatch.EstablisherFrame) break;
 
+        if (is_inside_signal_stack( (void *)dispatch.EstablisherFrame ))
+        {
+            TRACE( "frame %lx is inside signal stack (%p-%p)\n", dispatch.EstablisherFrame,
+                   get_signal_stack(), (char *)get_signal_stack() + signal_stack_size );
+            context = new_context;
+            continue;
+        }
+
         if ((dispatch.EstablisherFrame & 7) ||
             dispatch.EstablisherFrame < (ULONG64)NtCurrentTeb()->Tib.StackLimit ||
             dispatch.EstablisherFrame > (ULONG64)NtCurrentTeb()->Tib.StackBase)




More information about the wine-cvs mailing list