mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-14 17:29:33 +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 ST_FLUSH_WINDOWS 3
|
||||||
#define RW_FP [%fp + 0x48]
|
#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'];
|
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
|
||||||
@ -57,10 +82,20 @@ procedure longjmp(var s : jmp_buf;value:longint);assembler;nostackframe;[Public,
|
|||||||
}
|
}
|
||||||
|
|
||||||
ta 3
|
ta 3
|
||||||
ld [%g1+8], %o7 // Set return PC.
|
mov %g1,%o1 // use %o1, since %g1 will be destroyed by the call below
|
||||||
ld [%g1], %fp // Set saved SP on restore below.
|
|
||||||
|
ld [%o1], %fp // Set saved SP on restore below.
|
||||||
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.
|
||||||
|
|
||||||
retl
|
retl
|
||||||
restore %g2, 0, %o0 // Restore values from above register frame.
|
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 %o7, [%o0+8]
|
||||||
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
|
||||||
mov %g0, %o0
|
mov %g0, %o0
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{
|
{
|
||||||
$Log$
|
$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
|
* don't create stackframes so we can retrieve the info from
|
||||||
the caller
|
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.}
|
{@Define the machine-dependent type `jmp_buf'. SPARC version.}
|
||||||
|
const
|
||||||
|
jmpbufsigmaskwords = 128 div 32;
|
||||||
|
|
||||||
type
|
type
|
||||||
|
tjmpsigset=array[0..jmpbufsigmaskwords-1] of longint;
|
||||||
|
pjmpsigset=^tjmpsigset;
|
||||||
jmp_buf=packed record
|
jmp_buf=packed record
|
||||||
{stack pointer}
|
{stack pointer}
|
||||||
JB_SP,
|
JB_SP,
|
||||||
@ -44,13 +49,18 @@ type
|
|||||||
JB_FP,
|
JB_FP,
|
||||||
{program counter}
|
{program counter}
|
||||||
JB_PV:Pointer;
|
JB_PV:Pointer;
|
||||||
|
|
||||||
|
sigmask : tjmpsigset;
|
||||||
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.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
|
* fixing several bugs compiling the RTL
|
||||||
|
|
||||||
Revision 1.3 2003/01/01 18:24:41 mazen
|
Revision 1.3 2003/01/01 18:24:41 mazen
|
||||||
|
@ -20,12 +20,12 @@
|
|||||||
{****************************************************************************
|
{****************************************************************************
|
||||||
SPARC specific stuff
|
SPARC specific stuff
|
||||||
****************************************************************************}
|
****************************************************************************}
|
||||||
function get_fsr : dword;assembler;
|
function get_fsr : dword;assembler;nostackframe;
|
||||||
var
|
var
|
||||||
fsr : dword;
|
fsr : dword;
|
||||||
asm
|
asm
|
||||||
st %fsr,fsr
|
st %fsr,fsr
|
||||||
ld fsr,%i0
|
ld fsr,%o0
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
@ -84,7 +84,10 @@ function Sptr:Pointer;assembler;nostackframe;
|
|||||||
|
|
||||||
{
|
{
|
||||||
$Log$
|
$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
|
* fixed floating point and integer exception handling on sparc/linux
|
||||||
|
|
||||||
Revision 1.7 2004/05/30 20:03:05 florian
|
Revision 1.7 2004/05/30 20:03:05 florian
|
||||||
|
Loading…
Reference in New Issue
Block a user