浏览代码

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

git-svn-id: trunk@6033 -
tom_at_work 18 年之前
父节点
当前提交
f6d79e8abb
共有 2 个文件被更改,包括 28 次插入0 次删除
  1. 23 0
      rtl/linux/ossysc.inc
  2. 5 0
      rtl/linux/system.pp

+ 23 - 0
rtl/linux/ossysc.inc

@@ -579,3 +579,26 @@ begin
     TSysParam(resource), TSysParam(rlim));
     TSysParam(resource), TSysParam(rlim));
 end;
 end;
 {$endif}
 {$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}

+ 5 - 0
rtl/linux/system.pp

@@ -301,6 +301,11 @@ var
   initialstkptr : Pointer;external name '__stkptr';
   initialstkptr : Pointer;external name '__stkptr';
 begin
 begin
   SysResetFPU;
   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;
   IsConsole := TRUE;
   StackLength := CheckInitialStkLen(initialStkLen);
   StackLength := CheckInitialStkLen(initialStkLen);
   StackBottom := initialstkptr - StackLength;
   StackBottom := initialstkptr - StackLength;