• Thomas Gleixner's avatar
    x86/apic: Fix fallout from x2apic cleanup · a57e456a
    Thomas Gleixner authored
    In the recent x2apic cleanup I got two things really wrong:
    1) The safety check in __disable_x2apic which allows the function to
       be called unconditionally is backwards. The check is there to
       prevent access to the apic MSR in case that the machine has no
       apic. Though right now it returns if the machine has an apic and
       therefor the disabling of x2apic is never invoked.
    
    2) x2apic_disable() sets x2apic_mode to 0 after registering the local
       apic. That's wrong, because register_lapic_address() checks x2apic
       mode and therefor takes the wrong code path.
    
    This results in boot failures on machines with x2apic preenabled by
    BIOS and can also lead to an fatal MSR access on machines without
    apic.
    
    The solutions are simple:
    1) Correct the sanity check for apic availability
    2) Clear x2apic_mode _before_ calling register_lapic_address()
    
    Fixes: 659006bf 'x86/x2apic: Split enable and setup function'
    Reported-and-tested-by: default avatarJavier Monteagudo <javiermon@gmail.com>
    Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
    Link: https://bugzilla.redhat.com/show_bug.cgi?id=1224764
    Cc: stable@vger.kernel.org # 4.0+
    Cc: Laura Abbott <labbott@redhat.com>
    Cc: Jiang Liu <jiang.liu@linux.intel.com>
    Cc: Joerg Roedel <joro@8bytes.org>
    Cc: Tony Luck <tony.luck@intel.com>
    Cc: Borislav Petkov <bp@alien8.de>
    a57e456a
apic.c 61.1 KB