summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkaashoek <kaashoek>2006-07-10 13:08:37 +0000
committerkaashoek <kaashoek>2006-07-10 13:08:37 +0000
commit72ea69fbdfb6db6111cf3e1f5ef540e4a87ec29c (patch)
treec81f52d3ce2aae08e96072e35402875c5a8e4160
parent7837c71b32fc716101a859302e0349061416bd6e (diff)
downloadxv6-labs-72ea69fbdfb6db6111cf3e1f5ef540e4a87ec29c.tar.gz
xv6-labs-72ea69fbdfb6db6111cf3e1f5ef540e4a87ec29c.tar.bz2
xv6-labs-72ea69fbdfb6db6111cf3e1f5ef540e4a87ec29c.zip
read the disk using interrupts
-rw-r--r--defs.h4
-rw-r--r--ide.c19
-rw-r--r--main.c8
-rw-r--r--syscall.c22
4 files changed, 36 insertions, 17 deletions
diff --git a/defs.h b/defs.h
index a6f28e4..64ee013 100644
--- a/defs.h
+++ b/defs.h
@@ -70,6 +70,8 @@ int fd_read(struct fd *fd, char *addr, int n);
int fd_write(struct fd *fd, char *addr, int n);
// ide.c
+extern int disk_channel;
void ide_init(void);
-void ide_intri(void);
+void ide_intr(void);
+int ide_start_read(uint32_t secno, void *dst, unsigned nsecs);
int ide_read(uint32_t secno, void *dst, unsigned nsecs);
diff --git a/ide.c b/ide.c
index e870628..12e8af4 100644
--- a/ide.c
+++ b/ide.c
@@ -17,6 +17,7 @@
#define IDE_ERR 0x01
static int diskno = 0;
+int disk_channel;
static int
ide_wait_ready(int check_error)
@@ -43,6 +44,7 @@ void
ide_intr(void)
{
cprintf("ide_intr\n");
+ wakeup(&disk_channel);
}
@@ -78,12 +80,10 @@ ide_set_disk(int d)
}
int
-ide_read(uint32_t secno, void *dst, unsigned nsecs)
+ide_start_read(uint32_t secno, void *dst, unsigned nsecs)
{
- int r;
-
if(nsecs > 256)
- panic("ide_read");
+ panic("ide_start_read: nsecs too large");
ide_wait_ready(0);
@@ -95,14 +95,19 @@ ide_read(uint32_t secno, void *dst, unsigned nsecs)
outb(0x1F6, 0xE0 | ((diskno&1)<<4) | ((secno>>24)&0x0F));
outb(0x1F7, 0x20); // CMD 0x20 means read sector
-#if 0
+ return 0;
+}
+
+int
+ide_read(uint32_t secno, void *dst, unsigned nsecs)
+{
+ int r;
+
for (; nsecs > 0; nsecs--, dst += 512) {
if ((r = ide_wait_ready(1)) < 0)
return r;
insl(0x1F0, dst, 512/4);
}
-#endif
-
return 0;
}
diff --git a/main.c b/main.c
index a075def..563f216 100644
--- a/main.c
+++ b/main.c
@@ -60,12 +60,14 @@ main()
p->ppid = 0;
setupsegs(p);
- // become interruptable
- write_eflags(read_eflags() | FL_IF);
-
// turn on timer and enable interrupts on the local APIC
lapic_timerinit();
lapic_enableintr();
+ // init disk device
+ ide_init();
+
+ // become interruptable
+ write_eflags(read_eflags() | FL_IF);
p = newproc();
// load_icode(p, _binary_usertests_start, (unsigned) _binary_usertests_size);
diff --git a/syscall.c b/syscall.c
index 464d665..c7627ea 100644
--- a/syscall.c
+++ b/syscall.c
@@ -227,14 +227,24 @@ sys_cons_putc()
int
sys_block(void)
{
- char buf[1];
+ char buf[512];
+ int i, j;
cprintf("%d: call sys_block\n", cpu());
- ide_init();
- ide_read(0, buf, 1);
- // cprintf("sec0.0 %x\n", buf[0] & 0xff);
- cprintf ("call sleep\n");
- sleep (0);
+ for (i = 0; i < 100; i++) {
+ if (ide_start_read(i, buf, 1)) {
+ panic("couldn't start read\n");
+ }
+ cprintf("call sleep\n");
+ sleep (&disk_channel);
+ if (ide_read(i, buf, 1)) {
+ panic("couldn't do read\n");
+ }
+ cprintf("sector %d: ", i);
+ for (j = 0; j < 2; j++)
+ cprintf("%x ", buf[j] & 0xff);
+ cprintf("\n");
+ }
return 0;
}