mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-18 21:09:07 +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'];
|
Function SetJmp (Var S : Jmp_buf) : longint;assembler;[Public, alias : 'FPC_SETJMP'];
|
||||||
asm
|
asm
|
||||||
{$ifndef REGCALL}
|
{$ifndef REGCALL}
|
||||||
@ -33,6 +51,9 @@ 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'];
|
||||||
|
|
||||||
@ -40,11 +61,19 @@ 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
|
||||||
movl 12(%ebp),%eax
|
movl 12(%ebp),%eax
|
||||||
{$endif}
|
{$endif}
|
||||||
|
|
||||||
movl (%edx),%ebx
|
movl (%edx),%ebx
|
||||||
movl 4(%edx),%esi
|
movl 4(%edx),%esi
|
||||||
movl 8(%edx),%edi
|
movl 8(%edx),%edi
|
||||||
@ -58,7 +87,10 @@ end;
|
|||||||
|
|
||||||
{
|
{
|
||||||
$Log$
|
$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
|
* register calling updates
|
||||||
|
|
||||||
Revision 1.4 2003/11/11 21:08:17 peter
|
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
|
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;
|
||||||
|
|
||||||
@ -26,7 +47,10 @@ Procedure longjmp (Var S : Jmp_buf; value : longint);
|
|||||||
|
|
||||||
{
|
{
|
||||||
$Log$
|
$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)
|
* make the record packed (just in case)
|
||||||
|
|
||||||
Revision 1.3 2002/09/07 16:01:19 peter
|
Revision 1.3 2002/09/07 16:01:19 peter
|
||||||
|
@ -19,10 +19,6 @@
|
|||||||
#define RW_FP [%fp + 0x48]
|
#define RW_FP [%fp + 0x48]
|
||||||
}
|
}
|
||||||
|
|
||||||
{$ifdef linux}
|
|
||||||
{$define needsigprocmask}
|
|
||||||
{$endif}
|
|
||||||
|
|
||||||
{$ifdef needsigprocmask}
|
{$ifdef needsigprocmask}
|
||||||
const
|
const
|
||||||
JMPSIG_BLOCK = 1;
|
JMPSIG_BLOCK = 1;
|
||||||
@ -128,7 +124,10 @@ function setjmp(var S:jmp_buf):longint;assembler;nostackframe;[Public,alias:'FPC
|
|||||||
|
|
||||||
{
|
{
|
||||||
$Log$
|
$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
|
* restore traps when returning with longjmp
|
||||||
|
|
||||||
Revision 1.8 2004/05/31 10:43:00 peter
|
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.}
|
{@Define the machine-dependent type `jmp_buf'. SPARC version.}
|
||||||
|
|
||||||
|
|
||||||
|
{$ifdef linux}
|
||||||
|
{$define needsigprocmask}
|
||||||
|
{$endif}
|
||||||
|
|
||||||
|
|
||||||
|
{$ifdef needsigprocmask}
|
||||||
const
|
const
|
||||||
jmpbufsigmaskwords = 128 div 32;
|
jmpbufsigmaskwords = 128 div 32;
|
||||||
|
|
||||||
type
|
type
|
||||||
tjmpsigset=array[0..jmpbufsigmaskwords-1] of longint;
|
tjmpsigset=array[0..jmpbufsigmaskwords-1] of longint;
|
||||||
pjmpsigset=^tjmpsigset;
|
pjmpsigset=^tjmpsigset;
|
||||||
|
{$endif needsigprocmask}
|
||||||
|
|
||||||
|
type
|
||||||
jmp_buf=packed record
|
jmp_buf=packed record
|
||||||
{stack pointer}
|
{stack pointer}
|
||||||
JB_SP,
|
JB_SP,
|
||||||
@ -50,14 +61,20 @@ type
|
|||||||
{program counter}
|
{program counter}
|
||||||
JB_PV:Pointer;
|
JB_PV:Pointer;
|
||||||
|
|
||||||
|
{$ifdef needsigprocmask}
|
||||||
sigmask : tjmpsigset;
|
sigmask : tjmpsigset;
|
||||||
|
{$endif needsigprocmask}
|
||||||
end;
|
end;
|
||||||
Pjmp_buf=^jmp_buf;
|
Pjmp_buf=^jmp_buf;
|
||||||
|
|
||||||
function setjmp(var S:jmp_buf):longint;
|
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.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
|
* restore traps when returning with longjmp
|
||||||
|
|
||||||
Revision 1.4 2003/01/05 21:32:35 mazen
|
Revision 1.4 2003/01/05 21:32:35 mazen
|
||||||
|
Loading…
Reference in New Issue
Block a user