[PATCH] kexec: x86: local apic fix
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>
This commit is contained in:
parent
8f43d03fe2
commit
9635b47d91
|
@ -40,6 +40,11 @@
|
||||||
|
|
||||||
#include "io_ports.h"
|
#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
|
* Debug level
|
||||||
*/
|
*/
|
||||||
|
@ -666,26 +671,6 @@ static void apic_pm_activate(void) { }
|
||||||
* Original code written by Keir Fraser.
|
* 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)
|
static int __init apic_set_verbosity(char *str)
|
||||||
{
|
{
|
||||||
if (strcmp("debug", str) == 0)
|
if (strcmp("debug", str) == 0)
|
||||||
|
|
|
@ -44,6 +44,7 @@
|
||||||
#include <linux/edd.h>
|
#include <linux/edd.h>
|
||||||
#include <linux/nodemask.h>
|
#include <linux/nodemask.h>
|
||||||
#include <video/edid.h>
|
#include <video/edid.h>
|
||||||
|
#include <asm/apic.h>
|
||||||
#include <asm/e820.h>
|
#include <asm/e820.h>
|
||||||
#include <asm/mpspec.h>
|
#include <asm/mpspec.h>
|
||||||
#include <asm/setup.h>
|
#include <asm/setup.h>
|
||||||
|
@ -835,6 +836,16 @@ static void __init parse_cmdline_early (char ** cmdline_p)
|
||||||
#endif /* CONFIG_X86_LOCAL_APIC */
|
#endif /* CONFIG_X86_LOCAL_APIC */
|
||||||
#endif /* CONFIG_ACPI_BOOT */
|
#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.
|
* highmem=size forces highmem to be exactly 'size' bytes.
|
||||||
* This works even on boxes that have no highmem otherwise.
|
* This works even on boxes that have no highmem otherwise.
|
||||||
|
|
|
@ -5,6 +5,7 @@
|
||||||
#include <linux/pm.h>
|
#include <linux/pm.h>
|
||||||
#include <asm/fixmap.h>
|
#include <asm/fixmap.h>
|
||||||
#include <asm/apicdef.h>
|
#include <asm/apicdef.h>
|
||||||
|
#include <asm/processor.h>
|
||||||
#include <asm/system.h>
|
#include <asm/system.h>
|
||||||
|
|
||||||
#define Dprintk(x...)
|
#define Dprintk(x...)
|
||||||
|
@ -16,8 +17,20 @@
|
||||||
#define APIC_VERBOSE 1
|
#define APIC_VERBOSE 1
|
||||||
#define APIC_DEBUG 2
|
#define APIC_DEBUG 2
|
||||||
|
|
||||||
|
extern int enable_local_apic;
|
||||||
extern int apic_verbosity;
|
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
|
* Define the default level of output to be very little
|
||||||
* This can be turned up by using apic=verbose for more
|
* This can be turned up by using apic=verbose for more
|
||||||
|
|
Loading…
Reference in New Issue