aboutsummaryrefslogtreecommitdiff
path: root/kernel/devices
diff options
context:
space:
mode:
authorLukas Oesch <lukas.oesch@ost.ch>2026-03-17 19:48:59 +0100
committerLukas Oesch <lukas.oesch@ost.ch>2026-03-17 19:48:59 +0100
commite4291ea7c01cad04a02ca3f577dba9ccbadad110 (patch)
tree4af08f01820bf13fba8dda7646d036bcbdd3df53 /kernel/devices
parent59504cfd677dd3e9d9ddb0deea4df7614efedb84 (diff)
parentfde097681f96e2c6f23ecd71a5c0037acb3ac79e (diff)
downloadteachos-e4291ea7c01cad04a02ca3f577dba9ccbadad110.tar.xz
teachos-e4291ea7c01cad04a02ca3f577dba9ccbadad110.zip
Merge branch 'tidy-up-folder-structure' into 'develop-BA-FS26'
rename files to snake_case (temp_device part1 -> renamed to device later, due... See merge request teachos/kernel!12
Diffstat (limited to 'kernel/devices')
-rw-r--r--kernel/devices/CMakeLists.txt31
-rw-r--r--kernel/devices/include/devices/block_device.hpp101
-rw-r--r--kernel/devices/include/devices/device.hpp61
-rw-r--r--kernel/devices/include/devices/storage/ram_disk/ram_disk_controller.hpp31
-rw-r--r--kernel/devices/include/devices/storage/ram_disk/ram_disk_device.hpp52
-rw-r--r--kernel/devices/include/devices/storage/storage_controller.hpp71
-rw-r--r--kernel/devices/include/devices/storage/storage_management.hpp77
-rw-r--r--kernel/devices/src/block_device.cpp42
-rw-r--r--kernel/devices/src/device.cpp28
-rw-r--r--kernel/devices/src/storage/ram_disk/ram_disk_controller.cpp28
-rw-r--r--kernel/devices/src/storage/ram_disk/ram_disk_device.cpp77
-rw-r--r--kernel/devices/src/storage/storage_controller.cpp44
-rw-r--r--kernel/devices/src/storage/storage_management.cpp85
13 files changed, 0 insertions, 728 deletions
diff --git a/kernel/devices/CMakeLists.txt b/kernel/devices/CMakeLists.txt
deleted file mode 100644
index 15d03fa..0000000
--- a/kernel/devices/CMakeLists.txt
+++ /dev/null
@@ -1,31 +0,0 @@
-add_library("kernel_devices" STATIC)
-add_library("kernel::devices" ALIAS "kernel_devices")
-
-target_sources("kernel_devices" PRIVATE
- "src/device.cpp"
- "src/block_device.cpp"
- "src/storage/storage_controller.cpp"
- "src/storage/storage_management.cpp"
- "src/storage/ram_disk/ram_disk_controller.cpp"
- "src/storage/ram_disk/ram_disk_device.cpp"
-)
-
-target_sources("kernel_devices" PUBLIC
- FILE_SET HEADERS
- BASE_DIRS "include"
- FILES
- "include/devices/device.hpp"
- "include/devices/block_device.hpp"
- "include/devices/storage/storage_controller.hpp"
- "include/devices/storage/storage_management.hpp"
- "include/devices/storage/ram_disk/ram_disk_controller.hpp"
- "include/devices/storage/ram_disk/ram_disk_device.hpp"
-)
-
-target_include_directories("kernel_devices" PUBLIC
- "include"
-)
-
-target_link_libraries("kernel_devices" PRIVATE
- "os::kapi"
-) \ No newline at end of file
diff --git a/kernel/devices/include/devices/block_device.hpp b/kernel/devices/include/devices/block_device.hpp
deleted file mode 100644
index 4831be5..0000000
--- a/kernel/devices/include/devices/block_device.hpp
+++ /dev/null
@@ -1,101 +0,0 @@
-#ifndef TEACH_OS_KERNEL_DEVICES_BLOCK_DEVICE_HPP
-#define TEACH_OS_KERNEL_DEVICES_BLOCK_DEVICE_HPP
-
-#include "devices/device.hpp"
-
-#include <cstddef>
-#include <string_view>
-
-namespace devices
-{
- /**
- * @brief Base interface for block-addressable devices.
- */
- struct block_device : device
- {
- /**
- * @brief Create a block device descriptor.
- * @param major Device major number.
- * @param minor Device minor number.
- * @param name Device name.
- * @param block_size Size of one logical block in bytes.
- */
- block_device(size_t major, size_t minor, std::string_view name, size_t block_size);
-
- /**
- * @brief Virtual destructor for block device.
- */
- virtual ~block_device() = default;
-
- /**
- * @brief Read data from the block at @p block_index into @p buffer.
- * @param block_index Zero-based block index.
- * @param buffer Destination buffer.
- * @warning Panics if @p buffer is null.
- * @note Reads up to one logical block (see constructor @p block_size). Implementations may perform a partial
- * transfer for the final block when fewer than @p block_size bytes remain.
- */
- virtual auto read_block(size_t block_index, void * buffer) const -> void = 0;
-
- /**
- * @brief Write data to the block at @p block_index.
- * @param block_index Zero-based block index.
- * @param buffer Source buffer, must not be null.
- * @warning Panics if @p buffer is null.
- * @note Writes up to one logical block (see constructor @p block_size).
- * Implementations may perform a partial transfer for the final block when
- * fewer than @p block_size bytes remain.
- */
- virtual auto write_block(size_t block_index, void const * buffer) -> void = 0;
-
- /**
- * @brief Return logical block size in bytes.
- * @return One logical block size in bytes.
- */
- [[nodiscard]] auto block_size() const -> size_t;
-
- /**
- * @brief Return device capacity in bytes.
- * @return Total number of addressable bytes.
- */
- [[nodiscard]] auto capacity() const -> size_t;
-
- /**
- * @brief Override to identify block devices.
- * @return true if this device is a block device, false otherwise.
- */
-
- [[nodiscard]] auto is_block_device() const -> bool override
- {
- return true;
- }
-
- protected:
- /**
- * @brief Information describing the transfer window for one block index.
- */
- struct transfer_info
- {
- size_t offset;
- size_t to_transfer;
- size_t remainder;
- };
-
- /**
- * @brief Return total device size in bytes.
- * @return Total number of addressable bytes.
- */
- [[nodiscard]] virtual auto size() const -> size_t = 0;
-
- /**
- * @brief Compute transfer information for @p block_index.
- * @param block_index Zero-based block index.
- * @return Computed transfer information for one logical block access.
- */
- [[nodiscard]] auto calculate_transfer(size_t block_index) const -> transfer_info;
-
- size_t m_block_size;
- };
-} // namespace devices
-
-#endif \ No newline at end of file
diff --git a/kernel/devices/include/devices/device.hpp b/kernel/devices/include/devices/device.hpp
deleted file mode 100644
index d6f520f..0000000
--- a/kernel/devices/include/devices/device.hpp
+++ /dev/null
@@ -1,61 +0,0 @@
-#ifndef TEACH_OS_KERNEL_DEVICES_DEVICE_HPP
-#define TEACH_OS_KERNEL_DEVICES_DEVICE_HPP
-
-#include <cstddef>
-#include <string_view>
-
-namespace devices
-{
- /**
- * @brief Base device identified by a major, minor number and name.
- */
- struct device
- {
- /**
- * @brief Create a device identifier from @p major, @p minor and @p name.
- * @param major Device major number.
- * @param minor Device minor number.
- * @param name Device name.
- */
- device(size_t major, size_t minor, std::string_view name);
-
- /**
- * @brief Virtual destructor for device.
- */
- virtual ~device() = default;
-
- /**
- * @brief Returns the major number of the device.
- * @return Device major number.
- */
- [[nodiscard]] auto major() const -> size_t;
-
- /**
- * @brief Returns the minor number of the device.
- * @return Device minor number.
- */
- [[nodiscard]] auto minor() const -> size_t;
-
- /**
- * @brief Returns the name of the device.
- * @return Device name.
- */
- [[nodiscard]] auto name() const -> std::string_view;
-
- /**
- * @brief Check if the device is a block device.
- * @return true if this device is a block device, false otherwise.
- */
- [[nodiscard]] virtual auto is_block_device() const -> bool
- {
- return false;
- }
-
- private:
- size_t m_major;
- size_t m_minor;
- std::string_view m_name;
- };
-} // namespace devices
-
-#endif \ No newline at end of file
diff --git a/kernel/devices/include/devices/storage/ram_disk/ram_disk_controller.hpp b/kernel/devices/include/devices/storage/ram_disk/ram_disk_controller.hpp
deleted file mode 100644
index f69f8d8..0000000
--- a/kernel/devices/include/devices/storage/ram_disk/ram_disk_controller.hpp
+++ /dev/null
@@ -1,31 +0,0 @@
-#ifndef TEACH_OS_KERNEL_DEVICES_STORAGE_RAM_DISK_CONTROLLER_HPP
-#define TEACH_OS_KERNEL_DEVICES_STORAGE_RAM_DISK_CONTROLLER_HPP
-
-#include "kapi/boot_module/boot_module_registry.hpp"
-
-#include "devices/storage/storage_controller.hpp"
-
-namespace devices::storage::ram_disk
-{
- /**
- * @brief Storage controller that exposes boot modules as RAM-disk devices.
- */
- struct ram_disk_controller : storage_controller
- {
- /**
- * @brief Create a RAM-disk controller.
- * @param registry Boot module registry as device source.
- */
- explicit ram_disk_controller(kapi::boot_modules::boot_module_registry const * registry);
-
- /**
- * @brief Probe boot modules and create RAM-disk devices.
- */
- auto probe() -> void override;
-
- private:
- kapi::boot_modules::boot_module_registry const * m_boot_module_registry;
- };
-} // namespace devices::storage::ram_disk
-
-#endif \ No newline at end of file
diff --git a/kernel/devices/include/devices/storage/ram_disk/ram_disk_device.hpp b/kernel/devices/include/devices/storage/ram_disk/ram_disk_device.hpp
deleted file mode 100644
index 1edf48c..0000000
--- a/kernel/devices/include/devices/storage/ram_disk/ram_disk_device.hpp
+++ /dev/null
@@ -1,52 +0,0 @@
-#ifndef TEACH_OS_KERNEL_DEVICES_STORAGE_RAM_DISK_DEVICE_HPP
-#define TEACH_OS_KERNEL_DEVICES_STORAGE_RAM_DISK_DEVICE_HPP
-
-#include "kapi/boot_module/boot_module.hpp"
-
-#include "devices/block_device.hpp"
-
-#include <cstddef>
-
-namespace devices::storage::ram_disk
-{
- /**
- * @brief Block device for a boot module.
- */
- struct ram_disk_device : block_device
- {
- /**
- * @brief Create a RAM disk for the @p module.
- * @param module Boot module providing the memory region.
- * @param major Device major number.
- * @param minor Device minor number.
- */
- ram_disk_device(kapi::boot_modules::boot_module const & module, size_t major, size_t minor);
-
- /**
- * @brief Read one logical block into @p buffer.
- * @param block_index Zero-based block index.
- * @param buffer Destination buffer, must not be null.
- * @note If the request reaches the module end, only available bytes are copied and the rest of the
- * logical block is filled with zeros.
- */
- auto read_block(size_t block_index, void * buffer) const -> void override;
-
- /**
- * @brief Write one logical block from @p buffer.
- * @param block_index Zero-based block index.
- * @param buffer Source buffer, must not be null.
- * @note If the request reaches the module end, only the bytes in the module range are written.
- */
- auto write_block(size_t block_index, void const * buffer) -> void override;
-
- private:
- /**
- * @brief Return module size in bytes.
- */
- [[nodiscard]] auto size() const -> size_t override;
-
- kapi::boot_modules::boot_module m_boot_module{};
- };
-} // namespace devices::storage::ram_disk
-
-#endif \ No newline at end of file
diff --git a/kernel/devices/include/devices/storage/storage_controller.hpp b/kernel/devices/include/devices/storage/storage_controller.hpp
deleted file mode 100644
index 7760fc9..0000000
--- a/kernel/devices/include/devices/storage/storage_controller.hpp
+++ /dev/null
@@ -1,71 +0,0 @@
-#ifndef TEACH_OS_KERNEL_DEVICES_STORAGE_STORAGE_CONTROLLER_HPP
-#define TEACH_OS_KERNEL_DEVICES_STORAGE_STORAGE_CONTROLLER_HPP
-
-#include "devices/device.hpp"
-
-#include <kstd/memory>
-#include <kstd/vector>
-
-#include <cstddef>
-
-namespace devices::storage
-{
- /**
- * @brief Base interface for storage controllers.
- *
- * A storage controller probes for devices and resolves devices by major/minor
- * numbers.
- */
- struct storage_controller
- {
- /**
- * @brief Virtual destructor.
- */
- virtual ~storage_controller() = default;
-
- /**
- * @brief Probe the controller and register discovered devices.
- */
- virtual auto probe() -> void = 0;
-
- /**
- * @brief Assign the major number and minor stride for this controller.
- * @param major Major number assigned to this controller.
- * @param minors_per_dev Minor number stride between devices.
- */
- auto set_ids(size_t major, size_t minors_per_dev) -> void;
-
- /**
- * @brief Return the assigned major number.
- * @return Assigned major number.
- */
- [[nodiscard]] auto major() const -> size_t;
-
- /**
- * @brief Return the number of devices managed by this controller.
- * @return Number of managed devices.
- */
- [[nodiscard]] auto devices_count() const -> size_t;
-
- /**
- * @brief Return all devices managed by this controller.
- * @return Vector of all managed devices.
- */
- [[nodiscard]] auto all_devices() const -> kstd::vector<kstd::shared_ptr<devices::device>> const &;
-
- /**
- * @brief Find a managed device by major/minor numbers.
- * @param major Device major number.
- * @param minor Device minor number.
- * @return Matching block device, or nullptr if no device matches.
- */
- [[nodiscard]] auto device_by_minor(size_t minor) const -> kstd::shared_ptr<devices::device>;
-
- protected:
- size_t m_major{};
- size_t m_minors_per_device{};
- kstd::vector<kstd::shared_ptr<devices::device>> m_devices{};
- };
-} // namespace devices::storage
-
-#endif \ No newline at end of file
diff --git a/kernel/devices/include/devices/storage/storage_management.hpp b/kernel/devices/include/devices/storage/storage_management.hpp
deleted file mode 100644
index f8ffda8..0000000
--- a/kernel/devices/include/devices/storage/storage_management.hpp
+++ /dev/null
@@ -1,77 +0,0 @@
-#ifndef TEACH_OS_KERNEL_DEVICES_STORAGE_STORAGE_MANAGEMENT_HPP
-#define TEACH_OS_KERNEL_DEVICES_STORAGE_STORAGE_MANAGEMENT_HPP
-
-#include "devices/device.hpp"
-#include "devices/storage/storage_controller.hpp"
-
-#include <kstd/memory>
-#include <kstd/vector>
-
-#include <cstddef>
-
-namespace devices::storage
-{
- /**
- * @brief Global storage subsystem manager.
- *
- * Owns registered storage controllers and provides device lookup by
- * major/minor numbers.
- */
- struct storage_management
- {
- /**
- * @brief Initialize global storage management.
- *
- * Creates the singleton instance, registers controllers and probes
- * them for devices.
- *
- * @warning Panics if called more than once.
- */
- auto static init() -> void;
-
- /**
- * @brief Return the active storage manager singleton.
- * @return Reference to the active storage manager.
- * @warning Panics if storage management has not been initialized.
- */
- auto static get() -> storage_management &;
-
- /**
- * @brief Register a storage controller.
- * @param controller Controller to register.
- *
- * Assigns controller IDs (major number range and minors per device).
- */
- auto add_controller(kstd::shared_ptr<storage_controller> const & controller) -> void;
-
- /**
- * @brief Return all registered storage controllers.
- * @return Vector of all registered storage controllers.
- */
- [[nodiscard]] auto all_controllers() const -> kstd::vector<kstd::shared_ptr<storage_controller>> const &;
-
- /**
- * @brief Find a device by major/minor numbers.
- * @param major Device major number.
- * @param minor Device minor number.
- * @return Matching device, or nullptr if no device matches.
- */
- auto device_by_major_minor(size_t major, size_t minor) -> kstd::shared_ptr<device>;
-
- /**
- * @brief Determine the boot device.
- * @return Boot device, or nullptr if it cannot be determined.
- */
- auto determine_boot_device() -> kstd::shared_ptr<device>;
-
- private:
- /**
- * @brief Private default constructor for storage management singleton.
- */
- storage_management() = default;
-
- kstd::vector<kstd::shared_ptr<storage_controller>> m_controllers{};
- };
-} // namespace devices::storage
-
-#endif \ No newline at end of file
diff --git a/kernel/devices/src/block_device.cpp b/kernel/devices/src/block_device.cpp
deleted file mode 100644
index 40f842a..0000000
--- a/kernel/devices/src/block_device.cpp
+++ /dev/null
@@ -1,42 +0,0 @@
-#include "devices/block_device.hpp"
-
-#include "kapi/system.hpp"
-
-#include "devices/device.hpp"
-
-#include <cstddef>
-#include <string_view>
-
-namespace devices
-{
- block_device::block_device(size_t major, size_t minor, std::string_view name, size_t block_size)
- : device(major, minor, name)
- , m_block_size(block_size)
- {
- if (m_block_size == 0)
- {
- kapi::system::panic("[DEVICES] block_device constructed with zero block size.");
- }
- }
-
- auto block_device::calculate_transfer(size_t block_index) const -> transfer_info
- {
- size_t const offset = block_index * m_block_size;
- size_t const limit = size();
-
- size_t const available = (offset < limit) ? (limit - offset) : 0;
- size_t const to_transfer = (available < m_block_size) ? available : m_block_size;
-
- return {offset, to_transfer, m_block_size - to_transfer};
- }
-
- auto block_device::block_size() const -> size_t
- {
- return m_block_size;
- }
-
- auto block_device::capacity() const -> size_t
- {
- return size();
- }
-} // namespace devices \ No newline at end of file
diff --git a/kernel/devices/src/device.cpp b/kernel/devices/src/device.cpp
deleted file mode 100644
index 8184321..0000000
--- a/kernel/devices/src/device.cpp
+++ /dev/null
@@ -1,28 +0,0 @@
-#include "devices/device.hpp"
-
-#include <cstddef>
-#include <string_view>
-
-namespace devices
-{
- device::device(size_t major, size_t minor, std::string_view name)
- : m_major(major)
- , m_minor(minor)
- , m_name(name)
- {}
-
- auto device::major() const -> size_t
- {
- return m_major;
- }
-
- auto device::minor() const -> size_t
- {
- return m_minor;
- }
-
- auto device::name() const -> std::string_view
- {
- return m_name;
- }
-} // namespace devices \ No newline at end of file
diff --git a/kernel/devices/src/storage/ram_disk/ram_disk_controller.cpp b/kernel/devices/src/storage/ram_disk/ram_disk_controller.cpp
deleted file mode 100644
index 3d14faf..0000000
--- a/kernel/devices/src/storage/ram_disk/ram_disk_controller.cpp
+++ /dev/null
@@ -1,28 +0,0 @@
-#include "devices/storage/ram_disk/ram_disk_controller.hpp"
-
-#include "kapi/boot_module/boot_module_registry.hpp"
-
-#include "devices/storage/ram_disk/ram_disk_device.hpp"
-
-#include <kstd/memory>
-#include <kstd/print>
-
-#include <algorithm>
-#include <cstddef>
-
-namespace devices::storage::ram_disk
-{
- ram_disk_controller::ram_disk_controller(kapi::boot_modules::boot_module_registry const * registry)
- : m_boot_module_registry(registry)
- {}
-
- auto ram_disk_controller::probe() -> void
- {
- size_t current_device_index = 0;
-
- std::ranges::for_each(*m_boot_module_registry, [this, &current_device_index](auto const & module) {
- auto const minor = current_device_index++ * m_minors_per_device;
- m_devices.push_back(kstd::make_shared<ram_disk_device>(module, m_major, minor));
- });
- }
-} // namespace devices::storage::ram_disk \ No newline at end of file
diff --git a/kernel/devices/src/storage/ram_disk/ram_disk_device.cpp b/kernel/devices/src/storage/ram_disk/ram_disk_device.cpp
deleted file mode 100644
index 91a278e..0000000
--- a/kernel/devices/src/storage/ram_disk/ram_disk_device.cpp
+++ /dev/null
@@ -1,77 +0,0 @@
-#include "devices/storage/ram_disk/ram_disk_device.hpp"
-
-#include "kapi/boot_module/boot_module.hpp"
-#include "kapi/system.hpp"
-
-#include "devices/block_device.hpp"
-
-#include <kstd/cstring>
-
-#include <array>
-#include <cstddef>
-#include <string_view>
-
-namespace devices::storage::ram_disk
-{
- namespace
- {
- constexpr size_t RAM_DISK_BLOCK_SIZE = 512uz;
-
- // TODO BA-FS26 @Felix
- // TODO BA-FS26 currently only names for 9 minor devices
- constinit std::array<char, 5> name = {'r', 'a', 'm', '0', '\0'};
-
- auto determine_device_name(size_t minor) -> std::string_view
- {
- name[3] = '0' + minor;
- return std::string_view{name};
- }
- } // namespace
-
- ram_disk_device::ram_disk_device(kapi::boot_modules::boot_module const & module, size_t major, size_t minor)
- : block_device(major, minor, determine_device_name(minor), RAM_DISK_BLOCK_SIZE)
- , 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.");
- }
-
- auto const info = calculate_transfer(block_index);
-
- if (info.to_transfer > 0)
- {
- auto const src = static_cast<std::byte const *>(m_boot_module.start_address) + info.offset;
- kstd::libc::memcpy(buffer, src, info.to_transfer);
- }
-
- if (info.remainder > 0)
- {
- kstd::libc::memset(static_cast<std::byte *>(buffer) + info.to_transfer, 0, info.remainder);
- }
- }
-
- 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.");
- }
-
- auto const info = calculate_transfer(block_index);
-
- if (info.to_transfer > 0)
- {
- auto const dest = static_cast<std::byte *>(m_boot_module.start_address) + info.offset;
- kstd::libc::memcpy(dest, buffer, info.to_transfer);
- }
- }
-
- auto ram_disk_device::size() const -> size_t
- {
- return m_boot_module.size;
- }
-} // namespace devices::storage::ram_disk \ No newline at end of file
diff --git a/kernel/devices/src/storage/storage_controller.cpp b/kernel/devices/src/storage/storage_controller.cpp
deleted file mode 100644
index 16d40f4..0000000
--- a/kernel/devices/src/storage/storage_controller.cpp
+++ /dev/null
@@ -1,44 +0,0 @@
-#include "devices/storage/storage_controller.hpp"
-
-#include "devices/device.hpp"
-
-#include <kstd/memory>
-#include <kstd/vector>
-
-#include <algorithm>
-#include <cstddef>
-
-namespace devices::storage
-{
- auto storage_controller::set_ids(size_t major, size_t minors_per_dev) -> void
- {
- m_major = major;
- m_minors_per_device = minors_per_dev;
- }
-
- auto storage_controller::major() const -> size_t
- {
- return m_major;
- }
-
- auto storage_controller::device_by_minor(size_t minor) const -> kstd::shared_ptr<devices::device>
- {
- auto it = std::ranges::find_if(m_devices, [minor](auto const & device) { return device->minor() == minor; });
-
- if (it != m_devices.end())
- {
- return *it;
- }
- return nullptr;
- }
-
- auto storage_controller::devices_count() const -> size_t
- {
- return m_devices.size();
- }
-
- auto storage_controller::all_devices() const -> kstd::vector<kstd::shared_ptr<devices::device>> const &
- {
- return m_devices;
- }
-} // namespace devices::storage \ No newline at end of file
diff --git a/kernel/devices/src/storage/storage_management.cpp b/kernel/devices/src/storage/storage_management.cpp
deleted file mode 100644
index 25885ad..0000000
--- a/kernel/devices/src/storage/storage_management.cpp
+++ /dev/null
@@ -1,85 +0,0 @@
-#include "devices/storage/storage_management.hpp"
-
-#include "kapi/boot_modules.hpp"
-#include "kapi/system.hpp"
-
-#include "devices/device.hpp"
-#include "devices/storage/ram_disk/ram_disk_controller.hpp"
-#include "devices/storage/storage_controller.hpp"
-
-#include <kstd/memory>
-#include <kstd/vector>
-
-#include <algorithm>
-#include <cstddef>
-#include <optional>
-
-namespace devices::storage
-{
- namespace
- {
- constexpr size_t static MINORS_PER_DEVICE = 16;
- constexpr size_t static START_MAJOR = 1;
- constinit size_t static next_free_major = START_MAJOR;
-
- constinit auto static active_storage_management = std::optional<storage_management>{};
- } // namespace
-
- auto storage_management::init() -> void
- {
- if (active_storage_management)
- {
- kapi::system::panic("[DEVICES] Storage management has already been initialized.");
- }
- active_storage_management.emplace(storage_management{});
-
- auto current_ram_disk_controller =
- kstd::make_shared<ram_disk::ram_disk_controller>(&kapi::boot_modules::get_boot_module_registry());
- active_storage_management->add_controller(current_ram_disk_controller);
-
- std::ranges::for_each(active_storage_management->m_controllers, [](auto controller) { controller->probe(); });
- }
-
- auto storage_management::get() -> storage_management &
- {
- if (!active_storage_management)
- {
- kapi::system::panic("[DEVICES] Storage management has not been initialized.");
- }
-
- return *active_storage_management;
- }
-
- auto storage_management::add_controller(kstd::shared_ptr<storage_controller> const & controller) -> void
- {
- controller->set_ids(next_free_major++, MINORS_PER_DEVICE);
- m_controllers.push_back(controller);
- }
-
- auto storage_management::all_controllers() const -> kstd::vector<kstd::shared_ptr<storage_controller>> const &
- {
- return m_controllers;
- }
-
- auto storage_management::device_by_major_minor(size_t major, size_t minor) -> kstd::shared_ptr<device>
- {
- kstd::shared_ptr<device> found = nullptr;
-
- std::ranges::find_if(m_controllers, [&](auto const & controller) {
- if (controller != nullptr && controller->major() == major)
- {
- found = controller->device_by_minor(minor);
- return found != nullptr;
- }
- return false;
- });
-
- return found;
- }
-
- auto storage_management::determine_boot_device() -> kstd::shared_ptr<device>
- {
- return device_by_major_minor(START_MAJOR, 0);
- }
-
-} // namespace devices::storage \ No newline at end of file