mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Andi Kleen <ak@suse.de>
To: mingo@elte.hu, tglx@linutronix.de, linux-kernel@vger.kernel.org
Subject: [PATCH] [7/7] Don't disable the APIC if it hasn't been mapped yet
Date: Wed, 16 Jan 2008 23:27:10 +0100 (CET)	[thread overview]
Message-ID: <20080116222710.BF256150CA@wotan.suse.de> (raw)
In-Reply-To: <200801161127.268350000@suse.de>


When the kernel panics early for some unrelated reason 
there would be eventually an early exception inside panic because 
clear_local_APIC tried to disable the not yet mapped APIC.
Check for that explicitely.

Signed-off-by: Andi Kleen <ak@suse.de>

---
 arch/x86/kernel/apic_32.c |   11 ++++++++---
 arch/x86/kernel/apic_64.c |    9 +++++++--
 2 files changed, 15 insertions(+), 5 deletions(-)

Index: linux/arch/x86/kernel/apic_32.c
===================================================================
--- linux.orig/arch/x86/kernel/apic_32.c
+++ linux/arch/x86/kernel/apic_32.c
@@ -99,6 +99,8 @@ static DEFINE_PER_CPU(struct clock_event
 /* Local APIC was disabled by the BIOS and enabled by the kernel */
 static int enabled_via_apicbase;
 
+static unsigned long apic_phys;
+
 /*
  * Get the LAPIC version
  */
@@ -616,9 +618,14 @@ int setup_profiling_timer(unsigned int m
  */
 void clear_local_APIC(void)
 {
-	int maxlvt = lapic_get_maxlvt();
+	int maxlvt;
 	u32 v;
 
+	/* APIC hasn't been mapped yet */
+	if (!apic_phys)
+		return;
+
+	maxlvt = lapic_get_maxlvt();
 	/*
 	 * Masking an LVT entry can trigger a local APIC error
 	 * if the vector is zero. Mask LVTERR first to prevent this.
@@ -1105,8 +1112,6 @@ no_apic:
  */
 void __init init_apic_mappings(void)
 {
-	unsigned long apic_phys;
-
 	/*
 	 * If no local APIC can be found then set up a fake all
 	 * zeroes page to simulate the local APIC and another
Index: linux/arch/x86/kernel/apic_64.c
===================================================================
--- linux.orig/arch/x86/kernel/apic_64.c
+++ linux/arch/x86/kernel/apic_64.c
@@ -81,6 +81,8 @@ static struct clock_event_device lapic_c
 };
 static DEFINE_PER_CPU(struct clock_event_device, lapic_events);
 
+static unsigned long apic_phys;
+
 /*
  * Get the LAPIC version
  */
@@ -516,6 +518,11 @@ void clear_local_APIC(void)
 	int maxlvt = lapic_get_maxlvt();
 	u32 v;
 
+	/* APIC hasn't been mapped yet */
+	if (!apic_phys)
+		return;
+
+	maxlvt = lapic_get_maxlvt();
 	/*
 	 * Masking an LVT entry can trigger a local APIC error
 	 * if the vector is zero. Mask LVTERR first to prevent this.
@@ -850,8 +857,6 @@ static int __init detect_init_APIC(void)
  */
 void __init init_apic_mappings(void)
 {
-	unsigned long apic_phys;
-
 	/*
 	 * If no local APIC can be found then set up a fake all
 	 * zeroes page to simulate the local APIC and another

  parent reply	other threads:[~2008-01-16 22:33 UTC|newest]

Thread overview: 14+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-01-16 22:27 [PATCH] [0/7] Some random x86 patches that should all go into git-x86 Andi Kleen
2008-01-16 22:27 ` [PATCH] [1/7] i386: Move MWAIT idle check to generic CPU initialization Andi Kleen
2008-01-16 22:27 ` [PATCH] [2/7] Use the correct cpuid method to detect MWAIT support for C states Andi Kleen
2008-01-16 22:27 ` [PATCH] [3/7] Use shorter addresses in i386 segfault printks Andi Kleen
2008-01-17  2:58   ` Harvey Harrison
2008-01-17  3:11     ` H. Peter Anvin
2008-01-17  3:22       ` Harvey Harrison
2008-01-17  3:21         ` H. Peter Anvin
2008-01-17 11:27     ` Andi Kleen
2008-01-16 22:27 ` [PATCH] [4/7] Print which shared library/executable faulted in segfault etc. messages Andi Kleen
2008-01-16 22:27 ` [PATCH] [5/7] Replace hard coded reservations in x86-64 early boot code with dynamic table v2 Andi Kleen
2008-01-16 22:27 ` [PATCH] [6/7] Optimize lock prefix switching to run less frequently v2 Andi Kleen
2008-01-16 22:27 ` Andi Kleen [this message]
2008-01-18  9:43 ` [PATCH] [0/7] Some random x86 patches that should all go into git-x86 Ingo Molnar

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20080116222710.BF256150CA@wotan.suse.de \
    --to=ak@suse.de \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@elte.hu \
    --cc=tglx@linutronix.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®