Initialize the mxcsr properly, so the initial value in a process isn't
just the value that was left over from some other application.
This commit is contained in:
parent
738473e4ff
commit
c513b0c567
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=143768
@ -134,6 +134,7 @@ union savefpu {
|
||||
* intermediate values are stored in memory or in FPU registers.
|
||||
*/
|
||||
#define __INITIAL_NPXCW__ 0x127F
|
||||
#define __INITIAL_MXCSR__ 0x1F80
|
||||
|
||||
#ifdef _KERNEL
|
||||
int npxdna(void);
|
||||
|
@ -108,6 +108,7 @@ __FBSDID("$FreeBSD$");
|
||||
#ifdef CPU_ENABLE_SSE
|
||||
#define fxrstor(addr) __asm("fxrstor %0" : : "m" (*(addr)))
|
||||
#define fxsave(addr) __asm __volatile("fxsave %0" : "=m" (*(addr)))
|
||||
#define ldmxcsr(__csr) __asm __volatile("ldmxcsr %0" : : "m" (__csr))
|
||||
#endif
|
||||
#define start_emulating() __asm("smsw %%ax; orb %0,%%al; lmsw %%ax" \
|
||||
: : "n" (CR0_TS) : "ax")
|
||||
@ -754,6 +755,9 @@ npxdna()
|
||||
{
|
||||
struct pcb *pcb;
|
||||
register_t s;
|
||||
#ifdef CPU_ENABLE_SSE
|
||||
int mxcsr;
|
||||
#endif
|
||||
u_short control;
|
||||
|
||||
if (!npx_exists)
|
||||
@ -788,6 +792,12 @@ npxdna()
|
||||
fninit();
|
||||
control = __INITIAL_NPXCW__;
|
||||
fldcw(&control);
|
||||
#ifdef CPU_ENABLE_SSE
|
||||
if (cpu_fxsr) {
|
||||
mxcsr = __INITIAL_MXCSR__;
|
||||
ldmxcsr(mxcsr);
|
||||
}
|
||||
#endif
|
||||
pcb->pcb_flags |= PCB_NPXINITDONE;
|
||||
} else {
|
||||
/*
|
||||
|
Loading…
Reference in New Issue
Block a user