Mathieu Malaterre wrote: > Thanks a lot for the update. Could you send me the actual full debdiff > you used. Here is what I get from fall.d.o when I use your patch: > > [...] > IexMathFpu.cpp: In function 'void > Iex_2_2::setFpExceptionHandler(Iex_2_2::FpExceptionHandler)': > IexMathFpu.cpp:482:9: error: 'struct sigaction' has no member named > 'sa_restorer' > action.sa_restorer = 0; > ^ > [...]
Sorry, I forgot about that part. sa_restorer is not used on kfreebsd so I guarded that with ifdefs. Attached is a diff against 2.2.0-9 of what I actually tested. Thanks! Regards, -- Steven Chamberlain ste...@pyro.eu.org
--- a/IexMath/IexMathFpu.cpp +++ b/IexMath/IexMathFpu.cpp @@ -52,7 +52,7 @@ #define debug(x) #endif -#if defined(HAVE_UCONTEXT_H) && (defined(__x86_64__) || defined(_M_X64) || defined(__i386__) || defined(_M_IX86)) && (defined(ILMBASE_HAVE_CONTROL_REGISTER_SUPPORT) || defined(HAVE_ASM_SIGCONTEXT_H)) +#if defined(HAVE_UCONTEXT_H) && (defined(__x86_64__) || defined(_M_X64) || defined(__i386__) || defined(_M_IX86)) #include <ucontext.h> #include <signal.h> @@ -264,6 +264,18 @@ setMxcsr (ucon.uc_mcontext.fpregs->mxcsr, clearExceptions); } +#elif defined(__FreeBSD_kernel__) + +#include <machine/npx.h> + +inline void +restoreControlRegs (const ucontext_t & ucon, bool clearExceptions) +{ + struct envxmm *ex = (struct envxmm *)(ucon.uc_mcontext.mc_fpstate); + setCw ((ex->en_cw & cwRestoreMask) | cwRestoreVal); + setMxcsr (ex->en_mxcsr, clearExceptions); +} + #else // @@ -463,8 +475,9 @@ sigemptyset (&action.sa_mask); action.sa_flags = SA_SIGINFO | SA_NOMASK; action.sa_sigaction = (void (*) (int, siginfo_t *, void *)) catchSigFpe; +#ifndef __FreeBSD_kernel__ action.sa_restorer = 0; - +#endif sigaction (SIGFPE, &action, 0); }
signature.asc
Description: Digital signature