瀏覽代碼

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

florian 21 年之前
父節點
當前提交
49c3f3927e
共有 4 個文件被更改,包括 116 次插入9 次删除
  1. 5 2
      rtl/linux/osmain.inc
  2. 51 2
      rtl/linux/signal.inc
  3. 33 2
      rtl/linux/sparc/sighnd.inc
  4. 27 3
      rtl/sparc/sparc.inc

+ 5 - 2
rtl/linux/osmain.inc

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

+ 51 - 2
rtl/linux/signal.inc

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

+ 33 - 2
rtl/linux/sparc/sighnd.inc

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

+ 27 - 3
rtl/sparc/sparc.inc

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