root/kernel/ramdisk.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. ramdiskinit
  2. ramdiskrw

   1 //
   2 // ramdisk that uses the disk image loaded by qemu -initrd fs.img
   3 //
   4 
   5 #include "types.h"
   6 #include "riscv.h"
   7 #include "defs.h"
   8 #include "param.h"
   9 #include "memlayout.h"
  10 #include "spinlock.h"
  11 #include "sleeplock.h"
  12 #include "fs.h"
  13 #include "buf.h"
  14 
  15 void
  16 ramdiskinit(void)
  17 {
  18 }
  19 
  20 // If B_DIRTY is set, write buf to disk, clear B_DIRTY, set B_VALID.
  21 // Else if B_VALID is not set, read buf from disk, set B_VALID.
  22 void
  23 ramdiskrw(struct buf *b)
  24 {
  25   if(!holdingsleep(&b->lock))
  26     panic("ramdiskrw: buf not locked");
  27   if((b->flags & (B_VALID|B_DIRTY)) == B_VALID)
  28     panic("ramdiskrw: nothing to do");
  29 
  30   if(b->blockno >= FSSIZE)
  31     panic("ramdiskrw: blockno too big");
  32 
  33   uint64 diskaddr = b->blockno * BSIZE;
  34   char *addr = (char *)RAMDISK + diskaddr;
  35 
  36   if(b->flags & B_DIRTY){
  37     // write
  38     memmove(addr, b->data, BSIZE);
  39     b->flags &= ~B_DIRTY;
  40   } else {
  41     // read
  42     memmove(b->data, addr, BSIZE);
  43     b->flags |= B_VALID;
  44   }
  45 }

/* [<][>][^][v][top][bottom][index][help] */