]> xenbits.xensource.com Git - people/vhanquez/xen-unstable.git/commitdiff
x86: restore x2apic pre-enabled check logic
authorKeir Fraser <keir@xen.org>
Tue, 11 Jan 2011 11:40:50 +0000 (11:40 +0000)
committerKeir Fraser <keir@xen.org>
Tue, 11 Jan 2011 11:40:50 +0000 (11:40 +0000)
c/s 22475 removed the early checking without replacement, neglecting
the fact that x2apic_enabled must be set early for APIC register
accesses done during second stage ACPI table parsing (rooted at
acpi_boot_init()) to work correctly. Without this, particularly
determination of the boot CPU won't work, resulting in an attempt to
bring up that CPU again as a secondary one (which fails).

Restore the functionality, now calling it from generic_apic_probe().

Signed-off-by: Jan Beulich <jbeulich@novell.com>
xen/arch/x86/apic.c
xen/arch/x86/genapic/probe.c
xen/arch/x86/genapic/x2apic.c
xen/include/asm-x86/apic.h

index 37dfc79c2eb66f83f115ba2e673072255c43dd6b..1590c3a1712033a9419b965c4a7658d8b0cb5e89 100644 (file)
@@ -957,19 +957,10 @@ void x2apic_ap_setup(void)
 void __init x2apic_bsp_setup(void)
 {
     struct IO_APIC_route_entry **ioapic_entries = NULL;
-    uint64_t msr_content;
 
     if ( !cpu_has_x2apic )
         return;
 
-    /* Check whether x2apic mode was already enabled by the BIOS. */
-    rdmsrl(MSR_IA32_APICBASE, msr_content);
-    if ( msr_content & MSR_IA32_APICBASE_EXTD )
-    {
-        printk("x2APIC mode is already enabled by BIOS.\n");
-        x2apic_enabled = 1;
-    }
-
     if ( !opt_x2apic )
     {
         if ( !x2apic_enabled )
index 7768d36d71b14a9ea51820adfd6d24adadd2d30f..20e72922db976f1760816e86634637f6c1801320 100644 (file)
@@ -59,8 +59,10 @@ custom_param("apic", genapic_apic_force);
 
 void __init generic_apic_probe(void) 
 { 
-       int i;
-       int changed = cmdline_apic = (genapic != NULL);
+       int i, changed;
+
+       check_x2apic_preenabled();
+       cmdline_apic = changed = (genapic != NULL);
 
        for (i = 0; !changed && apic_probe[i]; i++) { 
                if (apic_probe[i]->probe()) {
index 98afc66b1b8b7ea8255cfca210a0fd9b976fc7cc..7cf89899474c02343218a6d0e5cd866613e44465 100644 (file)
@@ -24,6 +24,8 @@
 #include <asm/genapic.h>
 #include <asm/apic.h>
 #include <asm/io_apic.h>
+#include <asm/msr.h>
+#include <asm/processor.h>
 #include <xen/smp.h>
 #include <asm/mach-default/mach_mpparse.h>
 
@@ -123,3 +125,20 @@ const struct genapic *__init apic_x2apic_probe(void)
 {
     return x2apic_phys ? &apic_x2apic_phys : &apic_x2apic_cluster;
 }
+
+void __init check_x2apic_preenabled(void)
+{
+    u32 lo, hi;
+
+    if ( !cpu_has_x2apic )
+        return;
+
+    /* Check whether x2apic mode was already enabled by the BIOS. */
+    rdmsr(MSR_IA32_APICBASE, lo, hi);
+    if ( lo & MSR_IA32_APICBASE_EXTD )
+    {
+        printk("x2APIC mode is already enabled by BIOS.\n");
+        x2apic_enabled = 1;
+        genapic = apic_x2apic_probe();
+    }
+}
index 727115c3fe9fec334409bc4d37007ac3f408d536..b2c46a9ecc3f5ad5f1ed045b1e4f5aebde089075 100644 (file)
@@ -25,6 +25,7 @@ extern int apic_verbosity;
 extern bool_t x2apic_enabled;
 extern bool_t directed_eoi_enabled;
 
+void check_x2apic_preenabled(void);
 void x2apic_bsp_setup(void);
 void x2apic_ap_setup(void);
 const struct genapic *apic_x2apic_probe(void);