mirror of
https://github.com/RGBCube/serenity
synced 2025-07-04 14:57:35 +00:00

Storage controllers are initialized during init and are never modified. NonnullRefPtr can be safely used instead of the NonnullLockRefPtr. This also fixes one of the UB issue that was there when using an NVMe device because of NonnullLockRefPtr. We can add proper locking when we need to modify the storage controllers after init.
67 lines
1.8 KiB
C++
67 lines
1.8 KiB
C++
/*
|
|
* Copyright (c) 2021, the SerenityOS developers.
|
|
*
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
|
*/
|
|
|
|
#include <AK/OwnPtr.h>
|
|
#include <AK/Types.h>
|
|
#include <Kernel/Library/LockRefPtr.h>
|
|
#include <Kernel/Storage/Ramdisk/Controller.h>
|
|
|
|
namespace Kernel {
|
|
|
|
NonnullRefPtr<RamdiskController> RamdiskController::initialize()
|
|
{
|
|
return adopt_ref(*new RamdiskController());
|
|
}
|
|
|
|
bool RamdiskController::reset()
|
|
{
|
|
TODO();
|
|
}
|
|
|
|
bool RamdiskController::shutdown()
|
|
{
|
|
TODO();
|
|
}
|
|
|
|
size_t RamdiskController::devices_count() const
|
|
{
|
|
return m_devices.size();
|
|
}
|
|
|
|
void RamdiskController::complete_current_request(AsyncDeviceRequest::RequestResult)
|
|
{
|
|
VERIFY_NOT_REACHED();
|
|
}
|
|
|
|
RamdiskController::RamdiskController()
|
|
: StorageController(0)
|
|
{
|
|
// Populate ramdisk controllers from Multiboot boot modules, if any.
|
|
size_t count = 0;
|
|
MM.for_each_used_memory_range([&](auto& used_memory_range) {
|
|
if (used_memory_range.type == Memory::UsedMemoryRangeType::BootModule) {
|
|
size_t length = Memory::page_round_up(used_memory_range.end.get()).release_value_but_fixme_should_propagate_errors() - used_memory_range.start.get();
|
|
auto region_or_error = MM.allocate_kernel_region(used_memory_range.start, length, "Ramdisk"sv, Memory::Region::Access::ReadWrite);
|
|
if (region_or_error.is_error()) {
|
|
dmesgln("RamdiskController: Failed to allocate kernel region of size {}", length);
|
|
} else {
|
|
m_devices.append(RamdiskDevice::create(*this, region_or_error.release_value(), 6, count));
|
|
}
|
|
count++;
|
|
}
|
|
});
|
|
}
|
|
|
|
RamdiskController::~RamdiskController() = default;
|
|
|
|
LockRefPtr<StorageDevice> RamdiskController::device(u32 index) const
|
|
{
|
|
if (index >= m_devices.size())
|
|
return nullptr;
|
|
return m_devices[index];
|
|
}
|
|
|
|
}
|