Re: 2.6.10-rc1-mm5

From: Maciej W. Rozycki
Date: Sun Nov 14 2004 - 20:27:55 EST


On Sun, 14 Nov 2004, Stas Sergeev wrote:

> 1. Local APIC stopped working. I know
> I have to add "lapic" to the command-line,
> but now this doesn't help (in -mm4 either
> I think). dmesg says:

Here's a fix. 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.

This has been verified to work correctly with your configuration.
Andrew, please apply.

Maciej

Signed-off-by: Maciej W. Rozycki <macro@xxxxxxxxxxxxxx>

patch-2.6.10-rc1-mm5-i386-lapic-0
diff -up --recursive --new-file linux-2.6.10-rc1-mm5.macro/arch/i386/kernel/apic.c linux-2.6.10-rc1-mm5/arch/i386/kernel/apic.c
--- linux-2.6.10-rc1-mm5.macro/arch/i386/kernel/apic.c 2004-11-14 16:01:48.000000000 +0000
+++ linux-2.6.10-rc1-mm5/arch/i386/kernel/apic.c 2004-11-15 00:41:02.000000000 +0000
@@ -41,6 +41,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
*/
int apic_verbosity;
@@ -692,26 +697,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)
diff -up --recursive --new-file linux-2.6.10-rc1-mm5.macro/arch/i386/kernel/setup.c linux-2.6.10-rc1-mm5/arch/i386/kernel/setup.c
--- linux-2.6.10-rc1-mm5.macro/arch/i386/kernel/setup.c 2004-11-14 16:01:49.000000000 +0000
+++ linux-2.6.10-rc1-mm5/arch/i386/kernel/setup.c 2004-11-15 00:10:26.000000000 +0000
@@ -40,6 +40,7 @@
#include <linux/init.h>
#include <linux/edd.h>
#include <video/edid.h>
+#include <asm/apic.h>
#include <asm/e820.h>
#include <asm/mpspec.h>
#include <asm/setup.h>
@@ -814,6 +815,16 @@ static void __init parse_cmdline_early (
#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.
diff -up --recursive --new-file linux-2.6.10-rc1-mm5.macro/include/asm-i386/apic.h linux-2.6.10-rc1-mm5/include/asm-i386/apic.h
--- linux-2.6.10-rc1-mm5.macro/include/asm-i386/apic.h 2004-11-14 16:02:45.000000000 +0000
+++ linux-2.6.10-rc1-mm5/include/asm-i386/apic.h 2004-11-15 00:09:31.000000000 +0000
@@ -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...)
@@ -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
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/