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: 9a4496a35b ("x86emul: support {,V}{LD,ST}MXCSR")
Signed-off-by: Jan Beulich <jbeulich@suse.com>
Reviewed-by: Andrew Cooper <andrew.cooper3@citrix.com>
This commit is contained in:
Jan Beulich committed 2020-05-18 17:18:56 +02:00
1 parent 4c73a2a939
commit 2b532519d6
2 files changed
+13 -8

No files matched your search

+1 -2
View File
@@ -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:");
+12 -6
View File
@@ -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
{
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.