diff options
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/kernel/drivers/init.cpp | 31 | ||||
| -rw-r--r-- | kernel/kernel/drivers/pseudo/null.cpp | 18 | ||||
| -rw-r--r-- | kernel/kernel/drivers/pseudo/zero.cpp | 17 | ||||
| -rw-r--r-- | kernel/kernel/drivers/storage/ram_disk.cpp | 17 |
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) |
