* cygtls.h (__ljfault): Declare.
(_cygtls::return_from_fault): Use __ljfault. * exceptions.cc (set_signal_mask): Revert previous checkin. * gendef (__sjfault): Split out into a separate function which doesn't bother with any special signal locking. routines. (_ljfault): Return from a __sjfault without bothering with signals.
This commit is contained in:
parent
2241d3fb53
commit
c461fbf160
|
@ -1,3 +1,12 @@
|
|||
2005-08-28 Christopher Faylor <cgf@timesys.com>
|
||||
|
||||
* cygtls.h (__ljfault): Declare.
|
||||
(_cygtls::return_from_fault): Use __ljfault.
|
||||
* exceptions.cc (set_signal_mask): Revert previous checkin.
|
||||
* gendef (__sjfault): Split out into a separate function which doesn't
|
||||
bother with any special signal locking. routines.
|
||||
(_ljfault): Return from a __sjfault without bothering with signals.
|
||||
|
||||
2005-08-28 Christopher Faylor <cgf@timesys.com>
|
||||
|
||||
* cygtls.h (_local_storage::strerror_buf): Allocate more space.
|
||||
|
|
|
@ -148,6 +148,8 @@ typedef struct struct_waitq
|
|||
#include "cygerrno.h"
|
||||
|
||||
extern "C" int __sjfault (jmp_buf);
|
||||
extern "C" int __ljfault (jmp_buf, int);
|
||||
|
||||
/*gentls_offsets*/
|
||||
|
||||
typedef __uint32_t __stack_t;
|
||||
|
@ -223,7 +225,7 @@ struct _cygtls
|
|||
{
|
||||
if (_myfault_errno)
|
||||
set_errno (_myfault_errno);
|
||||
longjmp ((int *) _myfault, 1);
|
||||
__ljfault ((int *) _myfault, 1);
|
||||
}
|
||||
int setup_fault (jmp_buf j, int myerrno) __attribute__ ((always_inline))
|
||||
{
|
||||
|
|
|
@ -978,17 +978,19 @@ set_process_mask_delta ()
|
|||
extern "C" void __stdcall
|
||||
set_signal_mask (sigset_t newmask, sigset_t& oldmask)
|
||||
{
|
||||
if (GetCurrentThreadId () == sigtid)
|
||||
small_printf ("********* waiting in signal thread\n");
|
||||
mask_sync.acquire (INFINITE);
|
||||
newmask &= ~SIG_NONMASKABLE;
|
||||
sigset_t mask_bits = oldmask & ~newmask;
|
||||
sigproc_printf ("oldmask %p, newmask %p, mask_bits %p", oldmask, newmask,
|
||||
mask_bits);
|
||||
oldmask = newmask;
|
||||
mask_sync.release ();
|
||||
if (mask_bits)
|
||||
sig_dispatch_pending (true);
|
||||
else
|
||||
sigproc_printf ("not calling sig_dispatch_pending");
|
||||
mask_sync.release ();
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
@ -272,9 +272,8 @@ EOF
|
|||
sub longjmp {
|
||||
return <<EOF;
|
||||
|
||||
.globl _setjmp, ___sjfault
|
||||
.globl _setjmp
|
||||
_setjmp:
|
||||
___sjfault:
|
||||
pushl %ebp
|
||||
movl %esp,%ebp
|
||||
pushl %edi
|
||||
|
@ -312,6 +311,72 @@ ___sjfault:
|
|||
leave
|
||||
ret
|
||||
|
||||
.globl ___sjfault
|
||||
___sjfault:
|
||||
pushl %ebp
|
||||
movl %esp,%ebp
|
||||
pushl %edi
|
||||
movl 8(%ebp),%edi
|
||||
movl %eax,0(%edi)
|
||||
movl %ebx,4(%edi)
|
||||
movl %ecx,8(%edi)
|
||||
movl %edx,12(%edi)
|
||||
movl %esi,16(%edi)
|
||||
movl -4(%ebp),%eax
|
||||
movl %eax,20(%edi)
|
||||
movl 0(%ebp),%eax
|
||||
movl %eax,24(%edi)
|
||||
movl %esp,%eax
|
||||
addl \$12,%eax
|
||||
movl %eax,28(%edi)
|
||||
movl 4(%ebp),%eax
|
||||
movl %eax,32(%edi)
|
||||
movw %es,%ax
|
||||
movw %ax,36(%edi)
|
||||
movw %fs,%ax
|
||||
movw %ax,38(%edi)
|
||||
movw %gs,%ax
|
||||
movw %ax,40(%edi)
|
||||
movw %ss,%ax
|
||||
movw %ax,42(%edi)
|
||||
popl %edi
|
||||
movl \$0,%eax
|
||||
leave
|
||||
ret
|
||||
|
||||
.global ___ljfault
|
||||
___ljfault:
|
||||
pushl %ebp
|
||||
movl %esp,%ebp
|
||||
movl 8(%ebp),%edi
|
||||
|
||||
movl 12(%ebp),%eax
|
||||
testl %eax,%eax
|
||||
jne 0f
|
||||
incl %eax
|
||||
|
||||
0: movl %eax,0(%edi)
|
||||
movl 24(%edi),%ebp
|
||||
pushfl
|
||||
popl %ebx
|
||||
movw 42(%edi),%ax
|
||||
movw %ax,%ss
|
||||
movl 28(%edi),%esp
|
||||
pushl 32(%edi)
|
||||
pushl %ebx
|
||||
movw 36(%edi),%ax
|
||||
movw %ax,%es
|
||||
movw 40(%edi),%ax
|
||||
movw %ax,%gs
|
||||
movl 0(%edi),%eax
|
||||
movl 4(%edi),%ebx
|
||||
movl 8(%edi),%ecx
|
||||
movl 16(%edi),%esi
|
||||
movl 12(%edi),%edx
|
||||
movl 20(%edi),%edi
|
||||
popfl
|
||||
ret
|
||||
|
||||
.globl _longjmp
|
||||
_longjmp:
|
||||
pushl %ebp
|
||||
|
|
Loading…
Reference in New Issue