summaryrefslogtreecommitdiff
path: root/memide.c
diff options
context:
space:
mode:
authorFrans Kaashoek <[email protected]>2011-07-27 20:49:45 -0400
committerFrans Kaashoek <[email protected]>2011-07-27 20:49:45 -0400
commitdccb915282854476ce47752df6631dcce3b8f661 (patch)
treea84aa8ed35618f99c3d7e8cdd466d22ae7bad597 /memide.c
parent9acdfe0d04f3fcf95c6e392e08afb45bdfe16c20 (diff)
parent13a96baefc0ff5d8262c4bc8c797bee4b157443c (diff)
downloadxv6-labs-dccb915282854476ce47752df6631dcce3b8f661.tar.gz
xv6-labs-dccb915282854476ce47752df6631dcce3b8f661.tar.bz2
xv6-labs-dccb915282854476ce47752df6631dcce3b8f661.zip
Merge commit 'origin/master' into page
Diffstat (limited to 'memide.c')
-rw-r--r--memide.c58
1 files changed, 58 insertions, 0 deletions
diff --git a/memide.c b/memide.c
new file mode 100644
index 0000000..d2c5bb7
--- /dev/null
+++ b/memide.c
@@ -0,0 +1,58 @@
+// Fake IDE disk; stores blocks in memory.
+// Useful for running kernel without scratch disk.
+
+#include "types.h"
+#include "defs.h"
+#include "param.h"
+#include "mmu.h"
+#include "proc.h"
+#include "x86.h"
+#include "traps.h"
+#include "spinlock.h"
+#include "buf.h"
+
+extern uchar _binary_fs_img_start[], _binary_fs_img_size[];
+
+static int disksize;
+static uchar *memdisk;
+
+void
+ideinit(void)
+{
+ memdisk = _binary_fs_img_start;
+ disksize = (uint)_binary_fs_img_size/512;
+}
+
+// Interrupt handler.
+void
+ideintr(void)
+{
+ // no-op
+}
+
+// Sync buf with disk.
+// 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
+iderw(struct buf *b)
+{
+ uchar *p;
+
+ if(!(b->flags & B_BUSY))
+ panic("iderw: buf not busy");
+ if((b->flags & (B_VALID|B_DIRTY)) == B_VALID)
+ panic("iderw: nothing to do");
+ if(b->dev != 1)
+ panic("iderw: request not for disk 1");
+ if(b->sector >= disksize)
+ panic("iderw: sector out of range");
+
+ p = memdisk + b->sector*512;
+
+ if(b->flags & B_DIRTY){
+ b->flags &= ~B_DIRTY;
+ memmove(p, b->data, 512);
+ } else
+ memmove(b->data, p, 512);
+ b->flags |= B_VALID;
+}