Avoids nehalem keyboard issues, better monitors
authorBarret Rhoden <brho@cs.berkeley.edu>
Wed, 18 May 2011 23:03:28 +0000 (16:03 -0700)
committerKevin Klues <klueska@cs.berkeley.edu>
Thu, 3 Nov 2011 00:36:03 +0000 (17:36 -0700)
My nehalem locks up if I try to read from the keyboard on any core other
than core 0.  This detects the model processor and aborts reading the KB
(assuming you have the Makelocal flag set).  Most people won't need
this.

If you use it and you try to readline/monitor from a non-core0, you'll
need to input via the serial port, since the kernel still expects
something.

Makeconfig
Makelocal.template
kern/arch/i686/console.c

index f5fa759..56383f1 100644 (file)
@@ -31,6 +31,7 @@ CONFIG_BOXBORO:=                   -D__CONFIG_BOXBORO__
 CONFIG_RESET_STACKS:=              -D__CONFIG_RESET_STACKS__
 CONFIG_PCI_VERBOSE:=               -D__CONFIG_PCI_VERBOSE__
 CONFIG_ETH_AUDIO:=                 -D__CONFIG_ETH_AUDIO__
+CONFIG_KB_CORE0_ONLY:=             -D__CONFIG_KB_CORE0_ONLY__
 
 # Userspace configuration parameters
 # By default, each of these options will be turned off
index 33a18b8..84020fb 100644 (file)
@@ -29,6 +29,8 @@
 #KERN_CFLAGS += $(CONFIG_PCI_VERBOSE)
 # Rimas's Ethernet audio device
 #KERN_CFLAGS += $(CONFIG_ETH_AUDIO)
+# Avoid KB input on buggy nehalems (brho's machine)
+#KERN_CFLAGS += $(CONFIG_KB_CORE0_ONLY)
 
 #KERN_CFLAGS += -DDEVELOPER_NAME=waterman
 #KERN_CFLAGS += -DDEVELOPER_NAME=brho
index 3202c20..69db09b 100644 (file)
@@ -405,6 +405,17 @@ kbd_proc_data(void)
        int c;
        uint8_t data;
 
+#ifdef __CONFIG_KB_CORE0_ONLY__
+       /* Ghetto hack to avoid crashing brho's buggy nehalem. */
+       uint32_t eax, ebx, ecx, edx, family, model, stepping;
+       cpuid(1, &eax, &ebx, &ecx, &edx);
+       family = ((eax & 0x0FF00000) >> 20) + ((eax & 0x00000F00) >> 8);
+       model = ((eax & 0x000F0000) >> 12) + ((eax & 0x000000F0) >> 4);
+       stepping = eax & 0x0000000F;
+       if (family == 6 && model == 26 && stepping == 4)
+               if (core_id())
+                       return -1;
+#endif /* __CONFIG_KB_CORE0_ONLY */
 
        if ((inb(KBSTATP) & KBS_DIB) == 0)
                return -1;