101 lines
2.0 KiB
C
101 lines
2.0 KiB
C
// ramdisk.c
|
|
// Author: Josh Holtrop
|
|
// Date: 08/20/04
|
|
// Modified: 08/22/04
|
|
|
|
#include "block/ramdisk.h"
|
|
#include "fs/devices.h"
|
|
#include "functions.h"
|
|
#include "mm/vmm.h"
|
|
#include "lang/asmfuncs.h"
|
|
|
|
ramdisk_t *ramdisks[256];
|
|
|
|
int ramdisk_init(major_t major)
|
|
{
|
|
dev_driver_t *ramdisk_driver;
|
|
if (( ramdisk_driver = New(dev_driver_t) ))
|
|
{
|
|
ramdisk_driver->block_read = ramdisk_block_read;
|
|
ramdisk_driver->block_write = ramdisk_block_write;
|
|
devices_register_major('b', major, ramdisk_driver);
|
|
return 0;
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
minor_t ramdisk_new(u32_t size)
|
|
{
|
|
int i;
|
|
for (i = 0; i < 256; i++)
|
|
{
|
|
if (!ramdisks[i])
|
|
{
|
|
void *start;
|
|
if (( start = kmalloc(size) ))
|
|
{
|
|
ramdisks[i] = New(ramdisk_t);
|
|
ramdisks[i]->start = start;
|
|
ramdisks[i]->size = size;
|
|
return i;
|
|
}
|
|
return -2;
|
|
}
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
minor_t ramdisk_register(void *ramdisk, u32_t size)
|
|
{
|
|
int i;
|
|
for (i = 0; i < 256; i++)
|
|
{
|
|
if (!ramdisks[i])
|
|
{
|
|
ramdisks[i] = New(ramdisk_t);
|
|
ramdisks[i]->start = ramdisk;
|
|
ramdisks[i]->size = size;
|
|
return i;
|
|
}
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
int ramdisk_remove(minor_t minor)
|
|
{
|
|
if (ramdisks[minor])
|
|
{
|
|
kfree(ramdisks[minor]->start);
|
|
kfree(ramdisks[minor]);
|
|
ramdisks[minor] = NULL;
|
|
return 0;
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
int ramdisk_block_read(minor_t minor, u32_t blockNum, u32_t count, void *buffer)
|
|
{
|
|
if (!ramdisks[minor])
|
|
return -1;
|
|
if ((blockNum << BLOCK_SIZE_LOG) >= ramdisks[minor]->size)
|
|
return -2;
|
|
void *rdAddr = ramdisks[minor]->start + (blockNum << BLOCK_SIZE_LOG);
|
|
u32_t copyLen = min(count << BLOCK_SIZE_LOG, ramdisks[minor]->size - (u32_t)rdAddr);
|
|
memcpyd(buffer, rdAddr, copyLen >> 2);
|
|
return copyLen;
|
|
}
|
|
|
|
int ramdisk_block_write(minor_t minor, u32_t blockNum, u32_t count, void *buffer)
|
|
{
|
|
if (!ramdisks[minor])
|
|
return -1;
|
|
if ((blockNum << BLOCK_SIZE_LOG) >= ramdisks[minor]->size)
|
|
return -2;
|
|
void *rdAddr = ramdisks[minor]->start + (blockNum << BLOCK_SIZE_LOG);
|
|
u32_t copyLen = min(count << BLOCK_SIZE_LOG, ramdisks[minor]->size - (u32_t)rdAddr);
|
|
memcpyd(rdAddr, buffer, copyLen >> 2);
|
|
return copyLen;
|
|
}
|
|
|
|
|