// 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; }