Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/winsup
diff options
context:
space:
mode:
authorJon TURNEY <jon.turney@dronecode.org.uk>2015-03-10 00:55:29 +0300
committerJon TURNEY <jon.turney@dronecode.org.uk>2015-03-13 16:05:52 +0300
commite9e47b8ce6158d7d0486abf6c1ff4e2dd790a084 (patch)
treef48f6e7df6f3fdeb14a9fcdecea05b3b24fb49a3 /winsup
parent63c9ffeed8e1092cf85c257300f15c41fa2022e4 (diff)
Teach stackinfo::walk() how to virtually unwind the tls sigstack
This improves how stackinfo::dumpstack() dumps _sigbe and sigdelayed frames * exceptions.cc (stack_info): Add sigstackptr member. (walk): Unwind sigstackptr inside _sigbe and sigdelayed. * gendef (_sigdelayed_end): Add symbol to mark end of sigdelayed. Signed-off-by: Jon TURNEY <jon.turney@dronecode.org.uk>
Diffstat (limited to 'winsup')
-rw-r--r--winsup/cygwin/ChangeLog6
-rw-r--r--winsup/cygwin/exceptions.cc13
-rwxr-xr-xwinsup/cygwin/gendef2
3 files changed, 21 insertions, 0 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog
index f6261bd13..18dcc2530 100644
--- a/winsup/cygwin/ChangeLog
+++ b/winsup/cygwin/ChangeLog
@@ -1,3 +1,9 @@
+2015-03-12 Jon TURNEY <jon.turney@dronecode.org.uk>
+
+ * exceptions.cc (stack_info): Add sigstackptr member.
+ (walk): Unwind sigstackptr inside _sigbe and sigdelayed.
+ * gendef (_sigdelayed_end): Add symbol to mark end of sigdelayed.
+
2015-03-13 Corinna Vinschen <corinna@vinschen.de>
* include/cygwin/sys_time.h: Remove. Definitions moved to newlib's
diff --git a/winsup/cygwin/exceptions.cc b/winsup/cygwin/exceptions.cc
index c16b073c6..3af9a54da 100644
--- a/winsup/cygwin/exceptions.cc
+++ b/winsup/cygwin/exceptions.cc
@@ -45,6 +45,8 @@ details. */
#define CALL_HANDLER_RETRY_INNER 10
char debugger_command[2 * NT_MAX_PATH + 20];
+extern u_char _sigbe;
+extern u_char _sigdelayed_end;
static BOOL WINAPI ctrl_c_handler (DWORD);
@@ -224,6 +226,7 @@ class stack_info
#ifdef __x86_64__
CONTEXT c;
UNWIND_HISTORY_TABLE hist;
+ __stack_t *sigstackptr;
#endif
public:
STACKFRAME sf; /* For storing the stack information */
@@ -252,6 +255,7 @@ stack_info::init (PUINT_PTR framep, bool wantargs, PCONTEXT ctx)
memset (&c, 0, sizeof c);
c.ContextFlags = CONTEXT_ALL;
}
+ sigstackptr = _my_tls.stackptr;
#endif
memset (&sf, 0, sizeof (sf));
if (ctx)
@@ -287,6 +291,15 @@ stack_info::walk ()
sf.AddrStack.Offset = c.Rsp;
sf.AddrFrame.Offset = c.Rbp;
+ if ((c.Rip >= (DWORD64)&_sigbe) && (c.Rip < (DWORD64)&_sigdelayed_end))
+ {
+ /* _sigbe and sigdelayed don't have SEH unwinding data, so virtually
+ unwind the tls sigstack */
+ c.Rip = sigstackptr[-1];
+ sigstackptr--;
+ return 1;
+ }
+
f = RtlLookupFunctionEntry (c.Rip, &imagebase, &hist);
if (f)
RtlVirtualUnwind (0, imagebase, c.Rip, f, &c, &hdl, &establisher, NULL);
diff --git a/winsup/cygwin/gendef b/winsup/cygwin/gendef
index 4ea7f544b..58b95eb66 100755
--- a/winsup/cygwin/gendef
+++ b/winsup/cygwin/gendef
@@ -311,6 +311,8 @@ sigdelayed:
xchgq %r10,(%rsp)
ret
.seh_endproc
+_sigdelayed_end:
+ .global _sigdelayed_end
# _cygtls::pop
.global _ZN7_cygtls3popEv