diff options
author | Christopher Faylor <me@cgf.cx> | 2012-07-29 21:43:29 +0000 |
---|---|---|
committer | Christopher Faylor <me@cgf.cx> | 2012-07-29 21:43:29 +0000 |
commit | dd06381996da1d519f76489fe531cb0ed46e3fc6 (patch) | |
tree | 7e4c7c8a2f5c93c06c0e1f310de668d9430393ff /winsup/cygwin/gendef | |
parent | ab6596266fc616cbe235bb919349f22ff9a75aba (diff) | |
download | newlib-dd06381996da1d519f76489fe531cb0ed46e3fc6.zip newlib-dd06381996da1d519f76489fe531cb0ed46e3fc6.tar.gz newlib-dd06381996da1d519f76489fe531cb0ed46e3fc6.tar.bz2 |
* cygtls.cc (_cygtls::reset_signal_arrived): New function.
(set_signal_arrived::~set_signal_arrived): Use reset_signal_arrived to reset
state.
* exceptions.cc (sig_handle_tty_stop): Use WAIT_SIGNALED rather than assume we
know the return from cancelable_wait.
(_cygtls::interrupt_setup): Modify to allow calling when executing in
non-cygwin code via sigdelayed. Always reset signal_arrived.
* gendef: Throughout use start_offset rather than the completely wrong
sizeof__cygtls.
(_sigdelayed): Rewrite to avoid duplication when calling the signal handler.
(sigreturn): Delete.
* gentls_offsets: Define start_offset rather than sizeof__cygtls.
* tlsoffsets.h: Regenerate.
Diffstat (limited to 'winsup/cygwin/gendef')
-rwxr-xr-x | winsup/cygwin/gendef | 69 |
1 files changed, 16 insertions, 53 deletions
diff --git a/winsup/cygwin/gendef b/winsup/cygwin/gendef index 3dcea17..5cc06f7 100755 --- a/winsup/cygwin/gendef +++ b/winsup/cygwin/gendef @@ -162,60 +162,23 @@ __sigbe: # return here after cygwin syscall .global _sigdelayed _sigdelayed: - pushl %ebp - movl %esp,%ebp + pushl %ebp + movl %esp,%ebp pushf - pushl %esi - pushl %edi - pushl %edx - pushl %ecx - pushl %ebx - pushl %eax - movl %fs:4,%ebx -1: movl \$1,%eax - xchgl %eax,$tls::stacklock(%ebx) - movl %eax,$tls::spinning(%ebx) # flag if we are waiting for lock - # If %eax is 1 then someone else has - # the lock but we want to flag that - # we're waiting for it. If %eax is 0 - # then we're not spinning and 0 will - # reflect that. - testl %eax,%eax - jz 2f - call _yield - jmp 1b -2: incl $tls::incyg(%ebx) - movl $tls::sig(%ebx),%eax - testl %eax,%eax - jz leave # call_signal_handler may have beat us - # to it - pushl $tls::saved_errno(%ebx) # saved errno - call _set_process_mask_delta - pushl %eax - - # fill out handler arguments - xorl %eax,%eax # ucontext_t (currently not set) - pushl %eax - leal $tls::infodata(%ebx),%eax - pushl %eax # siginfo - pushl $tls::sig(%ebx) # signal number - - pushl \$_sigreturn # where to return - pushl $tls::func(%ebx) # user-supplied signal func - movl \$0,$tls::sig(%ebx) # zero the signal number as a - # flag to the signal handler thread - # that it is ok to set up sigsave -4: decl $tls::incyg(%ebx) - decl $tls::stacklock(%ebx) - ret # return via signal handler - - .global _sigreturn -_sigreturn: - movl %fs:4,%ebx - incl $tls::incyg(%ebx) - addl \$12,%esp # remove arguments - call _set_process_mask\@4 + pushl %esi + pushl %edi + pushl %edx + pushl %ecx + pushl %ebx + pushl %eax + movl %fs:4,%ebx # get tls + pushl $tls::saved_errno(%ebx) # saved errno + + movl \$$tls::start_offset,%eax # point to beginning + addl %ebx,%eax # of tls block + call __ZN7_cygtls19call_signal_handlerEv # call handler + movl %fs:4,%ebx # reget tls 1: movl \$1,%eax # potential lock value xchgl %eax,$tls::stacklock(%ebx) # see if we can grab it movl %eax,$tls::spinning(%ebx) # flag if we are waiting for lock @@ -292,7 +255,7 @@ stabilize_sig_stack: cmpl \$0,$tls::sig(%ebx) jz 3f decl $tls::stacklock(%ebx) # unlock - movl \$-$tls::sizeof__cygtls,%eax # point to beginning + movl \$$tls::start_offset,%eax # point to beginning addl %ebx,%eax # of tls block call __ZN7_cygtls19call_signal_handlerEv jmp 1b |