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