|
@@ -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.
|
|
|
+
|
|
|
+}
|