mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 10:11:27 +01:00
x86: restore x2apic pre-enabled check logic
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>
This commit is contained in:
1 parent
0c13834740
commit
db0fe41a14
4 files changed
+24
-11
No files matched your search
@@ -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 )
|
||||
|
||||
@@ -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()) {
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
|
||||