diff options
author | Frans Kaashoek <[email protected]> | 2016-08-18 07:39:03 -0400 |
---|---|---|
committer | Frans Kaashoek <[email protected]> | 2016-08-18 07:39:03 -0400 |
commit | 4a3576b81046b786f615a172aee0ba47d8fe8e48 (patch) | |
tree | e3605ccf1fe586d86e0309d35252f2b85e367f31 | |
parent | 19f65413bdf7553036f2c388552580905730060a (diff) | |
download | xv6-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.c | 10 |
1 files changed, 7 insertions, 3 deletions
@@ -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); } } |