Fixes a race in console.c
authorBarret Rhoden <brho@cs.berkeley.edu>
Mon, 27 Jul 2009 00:28:01 +0000 (17:28 -0700)
committerBarret Rhoden <brho@cs.berkeley.edu>
Mon, 27 Jul 2009 03:01:09 +0000 (20:01 -0700)
Putting a character now has it's own lock, since the printf-family is not currently
the only way to get to cons_putc() (reading a key, for example).  This also
means that now there is one less weird race where serial out will get something
different than the console (could have happened before).

Note that this bug was noticed by Ivy (deputy), which detected an overflow of
crt_buf[crt_pos++], which is usually caused by unhandled concurrency in console.c.

kern/src/console.c

index 5cdfc14..eff50aa 100644 (file)
@@ -3,6 +3,7 @@
 #include <arch/x86.h>
 #include <arch/console.h>
 #include <arch/kbdreg.h>
+#include <atomic.h>
 #include <string.h>
 #include <assert.h>
 
@@ -526,11 +527,14 @@ cons_getc(void)
 void
 cons_putc(int c)
 {
+       static uint32_t lock;
+       spin_lock_irqsave(&lock);
        #ifndef SERIAL_IO
                serial_putc(c);
        #endif
        //lpt_putc(c);
        cga_putc(c);
+       spin_unlock_irqsave(&lock);
 }
 
 // initialize the console devices