mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 09:12:45 +00:00 
			
		
		
		
	 75564b4a5f
			
		
	
	
		75564b4a5f
		
	
	
	
	
		
			
			This expands the reach of error propagation greatly throughout the kernel. Sadly, it also exposes the fact that we're allocating (and doing other fallible things) in constructors all over the place. This patch doesn't attempt to address that of course. That's work for our future selves.
		
			
				
	
	
		
			74 lines
		
	
	
	
		
			1.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			74 lines
		
	
	
	
		
			1.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /*
 | |
|  * Copyright (c) 2021, the SerenityOS developers.
 | |
|  *
 | |
|  * SPDX-License-Identifier: BSD-2-Clause
 | |
|  */
 | |
| 
 | |
| #include <AK/OwnPtr.h>
 | |
| #include <AK/RefPtr.h>
 | |
| #include <AK/Types.h>
 | |
| #include <Kernel/Storage/RamdiskController.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::start_request(const StorageDevice&, AsyncBlockDeviceRequest&)
 | |
| {
 | |
|     VERIFY_NOT_REACHED();
 | |
| }
 | |
| 
 | |
| void RamdiskController::complete_current_request(AsyncDeviceRequest::RequestResult)
 | |
| {
 | |
|     VERIFY_NOT_REACHED();
 | |
| }
 | |
| 
 | |
| RamdiskController::RamdiskController()
 | |
|     : StorageController()
 | |
| {
 | |
|     // Populate ramdisk controllers from Multiboot boot modules, if any.
 | |
|     size_t count = 0;
 | |
|     for (auto& used_memory_range : MM.used_memory_ranges()) {
 | |
|         if (used_memory_range.type == Memory::UsedMemoryRangeType::BootModule) {
 | |
|             size_t length = Memory::page_round_up(used_memory_range.end.get()) - used_memory_range.start.get();
 | |
|             auto region_or_error = MM.allocate_kernel_region(used_memory_range.start, length, "Ramdisk", 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()
 | |
| {
 | |
| }
 | |
| 
 | |
| RefPtr<StorageDevice> RamdiskController::device(u32 index) const
 | |
| {
 | |
|     if (index >= m_devices.size())
 | |
|         return nullptr;
 | |
|     return m_devices[index];
 | |
| }
 | |
| 
 | |
| }
 |