mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-10 03:46:00 +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'];
|
Function SetJmp (Var S : Jmp_buf) : longint;assembler;[Public, alias : 'FPC_SETJMP'];
|
||||||
asm
|
asm
|
||||||
{$ifndef REGCALL}
|
{$ifndef REGCALL}
|
||||||
@ -56,9 +33,6 @@ asm
|
|||||||
{$endif}
|
{$endif}
|
||||||
movl %edi,16(%eax)
|
movl %edi,16(%eax)
|
||||||
movl 8(%eax),%edi
|
movl 8(%eax),%edi
|
||||||
{$ifdef needsigprocmask}
|
|
||||||
call savesigmask
|
|
||||||
{$endif needsigprocmask}
|
|
||||||
xorl %eax,%eax
|
xorl %eax,%eax
|
||||||
end['EAX'];
|
end['EAX'];
|
||||||
|
|
||||||
@ -66,13 +40,6 @@ end['EAX'];
|
|||||||
Procedure longJmp (Var S : Jmp_buf; value : longint); assembler;[Public, alias : 'FPC_LONGJMP'];
|
Procedure longJmp (Var S : Jmp_buf; value : longint); assembler;[Public, alias : 'FPC_LONGJMP'];
|
||||||
asm
|
asm
|
||||||
{$ifdef REGCALL}
|
{$ifdef REGCALL}
|
||||||
{$ifdef needsigprocmask}
|
|
||||||
movl %edx, %ebx
|
|
||||||
movl %eax, %esi
|
|
||||||
call restoresigmask
|
|
||||||
movl %ebx, %edx
|
|
||||||
movl %esi, %eax
|
|
||||||
{$endif needsigprocmask}
|
|
||||||
xchgl %edx,%eax
|
xchgl %edx,%eax
|
||||||
{$else}
|
{$else}
|
||||||
movl 8(%ebp),%edx
|
movl 8(%ebp),%edx
|
||||||
@ -92,7 +59,11 @@ end;
|
|||||||
|
|
||||||
{
|
{
|
||||||
$Log$
|
$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
|
* truncate log
|
||||||
|
|
||||||
Revision 1.7 2005/02/13 20:01:37 peter
|
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
|
Type
|
||||||
jmp_buf = packed record
|
jmp_buf = packed record
|
||||||
ebx,esi,edi : Longint;
|
ebx,esi,edi : Longint;
|
||||||
bp,sp,pc : Pointer;
|
bp,sp,pc : Pointer;
|
||||||
{$ifdef needsigprocmask}
|
|
||||||
sigmask : tjmpsigset;
|
|
||||||
{$endif needsigprocmask}
|
|
||||||
end;
|
end;
|
||||||
PJmp_buf = ^jmp_buf;
|
PJmp_buf = ^jmp_buf;
|
||||||
|
|
||||||
@ -50,7 +26,11 @@ Procedure longjmp (Var S : Jmp_buf; value : longint);
|
|||||||
|
|
||||||
{
|
{
|
||||||
$Log$
|
$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
|
* truncate log
|
||||||
|
|
||||||
Revision 1.6 2005/01/24 16:54:16 peter
|
Revision 1.6 2005/01/24 16:54:16 peter
|
||||||
|
@ -34,14 +34,19 @@ begin
|
|||||||
SIGSEGV :
|
SIGSEGV :
|
||||||
res:=216;
|
res:=216;
|
||||||
end;
|
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
|
if res<>0 then
|
||||||
HandleErrorAddrFrame(res,pointer(uContext^.uc_mcontext.arm_ip),pointer(uContext^.uc_mcontext.arm_fp));
|
HandleErrorAddrFrame(res,pointer(uContext^.uc_mcontext.arm_ip),pointer(uContext^.uc_mcontext.arm_fp));
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{
|
{
|
||||||
$Log$
|
$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
|
* truncate log
|
||||||
|
|
||||||
Revision 1.3 2005/01/30 18:01:15 peter
|
Revision 1.3 2005/01/30 18:01:15 peter
|
||||||
|
@ -68,6 +68,7 @@ begin
|
|||||||
SIGSEGV :
|
SIGSEGV :
|
||||||
res:=216;
|
res:=216;
|
||||||
end;
|
end;
|
||||||
|
reenable_signal(sig);
|
||||||
{ give runtime error at the position where the signal was raised }
|
{ give runtime error at the position where the signal was raised }
|
||||||
if res<>0 then
|
if res<>0 then
|
||||||
HandleErrorAddrFrame(res,pointer(SigContext^.eip),pointer(SigContext^.ebp));
|
HandleErrorAddrFrame(res,pointer(SigContext^.eip),pointer(SigContext^.ebp));
|
||||||
@ -75,7 +76,11 @@ end;
|
|||||||
|
|
||||||
{
|
{
|
||||||
$Log$
|
$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
|
* change order of if to prevent always stack overflow instead
|
||||||
of generic fpu error when multiple states are set
|
of generic fpu error when multiple states are set
|
||||||
|
|
||||||
|
@ -46,6 +46,7 @@ begin
|
|||||||
SIGSEGV :
|
SIGSEGV :
|
||||||
res:=216;
|
res:=216;
|
||||||
end;
|
end;
|
||||||
|
reenable_signal(sig);
|
||||||
{ give runtime error at the position where the signal was raised }
|
{ give runtime error at the position where the signal was raised }
|
||||||
if res<>0 then
|
if res<>0 then
|
||||||
HandleErrorAddrFrame(res,pointer(SigContext^.pt_regs^.nip),pointer(SigContext^.pt_regs^.gpr[1]));
|
HandleErrorAddrFrame(res,pointer(SigContext^.pt_regs^.nip),pointer(SigContext^.pt_regs^.gpr[1]));
|
||||||
@ -53,7 +54,11 @@ end;
|
|||||||
|
|
||||||
{
|
{
|
||||||
$Log$
|
$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
|
* truncate log
|
||||||
|
|
||||||
Revision 1.5 2005/01/30 18:01:15 peter
|
Revision 1.5 2005/01/30 18:01:15 peter
|
||||||
|
@ -66,6 +66,7 @@ begin
|
|||||||
res:=216;
|
res:=216;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
reenable_signal(sig);
|
||||||
{ give runtime error at the position where the signal was raised }
|
{ give runtime error at the position where the signal was raised }
|
||||||
if res<>0 then
|
if res<>0 then
|
||||||
HandleErrorAddrFrame(res,addr,nil);
|
HandleErrorAddrFrame(res,addr,nil);
|
||||||
@ -73,7 +74,11 @@ end;
|
|||||||
|
|
||||||
{
|
{
|
||||||
$Log$
|
$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
|
* truncate log
|
||||||
|
|
||||||
Revision 1.8 2005/02/05 23:46:12 peter
|
Revision 1.8 2005/02/05 23:46:12 peter
|
||||||
|
@ -96,6 +96,22 @@ End;
|
|||||||
SystemUnit Initialization
|
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
|
// signal handler is arch dependant due to processorexception to language
|
||||||
// exception translation
|
// exception translation
|
||||||
|
|
||||||
@ -238,7 +254,11 @@ End.
|
|||||||
|
|
||||||
{
|
{
|
||||||
$Log$
|
$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
|
* truncate log
|
||||||
|
|
||||||
Revision 1.23 2005/02/13 21:47:56 peter
|
Revision 1.23 2005/02/13 21:47:56 peter
|
||||||
|
@ -32,20 +32,6 @@ function GetFPUState(const SigContext : TSigContext) : word;
|
|||||||
{$endif SYSTEM_DEBUG}
|
{$endif SYSTEM_DEBUG}
|
||||||
end;
|
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;
|
procedure SignalToRunerror(sig : longint; SigInfo: PSigInfo; SigContext: PSigContext); cdecl;
|
||||||
var
|
var
|
||||||
@ -91,7 +77,11 @@ procedure SignalToRunerror(sig : longint; SigInfo: PSigInfo; SigContext: PSigCon
|
|||||||
|
|
||||||
{
|
{
|
||||||
$Log$
|
$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
|
* truncate log
|
||||||
|
|
||||||
Revision 1.3 2005/01/30 18:01:15 peter
|
Revision 1.3 2005/01/30 18:01:15 peter
|
||||||
|
@ -19,30 +19,6 @@
|
|||||||
#define RW_FP [%fp + 0x48]
|
#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'];
|
procedure longjmp(var s : jmp_buf;value:longint);assembler;nostackframe;[Public,alias:'FPC_LONGJMP'];
|
||||||
asm
|
asm
|
||||||
// Store our arguments in global registers so we can still
|
// 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.
|
sub %fp, 64, %sp // Allocate a register frame.
|
||||||
st %g3, [%fp+48] // Set saved FP on restore below.
|
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.
|
ld [%o1+8], %o7 // Set return PC.
|
||||||
|
|
||||||
retl
|
retl
|
||||||
@ -117,18 +87,17 @@ function setjmp(var S:jmp_buf):longint;assembler;nostackframe;[Public,alias:'FPC
|
|||||||
st %sp, [%o0]
|
st %sp, [%o0]
|
||||||
st %fp, [%o0+4]
|
st %fp, [%o0+4]
|
||||||
|
|
||||||
{$ifdef needsigprocmask}
|
|
||||||
call savesigmask
|
|
||||||
nop
|
|
||||||
{$endif needsigprocmask}
|
|
||||||
|
|
||||||
ld [%o0+8], %o7
|
ld [%o0+8], %o7
|
||||||
mov %g0, %o0
|
mov %g0, %o0
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{
|
{
|
||||||
$Log$
|
$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
|
* truncate log
|
||||||
|
|
||||||
Revision 1.11 2005/02/13 20:01:38 peter
|
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.}
|
{@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
|
type
|
||||||
jmp_buf=packed record
|
jmp_buf=packed record
|
||||||
{stack pointer}
|
{stack pointer}
|
||||||
@ -60,10 +46,6 @@ type
|
|||||||
JB_FP,
|
JB_FP,
|
||||||
{program counter}
|
{program counter}
|
||||||
JB_PV:Pointer;
|
JB_PV:Pointer;
|
||||||
|
|
||||||
{$ifdef needsigprocmask}
|
|
||||||
sigmask : tjmpsigset;
|
|
||||||
{$endif needsigprocmask}
|
|
||||||
end;
|
end;
|
||||||
Pjmp_buf=^jmp_buf;
|
Pjmp_buf=^jmp_buf;
|
||||||
|
|
||||||
@ -71,7 +53,11 @@ function setjmp(var S:jmp_buf):longint;
|
|||||||
procedure longjmp(var S:jmp_buf;value:longint);
|
procedure longjmp(var S:jmp_buf;value:longint);
|
||||||
{
|
{
|
||||||
$Log$
|
$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
|
* truncate log
|
||||||
|
|
||||||
Revision 1.6 2005/01/20 16:38:28 peter
|
Revision 1.6 2005/01/20 16:38:28 peter
|
||||||
|
Loading…
Reference in New Issue
Block a user