Make tests public. Rewrite most tests. Add tests.
[pintos-anon] / src / devices / kbd.c
index ea9835876a53626e11d00d663e92b7501c4ba157..1ddf3e243c38220640016f3beb02280b5fa6f049 100644 (file)
@@ -25,14 +25,17 @@ static unsigned shift_state;
 /* Keyboard buffer. */
 static struct intq buffer;
 
+/* Number of keys pressed. */
+static int64_t key_cnt;
+
 static intr_handler_func keyboard_interrupt;
 
 /* Initializes the keyboard. */
 void
 kbd_init (void) 
 {
-  intq_init (&buffer, "keyboard");
-  intr_register (0x21, 0, INTR_OFF, keyboard_interrupt, "8042 Keyboard");
+  intq_init (&buffer);
+  intr_register_ext (0x21, keyboard_interrupt, "8042 Keyboard");
 }
 
 /* Retrieves a key from the keyboard buffer.
@@ -40,14 +43,22 @@ kbd_init (void)
 uint8_t
 kbd_getc (void) 
 {
+  enum intr_level old_level;
   uint8_t key;
-  
-  intq_lock (&buffer);
+
+  old_level = intr_disable ();
   key = intq_getc (&buffer);
-  intq_unlock (&buffer);
+  intr_set_level (old_level);
   
   return key;
 }
+
+/* Prints keyboard statistics. */
+void
+kbd_print_stats (void) 
+{
+  printf ("Keyboard: %lld keys pressed\n", key_cnt);
+}
 \f
 /* Maps a set of contiguous scancodes into characters. */
 struct keymap
@@ -159,8 +170,11 @@ keyboard_interrupt (struct intr_frame *args UNUSED)
             c += 0x80;
 
           /* Append to keyboard buffer. */
-          if (!intq_full (&buffer))
-            intq_putc (&buffer, c);
+          if (!intq_full (&buffer)) 
+            {
+              key_cnt++;
+              intq_putc (&buffer, c); 
+            }
         }
     }
   else