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:
parent
dad46c5594
commit
1e39a4bcee
@ -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;
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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
|
||||
*
|
||||
|
Loading…
Reference in New Issue
Block a user