aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--kernel/devices/include/devices/BlockDevice.hpp1
-rw-r--r--kernel/devices/include/devices/Device.hpp6
-rw-r--r--kernel/devices/include/devices/storage/RAMDisk/RAMDiskDevice.hpp4
-rw-r--r--kernel/devices/include/devices/storage/StorageController.hpp7
-rw-r--r--kernel/devices/src/BlockDevice.cpp8
-rw-r--r--kernel/devices/src/Device.cpp4
-rw-r--r--kernel/devices/src/storage/RAMDisk/RAMDiskController.cpp11
-rw-r--r--kernel/devices/src/storage/RAMDisk/RAMDiskDevice.cpp11
-rw-r--r--kernel/devices/src/storage/StorageController.cpp17
-rw-r--r--kernel/devices/src/storage/StorageManagement.cpp12
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, &current_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;