On Wed, Sep 28, 2016 at 12:34:15PM -0700, Andy Lutomirski wrote: > The condition for reading CR4 was wrong: there are some CPUs with > CPUID but not CR4. Rather than trying to make the condition exact, > using __read_cr4_safe(). > > Reported-by: da...@saggiorato.net > Fixes: 18bc7bd523e0 ("x86/boot: Synchronize trampoline_cr4_features and > mmu_cr4_features directly") > Signed-off-by: Andy Lutomirski <l...@kernel.org> > --- > arch/x86/kernel/setup.c | 10 +++++++--- > 1 file changed, 7 insertions(+), 3 deletions(-) > > diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c > index 0fa60f5f5a16..5930a4d191b4 100644 > --- a/arch/x86/kernel/setup.c > +++ b/arch/x86/kernel/setup.c > @@ -1137,9 +1137,13 @@ void __init setup_arch(char **cmdline_p) > * auditing all the early-boot CR4 manipulation would be needed to > * rule it out. > */ > - if (boot_cpu_data.cpuid_level >= 0) > - /* A CPU has %cr4 if and only if it has CPUID. */ > - mmu_cr4_features = __read_cr4(); > + if (boot_cpu_data.cpuid_level >= 0) { > + /* > + * CPUs without CPUID don't have CR4. CPUs with CPUID > + * usually have CR4. > + */ > + mmu_cr4_features = __read_cr4_safe(); > + }
Why are we even doing the CPUID check instead of unconditionally doing __read_cr4_safe()? The safe variant will give 0 on !CR4 machines. -- Regards/Gruss, Boris. ECO tip #101: Trim your mails when you reply. --