aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndi Kleen <ak@suse.de>2006-09-26 04:52:34 -0400
committerAndi Kleen <andi@basil.nowhere.org>2006-09-26 04:52:34 -0400
commitb7f5e3c7742d5332b78b831131f43fc3630e6322 (patch)
tree4334c97a3a8e2ac409444ecb2d7844d3a63e4118
parent3fa7c794fe4dc127f7fac3fad4d13628e68f89ce (diff)
[PATCH] Don't access the APIC in safe_smp_processor_id when it is not mapped yet
Lockdep can call the dwarf2 unwinder early, and the dwarf2 code uses safe_smp_processor_id which tries to access the local APIC page. But that doesn't work before the APIC code has set up its fixmap. Check for this case and always return boot cpu then. Cc: jbeulich@novell.com Cc: mingo@elte.hu Signed-off-by: Andi Kleen <ak@suse.de>
-rw-r--r--arch/x86_64/kernel/apic.c2
-rw-r--r--arch/x86_64/kernel/smp.c2
-rw-r--r--include/asm-x86_64/apic.h1
3 files changed, 4 insertions, 1 deletions
diff --git a/arch/x86_64/kernel/apic.c b/arch/x86_64/kernel/apic.c
index b95d1e378b96..6472e321cad7 100644
--- a/arch/x86_64/kernel/apic.c
+++ b/arch/x86_64/kernel/apic.c
@@ -38,6 +38,7 @@
38#include <asm/timex.h> 38#include <asm/timex.h>
39#include <asm/apic.h> 39#include <asm/apic.h>
40 40
41int apic_mapped;
41int apic_verbosity; 42int apic_verbosity;
42int apic_runs_main_timer; 43int apic_runs_main_timer;
43int apic_calibrate_pmtmr __initdata; 44int apic_calibrate_pmtmr __initdata;
@@ -600,6 +601,7 @@ void __init init_apic_mappings(void)
600 apic_phys = mp_lapic_addr; 601 apic_phys = mp_lapic_addr;
601 602
602 set_fixmap_nocache(FIX_APIC_BASE, apic_phys); 603 set_fixmap_nocache(FIX_APIC_BASE, apic_phys);
604 apic_mapped = 1;
603 apic_printk(APIC_VERBOSE,"mapped APIC to %16lx (%16lx)\n", APIC_BASE, apic_phys); 605 apic_printk(APIC_VERBOSE,"mapped APIC to %16lx (%16lx)\n", APIC_BASE, apic_phys);
604 606
605 /* 607 /*
diff --git a/arch/x86_64/kernel/smp.c b/arch/x86_64/kernel/smp.c
index 06af6ca60129..2df988bbf312 100644
--- a/arch/x86_64/kernel/smp.c
+++ b/arch/x86_64/kernel/smp.c
@@ -526,7 +526,7 @@ int safe_smp_processor_id(void)
526{ 526{
527 unsigned apicid, i; 527 unsigned apicid, i;
528 528
529 if (disable_apic) 529 if (disable_apic || !apic_mapped)
530 return 0; 530 return 0;
531 531
532 apicid = hard_smp_processor_id(); 532 apicid = hard_smp_processor_id();
diff --git a/include/asm-x86_64/apic.h b/include/asm-x86_64/apic.h
index 29ee735278f2..9e66d32330c9 100644
--- a/include/asm-x86_64/apic.h
+++ b/include/asm-x86_64/apic.h
@@ -18,6 +18,7 @@
18extern int apic_verbosity; 18extern int apic_verbosity;
19extern int apic_runs_main_timer; 19extern int apic_runs_main_timer;
20extern int ioapic_force; 20extern int ioapic_force;
21extern int apic_mapped;
21 22
22/* 23/*
23 * Define the default level of output to be very little 24 * Define the default level of output to be very little