diff src/memide.c @ 0:83c23a36980d

Init
author Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
date Fri, 26 May 2017 23:11:05 +0900
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/memide.c	Fri May 26 23:11:05 2017 +0900
@@ -0,0 +1,63 @@
+// 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 "spinlock.h"
+#include "buf.h"
+
+// a file system image, embeded
+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;
+}