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