x86: Poll and discard console devices during setup
authorBarret Rhoden <brho@cs.berkeley.edu>
Wed, 25 Jan 2017 19:18:27 +0000 (14:18 -0500)
committerBarret Rhoden <brho@cs.berkeley.edu>
Thu, 9 Feb 2017 17:31:08 +0000 (12:31 -0500)
The problem, which has been around forever, manifests itself as the console
not responding, and it was triggered by hitting keys during boot.  It's
always happened every so often.

The specific race is that the console devices are initialized very early
on so we can print (top of kernel_init()).  After this, if you hit keys,
then an interrupt would be generated by the device.  But if the IRQ
handlers hadn't been registered yet, then the input would be ignored.  The
device would then not generate interrupts for future keystrokes/events.

By polling the device after we register the IRQ, we reset the device.

Interestingly enough, during the debug of this (which happened concurrent
with other qemu hanging bugs), I was able to SSH in when the console was
locked up.  Then I ran "m monitor 1", to spawn the monitor on core 1.  As
soon as that happened, core 1 polled the console, which enabled the
interrupt and core 0 started to get IRQs.  After that, things worked fine.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
kern/arch/x86/init.c

index 31a796e..7bf641b 100644 (file)
@@ -66,6 +66,7 @@ static void cons_irq_init(void)
        /* Register interrupt handlers for all console devices */
        SLIST_FOREACH(i, &cdev_list, next) {
                register_irq(i->irq, irq_console, i, MKBUS(BusISA, 0, 0, 0));
+               irq_console(0, i);
 #ifdef CONFIG_POLL_CONSOLE
                ktask("cons_poller", cons_poller, i);
 #endif /* CONFIG_POLL_CONSOLE */