|
@@ -20,31 +20,43 @@
|
|
|
const
|
|
|
FPU_All = $7f;
|
|
|
|
|
|
-function GetFPUState(const SigContext : SigContextRec) : longint;
|
|
|
-begin
|
|
|
-{!!!!!!!
|
|
|
- if assigned(SigContext.fpstate) then
|
|
|
- GetfpuState:=SigContext.fpstate^.sw;
|
|
|
-{$ifdef SYSTEM_DEBUG}
|
|
|
- writeln('xx:',sigcontext.en_tw,' ',sigcontext.en_cw);
|
|
|
-{$endif SYSTEM_DEBUG}
|
|
|
-{$ifdef SYSTEM_DEBUG}
|
|
|
- Writeln(stderr,'FpuState = ',GetFpuState);
|
|
|
-{$endif SYSTEM_DEBUG}
|
|
|
-}
|
|
|
-end;
|
|
|
-
|
|
|
-procedure SignalToRunerror(Sig: longint; SigContext: SigContextRec); cdecl;
|
|
|
+function GetFPUState(const SigContext : SigContextRec) : word;
|
|
|
+ begin
|
|
|
+ if assigned(SigContext.fpstate) then
|
|
|
+ GetfpuState:=SigContext.fpstate^.swd;
|
|
|
+ {$ifdef SYSTEM_DEBUG}
|
|
|
+ writeln('xx:',sigcontext.en_tw,' ',sigcontext.en_cw);
|
|
|
+ {$endif SYSTEM_DEBUG}
|
|
|
+ {$ifdef SYSTEM_DEBUG}
|
|
|
+ Writeln(stderr,'FpuState = ',result);
|
|
|
+ {$endif SYSTEM_DEBUG}
|
|
|
+ end;
|
|
|
|
|
|
+function reenable_signal(sig : longint) : boolean;
|
|
|
var
|
|
|
- res,fpustate : word;
|
|
|
+ e,olde : TSigSet;
|
|
|
+ i,j : byte;
|
|
|
begin
|
|
|
- res:=0;
|
|
|
- case sig of
|
|
|
- SIGFPE :
|
|
|
- begin
|
|
|
- { this is not allways necessary but I don't know yet
|
|
|
- how to tell if it is or not PM }
|
|
|
+ fillchar(e,sizeof(e),#0);
|
|
|
+ { set is 1 based PM }
|
|
|
+ dec(sig);
|
|
|
+ i:=sig mod 32;
|
|
|
+ j:=sig div 32;
|
|
|
+ e[j]:=1 shl i;
|
|
|
+ fpsigprocmask(SIG_UNBLOCK,@e,nil);
|
|
|
+ reenable_signal:=geterrno=0;
|
|
|
+end;
|
|
|
+
|
|
|
+procedure SignalToRunerror(sig : longint; SigContext: SigContextRec); cdecl;
|
|
|
+ var
|
|
|
+ res,fpustate : word;
|
|
|
+ begin
|
|
|
+ res:=0;
|
|
|
+ case sig of
|
|
|
+ SIGFPE :
|
|
|
+ begin
|
|
|
+ { this is not allways necessary but I don't know yet
|
|
|
+ how to tell if it is or not PM }
|
|
|
res:=200;
|
|
|
fpustate:=GetFPUState(SigContext);
|
|
|
if (FpuState and FPU_All) <> 0 then
|
|
@@ -65,23 +77,24 @@ begin
|
|
|
else
|
|
|
res:=207; {'Coprocessor Error'}
|
|
|
end;
|
|
|
- sysResetFPU;
|
|
|
+ SysResetFPU;
|
|
|
end;
|
|
|
- SIGILL,
|
|
|
- SIGBUS,
|
|
|
- SIGSEGV :
|
|
|
+ SIGILL,
|
|
|
+ SIGBUS,
|
|
|
+ SIGSEGV:
|
|
|
res:=216;
|
|
|
+ end;
|
|
|
+ reenable_signal(sig);
|
|
|
+ if res<>0 then
|
|
|
+ HandleErrorAddrFrame(res,pointer(SigContext.rip),pointer(SigContext.rbp));
|
|
|
end;
|
|
|
-{ give runtime error at the position where the signal was raised }
|
|
|
-{!!!!
|
|
|
- if res<>0 then
|
|
|
- HandleErrorAddrFrame(res,pointer(SigContext.eip),pointer(SigContext.ebp));
|
|
|
-}
|
|
|
-end;
|
|
|
|
|
|
{
|
|
|
$Log$
|
|
|
- Revision 1.1 2004-02-05 01:16:12 florian
|
|
|
+ Revision 1.2 2004-05-01 15:59:17 florian
|
|
|
+ * x86_64 exception handling fixed
|
|
|
+
|
|
|
+ Revision 1.1 2004/02/05 01:16:12 florian
|
|
|
+ completed x86-64/linux system unit
|
|
|
|
|
|
Revision 1.2 2003/11/01 01:58:11 marco
|