From 3d09b0bd2c35740b34b87c1400e0a3d93647a5d2 Mon Sep 17 00:00:00 2001 From: Felix Morgner Date: Fri, 24 Jul 2026 19:27:20 +0200 Subject: kapi: extract real boot module registry singleton --- kernel/CMakeLists.txt | 2 +- kernel/kapi/boot_module/bus.cpp | 2 +- kernel/kapi/boot_module/registry.cpp | 131 +++++++++++++++++++++ kernel/kapi/boot_modules.cpp | 41 ------- kernel/kernel/devices/storage.cpp | 3 +- kernel/kernel/devices/storage.tests.cpp | 11 +- kernel/kernel/test_support/boot_modules.hpp | 10 -- .../filesystem/storage_boot_module_fixture.cpp | 28 +++-- .../filesystem/storage_boot_module_fixture.hpp | 2 +- .../kernel/test_support/state_reset_listener.cpp | 5 +- 10 files changed, 158 insertions(+), 77 deletions(-) create mode 100644 kernel/kapi/boot_module/registry.cpp delete mode 100644 kernel/kapi/boot_modules.cpp delete mode 100644 kernel/kernel/test_support/boot_modules.hpp (limited to 'kernel') diff --git a/kernel/CMakeLists.txt b/kernel/CMakeLists.txt index f4d0d3b3..5a0b42a8 100644 --- a/kernel/CMakeLists.txt +++ b/kernel/CMakeLists.txt @@ -9,7 +9,7 @@ target_sources("kernel_lib" PRIVATE # Kernel-defined KAPI Implementation "kapi/acpi.cpp" "kapi/boot_module/bus.cpp" - "kapi/boot_modules.cpp" + "kapi/boot_module/registry.cpp" "kapi/cio.cpp" "kapi/cpu.cpp" "kapi/devices.cpp" diff --git a/kernel/kapi/boot_module/bus.cpp b/kernel/kapi/boot_module/bus.cpp index aab1403b..88f2cda3 100644 --- a/kernel/kapi/boot_module/bus.cpp +++ b/kernel/kapi/boot_module/bus.cpp @@ -53,7 +53,7 @@ namespace kapi::boot_modules return kapi::devices::device::query_interface(interface); } - boot_module_bus::boot_module_bus(boot_module_registry const * registry) + boot_module_bus::boot_module_bus(registry const * registry) : kapi::devices::bus{"boot_modules"} , m_registry(registry) {} diff --git a/kernel/kapi/boot_module/registry.cpp b/kernel/kapi/boot_module/registry.cpp new file mode 100644 index 00000000..80c76129 --- /dev/null +++ b/kernel/kapi/boot_module/registry.cpp @@ -0,0 +1,131 @@ +#include + +#include +#include +#include + +#include +#include +#include + +namespace kapi::boot_modules +{ + + namespace + { + constinit auto instance = std::optional{}; + } + + auto registry::init() -> void + { + if (instance) + { + system::panic("[OS] Boot module registry has already been initialized."); + } + + instance.emplace(); + } + + auto registry::get() -> registry & + { + if (!instance) + { + system::panic("[OS] Boot module registry has not been initialized."); + } + + return *instance; + } + + auto registry::begin() const noexcept -> const_iterator + { + return m_modules.begin(); + } + + auto registry::end() const noexcept -> const_iterator + { + return m_modules.end(); + } + + auto registry::cbegin() const noexcept -> const_iterator + { + return m_modules.cbegin(); + } + + auto registry::cend() const noexcept -> const_iterator + { + return m_modules.cend(); + } + + auto registry::rbegin() const noexcept -> const_reverse_iterator + { + return m_modules.rbegin(); + } + + auto registry::rend() const noexcept -> const_reverse_iterator + { + return m_modules.rend(); + } + + auto registry::crbegin() const noexcept -> const_reverse_iterator + { + return m_modules.crbegin(); + } + + auto registry::crend() const noexcept -> const_reverse_iterator + { + return m_modules.crend(); + } + + auto registry::front() const noexcept -> const_reference + { + return m_modules.front(); + } + + auto registry::back() const noexcept -> const_reference + { + return m_modules.back(); + } + + auto registry::size() const noexcept -> std::size_t + { + return m_modules.size(); + } + + auto registry::empty() const noexcept -> bool + { + return m_modules.empty(); + } + + auto registry::at(std::size_t index) const -> const_reference + { + return m_modules.at(index); + } + + auto registry::operator[](std::size_t index) const noexcept -> const_reference + { + return m_modules[index]; + } + + auto registry::add(boot_module module) -> void + { + m_modules.push_back(module); + } + +} // namespace kapi::boot_modules + +namespace kapi::test_support::boot_modules +{ + + auto deinit_registry() -> void + { + kapi::boot_modules::instance.reset(); + } + + auto inject_registry(kapi::boot_modules::registry && registry) -> std::optional + { + auto old = std::move(kapi::boot_modules::instance); + kapi::boot_modules::instance.emplace(std::move(registry)); + return old; + } + +} // namespace kapi::test_support::boot_modules diff --git a/kernel/kapi/boot_modules.cpp b/kernel/kapi/boot_modules.cpp deleted file mode 100644 index 5629b77f..00000000 --- a/kernel/kapi/boot_modules.cpp +++ /dev/null @@ -1,41 +0,0 @@ -#include - -#include - -#include - -namespace -{ - constinit auto static registry = std::optional{}; -} // namespace - -namespace kapi::boot_modules -{ - auto set_boot_module_registry(boot_module_registry & new_registry) -> void - { - if (registry) - { - system::panic("[x86_64] Boot module registry has already been set."); - } - - registry = new_registry; - } - - auto get_boot_module_registry() -> boot_module_registry const & - { - if (!registry) - { - system::panic("[x86_64] Boot module registry has not been initialized."); - } - - return *registry; - } -} // namespace kapi::boot_modules - -namespace kernel::tests::boot_modules -{ - auto deinit() -> void - { - registry.reset(); - } -} // namespace kernel::tests::boot_modules diff --git a/kernel/kernel/devices/storage.cpp b/kernel/kernel/devices/storage.cpp index 28f96de2..cbd350ce 100644 --- a/kernel/kernel/devices/storage.cpp +++ b/kernel/kernel/devices/storage.cpp @@ -9,8 +9,7 @@ namespace kernel::devices::storage { auto init() -> void { - auto modules_bus = - kstd::make_shared(&kapi::boot_modules::get_boot_module_registry()); + auto modules_bus = kstd::make_shared(&kapi::boot_modules::registry::get()); kapi::devices::get_root_bus()->add_child(modules_bus); modules_bus->enumerate(*modules_bus); } diff --git a/kernel/kernel/devices/storage.tests.cpp b/kernel/kernel/devices/storage.tests.cpp index a51b6996..30cafe4a 100644 --- a/kernel/kernel/devices/storage.tests.cpp +++ b/kernel/kernel/devices/storage.tests.cpp @@ -1,10 +1,9 @@ #include -#include - #include #include #include +#include #include @@ -14,15 +13,15 @@ TEST_CASE("Storage devices attached with init() are reachable from the root bus", "[devices][storage]") { auto storage = std::vector{4096, std::byte{}}; - auto registry = kapi::boot_modules::boot_module_registry{}; + auto registry = kapi::boot_modules::registry{}; - registry.add_boot_module({ + registry.add({ .name = "test_module type=ramdisk", .start_address = kapi::memory::linear_address{storage.data()}, .size = storage.size(), }); - kapi::boot_modules::set_boot_module_registry(registry); + kapi::test_support::boot_modules::inject_registry(std::move(registry)); kernel::devices::storage::init(); @@ -47,5 +46,5 @@ TEST_CASE("Storage devices attached with init() are reachable from the root bus" CHECK(boot_device->state() == kapi::devices::state::bound); CHECK(boot_device->bound_driver() != nullptr); - kernel::tests::boot_modules::deinit(); + kapi::test_support::boot_modules::deinit_registry(); } \ No newline at end of file diff --git a/kernel/kernel/test_support/boot_modules.hpp b/kernel/kernel/test_support/boot_modules.hpp deleted file mode 100644 index 2343a104..00000000 --- a/kernel/kernel/test_support/boot_modules.hpp +++ /dev/null @@ -1,10 +0,0 @@ -#ifndef TEACHOS_KERNEL_TEST_SUPPORT_BOOT_MODULES_HPP -#define TEACHOS_KERNEL_TEST_SUPPORT_BOOT_MODULES_HPP - -namespace kernel::tests::boot_modules -{ - //! Deinitialize the boot module registry. - auto deinit() -> void; -} // namespace kernel::tests::boot_modules - -#endif \ No newline at end of file diff --git a/kernel/kernel/test_support/filesystem/storage_boot_module_fixture.cpp b/kernel/kernel/test_support/filesystem/storage_boot_module_fixture.cpp index 5bddd956..75b25011 100644 --- a/kernel/kernel/test_support/filesystem/storage_boot_module_fixture.cpp +++ b/kernel/kernel/test_support/filesystem/storage_boot_module_fixture.cpp @@ -1,11 +1,11 @@ #include #include -#include #include #include #include +#include #include @@ -78,7 +78,7 @@ namespace kernel::tests::filesystem storage_boot_module_fixture::~storage_boot_module_fixture() { - kernel::tests::boot_modules::deinit(); + kapi::test_support::boot_modules::deinit_registry(); } auto storage_boot_module_fixture::setup_modules(std::size_t module_count, std::size_t module_size) -> void @@ -98,14 +98,16 @@ namespace kernel::tests::filesystem for (std::size_t i = 0; i < module_count; ++i) { - m_registry.add_boot_module(kapi::boot_modules::boot_module{ - m_module_names[i].c_str(), kapi::memory::linear_address{m_module_data[i].data()}, m_module_data[i].size()}); + m_registry.add({ + .name = m_module_names[i].c_str(), + .start_address = kapi::memory::linear_address{m_module_data[i].data()}, + .size = m_module_data[i].size(), + }); } - kapi::boot_modules::set_boot_module_registry(m_registry); + kapi::test_support::boot_modules::inject_registry(std::move(m_registry)); - m_boot_module_bus = - kstd::make_shared(&kapi::boot_modules::get_boot_module_registry()); + m_boot_module_bus = kstd::make_shared(&kapi::boot_modules::registry::get()); m_boot_module_bus->enumerate(*m_boot_module_bus); if (module_count > 0 && kapi::devices::interface_registry::get().all(kapi::devices::block_device::id).empty()) @@ -131,10 +133,9 @@ namespace kernel::tests::filesystem setup_module_from_img(module_names[i], img_paths[i]); } - kapi::boot_modules::set_boot_module_registry(m_registry); + kapi::test_support::boot_modules::inject_registry(std::move(m_registry)); - m_boot_module_bus = - kstd::make_shared(&kapi::boot_modules::get_boot_module_registry()); + m_boot_module_bus = kstd::make_shared(&kapi::boot_modules::registry::get()); m_boot_module_bus->enumerate(*m_boot_module_bus); if (!module_names.empty() && kapi::devices::interface_registry::get().all(kapi::devices::block_device::id).empty()) @@ -149,7 +150,10 @@ namespace kernel::tests::filesystem m_module_names.push_back(module_name + " type=ramdisk"); auto & mapped_image = m_mapped_images.emplace_back(img_path); - m_registry.add_boot_module(kapi::boot_modules::boot_module{ - m_module_names.back().c_str(), kapi::memory::linear_address{mapped_image.mapping}, mapped_image.size}); + m_registry.add({ + .name = m_module_names.back().c_str(), + .start_address = kapi::memory::linear_address{mapped_image.mapping}, + .size = mapped_image.size, + }); } } // namespace kernel::tests::filesystem \ No newline at end of file diff --git a/kernel/kernel/test_support/filesystem/storage_boot_module_fixture.hpp b/kernel/kernel/test_support/filesystem/storage_boot_module_fixture.hpp index 663a8032..fdb50037 100644 --- a/kernel/kernel/test_support/filesystem/storage_boot_module_fixture.hpp +++ b/kernel/kernel/test_support/filesystem/storage_boot_module_fixture.hpp @@ -37,7 +37,7 @@ namespace kernel::tests::filesystem std::size_t size; }; - kapi::boot_modules::boot_module_registry m_registry{}; + kapi::boot_modules::registry m_registry{}; std::vector m_module_names{}; std::vector> m_module_data{}; std::vector m_mapped_images{}; diff --git a/kernel/kernel/test_support/state_reset_listener.cpp b/kernel/kernel/test_support/state_reset_listener.cpp index cc51d43f..45e8f5cb 100644 --- a/kernel/kernel/test_support/state_reset_listener.cpp +++ b/kernel/kernel/test_support/state_reset_listener.cpp @@ -2,7 +2,6 @@ #include #include #include -#include #include #include #include @@ -16,6 +15,7 @@ #include #include #include +#include #include #include @@ -48,8 +48,7 @@ struct state_reset_listener : Catch::EventListenerBase kernel::tests::filesystem::type_registry::deinit(); kernel::tests::filesystem::open_file_table::deinit(); - kernel::tests::boot_modules::deinit(); - + kapi::test_support::boot_modules::deinit_registry(); kapi::test_support::devices::deinit(); kernel::tests::memory::deinit(); kernel::tests::cpu::deinit(); -- cgit v1.2.3