mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-20 04:59:26 +02:00
* restore traps when returning with longjmp
This commit is contained in:
parent
7058450987
commit
ac68641535
@ -18,6 +18,31 @@
|
||||
#define ST_FLUSH_WINDOWS 3
|
||||
#define RW_FP [%fp + 0x48]
|
||||
}
|
||||
|
||||
{$ifdef linux}
|
||||
{$define needsigprocmask}
|
||||
{$endif}
|
||||
|
||||
{$ifdef needsigprocmask}
|
||||
const
|
||||
JMPSIG_BLOCK = 1;
|
||||
JMPSIG_SETMASK = 4;
|
||||
|
||||
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}
|
||||
|
||||
|
||||
|
||||
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
|
||||
@ -57,10 +82,20 @@ procedure longjmp(var s : jmp_buf;value:longint);assembler;nostackframe;[Public,
|
||||
}
|
||||
|
||||
ta 3
|
||||
ld [%g1+8], %o7 // Set return PC.
|
||||
ld [%g1], %fp // Set saved SP on restore below.
|
||||
mov %g1,%o1 // use %o1, since %g1 will be destroyed by the call below
|
||||
|
||||
ld [%o1], %fp // Set saved SP on restore below.
|
||||
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
|
||||
restore %g2, 0, %o0 // Restore values from above register frame.
|
||||
|
||||
@ -81,12 +116,22 @@ function setjmp(var S:jmp_buf):longint;assembler;nostackframe;[Public,alias:'FPC
|
||||
st %o7, [%o0+8]
|
||||
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.8 2004-05-31 10:43:00 peter
|
||||
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
|
||||
* don't create stackframes so we can retrieve the info from
|
||||
the caller
|
||||
|
||||
|
@ -36,7 +36,12 @@ Guardian:/usr/local/src/glibc-2.2.3/sysdeps/sparc/sparc32# more __longjmp.S
|
||||
|
||||
******************************************************************************}
|
||||
{@Define the machine-dependent type `jmp_buf'. SPARC version.}
|
||||
const
|
||||
jmpbufsigmaskwords = 128 div 32;
|
||||
|
||||
type
|
||||
tjmpsigset=array[0..jmpbufsigmaskwords-1] of longint;
|
||||
pjmpsigset=^tjmpsigset;
|
||||
jmp_buf=packed record
|
||||
{stack pointer}
|
||||
JB_SP,
|
||||
@ -44,13 +49,18 @@ type
|
||||
JB_FP,
|
||||
{program counter}
|
||||
JB_PV:Pointer;
|
||||
|
||||
sigmask : tjmpsigset;
|
||||
end;
|
||||
Pjmp_buf=^jmp_buf;
|
||||
function setjmp(var S:jmp_buf):longint;
|
||||
procedure longjmp(var S:jmp_buf;value:longint);
|
||||
{
|
||||
$Log$
|
||||
Revision 1.4 2003-01-05 21:32:35 mazen
|
||||
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
|
||||
* fixing several bugs compiling the RTL
|
||||
|
||||
Revision 1.3 2003/01/01 18:24:41 mazen
|
||||
|
@ -20,12 +20,12 @@
|
||||
{****************************************************************************
|
||||
SPARC specific stuff
|
||||
****************************************************************************}
|
||||
function get_fsr : dword;assembler;
|
||||
function get_fsr : dword;assembler;nostackframe;
|
||||
var
|
||||
fsr : dword;
|
||||
asm
|
||||
st %fsr,fsr
|
||||
ld fsr,%i0
|
||||
ld fsr,%o0
|
||||
end;
|
||||
|
||||
|
||||
@ -84,7 +84,10 @@ function Sptr:Pointer;assembler;nostackframe;
|
||||
|
||||
{
|
||||
$Log$
|
||||
Revision 1.8 2004-08-04 19:27:10 florian
|
||||
Revision 1.9 2004-09-12 12:04:23 peter
|
||||
* restore traps when returning with longjmp
|
||||
|
||||
Revision 1.8 2004/08/04 19:27:10 florian
|
||||
* fixed floating point and integer exception handling on sparc/linux
|
||||
|
||||
Revision 1.7 2004/05/30 20:03:05 florian
|
||||
|
Loading…
Reference in New Issue
Block a user