xref: /xv6-public/memide.c (revision 906610ef)
14fa8614dSRuss Cox // Fake IDE disk; stores blocks in memory.
24fa8614dSRuss Cox // Useful for running kernel without scratch disk.
34fa8614dSRuss Cox 
44fa8614dSRuss Cox #include "types.h"
54fa8614dSRuss Cox #include "defs.h"
64fa8614dSRuss Cox #include "param.h"
74fa8614dSRuss Cox #include "mmu.h"
84fa8614dSRuss Cox #include "proc.h"
94fa8614dSRuss Cox #include "x86.h"
104fa8614dSRuss Cox #include "traps.h"
114fa8614dSRuss Cox #include "spinlock.h"
12*906610efSFrans Kaashoek #include "sleeplock.h"
13b67ed090SFrans Kaashoek #include "fs.h"
144fa8614dSRuss Cox #include "buf.h"
154fa8614dSRuss Cox 
164fa8614dSRuss Cox extern uchar _binary_fs_img_start[], _binary_fs_img_size[];
174fa8614dSRuss Cox 
184fa8614dSRuss Cox static int disksize;
194fa8614dSRuss Cox static uchar *memdisk;
204fa8614dSRuss Cox 
214fa8614dSRuss Cox void
ideinit(void)224fa8614dSRuss Cox ideinit(void)
234fa8614dSRuss Cox {
244fa8614dSRuss Cox   memdisk = _binary_fs_img_start;
25c24ac5d7SFrans Kaashoek   disksize = (uint)_binary_fs_img_size/BSIZE;
264fa8614dSRuss Cox }
274fa8614dSRuss Cox 
284fa8614dSRuss Cox // Interrupt handler.
294fa8614dSRuss Cox void
ideintr(void)304fa8614dSRuss Cox ideintr(void)
314fa8614dSRuss Cox {
324fa8614dSRuss Cox   // no-op
334fa8614dSRuss Cox }
344fa8614dSRuss Cox 
354fa8614dSRuss Cox // Sync buf with disk.
364fa8614dSRuss Cox // If B_DIRTY is set, write buf to disk, clear B_DIRTY, set B_VALID.
374fa8614dSRuss Cox // Else if B_VALID is not set, read buf from disk, set B_VALID.
384fa8614dSRuss Cox void
iderw(struct buf * b)394fa8614dSRuss Cox iderw(struct buf *b)
404fa8614dSRuss Cox {
414fa8614dSRuss Cox   uchar *p;
424fa8614dSRuss Cox 
43e85cb90cSFrans Kaashoek   if(!holdingsleep(&b->lock))
44e85cb90cSFrans Kaashoek     panic("iderw: buf not locked");
454fa8614dSRuss Cox   if((b->flags & (B_VALID|B_DIRTY)) == B_VALID)
464fa8614dSRuss Cox     panic("iderw: nothing to do");
474fa8614dSRuss Cox   if(b->dev != 1)
484fa8614dSRuss Cox     panic("iderw: request not for disk 1");
49b67ed090SFrans Kaashoek   if(b->blockno >= disksize)
50c24ac5d7SFrans Kaashoek     panic("iderw: block out of range");
514fa8614dSRuss Cox 
52b67ed090SFrans Kaashoek   p = memdisk + b->blockno*BSIZE;
534fa8614dSRuss Cox 
544fa8614dSRuss Cox   if(b->flags & B_DIRTY){
554fa8614dSRuss Cox     b->flags &= ~B_DIRTY;
56c24ac5d7SFrans Kaashoek     memmove(p, b->data, BSIZE);
574fa8614dSRuss Cox   } else
58c24ac5d7SFrans Kaashoek     memmove(b->data, p, BSIZE);
594fa8614dSRuss Cox   b->flags |= B_VALID;
604fa8614dSRuss Cox }
61