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" 12b67ed090SFrans Kaashoek #include "fs.h" 134fa8614dSRuss Cox #include "buf.h" 144fa8614dSRuss Cox 154fa8614dSRuss Cox extern uchar _binary_fs_img_start[], _binary_fs_img_size[]; 164fa8614dSRuss Cox 174fa8614dSRuss Cox static int disksize; 184fa8614dSRuss Cox static uchar *memdisk; 194fa8614dSRuss Cox 204fa8614dSRuss Cox void 214fa8614dSRuss Cox ideinit(void) 224fa8614dSRuss Cox { 234fa8614dSRuss Cox memdisk = _binary_fs_img_start; 24c24ac5d7SFrans Kaashoek disksize = (uint)_binary_fs_img_size/BSIZE; 254fa8614dSRuss Cox } 264fa8614dSRuss Cox 274fa8614dSRuss Cox // Interrupt handler. 284fa8614dSRuss Cox void 294fa8614dSRuss Cox ideintr(void) 304fa8614dSRuss Cox { 314fa8614dSRuss Cox // no-op 324fa8614dSRuss Cox } 334fa8614dSRuss Cox 344fa8614dSRuss Cox // Sync buf with disk. 354fa8614dSRuss Cox // If B_DIRTY is set, write buf to disk, clear B_DIRTY, set B_VALID. 364fa8614dSRuss Cox // Else if B_VALID is not set, read buf from disk, set B_VALID. 374fa8614dSRuss Cox void 384fa8614dSRuss Cox iderw(struct buf *b) 394fa8614dSRuss Cox { 404fa8614dSRuss Cox uchar *p; 414fa8614dSRuss Cox 42*e85cb90cSFrans Kaashoek if(!holdingsleep(&b->lock)) 43*e85cb90cSFrans Kaashoek panic("iderw: buf not locked"); 444fa8614dSRuss Cox if((b->flags & (B_VALID|B_DIRTY)) == B_VALID) 454fa8614dSRuss Cox panic("iderw: nothing to do"); 464fa8614dSRuss Cox if(b->dev != 1) 474fa8614dSRuss Cox panic("iderw: request not for disk 1"); 48b67ed090SFrans Kaashoek if(b->blockno >= disksize) 49c24ac5d7SFrans Kaashoek panic("iderw: block out of range"); 504fa8614dSRuss Cox 51b67ed090SFrans Kaashoek p = memdisk + b->blockno*BSIZE; 524fa8614dSRuss Cox 534fa8614dSRuss Cox if(b->flags & B_DIRTY){ 544fa8614dSRuss Cox b->flags &= ~B_DIRTY; 55c24ac5d7SFrans Kaashoek memmove(p, b->data, BSIZE); 564fa8614dSRuss Cox } else 57c24ac5d7SFrans Kaashoek memmove(b->data, p, BSIZE); 584fa8614dSRuss Cox b->flags |= B_VALID; 594fa8614dSRuss Cox } 60