summaryrefslogtreecommitdiff
path: root/console.c
diff options
context:
space:
mode:
Diffstat (limited to 'console.c')
-rw-r--r--console.c17
1 files changed, 13 insertions, 4 deletions
diff --git a/console.c b/console.c
index 3d19a8e..d1741dd 100644
--- a/console.c
+++ b/console.c
@@ -304,26 +304,31 @@ char kbd_buf[KBD_BUF];
int kbd_r;
int kbd_w;
struct spinlock kbd_lock;
+static uint shift;
void
kbd_intr()
{
uint st, data, c;
- static uint shift;
+
+ acquire(&kbd_lock);
st = inb(KBSTATP);
if ((st & KBS_DIB) == 0){
+ release(&kbd_lock);
return;
}
data = inb(KBDATAP);
if (data == 0xE0) {
shift |= E0ESC;
+ release(&kbd_lock);
return;
} else if (data & 0x80) {
// Key released
data = (shift & E0ESC ? data : data & 0x7F);
shift &= ~(shiftcode[data] | E0ESC);
+ release(&kbd_lock);
return;
} else if (shift & E0ESC) {
// Last character was an E0 escape; or with 0x80
@@ -341,8 +346,12 @@ kbd_intr()
else if ('A' <= c && c <= 'Z')
c += 'a' - 'A';
}
-
- acquire(&kbd_lock);
+
+ // xxx hack
+ if (c == 0x0) {
+ release(&kbd_lock);
+ return;
+ }
if(((kbd_w + 1) % KBD_BUF) != kbd_r){
kbd_buf[kbd_w++] = c;
@@ -367,7 +376,7 @@ console_read(int minor, char *dst, int n)
sleep(&kbd_r, &kbd_lock);
while(n > 0 && kbd_w != kbd_r){
- *dst = kbd_buf[kbd_r];
+ *dst = (kbd_buf[kbd_r]) & 0xff;
cons_putc(*dst & 0xff);
dst++;
--n;