From 2b532519d64e653a6bbfd9eefed6040a09c8876d Mon Sep 17 00:00:00 2001 From: Jan Beulich Date: Mon, 18 May 2020 17:18:56 +0200 Subject: [PATCH] x86: determine MXCSR mask in all cases For its use(s) by the emulator to be correct in all cases, the filling of the variable needs to be independent of XSAVE availability. As there's no suitable function in i387.c to put the logic in, keep it in xstate_init(), arrange for the function to be called unconditionally, and pull the logic ahead of all return paths there. Fixes: 9a4496a35b20 ("x86emul: support {,V}{LD,ST}MXCSR") Signed-off-by: Jan Beulich Reviewed-by: Andrew Cooper --- xen/arch/x86/cpu/common.c | 3 +-- xen/arch/x86/xstate.c | 18 ++++++++++++------ 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/xen/arch/x86/cpu/common.c b/xen/arch/x86/cpu/common.c index 63f3893c7a..3e0d9cbe98 100644 --- a/xen/arch/x86/cpu/common.c +++ b/xen/arch/x86/cpu/common.c @@ -488,8 +488,7 @@ void identify_cpu(struct cpuinfo_x86 *c) /* Now the feature flags better reflect actual CPU features! */ - if ( cpu_has_xsave ) - xstate_init(c); + xstate_init(c); #ifdef NOISY_CAPS printk(KERN_DEBUG "CPU: After all inits, caps:"); diff --git a/xen/arch/x86/xstate.c b/xen/arch/x86/xstate.c index 078419a171..3794d9a5a5 100644 --- a/xen/arch/x86/xstate.c +++ b/xen/arch/x86/xstate.c @@ -588,6 +588,18 @@ void xstate_init(struct cpuinfo_x86 *c) u32 eax, ebx, ecx, edx; u64 feature_mask; + if ( bsp ) + { + static typeof(current->arch.xsave_area->fpu_sse) __initdata ctxt; + + asm ( "fxsave %0" : "=m" (ctxt) ); + if ( ctxt.mxcsr_mask ) + mxcsr_mask = ctxt.mxcsr_mask; + } + + if ( !cpu_has_xsave ) + return; + if ( (bsp && !use_xsave) || boot_cpu_data.cpuid_level < XSTATE_CPUID ) { @@ -611,8 +623,6 @@ void xstate_init(struct cpuinfo_x86 *c) if ( bsp ) { - static typeof(current->arch.xsave_area->fpu_sse) __initdata ctxt; - xfeature_mask = feature_mask; /* * xsave_cntxt_size is the max size required by enabled features. @@ -621,10 +631,6 @@ void xstate_init(struct cpuinfo_x86 *c) xsave_cntxt_size = _xstate_ctxt_size(feature_mask); printk("xstate: size: %#x and states: %#"PRIx64"\n", xsave_cntxt_size, xfeature_mask); - - asm ( "fxsave %0" : "=m" (ctxt) ); - if ( ctxt.mxcsr_mask ) - mxcsr_mask = ctxt.mxcsr_mask; } else { -- 2.30.2