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