diff options
author | Robert Morris <[email protected]> | 2019-05-31 11:45:42 -0400 |
---|---|---|
committer | Robert Morris <[email protected]> | 2019-05-31 11:45:42 -0400 |
commit | 5d34fa2a489940f19ee6c4728e4b11b6d8ffad01 (patch) | |
tree | 98bb91986da866684aa0159d3e44991ea8a1a87c /ramdisk.c | |
parent | 2ec1959fd1016a18ef3b2d154ce7076be8f237e4 (diff) | |
download | xv6-labs-5d34fa2a489940f19ee6c4728e4b11b6d8ffad01.tar.gz xv6-labs-5d34fa2a489940f19ee6c4728e4b11b6d8ffad01.tar.bz2 xv6-labs-5d34fa2a489940f19ee6c4728e4b11b6d8ffad01.zip |
-initrd fs.img, ramdisk.c, file system
Diffstat (limited to 'ramdisk.c')
-rw-r--r-- | ramdisk.c | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/ramdisk.c b/ramdisk.c new file mode 100644 index 0000000..9901294 --- /dev/null +++ b/ramdisk.c @@ -0,0 +1,45 @@ +// +// ramdisk that uses the disk image loaded by qemu -rdinit fs.img +// + +#include "types.h" +#include "riscv.h" +#include "defs.h" +#include "param.h" +#include "memlayout.h" +#include "spinlock.h" +#include "sleeplock.h" +#include "fs.h" +#include "buf.h" + +void +ramdiskinit(void) +{ +} + +// If B_DIRTY is set, write buf to disk, clear B_DIRTY, set B_VALID. +// Else if B_VALID is not set, read buf from disk, set B_VALID. +void +ramdiskrw(struct buf *b) +{ + if(!holdingsleep(&b->lock)) + panic("ramdiskrw: buf not locked"); + if((b->flags & (B_VALID|B_DIRTY)) == B_VALID) + panic("ramdiskrw: nothing to do"); + + if(b->blockno >= FSSIZE) + panic("ramdiskrw: blockno too big"); + + uint64 diskaddr = b->blockno * BSIZE; + char *addr = (char *)RAMDISK + diskaddr; + + if(b->flags & B_DIRTY){ + // write + memmove(addr, b->data, BSIZE); + b->flags &= ~B_DIRTY; + } else { + // read + memmove(b->data, addr, BSIZE); + b->flags |= B_VALID; + } +} |