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)
commita00b00b7250d29e8ce0fbbad0fa7e14346f38f62
treedf9bf9977322c110382d4a4d108994881399a457
parent638abcc55f9692c80eab2a38bcae72ab93199a4d
x86: Poll and discard console devices during setup

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