2
0
marco 21 жил өмнө
parent
commit
9eebe90053

+ 85 - 0
rtl/freebsd/i386/sighnd.inc

@@ -0,0 +1,85 @@
+{  
+   $Id$
+   This file is part of the Free Pascal run time library.
+   (c) 2000-2003 by Marco van de Voort
+   member of the Free Pascal development team.
+
+   See the file COPYING.FPC, included in this distribution,
+   for details about the copyright.
+
+   Signalhandler for FreeBSD/i386
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY;without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+}
+
+procedure SignalToRunerror(Sig: cint; var info : tsiginfo_t;Var SigContext:SigContextRec); cdecl;
+
+var
+  res : word;
+
+begin
+  res:=0;
+  case sig of
+    SIGFPE :
+          begin
+	    Case Info.si_code Of
+		FPE_INTDIV : Res:=200;  {integer divide fault. Div0?}
+		FPE_FLTOVF : Res:=205;  {Overflow trap}
+		FPE_FLTUND : Res:=206;  {Stack over/underflow}
+		FPE_FLTRES : Res:=216;  {Device not available}
+		FPE_FLTINV : Res:=216;  {Invalid floating point operation}
+	       Else
+  	        Res:=208; {coprocessor error}
+		End;
+	     sysResetFPU;
+	  End;
+    SIGILL,
+    SIGBUS,
+    SIGSEGV :
+        res:=216;
+  end;
+  {$ifdef FPC_USE_SIGPROCMASK}
+   reenable_signal(sig);
+  {$endif }
+{ give runtime error at the position where the signal was raised }
+  if res<>0 then
+   begin
+{$ifdef I386}
+  HandleErrorAddrFrame(res,Pointer(SigContext.sc_eip),pointer(SigContext.sc_ebp));
+{$else}
+     HandleError(res);
+{$endif}
+   end;
+end;
+{
+procedure SignalToRunerror(signo: cint); cdecl;
+var
+  res : word;
+begin
+    res:=0;
+
+    if signo = SIGFPE then
+     begin
+        res := 200;
+     end
+    else
+    if (signo = SIGILL) or (signo = SIGBUS) or (signo = SIGSEGV) then
+      begin
+        res := 216;
+      end;
+  { give runtime error at the position where the signal was raised }
+  if res<>0 then
+   begin
+     HandleError(res);
+   end;
+end;
+}
+
+{
+  $Log$
+  Revision 1.1  2004-01-03 12:29:36  marco
+   * now separately.
+
+}