memide.c (1181B)
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 "buf.h" 13 14 extern uchar _binary_fs_img_start[], _binary_fs_img_size[]; 15 16 static int disksize; 17 static uchar *memdisk; 18 19 void 20 ideinit(void) 21 { 22 memdisk = _binary_fs_img_start; 23 disksize = (uint)_binary_fs_img_size/512; 24 } 25 26 // Interrupt handler. 27 void 28 ideintr(void) 29 { 30 // no-op 31 } 32 33 // Sync buf with disk. 34 // If B_DIRTY is set, write buf to disk, clear B_DIRTY, set B_VALID. 35 // Else if B_VALID is not set, read buf from disk, set B_VALID. 36 void 37 iderw(struct buf *b) 38 { 39 uchar *p; 40 41 if(!(b->flags & B_BUSY)) 42 panic("iderw: buf not busy"); 43 if((b->flags & (B_VALID|B_DIRTY)) == B_VALID) 44 panic("iderw: nothing to do"); 45 if(b->dev != 1) 46 panic("iderw: request not for disk 1"); 47 if(b->sector >= disksize) 48 panic("iderw: sector out of range"); 49 50 p = memdisk + b->sector*512; 51 52 if(b->flags & B_DIRTY){ 53 b->flags &= ~B_DIRTY; 54 memmove(p, b->data, 512); 55 } else 56 memmove(b->data, p, 512); 57 b->flags |= B_VALID; 58 }