Module: wine Branch: master Commit: af22daf72ba5c25e1d9221a77004701a2d5c5893 URL: http://source.winehq.org/git/wine.git/?a=commit;h=af22daf72ba5c25e1d9221a770...
Author: Alexandre Julliard julliard@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)