xref: /xv6-public/memide.c (revision e85cb90c)
1 // Fake IDE disk; stores blocks in memory.
2 // Useful for running kernel without scratch disk.
3 
4 #include "types.h"
5 #include "defs.h"
6 #include "param.h"
7 #include "mmu.h"
8 #include "proc.h"
9 #include "x86.h"
10 #include "traps.h"
11 #include "spinlock.h"
12 #include "fs.h"
13 #include "buf.h"
14 
15 extern uchar _binary_fs_img_start[], _binary_fs_img_size[];
16 
17 static int disksize;
18 static uchar *memdisk;
19 
20 void
21 ideinit(void)
22 {
23   memdisk = _binary_fs_img_start;
24   disksize = (uint)_binary_fs_img_size/BSIZE;
25 }
26 
27 // Interrupt handler.
28 void
29 ideintr(void)
30 {
31   // no-op
32 }
33 
34 // Sync buf with disk.
35 // If B_DIRTY is set, write buf to disk, clear B_DIRTY, set B_VALID.
36 // Else if B_VALID is not set, read buf from disk, set B_VALID.
37 void
38 iderw(struct buf *b)
39 {
40   uchar *p;
41 
42   if(!holdingsleep(&b->lock))
43     panic("iderw: buf not locked");
44   if((b->flags & (B_VALID|B_DIRTY)) == B_VALID)
45     panic("iderw: nothing to do");
46   if(b->dev != 1)
47     panic("iderw: request not for disk 1");
48   if(b->blockno >= disksize)
49     panic("iderw: block out of range");
50 
51   p = memdisk + b->blockno*BSIZE;
52 
53   if(b->flags & B_DIRTY){
54     b->flags &= ~B_DIRTY;
55     memmove(p, b->data, BSIZE);
56   } else
57     memmove(b->data, p, BSIZE);
58   b->flags |= B_VALID;
59 }
60