xv6

port of xv6 to x86-64
git clone http://frotz.net/git/xv6.git
Log | Files | Refs | README | LICENSE

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 }