* explicitly enable FPU exception reporting on PowerPC in the MSR because some distros disable them by default

git-svn-id: trunk@6033 -
This commit is contained in:
tom_at_work 2007-01-17 22:12:19 +00:00
parent 67e6d8d2da
commit f6d79e8abb
2 changed files with 28 additions and 0 deletions

View File

@ -579,3 +579,26 @@ begin
TSysParam(resource), TSysParam(rlim));
end;
{$endif}
{$if defined(cpupowerpc)}
const
{ FP exception related constants for prctl(); PowerPC specific }
PR_GET_FPEXC = 11; { get floating point exception mode }
PR_SET_FPEXC = 12; { set floating point exception mode }
PR_FP_EXC_DISABLED = 0; { FP exceptions disabled }
PR_FP_EXC_NONREC = 1; { async non-recoverable exc. mode }
PR_FP_EXC_ASYNC = 2; { async recoverable exc. mode }
PR_FP_EXC_PRECISE = 3; { precise exception mode }
{ prctl() call to get FP exception mode }
function prctl_get_fpexc(var mode : cint): cint;
begin
prctl_get_fpexc := do_syscall(syscall_nr_prctl, PR_GET_FPEXC, ptrint(@mode));
end;
{ prctl() call to set FP exception mode }
function prctl_set_fpexc(const mode : cint): cint;
begin
prctl_set_fpexc := do_syscall(syscall_nr_prctl, PR_SET_FPEXC, mode);
end;
{$endif}

View File

@ -301,6 +301,11 @@ var
initialstkptr : Pointer;external name '__stkptr';
begin
SysResetFPU;
{$if defined(cpupowerpc)}
// some PPC kernels set the exception bits FE0/FE1 in the MSR to zero,
// disabling all FPU exceptions. Enable them again.
prctl_set_fpexc(PR_FP_EXC_PRECISE);
{$endif}
IsConsole := TRUE;
StackLength := CheckInitialStkLen(initialStkLen);
StackBottom := initialstkptr - StackLength;