ソースを参照

* fixed rtl compilation with -dFPC_USE_LIBC by providing a more generic fpprctl() call (including libc variant) and moving related constants slightly

git-svn-id: trunk@6134 -
tom_at_work 18 年 前
コミット
704f8dae14
4 ファイル変更20 行追加19 行削除
  1. 3 18
      rtl/linux/ossysc.inc
  2. 12 0
      rtl/linux/ostypes.inc
  3. 1 1
      rtl/linux/system.pp
  4. 4 0
      rtl/unix/oscdeclh.inc

+ 3 - 18
rtl/linux/ossysc.inc

@@ -581,24 +581,9 @@ 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;
+{ fpprctl() call }
+function fpprctl(option : cint; const arg : ptrint) : cint;
 begin
-  prctl_set_fpexc := do_syscall(syscall_nr_prctl, PR_SET_FPEXC, mode);
+  fpprctl := do_syscall(syscall_nr_prctl, option, arg);
 end;
 {$endif}

+ 12 - 0
rtl/linux/ostypes.inc

@@ -280,6 +280,18 @@ type
   tiovec=iovec;
   piovec=^tiovec;		
 
+{$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 }
+{$endif}
+
     {*************************************************************************}
     {                               SIGNALS                                   }
     {*************************************************************************}

+ 1 - 1
rtl/linux/system.pp

@@ -304,7 +304,7 @@ begin
   {$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);
+  fpprctl(PR_SET_FPEXC, PR_FP_EXC_PRECISE);
   {$endif}
   IsConsole := TRUE;
   StackLength := CheckInitialStkLen(initialStkLen);

+ 4 - 0
rtl/unix/oscdeclh.inc

@@ -117,3 +117,7 @@ Type TGrpArr = Array [0..0] of TGid;            { C style array workarounds}
     function  FpReadV	   (fd: cint; const iov : piovec; iovcnt : cint):TSSize;  cdecl; external clib name 'readv';
     Function  FpPWrite     (fd : cInt; buf:pChar; nbytes : TSize; offset:Toff): TSSize;  cdecl; external clib name 'pwrite';
     function  FpWriteV	   (fd: cint; const iov : piovec; iovcnt : cint):TSSize;  cdecl; external clib name 'writev';
+
+{$ifdef linux}
+    function  FpPrCtl(options : cInt; const args : ptrint) : cint; cdecl; external clib name 'prctl';
+{$endif}