mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-05-31 09:42:36 +02:00
* unblock signal in signalhandler, remove the sigprocmask call
from setjmp
This commit is contained in:
parent
9843416e70
commit
16b121f8c4
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user