diff options
author | rtm <rtm> | 2006-08-11 13:55:18 +0000 |
---|---|---|
committer | rtm <rtm> | 2006-08-11 13:55:18 +0000 |
commit | 17a856577f9db766b8ef7099d0575d378dff5dd1 (patch) | |
tree | 53d0c687d9c9bf83d097a2171c48d04a569c5a61 /console.c | |
parent | 5be0039ce9e22f140a29e167526c64c723c5be3c (diff) | |
download | xv6-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.c | 32 |
1 files changed, 29 insertions, 3 deletions
@@ -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); |