diff options
author | kib <kib@FreeBSD.org> | 2012-07-21 21:52:48 +0000 |
---|---|---|
committer | kib <kib@FreeBSD.org> | 2012-07-21 21:52:48 +0000 |
commit | 85d13cee2c898c09c66d9363ed996ec22e463477 (patch) | |
tree | 89398484d43bb1d8807fbfb9a8af354b9eb3e298 /sys/i386 | |
parent | 7925edc16eae8c1b2933c3bb83e9005b8c8f18fa (diff) | |
download | FreeBSD-src-85d13cee2c898c09c66d9363ed996ec22e463477.zip FreeBSD-src-85d13cee2c898c09c66d9363ed996ec22e463477.tar.gz |
MFCamd64 r238598:
Provide siginfo.si_code for floating point errors when error occurs
using the SSE math processor.
MFC after: 3 weeks
Diffstat (limited to 'sys/i386')
-rw-r--r-- | sys/i386/i386/trap.c | 10 | ||||
-rw-r--r-- | sys/i386/include/npx.h | 3 | ||||
-rw-r--r-- | sys/i386/isa/npx.c | 27 |
3 files changed, 35 insertions, 5 deletions
diff --git a/sys/i386/i386/trap.c b/sys/i386/i386/trap.c index 41495b4..4a64652 100644 --- a/sys/i386/i386/trap.c +++ b/sys/i386/i386/trap.c @@ -369,7 +369,7 @@ trap(struct trapframe *frame) case T_ARITHTRAP: /* arithmetic trap */ #ifdef DEV_NPX - ucode = npxtrap(); + ucode = npxtrap_x87(); if (ucode == -1) goto userout; #else @@ -532,7 +532,13 @@ trap(struct trapframe *frame) break; case T_XMMFLT: /* SIMD floating-point exception */ - ucode = 0; /* XXX */ +#if defined(DEV_NPX) && !defined(CPU_DISABLE_SSE) && defined(I686_CPU) + ucode = npxtrap_sse(); + if (ucode == -1) + goto userout; +#else + ucode = 0; +#endif i = SIGFPE; break; } diff --git a/sys/i386/include/npx.h b/sys/i386/include/npx.h index 86ac477..33a47b3 100644 --- a/sys/i386/include/npx.h +++ b/sys/i386/include/npx.h @@ -55,7 +55,8 @@ int npxgetregs(struct thread *td); void npxinit(void); void npxsave(union savefpu *addr); void npxsetregs(struct thread *td, union savefpu *addr); -int npxtrap(void); +int npxtrap_x87(void); +int npxtrap_sse(void); void npxuserinited(struct thread *); struct fpu_kern_ctx *fpu_kern_alloc_ctx(u_int flags); void fpu_kern_free_ctx(struct fpu_kern_ctx *ctx); diff --git a/sys/i386/isa/npx.c b/sys/i386/isa/npx.c index 4e61ad2..69413ff 100644 --- a/sys/i386/isa/npx.c +++ b/sys/i386/isa/npx.c @@ -600,12 +600,13 @@ static char fpetable[128] = { * For XMM traps, the exceptions were never cleared. */ int -npxtrap() +npxtrap_x87(void) { u_short control, status; if (!hw_float) { - printf("npxtrap: fpcurthread = %p, curthread = %p, hw_float = %d\n", + printf( + "npxtrap_x87: fpcurthread = %p, curthread = %p, hw_float = %d\n", PCPU_GET(fpcurthread), curthread, hw_float); panic("npxtrap from nowhere"); } @@ -627,6 +628,28 @@ npxtrap() return (fpetable[status & ((~control & 0x3f) | 0x40)]); } +#ifdef CPU_ENABLE_SSE +int +npxtrap_sse(void) +{ + u_int mxcsr; + + if (!hw_float) { + printf( + "npxtrap_sse: fpcurthread = %p, curthread = %p, hw_float = %d\n", + PCPU_GET(fpcurthread), curthread, hw_float); + panic("npxtrap from nowhere"); + } + critical_enter(); + if (PCPU_GET(fpcurthread) != curthread) + mxcsr = curthread->td_pcb->pcb_save->sv_xmm.sv_env.en_mxcsr; + else + stmxcsr(&mxcsr); + critical_exit(); + return (fpetable[(mxcsr & (~mxcsr >> 7)) & 0x3f]); +} +#endif + /* * Implement device not available (DNA) exception * |