From 16b121f8c4e401dfd4b6e13fc36cf0b47f4fccc2 Mon Sep 17 00:00:00 2001 From: peter Date: Sun, 24 Apr 2005 21:19:22 +0000 Subject: [PATCH] * unblock signal in signalhandler, remove the sigprocmask call from setjmp --- rtl/i386/setjump.inc | 39 +++++----------------------------- rtl/i386/setjumph.inc | 30 +++++--------------------- rtl/linux/arm/sighnd.inc | 9 ++++++-- rtl/linux/i386/sighnd.inc | 7 +++++- rtl/linux/powerpc/sighnd.inc | 7 +++++- rtl/linux/sparc/sighnd.inc | 7 +++++- rtl/linux/system.pp | 22 ++++++++++++++++++- rtl/linux/x86_64/sighnd.inc | 20 +++++------------- rtl/sparc/setjump.inc | 41 +++++------------------------------- rtl/sparc/setjumph.inc | 24 +++++---------------- 10 files changed, 71 insertions(+), 135 deletions(-) diff --git a/rtl/i386/setjump.inc b/rtl/i386/setjump.inc index 95232f9c25..673c9236a2 100644 --- a/rtl/i386/setjump.inc +++ b/rtl/i386/setjump.inc @@ -14,29 +14,6 @@ **********************************************************************} -{$ifdef needsigprocmask} -const - JMPSIG_BLOCK = 0; - JMPSIG_SETMASK = 2; - - -{$ifdef FPC_USE_LIBC} - function JmpSigProcMask(how:longint;nset : pjmpsigset;oset : pjmpsigset):longint; external name 'sigprocmask'; -{$else} - function JmpSigProcMask(how:longint;nset : pjmpsigset;oset : pjmpsigset):longint; external name 'FPC_SYSC_SIGPROCMASK'; -{$endif} - -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} @@ -56,9 +33,6 @@ asm {$endif} movl %edi,16(%eax) movl 8(%eax),%edi -{$ifdef needsigprocmask} - call savesigmask -{$endif needsigprocmask} xorl %eax,%eax end['EAX']; @@ -66,13 +40,6 @@ 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 @@ -92,7 +59,11 @@ end; { $Log$ - Revision 1.8 2005-02-14 17:13:22 peter + Revision 1.9 2005-04-24 21:19:22 peter + * unblock signal in signalhandler, remove the sigprocmask call + from setjmp + + Revision 1.8 2005/02/14 17:13:22 peter * truncate log Revision 1.7 2005/02/13 20:01:37 peter diff --git a/rtl/i386/setjumph.inc b/rtl/i386/setjumph.inc index 65698c6d44..0788949f57 100644 --- a/rtl/i386/setjumph.inc +++ b/rtl/i386/setjumph.inc @@ -14,34 +14,10 @@ **********************************************************************} -{$ifndef VER1_0} - {$if (FPC_VERSION>1) or ((FPC_RELEASE>=9) and (FPC_PATCH>6))} - {$ifdef linux} - {$define needsigprocmask} - {$endif} - {$endif} -{$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; @@ -50,7 +26,11 @@ Procedure longjmp (Var S : Jmp_buf; value : longint); { $Log$ - Revision 1.7 2005-02-14 17:13:22 peter + Revision 1.8 2005-04-24 21:19:22 peter + * unblock signal in signalhandler, remove the sigprocmask call + from setjmp + + Revision 1.7 2005/02/14 17:13:22 peter * truncate log Revision 1.6 2005/01/24 16:54:16 peter diff --git a/rtl/linux/arm/sighnd.inc b/rtl/linux/arm/sighnd.inc index 38dbf91986..e0dd50f050 100644 --- a/rtl/linux/arm/sighnd.inc +++ b/rtl/linux/arm/sighnd.inc @@ -34,14 +34,19 @@ begin SIGSEGV : res:=216; end; -{ give runtime error at the position where the signal was raised } + reenable_signal(sig); + { give runtime error at the position where the signal was raised } if res<>0 then HandleErrorAddrFrame(res,pointer(uContext^.uc_mcontext.arm_ip),pointer(uContext^.uc_mcontext.arm_fp)); end; { $Log$ - Revision 1.4 2005-02-14 17:13:30 peter + Revision 1.5 2005-04-24 21:19:22 peter + * unblock signal in signalhandler, remove the sigprocmask call + from setjmp + + Revision 1.4 2005/02/14 17:13:30 peter * truncate log Revision 1.3 2005/01/30 18:01:15 peter diff --git a/rtl/linux/i386/sighnd.inc b/rtl/linux/i386/sighnd.inc index 0b4b4012d6..9634dd99ec 100644 --- a/rtl/linux/i386/sighnd.inc +++ b/rtl/linux/i386/sighnd.inc @@ -68,6 +68,7 @@ begin SIGSEGV : res:=216; end; + reenable_signal(sig); { give runtime error at the position where the signal was raised } if res<>0 then HandleErrorAddrFrame(res,pointer(SigContext^.eip),pointer(SigContext^.ebp)); @@ -75,7 +76,11 @@ end; { $Log$ - Revision 1.7 2005-02-17 18:05:57 peter + Revision 1.8 2005-04-24 21:19:22 peter + * unblock signal in signalhandler, remove the sigprocmask call + from setjmp + + Revision 1.7 2005/02/17 18:05:57 peter * change order of if to prevent always stack overflow instead of generic fpu error when multiple states are set diff --git a/rtl/linux/powerpc/sighnd.inc b/rtl/linux/powerpc/sighnd.inc index 08dcce76d6..1efbef5d43 100644 --- a/rtl/linux/powerpc/sighnd.inc +++ b/rtl/linux/powerpc/sighnd.inc @@ -46,6 +46,7 @@ begin SIGSEGV : res:=216; end; + reenable_signal(sig); { give runtime error at the position where the signal was raised } if res<>0 then HandleErrorAddrFrame(res,pointer(SigContext^.pt_regs^.nip),pointer(SigContext^.pt_regs^.gpr[1])); @@ -53,7 +54,11 @@ end; { $Log$ - Revision 1.6 2005-02-14 17:13:30 peter + Revision 1.7 2005-04-24 21:19:22 peter + * unblock signal in signalhandler, remove the sigprocmask call + from setjmp + + Revision 1.6 2005/02/14 17:13:30 peter * truncate log Revision 1.5 2005/01/30 18:01:15 peter diff --git a/rtl/linux/sparc/sighnd.inc b/rtl/linux/sparc/sighnd.inc index 4f17adf729..05ee071aea 100644 --- a/rtl/linux/sparc/sighnd.inc +++ b/rtl/linux/sparc/sighnd.inc @@ -66,6 +66,7 @@ begin res:=216; end; end; + reenable_signal(sig); { give runtime error at the position where the signal was raised } if res<>0 then HandleErrorAddrFrame(res,addr,nil); @@ -73,7 +74,11 @@ end; { $Log$ - Revision 1.9 2005-02-14 17:13:30 peter + Revision 1.10 2005-04-24 21:19:22 peter + * unblock signal in signalhandler, remove the sigprocmask call + from setjmp + + Revision 1.9 2005/02/14 17:13:30 peter * truncate log Revision 1.8 2005/02/05 23:46:12 peter diff --git a/rtl/linux/system.pp b/rtl/linux/system.pp index 22fb215aac..a0d9005d78 100644 --- a/rtl/linux/system.pp +++ b/rtl/linux/system.pp @@ -96,6 +96,22 @@ End; SystemUnit Initialization *****************************************************************************} +function reenable_signal(sig : longint) : boolean; +var + e : TSigSet; + i,j : byte; +begin + fillchar(e,sizeof(e),#0); + { set is 1 based PM } + dec(sig); + i:=sig mod 32; + j:=sig div 32; + e[j]:=1 shl i; + fpsigprocmask(SIG_UNBLOCK,@e,nil); + reenable_signal:=geterrno=0; +end; + + // signal handler is arch dependant due to processorexception to language // exception translation @@ -238,7 +254,11 @@ End. { $Log$ - Revision 1.24 2005-02-14 17:13:30 peter + Revision 1.25 2005-04-24 21:19:22 peter + * unblock signal in signalhandler, remove the sigprocmask call + from setjmp + + Revision 1.24 2005/02/14 17:13:30 peter * truncate log Revision 1.23 2005/02/13 21:47:56 peter diff --git a/rtl/linux/x86_64/sighnd.inc b/rtl/linux/x86_64/sighnd.inc index a1c09de3f7..9f3558e984 100644 --- a/rtl/linux/x86_64/sighnd.inc +++ b/rtl/linux/x86_64/sighnd.inc @@ -32,20 +32,6 @@ function GetFPUState(const SigContext : TSigContext) : word; {$endif SYSTEM_DEBUG} end; -function reenable_signal(sig : longint) : boolean; -var - e,olde : TSigSet; - i,j : byte; -begin - fillchar(e,sizeof(e),#0); - { set is 1 based PM } - dec(sig); - i:=sig mod 32; - j:=sig div 32; - e[j]:=1 shl i; - fpsigprocmask(SIG_UNBLOCK,@e,nil); - reenable_signal:=geterrno=0; -end; procedure SignalToRunerror(sig : longint; SigInfo: PSigInfo; SigContext: PSigContext); cdecl; var @@ -91,7 +77,11 @@ procedure SignalToRunerror(sig : longint; SigInfo: PSigInfo; SigContext: PSigCon { $Log$ - Revision 1.4 2005-02-14 17:13:30 peter + Revision 1.5 2005-04-24 21:19:22 peter + * unblock signal in signalhandler, remove the sigprocmask call + from setjmp + + Revision 1.4 2005/02/14 17:13:30 peter * truncate log Revision 1.3 2005/01/30 18:01:15 peter diff --git a/rtl/sparc/setjump.inc b/rtl/sparc/setjump.inc index 18c0b587b3..527e7c3c59 100644 --- a/rtl/sparc/setjump.inc +++ b/rtl/sparc/setjump.inc @@ -19,30 +19,6 @@ #define RW_FP [%fp + 0x48] } -{$ifdef needsigprocmask} -const - JMPSIG_BLOCK = 1; - JMPSIG_SETMASK = 4; - -{$ifdef FPC_USE_LIBC} - function JmpSigProcMask(how:longint;nset : pjmpsigset;oset : pjmpsigset):longint; external name 'sigprocmask'; -{$else} - function JmpSigProcMask(how:longint;nset : pjmpsigset;oset : pjmpsigset):longint; external name 'FPC_SYSC_SIGPROCMASK'; -{$endif} - -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} - - - procedure longjmp(var s : jmp_buf;value:longint);assembler;nostackframe;[Public,alias:'FPC_LONGJMP']; asm // Store our arguments in global registers so we can still @@ -88,12 +64,6 @@ procedure longjmp(var s : jmp_buf;value:longint);assembler;nostackframe;[Public, sub %fp, 64, %sp // Allocate a register frame. st %g3, [%fp+48] // Set saved FP on restore below. -{$ifdef needsigprocmask} - mov %o1,%o0 - call restoresigmask - nop -{$endif needsigprocmask} - ld [%o1+8], %o7 // Set return PC. retl @@ -117,18 +87,17 @@ function setjmp(var S:jmp_buf):longint;assembler;nostackframe;[Public,alias:'FPC st %sp, [%o0] st %fp, [%o0+4] -{$ifdef needsigprocmask} - call savesigmask - nop -{$endif needsigprocmask} - ld [%o0+8], %o7 mov %g0, %o0 end; { $Log$ - Revision 1.12 2005-02-14 17:13:31 peter + Revision 1.13 2005-04-24 21:19:22 peter + * unblock signal in signalhandler, remove the sigprocmask call + from setjmp + + Revision 1.12 2005/02/14 17:13:31 peter * truncate log Revision 1.11 2005/02/13 20:01:38 peter diff --git a/rtl/sparc/setjumph.inc b/rtl/sparc/setjumph.inc index f605f1cdf3..ea5dc4d4d6 100644 --- a/rtl/sparc/setjumph.inc +++ b/rtl/sparc/setjumph.inc @@ -38,20 +38,6 @@ 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} @@ -60,10 +46,6 @@ type JB_FP, {program counter} JB_PV:Pointer; - -{$ifdef needsigprocmask} - sigmask : tjmpsigset; -{$endif needsigprocmask} end; Pjmp_buf=^jmp_buf; @@ -71,7 +53,11 @@ function setjmp(var S:jmp_buf):longint; procedure longjmp(var S:jmp_buf;value:longint); { $Log$ - Revision 1.7 2005-02-14 17:13:31 peter + Revision 1.8 2005-04-24 21:19:22 peter + * unblock signal in signalhandler, remove the sigprocmask call + from setjmp + + Revision 1.7 2005/02/14 17:13:31 peter * truncate log Revision 1.6 2005/01/20 16:38:28 peter