Fix userspace's FP restore
authorBarret Rhoden <brho@cs.berkeley.edu>
Thu, 7 Apr 2016 17:34:46 +0000 (13:34 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Thu, 7 Apr 2016 18:07:34 +0000 (14:07 -0400)
We weren't passing the right xcr0.  Who knows what we were passing.  This
caused FP state to be partially restored.

Whenever we migrated pcores, we wouldn't get all of the new FP state, such
as having bad xmms.  We often would see parts of the correct FP state from
previous residents of the core, and the xmms were probably clobbered by
another thread calling into glibc for e.g. memset().

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
user/parlib/include/parlib/x86/arch.h

index 58b2e4e..3866189 100644 (file)
@@ -155,7 +155,7 @@ static inline void restore_fp_state(struct ancillary_state *silly)
        if (cpu_has_feat(CPU_FEAT_X86_XSAVE)) {
                edx = x86_default_xcr0 >> 32;
                eax = x86_default_xcr0;
-               asm volatile("xrstor64 %0" : : "m"(*silly));
+               asm volatile("xrstor64 %0" : : "m"(*silly), "a"(eax), "d"(edx));
        } else {
                asm volatile("fxrstor64 %0" : : "m"(*silly));
        }