linux/arch/x86/kernel/apic
Thomas Gleixner a57e456a7b x86/apic: Fix fallout from x2apic cleanup
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: 659006bf3a 'x86/x2apic: Split enable and setup function'
Reported-and-tested-by: Javier Monteagudo <javiermon@gmail.com>
Signed-off-by: Thomas 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>
2015-08-22 17:01:48 +02:00
..
apic_flat_64.c x86, apic: Remove enable_apic_mode callback 2014-07-31 08:05:44 -07:00
apic_noop.c x86, apic: Remove enable_apic_mode callback 2014-07-31 08:05:44 -07:00
apic_numachip.c x86/apic/numachip: Fix sibling map with NumaChip 2015-03-12 16:58:59 +01:00
apic.c x86/apic: Fix fallout from x2apic cleanup 2015-08-22 17:01:48 +02:00
bigsmp_32.c x86, apic: Remove enable_apic_mode callback 2014-07-31 08:05:44 -07:00
htirq.c x86: Constify irqdomain ops 2015-05-05 11:14:48 +02:00
hw_nmi.c x86/nmi: Fix use of unallocated cpumask_var_t 2014-11-25 14:15:30 -05:00
io_apic.c x86/irq: Use the caller provided polarity setting in mp_check_pin_attr() 2015-07-30 21:15:29 +02:00
ipi.c x86: Delete non-required instances of include <linux/init.h> 2014-01-06 21:25:18 -08:00
Makefile x86, irq: Move HT IRQ related code from io_apic.c into htirq.c 2014-12-16 14:08:17 +01:00
msi.c x86/irq/msi: Implement irq_set_vcpu_affinity for remapped MSI irqs 2015-05-19 15:51:17 +02:00
probe_32.c x86, apic: Remove enable_apic_mode callback 2014-07-31 08:05:44 -07:00
probe_64.c x86/platform: Introduce APIC post-initialization callback 2012-06-06 09:06:19 +02:00
vector.c x86/irq: Build correct vector mapping for multiple MSI interrupts 2015-08-18 18:18:55 +02:00
x2apic_cluster.c x86: fix more deprecated cpu function usage. 2015-03-10 13:54:40 +10:30
x2apic_phys.c x86/x2apic: Acpi_gbl_FADT existence depends on CONFIG_ACPI 2015-05-05 14:01:37 +02:00
x2apic_uv_x.c x86/apic/uv: Update the UV APIC HUB check 2015-04-10 10:16:08 +02:00