From 704f8dae14ffea2d2ec048989e94020664ec5274 Mon Sep 17 00:00:00 2001 From: tom_at_work Date: Mon, 22 Jan 2007 22:21:32 +0000 Subject: [PATCH] * 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 - --- rtl/linux/ossysc.inc | 21 +++------------------ rtl/linux/ostypes.inc | 12 ++++++++++++ rtl/linux/system.pp | 2 +- rtl/unix/oscdeclh.inc | 4 ++++ 4 files changed, 20 insertions(+), 19 deletions(-) diff --git a/rtl/linux/ossysc.inc b/rtl/linux/ossysc.inc index 29baab0b33..bb4f5bfb1b 100644 --- a/rtl/linux/ossysc.inc +++ b/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; +{ fpprctl() call } +function fpprctl(option : cint; const arg : ptrint) : 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); + fpprctl := do_syscall(syscall_nr_prctl, option, arg); end; {$endif} diff --git a/rtl/linux/ostypes.inc b/rtl/linux/ostypes.inc index 78e09bca23..21b27cc6e7 100644 --- a/rtl/linux/ostypes.inc +++ b/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 } {*************************************************************************} diff --git a/rtl/linux/system.pp b/rtl/linux/system.pp index e9afda2377..72de524e56 100644 --- a/rtl/linux/system.pp +++ b/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); diff --git a/rtl/unix/oscdeclh.inc b/rtl/unix/oscdeclh.inc index eb21eb224b..b35994e44f 100644 --- a/rtl/unix/oscdeclh.inc +++ b/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}