Skip to content

Commit

Permalink
[PATCH] kexec: x86: local apic fix
Browse files Browse the repository at this point in the history
From: "Maciej W. Rozycki" <macro@linux-mips.org>

Fix a kexec problem whcih causes local APIC detection failure.

The problem is detect_init_APIC() is called early, before the command line
have been processed.  Therefore "lapic" (and "nolapic") have not been seen,
yet.

Signed-off-by: Maciej W. Rozycki <macro@linux-mips.org>
Signed-off-by: Eric Biederman <ebiederm@xmission.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
  • Loading branch information
Eric W. Biederman authored and Linus Torvalds committed Jun 25, 2005
1 parent 8f43d03 commit 9635b47
Show file tree
Hide file tree
Showing 3 changed files with 29 additions and 20 deletions.
25 changes: 5 additions & 20 deletions arch/i386/kernel/apic.c
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,11 @@

#include "io_ports.h"

/*
* Knob to control our willingness to enable the local APIC.
*/
int enable_local_apic __initdata = 0; /* -1=force-disable, +1=force-enable */

/*
* Debug level
*/
Expand Down Expand Up @@ -666,26 +671,6 @@ static void apic_pm_activate(void) { }
* Original code written by Keir Fraser.
*/

/*
* Knob to control our willingness to enable the local APIC.
*/
int enable_local_apic __initdata = 0; /* -1=force-disable, +1=force-enable */

static int __init lapic_disable(char *str)
{
enable_local_apic = -1;
clear_bit(X86_FEATURE_APIC, boot_cpu_data.x86_capability);
return 0;
}
__setup("nolapic", lapic_disable);

static int __init lapic_enable(char *str)
{
enable_local_apic = 1;
return 0;
}
__setup("lapic", lapic_enable);

static int __init apic_set_verbosity(char *str)
{
if (strcmp("debug", str) == 0)
Expand Down
11 changes: 11 additions & 0 deletions arch/i386/kernel/setup.c
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@
#include <linux/edd.h>
#include <linux/nodemask.h>
#include <video/edid.h>
#include <asm/apic.h>
#include <asm/e820.h>
#include <asm/mpspec.h>
#include <asm/setup.h>
Expand Down Expand Up @@ -835,6 +836,16 @@ static void __init parse_cmdline_early (char ** cmdline_p)
#endif /* CONFIG_X86_LOCAL_APIC */
#endif /* CONFIG_ACPI_BOOT */

#ifdef CONFIG_X86_LOCAL_APIC
/* enable local APIC */
else if (!memcmp(from, "lapic", 5))
lapic_enable();

/* disable local APIC */
else if (!memcmp(from, "nolapic", 6))
lapic_disable();
#endif /* CONFIG_X86_LOCAL_APIC */

/*
* highmem=size forces highmem to be exactly 'size' bytes.
* This works even on boxes that have no highmem otherwise.
Expand Down
13 changes: 13 additions & 0 deletions include/asm-i386/apic.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
#include <linux/pm.h>
#include <asm/fixmap.h>
#include <asm/apicdef.h>
#include <asm/processor.h>
#include <asm/system.h>

#define Dprintk(x...)
Expand All @@ -16,8 +17,20 @@
#define APIC_VERBOSE 1
#define APIC_DEBUG 2

extern int enable_local_apic;
extern int apic_verbosity;

static inline void lapic_disable(void)
{
enable_local_apic = -1;
clear_bit(X86_FEATURE_APIC, boot_cpu_data.x86_capability);
}

static inline void lapic_enable(void)
{
enable_local_apic = 1;
}

/*
* Define the default level of output to be very little
* This can be turned up by using apic=verbose for more
Expand Down

0 comments on commit 9635b47

Please sign in to comment.