c24ac5d763
that they can be different. Clean up mkfs, simplifying specifying fs parameters, remove some redundancy between fs and mkfs, and fix disk layout bugs. Call blocks in the file system blocks instead of sectors. Passes usertests for different block sizes.
58 lines
1.2 KiB
C
58 lines
1.2 KiB
C
// Fake IDE disk; stores blocks in memory.
|
|
// Useful for running kernel without scratch disk.
|
|
|
|
#include "types.h"
|
|
#include "defs.h"
|
|
#include "param.h"
|
|
#include "mmu.h"
|
|
#include "proc.h"
|
|
#include "x86.h"
|
|
#include "traps.h"
|
|
#include "spinlock.h"
|
|
#include "buf.h"
|
|
|
|
extern uchar _binary_fs_img_start[], _binary_fs_img_size[];
|
|
|
|
static int disksize;
|
|
static uchar *memdisk;
|
|
|
|
void
|
|
ideinit(void)
|
|
{
|
|
memdisk = _binary_fs_img_start;
|
|
disksize = (uint)_binary_fs_img_size/BSIZE;
|
|
}
|
|
|
|
// Interrupt handler.
|
|
void
|
|
ideintr(void)
|
|
{
|
|
// no-op
|
|
}
|
|
|
|
// Sync buf with disk.
|
|
// If B_DIRTY is set, write buf to disk, clear B_DIRTY, set B_VALID.
|
|
// Else if B_VALID is not set, read buf from disk, set B_VALID.
|
|
void
|
|
iderw(struct buf *b)
|
|
{
|
|
uchar *p;
|
|
|
|
if(!(b->flags & B_BUSY))
|
|
panic("iderw: buf not busy");
|
|
if((b->flags & (B_VALID|B_DIRTY)) == B_VALID)
|
|
panic("iderw: nothing to do");
|
|
if(b->dev != 1)
|
|
panic("iderw: request not for disk 1");
|
|
if(b->block >= disksize)
|
|
panic("iderw: block out of range");
|
|
|
|
p = memdisk + b->block*BSIZE;
|
|
|
|
if(b->flags & B_DIRTY){
|
|
b->flags &= ~B_DIRTY;
|
|
memmove(p, b->data, BSIZE);
|
|
} else
|
|
memmove(b->data, p, BSIZE);
|
|
b->flags |= B_VALID;
|
|
}
|