* fixed floating point and integer exception handling on sparc/linux

This commit is contained in:
florian 2004-08-04 19:27:09 +00:00
parent c5ec202cd1
commit 49c3f3927e
4 changed files with 116 additions and 9 deletions

View File

@ -517,7 +517,7 @@ begin
{ initialize handler }
act.sa_handler := signalhandler(@SignalToRunError);
{$ifdef RTSIGACTION}
act.sa_flags:=4
act.sa_flags:=SA_SIGINFO
{$ifdef x86_64}
or $4000000
{$endif x86_64}
@ -589,7 +589,10 @@ end;
{
$Log$
Revision 1.19 2004-05-31 20:25:04 peter
Revision 1.20 2004-08-04 19:27:09 florian
* fixed floating point and integer exception handling on sparc/linux
Revision 1.19 2004/05/31 20:25:04 peter
* removed warnings
Revision 1.18 2004/05/16 18:51:20 peter

View File

@ -21,6 +21,14 @@
Const
{ For sending a signal }
{$ifdef SPARC}
SA_SIGINFO = $200;
SA_NOMASK = $20;
SIG_BLOCK = 1;
SIG_UNBLOCK = 2;
SIG_SETMASK = 4;
{$else SPARC}
SA_NOCLDSTOP = 1;
SA_NOCLDWAIT = 2;
SA_SIGINFO = 4;
@ -34,6 +42,7 @@ Const
SIG_BLOCK = 0;
SIG_UNBLOCK = 1;
SIG_SETMASK = 2;
{$endif SPARC}
SIG_DFL = 0 ;
SIG_IGN = 1 ;
@ -278,10 +287,47 @@ type
SigContextRec = record
{ dummy for now PM }
end;
psiginfo = ^tsiginfo;
tsiginfo = record
si_signo : longint;
si_errno : longint;
si_code : longint;
_sifields : record
case longint of
0 : ( _pad : array[0..(SI_PAD_SIZE)-1] of longint );
1 : ( _kill : record
_pid : pid_t;
_uid : uid_t;
end );
2 : ( _timer : record
_timer1 : dword;
_timer2 : dword;
end );
3 : ( _rt : record
_pid : pid_t;
_uid : uid_t;
_sigval : pointer;
end );
4 : ( _sigchld : record
_pid : pid_t;
_uid : uid_t;
_status : longint;
_utime : clock_t;
_stime : clock_t;
end );
5 : ( _sigfault : record
_addr : pointer;
end );
6 : ( _sigpoll : record
_band : longint;
_fd : longint;
end );
end;
end;
{$endif cpusparc}
{$ifdef cpux86_64}
p_fpstate = ^_fpstate;
_fpstate = packed record
cwd,
@ -459,7 +505,10 @@ type
{
$Log$
Revision 1.21 2004-05-31 09:08:14 peter
Revision 1.22 2004-08-04 19:27:10 florian
* fixed floating point and integer exception handling on sparc/linux
Revision 1.21 2004/05/31 09:08:14 peter
* added siginfo const
Revision 1.20 2004/05/27 23:15:43 peter

View File

@ -16,8 +16,18 @@
**********************************************************************}
const
FPE_INTDIV = 1;
FPE_INTOVF = 2;
FPE_FLTDIV = 3;
FPE_FLTOVF = 4;
FPE_FLTUND = 5;
FPE_FLTRES = 6;
FPE_FLTINV = 7;
FPE_FLTSUB = 8;
procedure SignalToRunerror(Sig: longint; SigContext: SigContextRec); cdecl;
procedure SignalToRunerror(Sig: longint; siginfo : psiginfo); cdecl;
var
res : word;
@ -28,6 +38,24 @@ begin
begin
{ don't know how to find the different causes, maybe via xer? }
res := 207;
case siginfo^.si_code of
FPE_INTDIV:
res:=200;
FPE_INTOVF:
res:=205;
FPE_FLTDIV:
res:=200;
FPE_FLTOVF:
res:=205;
FPE_FLTUND:
res:=206;
FPE_FLTRES,
FPE_FLTINV,
FPE_FLTSUB:
res:=216;
else
res:=207;
end;
end;
SIGILL,
SIGBUS,
@ -42,7 +70,10 @@ end;
{
$Log$
Revision 1.3 2004-05-31 20:25:04 peter
Revision 1.4 2004-08-04 19:27:10 florian
* fixed floating point and integer exception handling on sparc/linux
Revision 1.3 2004/05/31 20:25:04 peter
* removed warnings
Revision 1.2 2003/11/06 16:28:52 peter

View File

@ -18,17 +18,38 @@
{****************************************************************************
PowerPC specific stuff
SPARC specific stuff
****************************************************************************}
function get_fsr : dword;assembler;
var
fsr : dword;
asm
st %fsr,fsr
ld fsr,%i0
end;
procedure set_fsr(fsr : dword);assembler;
var
_fsr : dword;
asm
// force memory location
st fsr,_fsr
ld _fsr,%fsr
end;
procedure fpc_cpuinit;
begin
{ enable div by 0 and invalid operation fpu exceptions }
set_fsr(get_fsr or $09000000);
end;
{$define FPC_SYSTEM_HAS_GET_FRAME}
function get_frame:pointer;assembler;nostackframe;
asm
mov %sp,%o0
mov %sp,%o0
end;
@ -63,7 +84,10 @@ function Sptr:Pointer;assembler;nostackframe;
{
$Log$
Revision 1.7 2004-05-30 20:03:05 florian
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
* ?
Revision 1.6 2004/05/27 23:34:37 peter