diff options
-rw-r--r-- | winsup/cygwin/ChangeLog | 6 | ||||
-rw-r--r-- | winsup/cygwin/exceptions.cc | 19 |
2 files changed, 21 insertions, 4 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index 65adef564..eb89f6745 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,5 +1,11 @@ 2015-07-17 Corinna Vinschen <corinna@vinschen.de> + * exceptions.cc (__unwind_single_frame): Define empty macro on i686. + (_cygtls::call_signal_handler): Try to make sure signal context makes + sense in case we're generating context here. Add comment to explain. + +2015-07-17 Corinna Vinschen <corinna@vinschen.de> + * exceptions.cc (getcontext/x86_64): Drop comment on RtlCaptureContext. (swapcontext/x86_64): Fix comment yet again. (getcontext/i686): Move comment from x86_64 getcontext, slightly diff --git a/winsup/cygwin/exceptions.cc b/winsup/cygwin/exceptions.cc index 6e9890e32..d69dbf799 100644 --- a/winsup/cygwin/exceptions.cc +++ b/winsup/cygwin/exceptions.cc @@ -300,6 +300,8 @@ __unwind_single_frame (PCONTEXT ctx) ctx->Rsp += 8; } } +#else +#define __unwind_single_frame(ctx) #endif /* Walk the stack. @@ -1667,11 +1669,20 @@ _cygtls::call_signal_handler () sizeof (CONTEXT)); else { - /* FIXME: Really this should be the context which the signal - interrupted? */ - memset(&context.uc_mcontext, 0, sizeof (struct __mcontext)); + /* Software-generated signal. We're fetching the current + context, unwind to the caller and in case we're called + from sigdelayed, fix rip/eip accordingly. */ context.uc_mcontext.ctxflags = CONTEXT_FULL; - RtlCaptureContext ((CONTEXT *) &context.uc_mcontext); + RtlCaptureContext ((PCONTEXT) &context.uc_mcontext); + __unwind_single_frame ((PCONTEXT) &context.uc_mcontext); + if (stackptr > stack) + { +#ifdef __x86_64__ + context.uc_mcontext.rip = retaddr (); +#else + context.uc_mcontext.eip = retaddr (); +#endif + } } if (this_sa_flags & SA_ONSTACK |