summaryrefslogtreecommitdiffstats
path: root/winsup/cygwin/cygtls.cc
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2015-07-07 20:45:06 +0200
committerCorinna Vinschen <corinna@vinschen.de>2015-07-07 20:45:06 +0200
commit60f10c64aa57d613471446ea3ec1b3ce6d3b9500 (patch)
tree0d7e41c913bb1d547cf3512dd3314dc332ca0585 /winsup/cygwin/cygtls.cc
parent29a12632278368f197f3270532e2f6c19642512e (diff)
downloadcygnal-60f10c64aa57d613471446ea3ec1b3ce6d3b9500.tar.gz
cygnal-60f10c64aa57d613471446ea3ec1b3ce6d3b9500.tar.bz2
cygnal-60f10c64aa57d613471446ea3ec1b3ce6d3b9500.zip
x86_64: Handle myfault exceptions when running on alternate signal stack
x86_64 only: * cygtls.cc (san::leave): Restore _my_tls.andreas. * cygtls.h (class san): Add _clemente as in 32 bit case. Add ret and frame members. (san::san): Handle _my_tls.andreas as on 32 bit. Take parameter and write it to new member ret. Store current stack pointer in frame. (san::~san): New destructor to restore _my_tls.andreas. (__try): Use __l_except address as parameter to san::san. * dcrt0.cc (dll_crt0_0): Add myfault_altstack_handler as vectored continuation handler. * exception.h (myfault_altstack_handler): Declare. * exceptions.cc (myfault_altstack_handler): New function. Explain what it's good for. Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
Diffstat (limited to 'winsup/cygwin/cygtls.cc')
-rw-r--r--winsup/cygwin/cygtls.cc1
1 files changed, 1 insertions, 0 deletions
diff --git a/winsup/cygwin/cygtls.cc b/winsup/cygwin/cygtls.cc
index dc9a698f7..cb8c24e8f 100644
--- a/winsup/cygwin/cygtls.cc
+++ b/winsup/cygwin/cygtls.cc
@@ -224,5 +224,6 @@ void san::leave ()
{
/* Restore tls_pathbuf counters in case of error. */
_my_tls.locals.pathbufs._counters = _cnt;
+ _my_tls.andreas = _clemente;
}
#endif