* restore traps when returning with longjmp

This commit is contained in:
peter 2004-09-12 12:04:22 +00:00
parent 7058450987
commit ac68641535
3 changed files with 65 additions and 7 deletions

View File

@ -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

View File

@ -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

View File

@ -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