• Thomas Gleixner's avatar
    x86/cpu: Restore CPUID_8000_0008_EBX reload · c65732e4
    Thomas Gleixner authored
    The recent commt which addresses the x86_phys_bits corruption with
    encrypted memory on CPUID reload after a microcode update lost the reload
    of CPUID_8000_0008_EBX as well.
    
    As a consequence IBRS and IBRS_FW are not longer detected
    
    Restore the behaviour by bringing the reload of CPUID_8000_0008_EBX
    back. This restore has a twist due to the convoluted way the cpuid analysis
    works:
    
    CPUID_8000_0008_EBX is used by AMD to enumerate IBRB, IBRS, STIBP. On Intel
    EBX is not used. But the speculation control code sets the AMD bits when
    running on Intel depending on the Intel specific speculation control
    bits. This was done to use the same bits for alternatives.
    
    The change which moved the 8000_0008 evaluation out of get_cpu_cap() broke
    this nasty scheme due to ordering. So that on Intel the store to
    CPUID_8000_0008_EBX clears the IBRB, IBRS, STIBP bits which had been set
    before by software.
    
    So the actual CPUID_8000_0008_EBX needs to go back to the place where it
    was and the phys/virt address space calculation cannot touch it.
    
    In hindsight this should have used completely synthetic bits for IBRB,
    IBRS, STIBP instead of reusing the AMD bits, but that's for 4.18.
    
    /me needs to find time to cleanup that steaming pile of ...
    
    Fixes: d94a155c ("x86/cpu: Prevent cpuinfo_x86::x86_phys_bits adjustment corruption")
    Reported-by: default avatarJörg Otte <jrg.otte@gmail.com>
    Reported-by: default avatarTim Chen <tim.c.chen@linux.intel.com>
    Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
    Tested-by: default avatarJörg Otte <jrg.otte@gmail.com>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: kirill.shutemov@linux.intel.com
    Cc: Borislav Petkov <bp@alien8.de
    Link: https://lkml.kernel.org/r/alpine.DEB.2.21.1805021043510.1668@nanos.tec.linutronix.de
    c65732e4
common.c 44.1 KB