// ramdisk.cpp // Author: Josh Holtrop // Date: 08/20/04 // Modified: 05/11/05 #define _HOS_CPP_ _HOS_CPP_ extern "C" { #include "functions.h" #include "mm/vmm.h" #include "lang/lang.h" } #include "block/ramdisk.h" #include "devices.h" ramdisk_t *ramdisks[256]; 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] = (ramdisk_t *)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] = (ramdisk_t *)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 blockStart, u32_t blocks, void *buffer) { if (!ramdisks[minor]) return -1; if ((blockStart << BLOCK_SIZE_LOG) >= ramdisks[minor]->size) return -2; void *rdAddr = (void *)((u32_t)ramdisks[minor]->start + (blockStart << BLOCK_SIZE_LOG)); u32_t copyLen = min(blocks << BLOCK_SIZE_LOG, ramdisks[minor]->size + (u32_t)ramdisks[minor]->start - (u32_t)rdAddr); memcpyd(buffer, rdAddr, copyLen >> 2); return copyLen; } int Ramdisk::block_write(minor_t minor, u32_t blockStart, u32_t blocks, void *buffer) { if (!ramdisks[minor]) return -1; if ((blockStart << BLOCK_SIZE_LOG) >= ramdisks[minor]->size) return -2; void *rdAddr = (void *)((u32_t)ramdisks[minor]->start + (blockStart << BLOCK_SIZE_LOG)); u32_t copyLen = min(blocks << BLOCK_SIZE_LOG, ramdisks[minor]->size + (u32_t)ramdisks[minor]->start - (u32_t)rdAddr); memcpyd(rdAddr, buffer, copyLen >> 2); return copyLen; }