summaryrefslogtreecommitdiff
path: root/console.c
diff options
context:
space:
mode:
authorrtm <rtm>2006-08-11 13:55:18 +0000
committerrtm <rtm>2006-08-11 13:55:18 +0000
commit17a856577f9db766b8ef7099d0575d378dff5dd1 (patch)
tree53d0c687d9c9bf83d097a2171c48d04a569c5a61 /console.c
parent5be0039ce9e22f140a29e167526c64c723c5be3c (diff)
downloadxv6-labs-17a856577f9db766b8ef7099d0575d378dff5dd1.tar.gz
xv6-labs-17a856577f9db766b8ef7099d0575d378dff5dd1.tar.bz2
xv6-labs-17a856577f9db766b8ef7099d0575d378dff5dd1.zip
init creates console, opens 0/1/2, runs sh
sh accepts 0-argument commands (like userfs) reads from console
Diffstat (limited to 'console.c')
-rw-r--r--console.c32
1 files changed, 29 insertions, 3 deletions
diff --git a/console.c b/console.c
index 5fc1920..a91029f 100644
--- a/console.c
+++ b/console.c
@@ -169,15 +169,14 @@ panic(char *s)
}
int
-console_write (int minor, void *buf, int n)
+console_write (int minor, char *buf, int n)
{
int i;
- uchar *b = buf;
acquire(&console_lock);
for (i = 0; i < n; i++) {
- cons_putc((int) b[i]);
+ cons_putc(buf[i] & 0xff);
}
release(&console_lock);
@@ -349,6 +348,7 @@ kbd_intr()
kbd_buf[kbd_w++] = c;
if(kbd_w >= KBD_BUF)
kbd_w = 0;
+ wakeup(&kbd_r);
} else {
cprintf("kbd overflow\n");
}
@@ -356,6 +356,31 @@ kbd_intr()
release(&kbd_lock);
}
+int
+console_read(int minor, char *dst, int n)
+{
+ uint target = n;
+
+ acquire(&kbd_lock);
+
+ while(kbd_w == kbd_r)
+ sleep(&kbd_r, &kbd_lock);
+
+ while(n > 0 && kbd_w != kbd_r){
+ *dst = kbd_buf[kbd_r];
+ cons_putc(*dst & 0xff);
+ dst++;
+ --n;
+ kbd_r++;
+ if(kbd_r >= KBD_BUF)
+ kbd_r = 0;
+ }
+
+ release(&kbd_lock);
+
+ return target - n;
+}
+
void
console_init()
{
@@ -363,6 +388,7 @@ console_init()
initlock(&kbd_lock, "kbd");
devsw[CONSOLE].d_write = console_write;
+ devsw[CONSOLE].d_read = console_read;
ioapic_enable (IRQ_KBD, 1);