* unblock signal in signalhandler, remove the sigprocmask call

from setjmp
This commit is contained in:
peter 2005-04-24 21:19:22 +00:00
parent 9843416e70
commit 16b121f8c4
10 changed files with 71 additions and 135 deletions

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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