mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-08 10:48:12 +02:00
* restore sigprocmask for linux
This commit is contained in:
parent
be53661900
commit
7395e7e546
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user