* return RTE 207 for fpu inexact exceptions (so we get a sensible

exception from sysutils)
  * some cleanup in the i386 sighandler code

git-svn-id: trunk@5137 -
This commit is contained in:
Jonas Maebe 2006-11-01 00:08:10 +00:00
parent a200cae8af
commit aab785d0fc
2 changed files with 8 additions and 17 deletions

View File

@ -28,12 +28,12 @@ begin
FPE_FLTDIV : Res:=200; { floating point divide by zero } FPE_FLTDIV : Res:=200; { floating point divide by zero }
FPE_FLTOVF : Res:=205; { floating point overflow } FPE_FLTOVF : Res:=205; { floating point overflow }
FPE_FLTUND : Res:=206; { floating point underflow } FPE_FLTUND : Res:=206; { floating point underflow }
FPE_FLTRES : Res:=208; { floating point inexact result } FPE_FLTRES, { floating point inexact result }
FPE_FLTINV : Res:=207; { invalid floating point operation } FPE_FLTINV : Res:=207; { invalid floating point operation }
Else Else
Res:=207; { coprocessor error } Res:=207; { coprocessor error }
end; end;
{ the following is true on ppc, hopefully not on x86 as well } { the following is true on ppc, but fortunately not on x86 }
{ FPU exceptions are completely disabled by the kernel if one occurred, it } { FPU exceptions are completely disabled by the kernel if one occurred, it }
{ seems this is necessary to be able to return to user mode. They can be } { seems this is necessary to be able to return to user mode. They can be }
{ enabled by executing a sigreturn, however then the exception is triggered } { enabled by executing a sigreturn, however then the exception is triggered }
@ -52,15 +52,5 @@ begin
if (res <> 0) then if (res <> 0) then
HandleErrorAddrFrame(res,pointer(sigcontext.ts.eip),pointer(sigcontext.ts.ebp)); HandleErrorAddrFrame(res,pointer(sigcontext.ts.eip),pointer(sigcontext.ts.ebp));
(*
{ return to trampoline }
if res <> 0 then
begin
SigContext.uc_mcontext^.ss.r3 := res;
SigContext.uc_mcontext^.ss.r4 := SigContext.uc_mcontext^.ss.srr0;
SigContext.uc_mcontext^.ss.r5 := SigContext.uc_mcontext^.ss.r1;
pointer(SigContext.uc_mcontext^.ss.srr0) := @HandleErrorAddrFrame;
end;
*)
end; end;

View File

@ -24,11 +24,12 @@ begin
SIGFPE : SIGFPE :
begin begin
Case Info.si_code Of Case Info.si_code Of
FPE_INTDIV : Res:=200; {integer divide fault. Div0?} FPE_FLTDIV,
FPE_FLTOVF : Res:=205; {Overflow trap} FPE_INTDIV : Res:=200; { floating point divide by zero }
FPE_FLTUND : Res:=206; {Stack over/underflow} FPE_FLTOVF : Res:=205; { floating point overflow }
FPE_FLTRES : Res:=208; {Device not available} FPE_FLTUND : Res:=206; { floating point underflow }
FPE_FLTINV : Res:=207; {Invalid floating point operation} FPE_FLTRES, { floating point inexact result }
FPE_FLTINV : Res:=207; { invalid floating point operation }
Else Else
Res:=207; {coprocessor error} Res:=207; {coprocessor error}
end; end;