]> Devi Nivas Git - cs3210-lab0.git/commitdiff
read the disk using interrupts
authorkaashoek <kaashoek>
Mon, 10 Jul 2006 13:08:37 +0000 (13:08 +0000)
committerkaashoek <kaashoek>
Mon, 10 Jul 2006 13:08:37 +0000 (13:08 +0000)
defs.h
ide.c
main.c
syscall.c

diff --git a/defs.h b/defs.h
index a6f28e4cc282cd5dce934df53812bde17be9beee..64ee01366bec74dfa566f15ccd65a83686d0863a 100644 (file)
--- 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 e8706283fa9c8217ea4d89bc308b658e962f543c..12e8af406015e0a55f35ceb89314e15ada708217 100644 (file)
--- 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 a075defc6f112d6da1ef6f9b2f18ad8c98e3163c..563f216a52494768559f0f01d7c9005dd0a93831 100644 (file)
--- 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);
index 464d665d704e007f633f930b0ba35c68fcd2ea2e..c7627eafbbf5071b5a92c2870bd28c060e973a14 100644 (file)
--- 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;
 }