From 23b52bbf23bcc3f7f64b4d3496993bee83f5f2eb Mon Sep 17 00:00:00 2001 From: cinap_lenrek Date: Sun, 6 Dec 2020 22:05:00 +0100 Subject: [PATCH] pc64: assign fpsave/fprestore only once in fpuinit() --- sys/src/9/pc64/fpu.c | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/sys/src/9/pc64/fpu.c b/sys/src/9/pc64/fpu.c index 2b9a377b7..1a5f31251 100644 --- a/sys/src/9/pc64/fpu.c +++ b/sys/src/9/pc64/fpu.c @@ -253,25 +253,26 @@ fpuinit(void) ulong regs[4]; cr4 = getcr4() | CR4Osfxsr|CR4Oxmmex; - putcr4(cr4); - fpsave = fpssesave; - fprestore = fpsserestore; - if((m->cpuidcx & (Xsave|Avx)) == (Xsave|Avx) && getconf("*noavx") == nil){ cr4 |= CR4Oxsave; putcr4(cr4); m->xcr0 = 7; /* x87, sse, avx */ putxcr0(m->xcr0); - fpsave = fpxsave; - fprestore = fpxrestore; - cpuid(0xd, 1, regs); - if(regs[0] & Xsaveopt) - fpsave = fpxsaveopt; if(regs[0] & Xsaves){ fpsave = fpxsaves; fprestore = fpxrestores; + } else { + if(regs[0] & Xsaveopt) + fpsave = fpxsaveopt; + else + fpsave = fpxsave; + fprestore = fpxrestore; } + } else { + putcr4(cr4); + fpsave = fpssesave; + fprestore = fpsserestore; } }