diff -r 8e55c5c11475 xen/drivers/char/console.c --- a/xen/drivers/char/console.c Wed Jul 05 18:48:41 2006 +0100 +++ b/xen/drivers/char/console.c Fri Jul 07 16:40:56 2006 +0900 @@ -217,19 +217,27 @@ static void putchar_console_ring(int c) static void putchar_console_ring(int c) { conring[CONRING_IDX_MASK(conringp++)] = c; - if ( (conringp - conringc) > CONRING_SIZE ) - conringc = conringp - CONRING_SIZE; } long read_console_ring(XEN_GUEST_HANDLE(char) str, u32 *pcount, int clear) { unsigned int idx, len, max, sofar, c; unsigned long flags; + static int conringlogp = 0; max = *pcount; sofar = 0; - c = conringc; + if (clear < 0) { + if ( (conringp - conringlogp) > CONRING_SIZE ) + conringlogp = conringp - CONRING_SIZE; + c = conringlogp; + } else { + if ( (conringp - conringc) > CONRING_SIZE ) + conringc = conringp - CONRING_SIZE; + c = conringc; + } + while ( (c != conringp) && (sofar < max) ) { idx = CONRING_IDX_MASK(c); @@ -244,7 +252,7 @@ long read_console_ring(XEN_GUEST_HANDLE( c += len; } - if ( clear ) + if ( clear > 0 ) { spin_lock_irqsave(&console_lock, flags); if ( (conringp - c) > CONRING_SIZE ) @@ -252,7 +260,14 @@ long read_console_ring(XEN_GUEST_HANDLE( else conringc = c; spin_unlock_irqrestore(&console_lock, flags); - } + } else if ( clear < 0 ) { + spin_lock_irqsave(&console_lock, flags); + if ( (conringp - c) > CONRING_SIZE ) + conringlogp = conringp - CONRING_SIZE; + else + conringlogp = c; + spin_unlock_irqrestore(&console_lock, flags); + } *pcount = sofar; return 0;