MFCamd64 r238598:

Provide siginfo.si_code for floating point errors when error occurs
using the SSE math processor.

MFC after:    3 weeks
This commit is contained in:
Konstantin Belousov 2012-07-21 21:52:48 +00:00
parent dad46c5594
commit 1e39a4bcee
3 changed files with 35 additions and 5 deletions

View File

@ -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;
}

View File

@ -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);

View File

@ -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
*