#include "devices/storage/RAMDisk/RAMDiskDevice.hpp" #include "kapi/boot_module/boot_module.hpp" #include "kapi/system.hpp" #include "devices/BlockDevice.hpp" #include #include namespace devices::storage::ram_disk { ram_disk_device::ram_disk_device() // TODO BA-FS26 remove when kstd::vector is available : block_device(0, 0) {} ram_disk_device::ram_disk_device(kapi::boot_modules::boot_module const & module, size_t major, size_t minor) : block_device(major, minor) , m_boot_module(module) {} auto ram_disk_device::read_block(size_t block_index, void * buffer) const -> void { if (buffer == nullptr) { kapi::system::panic("[RAM DISK DEVICE] read_block called with null buffer."); } size_t const offset = block_index * block_size; size_t const limit = m_boot_module.size; size_t const available = (offset < limit) ? (limit - offset) : 0; size_t const to_copy = (available < block_size) ? available : block_size; if (to_copy > 0) { auto const source = static_cast(m_boot_module.start_address) + offset; kstd::libc::memcpy(buffer, source, to_copy); } if (to_copy < block_size) { kstd::libc::memset(static_cast(buffer) + to_copy, std::byte{0}, block_size - to_copy); } } auto ram_disk_device::write_block(size_t block_index, void const * buffer) -> void { if (buffer == nullptr) { kapi::system::panic("[RAM DISK DEVICE] write_block called with null buffer."); } size_t const offset = block_index * block_size; size_t const limit = m_boot_module.size; if (offset >= limit) return; size_t const available = limit - offset; size_t const to_write = (available < block_size) ? available : block_size; auto const destination = static_cast(m_boot_module.start_address) + offset; kstd::libc::memcpy(destination, buffer, to_write); } } // namespace devices::storage::ram_disk