On Tue, May 1, 2018 at 5:59 AM Thomas Gleixner <t...@linutronix.de> wrote:
> Then I really have no idea how reverting the patch you pointed out would > fix it. So I do think that the original patch is buggy. What I think *may* be going on is: - first we do that get_cpu_cap(c); get_cpu_address_sizes(c); but at that point, CPU levels may be masked, and that 0x80000008 leaf isn't seen - then we do if (this_cpu->c_early_init) this_cpu->c_early_init(c); which calls early_init_intel(), which does that if (msr_clear_bit(MSR_IA32_MISC_ENABLE, MSR_IA32_MISC_ENABLE_LIMIT_CPUID_BIT) > 0) { which now raises the cpuid_level. - then we do get_cpu_cap(c); again, because the cpuid level has been raised, and _now_ it used to get that 0x80000008 leaf information. But with the change, that second call to get_cpu_cap() didn't do anything, because the 0x80000008 leaf handling had been moved away. However, I agree that your patch to just do that CPUID_8000_0008_EBX in get_cpu_cap() should have fixed it, and it's possible that Jörg mis-tested it. Jörg, are you sure you didn't somehow get the wrong microcode? Because another way for those bits to be cleared again is if bad_spectre_microcode() triggers. That should show up in dmesg as "Intel Spectre v2 broken microcode detected" though. Linus