diff options
author | kaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk> | 2005-05-18 16:59:25 +0000 |
---|---|---|
committer | kaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk> | 2005-05-18 16:59:25 +0000 |
commit | 7229bad40802e7591066ba291786a05da8afe328 (patch) | |
tree | ebe2fe8f5c030746a07b174bf8d1b7d8e503ae4a | |
parent | 342b92476c6021e669d8577896056acba4a9caa2 (diff) | |
download | xen-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.c | 16 |
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) |