diff options
Diffstat (limited to 'kernel/devices')
| -rw-r--r-- | kernel/devices/include/devices/BlockDevice.hpp | 1 | ||||
| -rw-r--r-- | kernel/devices/include/devices/Device.hpp | 6 | ||||
| -rw-r--r-- | kernel/devices/include/devices/storage/RAMDisk/RAMDiskDevice.hpp | 4 | ||||
| -rw-r--r-- | kernel/devices/include/devices/storage/StorageController.hpp | 7 | ||||
| -rw-r--r-- | kernel/devices/src/BlockDevice.cpp | 8 | ||||
| -rw-r--r-- | kernel/devices/src/Device.cpp | 4 | ||||
| -rw-r--r-- | kernel/devices/src/storage/RAMDisk/RAMDiskController.cpp | 11 | ||||
| -rw-r--r-- | kernel/devices/src/storage/RAMDisk/RAMDiskDevice.cpp | 11 | ||||
| -rw-r--r-- | kernel/devices/src/storage/StorageController.cpp | 17 | ||||
| -rw-r--r-- | kernel/devices/src/storage/StorageManagement.cpp | 12 |
10 files changed, 72 insertions, 9 deletions
diff --git a/kernel/devices/include/devices/BlockDevice.hpp b/kernel/devices/include/devices/BlockDevice.hpp index 9e9ef08..2f9d0aa 100644 --- a/kernel/devices/include/devices/BlockDevice.hpp +++ b/kernel/devices/include/devices/BlockDevice.hpp @@ -9,6 +9,7 @@ namespace devices { struct block_device : device { + block_device(size_t major, size_t minor); virtual ~block_device() = default; virtual auto read_block(size_t block_index, void * buffer) const -> void = 0; diff --git a/kernel/devices/include/devices/Device.hpp b/kernel/devices/include/devices/Device.hpp index 815049f..0f93bff 100644 --- a/kernel/devices/include/devices/Device.hpp +++ b/kernel/devices/include/devices/Device.hpp @@ -2,18 +2,20 @@ #define TEACH_OS_KERNEL_DEVICES_DEVICE_HPP #include <cstddef> + namespace devices { struct device { + device(size_t major, size_t minor); virtual ~device() = default; auto major() const -> size_t; auto minor() const -> size_t; private: - size_t m_major = 0; // TODO BA-FS26 initialize correctly - size_t m_minor = 0; // TODO BA-FS26 initialize correctly + size_t m_major; + size_t m_minor; }; } // namespace devices diff --git a/kernel/devices/include/devices/storage/RAMDisk/RAMDiskDevice.hpp b/kernel/devices/include/devices/storage/RAMDisk/RAMDiskDevice.hpp index fdcef3f..de71663 100644 --- a/kernel/devices/include/devices/storage/RAMDisk/RAMDiskDevice.hpp +++ b/kernel/devices/include/devices/storage/RAMDisk/RAMDiskDevice.hpp @@ -13,8 +13,8 @@ namespace devices::storage::ram_disk { constexpr size_t static block_size = 512uz; // TODO BA-FS26 really correct / good?? - ram_disk_device() = default; - ram_disk_device(kapi::boot_modules::boot_module const & module); + ram_disk_device(); // TODO BA-FS26 remove when kstd::vector is available + ram_disk_device(kapi::boot_modules::boot_module const & module, size_t major, size_t minor); auto read_block(size_t block_index, void * buffer) const -> void override; diff --git a/kernel/devices/include/devices/storage/StorageController.hpp b/kernel/devices/include/devices/storage/StorageController.hpp index a51683d..50fdb34 100644 --- a/kernel/devices/include/devices/storage/StorageController.hpp +++ b/kernel/devices/include/devices/storage/StorageController.hpp @@ -13,8 +13,15 @@ namespace devices::storage virtual auto probe() -> void = 0; + auto set_ids(size_t major, size_t minors_per_dev) -> void; + auto major() const -> size_t; + virtual auto devices_count() -> size_t = 0; virtual auto device_by_major_minor(size_t major, size_t minor) -> block_device * = 0; + + protected: + size_t m_major{}; + size_t m_minors_per_device{}; }; } // namespace devices::storage diff --git a/kernel/devices/src/BlockDevice.cpp b/kernel/devices/src/BlockDevice.cpp index 970f7b2..6d43073 100644 --- a/kernel/devices/src/BlockDevice.cpp +++ b/kernel/devices/src/BlockDevice.cpp @@ -1,6 +1,12 @@ #include "devices/BlockDevice.hpp" +#include "devices/Device.hpp" + +#include <cstddef> + namespace devices { - // TODO BA-FS26 implement block device functionality + block_device::block_device(size_t major, size_t minor) + : device(major, minor) + {} } // namespace devices
\ No newline at end of file diff --git a/kernel/devices/src/Device.cpp b/kernel/devices/src/Device.cpp index 48ba29b..38fdd48 100644 --- a/kernel/devices/src/Device.cpp +++ b/kernel/devices/src/Device.cpp @@ -4,6 +4,10 @@ namespace devices { + device::device(size_t major, size_t minor) + : m_major(major) + , m_minor(minor) + {} auto device::major() const -> size_t { diff --git a/kernel/devices/src/storage/RAMDisk/RAMDiskController.cpp b/kernel/devices/src/storage/RAMDisk/RAMDiskController.cpp index ec2cb97..1f70e2d 100644 --- a/kernel/devices/src/storage/RAMDisk/RAMDiskController.cpp +++ b/kernel/devices/src/storage/RAMDisk/RAMDiskController.cpp @@ -21,6 +21,17 @@ namespace devices::storage::ram_disk auto ram_disk_controller::probe() -> void { + size_t current_device_index = 0; // Starte bei 0 + + std::ranges::for_each(*m_boot_module_registry, [this, ¤t_device_index](auto const & module) { + auto const minor = current_device_index * m_minors_per_device; + + // TODO BA-FS26 use push_back from kstd::vector when available + m_devices.at(0) = ram_disk_device{module, m_major, minor}; + + current_device_index++; + }); + std::ranges::for_each(*m_boot_module_registry, [this](auto const & module) { create_device_from_boot_module(module); }); } diff --git a/kernel/devices/src/storage/RAMDisk/RAMDiskDevice.cpp b/kernel/devices/src/storage/RAMDisk/RAMDiskDevice.cpp index 339e7fa..f33cf94 100644 --- a/kernel/devices/src/storage/RAMDisk/RAMDiskDevice.cpp +++ b/kernel/devices/src/storage/RAMDisk/RAMDiskDevice.cpp @@ -3,14 +3,21 @@ #include "kapi/boot_module/boot_module.hpp" #include "kapi/system.hpp" +#include "devices/BlockDevice.hpp" + #include <kstd/cstring> #include <cstddef> namespace devices::storage::ram_disk { - ram_disk_device::ram_disk_device(kapi::boot_modules::boot_module const & module) - : m_boot_module(module) + 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 diff --git a/kernel/devices/src/storage/StorageController.cpp b/kernel/devices/src/storage/StorageController.cpp new file mode 100644 index 0000000..d11a175 --- /dev/null +++ b/kernel/devices/src/storage/StorageController.cpp @@ -0,0 +1,17 @@ +#include "devices/storage/StorageController.hpp" + +#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; + } +} // namespace devices::storage
\ No newline at end of file diff --git a/kernel/devices/src/storage/StorageManagement.cpp b/kernel/devices/src/storage/StorageManagement.cpp index cfc5239..58d8510 100644 --- a/kernel/devices/src/storage/StorageManagement.cpp +++ b/kernel/devices/src/storage/StorageManagement.cpp @@ -15,6 +15,9 @@ namespace devices::storage { namespace { + constexpr size_t static MINORS_PER_DEVICE = 16; + constinit size_t static next_free_major = 1; + constinit auto static active_storage_management = std::optional<storage_management>{}; constinit auto static active_ram_disk_controller = std::optional<ram_disk::ram_disk_controller>{}; } // namespace @@ -45,6 +48,7 @@ namespace devices::storage auto storage_management::add_controller(storage_controller * controller) -> void { + controller->set_ids(next_free_major++, MINORS_PER_DEVICE); m_controllers.at(0) = controller; // TODO BA-FS26 use push_back from kstd:vector } @@ -53,8 +57,12 @@ namespace devices::storage block_device * found = nullptr; std::ranges::find_if(m_controllers, [&](auto const controller) { - found = controller->device_by_major_minor(major, minor); - return found != nullptr; + if (controller != nullptr && controller->major() == major) + { + found = controller->device_by_major_minor(major, minor); + return found != nullptr; + } + return false; }); return found; |
