aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>2005-05-18 16:59:25 +0000
committerkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>2005-05-18 16:59:25 +0000
commit7229bad40802e7591066ba291786a05da8afe328 (patch)
treeebe2fe8f5c030746a07b174bf8d1b7d8e503ae4a
parent342b92476c6021e669d8577896056acba4a9caa2 (diff)
downloadxen-7229bad40802e7591066ba291786a05da8afe328.tar.gz
xen-7229bad40802e7591066ba291786a05da8afe328.tar.bz2
xen-7229bad40802e7591066ba291786a05da8afe328.zip
bitkeeper revision 1.1159.258.137 (428b746dvt7HoFn2rjyGGO-i1yesPg)
Ensure that domain0 console receiver does not get stuck if serial input is received early during boot. Fixes bugzilla bug #41. Signed-off-by: Keir Fraser <keir@xensource.com>
-rw-r--r--xen/drivers/char/console.c16
1 files changed, 7 insertions, 9 deletions
diff --git a/xen/drivers/char/console.c b/xen/drivers/char/console.c
index ba4c53f927..f4864f5744 100644
--- a/xen/drivers/char/console.c
+++ b/xen/drivers/char/console.c
@@ -260,15 +260,13 @@ static void switch_serial_input(void)
static void __serial_rx(unsigned char c, struct xen_regs *regs)
{
if ( xen_rx )
- {
- handle_keypress(c, regs);
- }
- else if ( (serial_rx_prod-serial_rx_cons) != SERIAL_RX_SIZE )
- {
- serial_rx_ring[SERIAL_RX_MASK(serial_rx_prod)] = c;
- if ( serial_rx_prod++ == serial_rx_cons )
- send_guest_virq(dom0, VIRQ_CONSOLE);
- }
+ return handle_keypress(c, regs);
+
+ /* Deliver input to guest buffer, unless it is already full. */
+ if ( (serial_rx_prod-serial_rx_cons) != SERIAL_RX_SIZE )
+ serial_rx_ring[SERIAL_RX_MASK(serial_rx_prod++)] = c;
+ /* Always notify the guest: prevents receive path from getting stuck. */
+ send_guest_virq(dom0, VIRQ_CONSOLE);
}
static void serial_rx(unsigned char c, struct xen_regs *regs)