Port-m68k archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Segfault in lrintf() and similar functions



Hi,

it seems we have a serious problem in some new C99 math functions, which
use fenv_t to save/restore the FPU environment. It is also responsible for
X-server segfaults, when moving the mouse (at least on NetBSD/amiga).

The following source reproduces the problem:

---8<---
typedef unsigned long uint32_t;
typedef struct {
        uint32_t fpcr;
        uint32_t fpsr;
        uint32_t fppc;
} fenv_t;

#define __fgetenv(__envp) \
    __asm__ __volatile__ ("fmovem%.l %/fpcr/%/fpsr/%/fpiar,%0" : "=m"
(*__envp))
#define __set_fpsr(__fpsr) \
    __asm__ __volatile__ ("fmove%.l %0,%/fpsr" : : "dm" (__fpsr))  
#define FE_ALL_EXCEPT (0xf8)

static inline int
feholdexcept(fenv_t *__envp)
{
        int __fpsr;
        __fgetenv(__envp);
        __fpsr = __envp->fpsr & ~FE_ALL_EXCEPT;
        __set_fpsr(__fpsr);     /* clear all */
        return 0;
}

int main(void)
{
    fenv_t env;
    return feholdexcept(&env);
}
---8<---

I am currently testing this modification to sys/arch/m68k/include/fenv.h,
which seems to fix it. I would commit that, when there are no objections:

--- fenv.h      22 Mar 2017 23:11:09 -0000      1.6
+++ fenv.h      9 Sep 2017 15:46:17 -0000
@@ -210,7 +210,7 @@
 __fenv_static inline int
 fegetenv(fenv_t *__envp)
 {
-       __fgetenv(__envp);
+       __fgetenv(*__envp);
 
        return 0;
 }
@@ -220,7 +220,7 @@
 {
        fexcept_t __fpcr, __fpsr;
 
-       __fgetenv(__envp);
+       __fgetenv(*__envp);
        __fpsr = __envp->fpsr & ~FE_ALL_EXCEPT;
        __set_fpsr(__fpsr);     /* clear all */
        __fpcr = __envp->fpcr & ~(FE_ALL_EXCEPT << 6);


-- 
Frank Wille



Home | Main Index | Thread Index | Old Index