aboutsummaryrefslogtreecommitdiff
path: root/kernel
diff options
context:
space:
mode:
authorFelix Morgner <felix.morgner@ost.ch>2026-08-01 00:33:56 +0200
committerFelix Morgner <felix.morgner@ost.ch>2026-08-01 00:33:56 +0200
commit5ce5c28e0f0f034cb7c704f08e59089ef303ff7e (patch)
tree6340aef7cee1948d3b6321e83f8c5976ef192180 /kernel
parent2c9b29799dbf6a706d235d79a3257fc9a42d12d3 (diff)
downloadkernel-5ce5c28e0f0f034cb7c704f08e59089ef303ff7e.tar.xz
kernel-5ce5c28e0f0f034cb7c704f08e59089ef303ff7e.zip
kapi: add automatic driver registrationHEADdevelop
Diffstat (limited to 'kernel')
-rw-r--r--kernel/kernel/drivers/init.cpp31
-rw-r--r--kernel/kernel/drivers/pseudo/null.cpp18
-rw-r--r--kernel/kernel/drivers/pseudo/zero.cpp17
-rw-r--r--kernel/kernel/drivers/storage/ram_disk.cpp17
4 files changed, 76 insertions, 7 deletions
diff --git a/kernel/kernel/drivers/init.cpp b/kernel/kernel/drivers/init.cpp
index cd196fa8..97d8f0bc 100644
--- a/kernel/kernel/drivers/init.cpp
+++ b/kernel/kernel/drivers/init.cpp
@@ -1,25 +1,42 @@
#include <kernel/drivers/init.hpp>
-#include <kernel/drivers/pseudo/null.hpp>
-#include <kernel/drivers/pseudo/zero.hpp>
-#include <kernel/drivers/storage/ram_disk.hpp>
-
+#include <kapi/devices.hpp>
#include <kapi/devices/driver_registry.hpp>
#include <kstd/memory.hpp>
+#include <kstd/print.hpp>
+
+#include <ranges>
+#include <span>
namespace kernel::drivers
{
+ extern "C"
+ {
+ // We need to suppress clang-tidy linting warnings here, since these symbols are generated by the linker and we
+ // cannot choose their names, unless we wanted to extend the linker script needlessly.
+ // NOLINTBEGIN(readability-identifier-naming)
+ extern kstd::observer_ptr<kapi::devices::driver_descriptor> const __start_kernel_drivers;
+ extern kstd::observer_ptr<kapi::devices::driver_descriptor> const __stop_kernel_drivers;
+ // NOLINTEND(readability-identifier-naming)
+ }
+
auto init() -> void
{
kapi::devices::driver_registry::init();
auto & registry = kapi::devices::driver_registry::get();
- registry.add(kstd::make_shared<kernel::drivers::pseudo::null>());
- registry.add(kstd::make_shared<kernel::drivers::pseudo::zero>());
- registry.add(kstd::make_shared<kernel::drivers::storage::ram_disk>());
+ auto descriptors = std::span{&__start_kernel_drivers, &__stop_kernel_drivers} | //
+ std::views::filter([](auto p) { return p != nullptr; });
+
+ for (auto driver : descriptors)
+ {
+ auto instance = driver->make_instance();
+ kstd::println("[OS:DRV] registering driver '{}' ({})", instance->name(), driver->name());
+ registry.add(driver->make_instance());
+ }
}
} // namespace kernel::drivers \ No newline at end of file
diff --git a/kernel/kernel/drivers/pseudo/null.cpp b/kernel/kernel/drivers/pseudo/null.cpp
index d0df9000..4995cc25 100644
--- a/kernel/kernel/drivers/pseudo/null.cpp
+++ b/kernel/kernel/drivers/pseudo/null.cpp
@@ -4,6 +4,7 @@
#include <kernel/filesystem/reserved_numbers.hpp>
#include <kapi/devices.hpp>
+#include <kapi/devices/driver_registry.hpp>
#include <kapi/filesystem.hpp>
#include <kstd/memory.hpp>
@@ -26,6 +27,23 @@ namespace kernel::drivers::pseudo
namespace
{
+ struct descriptor final : kapi::devices::driver_descriptor
+ {
+ public:
+ [[nodiscard("")]] auto name() const noexcept -> std::string_view override
+ {
+ return "dev_null";
+ }
+
+ [[nodiscard("")]] auto make_instance() const -> kstd::shared_ptr<kapi::devices::driver> override
+ {
+ return kstd::make_shared<null>();
+ }
+ };
+
+ [[gnu::used]]
+ constexpr auto registration = kapi::devices::kernel_driver<descriptor>{};
+
struct null_node final : kapi::filesystem::character_special_file
{
public:
diff --git a/kernel/kernel/drivers/pseudo/zero.cpp b/kernel/kernel/drivers/pseudo/zero.cpp
index 550a97ff..724ff25c 100644
--- a/kernel/kernel/drivers/pseudo/zero.cpp
+++ b/kernel/kernel/drivers/pseudo/zero.cpp
@@ -27,6 +27,23 @@ namespace kernel::drivers::pseudo
namespace
{
+ struct descriptor final : kapi::devices::driver_descriptor
+ {
+ public:
+ [[nodiscard("")]] auto name() const noexcept -> std::string_view override
+ {
+ return "dev_zero";
+ }
+
+ [[nodiscard("")]] auto make_instance() const -> kstd::shared_ptr<kapi::devices::driver> override
+ {
+ return kstd::make_shared<zero>();
+ }
+ };
+
+ [[gnu::used]]
+ constexpr auto registration = kapi::devices::kernel_driver<descriptor>{};
+
struct zero_node final : kapi::filesystem::character_special_file
{
public:
diff --git a/kernel/kernel/drivers/storage/ram_disk.cpp b/kernel/kernel/drivers/storage/ram_disk.cpp
index 987f4bbc..f7e73cd1 100644
--- a/kernel/kernel/drivers/storage/ram_disk.cpp
+++ b/kernel/kernel/drivers/storage/ram_disk.cpp
@@ -31,6 +31,23 @@ namespace kernel::drivers::storage
{
constexpr auto default_block_size = 512_B;
+ struct descriptor final : kapi::devices::driver_descriptor
+ {
+ public:
+ [[nodiscard("")]] auto name() const noexcept -> std::string_view override
+ {
+ return "ram_disk";
+ }
+
+ [[nodiscard("")]] auto make_instance() const -> kstd::shared_ptr<kapi::devices::driver> override
+ {
+ return kstd::make_shared<ram_disk>();
+ }
+ };
+
+ [[gnu::used]]
+ constexpr auto registration = kapi::devices::kernel_driver<descriptor>{};
+
struct block_node final : kapi::filesystem::block_special_file
{
explicit block_node(kapi::boot_modules::module const & module)