* restore sigprocmask for linux

This commit is contained in:
peter 2005-01-20 16:38:28 +00:00
parent be53661900
commit 7395e7e546
4 changed files with 80 additions and 8 deletions

View File

@ -14,6 +14,24 @@
**********************************************************************}
{$ifdef needsigprocmask}
const
JMPSIG_BLOCK = 0;
JMPSIG_SETMASK = 2;
function JmpSigProcMask(how:longint;nset : pjmpsigset;oset : pjmpsigset):longint; external name 'FPC_SYSC_SIGPROCMASK';
procedure savesigmask(var s:jmp_buf);
begin
jmpsigprocmask(JMPSIG_BLOCK,nil,@s.sigmask);
end;
procedure restoresigmask(var s:jmp_buf);
begin
jmpsigprocmask(JMPSIG_SETMASK,@s.sigmask,nil);
end;
{$endif needsigprocmask}
Function SetJmp (Var S : Jmp_buf) : longint;assembler;[Public, alias : 'FPC_SETJMP'];
asm
{$ifndef REGCALL}
@ -33,6 +51,9 @@ asm
{$endif}
movl %edi,16(%eax)
movl 8(%eax),%edi
{$ifdef needsigprocmask}
call savesigmask
{$endif needsigprocmask}
xorl %eax,%eax
end['EAX'];
@ -40,11 +61,19 @@ end['EAX'];
Procedure longJmp (Var S : Jmp_buf; value : longint); assembler;[Public, alias : 'FPC_LONGJMP'];
asm
{$ifdef REGCALL}
{$ifdef needsigprocmask}
movl %edx, %ebx
movl %eax, %esi
call restoresigmask
movl %ebx, %edx
movl %esi, %eax
{$endif needsigprocmask}
xchgl %edx,%eax
{$else}
movl 8(%ebp),%edx
movl 12(%ebp),%eax
{$endif}
movl (%edx),%ebx
movl 4(%edx),%esi
movl 8(%edx),%edi
@ -58,7 +87,10 @@ end;
{
$Log$
Revision 1.5 2003-12-04 21:42:07 peter
Revision 1.6 2005-01-20 16:38:28 peter
* restore sigprocmask for linux
Revision 1.5 2003/12/04 21:42:07 peter
* register calling updates
Revision 1.4 2003/11/11 21:08:17 peter

View File

@ -14,10 +14,31 @@
**********************************************************************}
{$ifdef linux}
{$define needsigprocmask}
{$endif}
{$ifdef needsigprocmask}
const
{$ifdef FPC_USE_LIBC}
jmpbufsigmaskwords = 1024 div 32;
{$else}
jmpbufsigmaskwords = 128 div 32;
{$endif}
type
tjmpsigset=array[0..jmpbufsigmaskwords-1] of longint;
pjmpsigset=^tjmpsigset;
{$endif needsigprocmask}
Type
jmp_buf = packed record
ebx,esi,edi : Longint;
bp,sp,pc : Pointer;
{$ifdef needsigprocmask}
sigmask : tjmpsigset;
{$endif needsigprocmask}
end;
PJmp_buf = ^jmp_buf;
@ -26,7 +47,10 @@ Procedure longjmp (Var S : Jmp_buf; value : longint);
{
$Log$
Revision 1.4 2002-09-15 10:04:31 carl
Revision 1.5 2005-01-20 16:38:28 peter
* restore sigprocmask for linux
Revision 1.4 2002/09/15 10:04:31 carl
* make the record packed (just in case)
Revision 1.3 2002/09/07 16:01:19 peter

View File

@ -19,10 +19,6 @@
#define RW_FP [%fp + 0x48]
}
{$ifdef linux}
{$define needsigprocmask}
{$endif}
{$ifdef needsigprocmask}
const
JMPSIG_BLOCK = 1;
@ -128,7 +124,10 @@ function setjmp(var S:jmp_buf):longint;assembler;nostackframe;[Public,alias:'FPC
{
$Log$
Revision 1.9 2004-09-12 12:04:22 peter
Revision 1.10 2005-01-20 16:38:28 peter
* restore sigprocmask for linux
Revision 1.9 2004/09/12 12:04:22 peter
* restore traps when returning with longjmp
Revision 1.8 2004/05/31 10:43:00 peter

View File

@ -36,12 +36,23 @@ Guardian:/usr/local/src/glibc-2.2.3/sysdeps/sparc/sparc32# more __longjmp.S
******************************************************************************}
{@Define the machine-dependent type `jmp_buf'. SPARC version.}
{$ifdef linux}
{$define needsigprocmask}
{$endif}
{$ifdef needsigprocmask}
const
jmpbufsigmaskwords = 128 div 32;
type
tjmpsigset=array[0..jmpbufsigmaskwords-1] of longint;
pjmpsigset=^tjmpsigset;
{$endif needsigprocmask}
type
jmp_buf=packed record
{stack pointer}
JB_SP,
@ -50,14 +61,20 @@ type
{program counter}
JB_PV:Pointer;
{$ifdef needsigprocmask}
sigmask : tjmpsigset;
{$endif needsigprocmask}
end;
Pjmp_buf=^jmp_buf;
function setjmp(var S:jmp_buf):longint;
procedure longjmp(var S:jmp_buf;value:longint);
{
$Log$
Revision 1.5 2004-09-12 12:04:23 peter
Revision 1.6 2005-01-20 16:38:28 peter
* restore sigprocmask for linux
Revision 1.5 2004/09/12 12:04:23 peter
* restore traps when returning with longjmp
Revision 1.4 2003/01/05 21:32:35 mazen