diff options
| author | kaashoek <kaashoek> | 2006-07-10 13:08:37 +0000 | 
|---|---|---|
| committer | kaashoek <kaashoek> | 2006-07-10 13:08:37 +0000 | 
| commit | 72ea69fbdfb6db6111cf3e1f5ef540e4a87ec29c (patch) | |
| tree | c81f52d3ce2aae08e96072e35402875c5a8e4160 | |
| parent | 7837c71b32fc716101a859302e0349061416bd6e (diff) | |
| download | xv6-labs-72ea69fbdfb6db6111cf3e1f5ef540e4a87ec29c.tar.gz xv6-labs-72ea69fbdfb6db6111cf3e1f5ef540e4a87ec29c.tar.bz2 xv6-labs-72ea69fbdfb6db6111cf3e1f5ef540e4a87ec29c.zip | |
read the disk using interrupts
| -rw-r--r-- | defs.h | 4 | ||||
| -rw-r--r-- | ide.c | 19 | ||||
| -rw-r--r-- | main.c | 8 | ||||
| -rw-r--r-- | syscall.c | 22 | 
4 files changed, 36 insertions, 17 deletions
| @@ -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); @@ -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;  } @@ -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); @@ -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;  } | 
