diff --git a/rtl/i386/setjump.inc b/rtl/i386/setjump.inc index e6f434f45f..0257da51b9 100644 --- a/rtl/i386/setjump.inc +++ b/rtl/i386/setjump.inc @@ -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 diff --git a/rtl/i386/setjumph.inc b/rtl/i386/setjumph.inc index 026a5eeed5..7c76c37b5f 100644 --- a/rtl/i386/setjumph.inc +++ b/rtl/i386/setjumph.inc @@ -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 diff --git a/rtl/sparc/setjump.inc b/rtl/sparc/setjump.inc index 8f0fc69a6c..4d17e43300 100644 --- a/rtl/sparc/setjump.inc +++ b/rtl/sparc/setjump.inc @@ -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 diff --git a/rtl/sparc/setjumph.inc b/rtl/sparc/setjumph.inc index d2a72a5ad8..c54b22512a 100644 --- a/rtl/sparc/setjumph.inc +++ b/rtl/sparc/setjumph.inc @@ -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