aboutsummaryrefslogtreecommitdiff
path: root/kernel
diff options
context:
space:
mode:
Diffstat (limited to 'kernel')
-rw-r--r--kernel/CMakeLists.txt2
-rw-r--r--kernel/kapi/boot_module/bus.cpp2
-rw-r--r--kernel/kapi/boot_module/registry.cpp131
-rw-r--r--kernel/kapi/boot_modules.cpp41
-rw-r--r--kernel/kernel/devices/storage.cpp3
-rw-r--r--kernel/kernel/devices/storage.tests.cpp11
-rw-r--r--kernel/kernel/test_support/boot_modules.hpp10
-rw-r--r--kernel/kernel/test_support/filesystem/storage_boot_module_fixture.cpp28
-rw-r--r--kernel/kernel/test_support/filesystem/storage_boot_module_fixture.hpp2
-rw-r--r--kernel/kernel/test_support/state_reset_listener.cpp5
10 files changed, 158 insertions, 77 deletions
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 <kapi/boot_modules/registry.hpp>
+
+#include <kapi/boot_modules.hpp>
+#include <kapi/system.hpp>
+#include <kapi/test_support/boot_modules.hpp>
+
+#include <cstddef>
+#include <optional>
+#include <utility>
+
+namespace kapi::boot_modules
+{
+
+ namespace
+ {
+ constinit auto instance = std::optional<registry>{};
+ }
+
+ 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<kapi::boot_modules::registry>
+ {
+ 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 <kapi/boot_modules.hpp>
-
-#include <kapi/system.hpp>
-
-#include <optional>
-
-namespace
-{
- constinit auto static registry = std::optional<kapi::boot_modules::boot_module_registry>{};
-} // 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::boot_module_bus>(&kapi::boot_modules::get_boot_module_registry());
+ auto modules_bus = kstd::make_shared<kapi::boot_modules::boot_module_bus>(&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 <kernel/devices/storage.hpp>
-#include <kernel/test_support/boot_modules.hpp>
-
#include <kapi/boot_modules.hpp>
#include <kapi/devices.hpp>
#include <kapi/memory.hpp>
+#include <kapi/test_support/boot_modules.hpp>
#include <catch2/catch_test_macros.hpp>
@@ -14,15 +13,15 @@
TEST_CASE("Storage devices attached with init() are reachable from the root bus", "[devices][storage]")
{
auto storage = std::vector<std::byte>{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 <kernel/test_support/filesystem/storage_boot_module_fixture.hpp>
#include <kernel/devices/storage.hpp>
-#include <kernel/test_support/boot_modules.hpp>
#include <kapi/boot_modules.hpp>
#include <kapi/devices.hpp>
#include <kapi/memory.hpp>
+#include <kapi/test_support/boot_modules.hpp>
#include <kstd/memory.hpp>
@@ -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::boot_module_bus>(&kapi::boot_modules::get_boot_module_registry());
+ m_boot_module_bus = kstd::make_shared<kapi::boot_modules::boot_module_bus>(&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::boot_module_bus>(&kapi::boot_modules::get_boot_module_registry());
+ m_boot_module_bus = kstd::make_shared<kapi::boot_modules::boot_module_bus>(&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<std::string> m_module_names{};
std::vector<std::vector<std::byte>> m_module_data{};
std::vector<mapped_image> 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 <kernel/filesystem/open_file_table.hpp>
#include <kernel/filesystem/type_registry.hpp>
#include <kernel/filesystem/vfs.hpp>
-#include <kernel/test_support/boot_modules.hpp>
#include <kernel/test_support/cio.hpp>
#include <kernel/test_support/cpu.hpp>
#include <kernel/test_support/filesystem/device_number_registry.hpp>
@@ -16,6 +15,7 @@
#include <kapi/devices.hpp>
#include <kapi/devices/driver_registry.hpp>
#include <kapi/memory.hpp>
+#include <kapi/test_support/boot_modules.hpp>
#include <kapi/test_support/devices.hpp>
#include <kstd/memory.hpp>
@@ -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();