Serenity Operating System
at master 67 lines 1.8 kB view raw
1/* 2 * Copyright (c) 2021, the SerenityOS developers. 3 * 4 * SPDX-License-Identifier: BSD-2-Clause 5 */ 6 7#include <AK/OwnPtr.h> 8#include <AK/Types.h> 9#include <Kernel/Library/LockRefPtr.h> 10#include <Kernel/Storage/Ramdisk/Controller.h> 11 12namespace Kernel { 13 14NonnullLockRefPtr<RamdiskController> RamdiskController::initialize() 15{ 16 return adopt_lock_ref(*new RamdiskController()); 17} 18 19bool RamdiskController::reset() 20{ 21 TODO(); 22} 23 24bool RamdiskController::shutdown() 25{ 26 TODO(); 27} 28 29size_t RamdiskController::devices_count() const 30{ 31 return m_devices.size(); 32} 33 34void RamdiskController::complete_current_request(AsyncDeviceRequest::RequestResult) 35{ 36 VERIFY_NOT_REACHED(); 37} 38 39RamdiskController::RamdiskController() 40 : StorageController(0) 41{ 42 // Populate ramdisk controllers from Multiboot boot modules, if any. 43 size_t count = 0; 44 MM.for_each_used_memory_range([&](auto& used_memory_range) { 45 if (used_memory_range.type == Memory::UsedMemoryRangeType::BootModule) { 46 size_t length = Memory::page_round_up(used_memory_range.end.get()).release_value_but_fixme_should_propagate_errors() - used_memory_range.start.get(); 47 auto region_or_error = MM.allocate_kernel_region(used_memory_range.start, length, "Ramdisk"sv, Memory::Region::Access::ReadWrite); 48 if (region_or_error.is_error()) { 49 dmesgln("RamdiskController: Failed to allocate kernel region of size {}", length); 50 } else { 51 m_devices.append(RamdiskDevice::create(*this, region_or_error.release_value(), 6, count)); 52 } 53 count++; 54 } 55 }); 56} 57 58RamdiskController::~RamdiskController() = default; 59 60LockRefPtr<StorageDevice> RamdiskController::device(u32 index) const 61{ 62 if (index >= m_devices.size()) 63 return nullptr; 64 return m_devices[index]; 65} 66 67}