summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFrans Kaashoek <[email protected]>2016-08-18 07:39:03 -0400
committerFrans Kaashoek <[email protected]>2016-08-18 07:39:03 -0400
commit4a3576b81046b786f615a172aee0ba47d8fe8e48 (patch)
treee3605ccf1fe586d86e0309d35252f2b85e367f31
parent19f65413bdf7553036f2c388552580905730060a (diff)
downloadxv6-labs-4a3576b81046b786f615a172aee0ba47d8fe8e48.tar.gz
xv6-labs-4a3576b81046b786f615a172aee0ba47d8fe8e48.tar.bz2
xv6-labs-4a3576b81046b786f615a172aee0ba47d8fe8e48.zip
Small change to support RWMUL and WRMUL. Now xv6 truly works with a block size
that is a multiple of the sector size.
-rw-r--r--ide.c10
1 files changed, 7 insertions, 3 deletions
diff --git a/ide.c b/ide.c
index ed5a572..2606b9e 100644
--- 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);
}
}