mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-27 19:29:37 +00:00
x86/fpu: Do not BUG_ON() in early FPU code
I don't think it is really possible to have a system where CPUID enumerates support for XSAVE but that it does not have FP/SSE (they are "legacy" features and always present). But, I did manage to hit this case in qemu when I enabled its somewhat shaky XSAVE support. The bummer is that the FPU is set up before we parse the command-line or have *any* console support including earlyprintk. That turned what should have been an easy thing to debug in to a bit more of an odyssey. So a BUG() here is worthless. All it does it guarantee that if/when we hit this case we have an empty console. So, remove the BUG() and try to limp along by disabling XSAVE and trying to continue. Add a comment on why we are doing this, and also add a common "out_disable" path for leaving fpu__init_system_xstate(). Signed-off-by: Dave Hansen <dave.hansen@linux.intel.com> Cc: Andy Lutomirski <luto@kernel.org> Cc: Borislav Petkov <bp@alien8.de> Cc: Brian Gerst <brgerst@gmail.com> Cc: Dave Hansen <dave@sr71.net> Cc: Denys Vlasenko <dvlasenk@redhat.com> Cc: Fenghua Yu <fenghua.yu@intel.com> Cc: H. Peter Anvin <hpa@zytor.com> Cc: Josh Poimboeuf <jpoimboe@redhat.com> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Oleg Nesterov <oleg@redhat.com> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Quentin Casasnovas <quentin.casasnovas@oracle.com> Cc: Thomas Gleixner <tglx@linutronix.de> Link: http://lkml.kernel.org/r/20160720194551.63BB2B58@viggo.jf.intel.com Signed-off-by: Ingo Molnar <mingo@kernel.org>
This commit is contained in:
parent
b8be15d588
commit
ec3ed4a210
1 changed files with 13 additions and 6 deletions
|
@ -714,8 +714,13 @@ void __init fpu__init_system_xstate(void)
|
|||
xfeatures_mask = eax + ((u64)edx << 32);
|
||||
|
||||
if ((xfeatures_mask & XFEATURE_MASK_FPSSE) != XFEATURE_MASK_FPSSE) {
|
||||
/*
|
||||
* This indicates that something really unexpected happened
|
||||
* with the enumeration. Disable XSAVE and try to continue
|
||||
* booting without it. This is too early to BUG().
|
||||
*/
|
||||
pr_err("x86/fpu: FP/SSE not present amongst the CPU's xstate features: 0x%llx.\n", xfeatures_mask);
|
||||
BUG();
|
||||
goto out_disable;
|
||||
}
|
||||
|
||||
xfeatures_mask &= fpu__get_supported_xfeatures_mask();
|
||||
|
@ -723,11 +728,8 @@ void __init fpu__init_system_xstate(void)
|
|||
/* Enable xstate instructions to be able to continue with initialization: */
|
||||
fpu__init_cpu_xstate();
|
||||
err = init_xstate_size();
|
||||
if (err) {
|
||||
/* something went wrong, boot without any XSAVE support */
|
||||
fpu__init_disable_system_xstate();
|
||||
return;
|
||||
}
|
||||
if (err)
|
||||
goto out_disable;
|
||||
|
||||
/*
|
||||
* Update info used for ptrace frames; use standard-format size and no
|
||||
|
@ -744,6 +746,11 @@ void __init fpu__init_system_xstate(void)
|
|||
xfeatures_mask,
|
||||
fpu_kernel_xstate_size,
|
||||
boot_cpu_has(X86_FEATURE_XSAVES) ? "compacted" : "standard");
|
||||
return;
|
||||
|
||||
out_disable:
|
||||
/* something went wrong, try to boot without any XSAVE support */
|
||||
fpu__init_disable_system_xstate();
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
Loading…
Reference in a new issue