]> Devi Nivas Git - cs3210-lab1.git/commitdiff
Small change to support RWMUL and WRMUL. Now xv6 truly works with a block size
authorFrans Kaashoek <kaashoek@mit.edu>
Thu, 18 Aug 2016 11:39:03 +0000 (07:39 -0400)
committerFrans Kaashoek <kaashoek@mit.edu>
Thu, 18 Aug 2016 11:39:03 +0000 (07:39 -0400)
that is a multiple of the sector size.

ide.c

diff --git a/ide.c b/ide.c
index ed5a572ec6e395ea0272d5d2a3a4125e544f28c2..2606b9e82800009008e84ea5a57c38795fd7b2ff 100644 (file)
--- a/ide.c
+++ b/ide.c
@@ -20,6 +20,8 @@
 
 #define IDE_CMD_READ  0x20
 #define IDE_CMD_WRITE 0x30
+#define IDE_CMD_RDMUL 0xc4
+#define IDE_CMD_WRMUL 0xc5
 
 // idequeue points to the buf now being read/written to the disk.
 // idequeue->qnext points to the next buf to be processed.
@@ -77,7 +79,9 @@ idestart(struct buf *b)
     panic("incorrect blockno");
   int sector_per_block =  BSIZE/SECTOR_SIZE;
   int sector = b->blockno * sector_per_block;
-
+  int read_cmd = (sector_per_block == 1) ? IDE_CMD_READ :  IDE_CMD_RDMUL;
+  int write_cmd = (sector_per_block == 1) ? IDE_CMD_WRITE : IDE_CMD_WRMUL;
   if (sector_per_block > 7) panic("idestart");
   
   idewait(0);
@@ -88,10 +92,10 @@ idestart(struct buf *b)
   outb(0x1f5, (sector >> 16) & 0xff);
   outb(0x1f6, 0xe0 | ((b->dev&1)<<4) | ((sector>>24)&0x0f));
   if(b->flags & B_DIRTY){
-    outb(0x1f7, IDE_CMD_WRITE);
+    outb(0x1f7, write_cmd);
     outsl(0x1f0, b->data, BSIZE/4);
   } else {
-    outb(0x1f7, IDE_CMD_READ);
+    outb(0x1f7, read_cmd);
   }
 }