aboutsummaryrefslogtreecommitdiff
path: root/kernel/src
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/src')
-rw-r--r--kernel/src/filesystem/devfs/filesystem.cpp6
-rw-r--r--kernel/src/filesystem/ext2/filesystem.cpp6
-rw-r--r--kernel/src/filesystem/type_registry.cpp67
-rw-r--r--kernel/src/filesystem/vfs.cpp17
-rw-r--r--kernel/src/main.cpp2
5 files changed, 75 insertions, 23 deletions
diff --git a/kernel/src/filesystem/devfs/filesystem.cpp b/kernel/src/filesystem/devfs/filesystem.cpp
index 1aaa0d1..ce887ff 100644
--- a/kernel/src/filesystem/devfs/filesystem.cpp
+++ b/kernel/src/filesystem/devfs/filesystem.cpp
@@ -32,10 +32,10 @@ namespace kernel::filesystem::devfs
{
return kstd::make_shared<filesystem>();
}
- } const constinit type_instance{};
+ };
- [[gnu::section("vfs_type_descriptors"), gnu::used]]
- auto const * const type_descriptor_pointer = static_cast<kernel::filesystem::type const *>(&type_instance);
+ [[gnu::used]]
+ constexpr auto registration = type_registration<type>{};
auto filesystem::mount(kstd::shared_ptr<kernel::filesystem::inode> const &) -> operation_result
{
diff --git a/kernel/src/filesystem/ext2/filesystem.cpp b/kernel/src/filesystem/ext2/filesystem.cpp
index 7b5d2d7..3180a19 100644
--- a/kernel/src/filesystem/ext2/filesystem.cpp
+++ b/kernel/src/filesystem/ext2/filesystem.cpp
@@ -36,10 +36,10 @@ namespace kernel::filesystem::ext2
{
return kstd::make_shared<filesystem>();
}
- } const constinit type_instance{};
+ };
- [[gnu::section("vfs_type_descriptors"), gnu::used]]
- auto const * const type_descriptor_pointer = static_cast<kernel::filesystem::type const *>(&type_instance);
+ [[gnu::used]]
+ constexpr auto registration = type_registration<type>{};
auto filesystem::mount(kstd::shared_ptr<kernel::filesystem::inode> const & backing_inode) -> operation_result
{
diff --git a/kernel/src/filesystem/type_registry.cpp b/kernel/src/filesystem/type_registry.cpp
new file mode 100644
index 0000000..033b879
--- /dev/null
+++ b/kernel/src/filesystem/type_registry.cpp
@@ -0,0 +1,67 @@
+#include <kernel/filesystem/type_registry.hpp>
+
+#include <kapi/system.hpp>
+
+#include <kstd/memory>
+#include <kstd/print>
+
+#include <algorithm>
+#include <optional>
+#include <ranges>
+#include <span>
+
+namespace kernel::filesystem
+{
+
+ extern "C"
+ {
+ extern type_registry::pointer const __start_fs_types;
+ extern type_registry::pointer const __stop_fs_types;
+ }
+
+ namespace
+ {
+ auto constinit instance = std::optional<type_registry>{};
+ }
+
+ auto type_registry::init() -> void
+ {
+ if (instance)
+ {
+ kapi::system::panic("[FILESYSTEM] tried to initialize type registry more than once!");
+ }
+
+ instance.emplace();
+
+ auto type_descriptors = std::span{&__start_fs_types, &__stop_fs_types} | //
+ std::views::filter([](auto p) { return p != nullptr; });
+
+ std::ranges::for_each(type_descriptors, [](auto descriptor) {
+ kstd::println("[FILESYSTEM] registering '{}'", descriptor->name());
+ instance->add(descriptor);
+ });
+ }
+
+ auto type_registry::get() -> type_registry &
+ {
+ if (!instance)
+ {
+ kapi::system::panic("[FILESYSTEM] type registry has not been initialized!");
+ }
+
+ return *instance;
+ }
+
+ auto type_registry::add(pointer descriptor) -> bool
+ {
+ auto result = m_descriptors.emplace(descriptor->name(), descriptor);
+ return result.second;
+ }
+
+ [[nodiscard]] auto type_registry::all() const noexcept -> std::span<pointer>
+ {
+ // TODO: implement value accessor for flat_map
+ return {};
+ }
+
+} // namespace kernel::filesystem
diff --git a/kernel/src/filesystem/vfs.cpp b/kernel/src/filesystem/vfs.cpp
index 8dcae2c..8d1fd23 100644
--- a/kernel/src/filesystem/vfs.cpp
+++ b/kernel/src/filesystem/vfs.cpp
@@ -8,29 +8,20 @@
#include <kernel/filesystem/mount_table.hpp>
#include <kernel/filesystem/path.hpp>
#include <kernel/filesystem/rootfs/filesystem.hpp>
-#include <kernel/filesystem/type.hpp>
#include <kapi/system.hpp>
#include <kstd/memory>
#include <kstd/print>
-#include <kstd/string>
#include <kstd/vector>
#include <algorithm>
#include <cstdint>
#include <optional>
#include <ranges>
-#include <span>
#include <string_view>
#include <utility>
-extern "C"
-{
- extern kernel::filesystem::type const * const __start_vfs_type_descriptors;
- extern kernel::filesystem::type const * const __stop_vfs_type_descriptors;
-}
-
namespace
{
constinit auto static active_vfs = std::optional<kernel::filesystem::vfs>{};
@@ -50,14 +41,6 @@ namespace kernel::filesystem
vfs::vfs()
{
- // Register all compiled-in filesystems
- auto type_descriptors = std::span{&__start_vfs_type_descriptors, &__stop_vfs_type_descriptors} |
- std::views::filter([](auto p) { return p != nullptr; });
- std::ranges::for_each(type_descriptors, [this](auto descriptor) {
- kstd::println("[FILESYSTEM] registering '{}'", descriptor->name());
- m_filesystems.emplace(descriptor->name(), descriptor);
- });
-
// mount rootfs at /
auto root_fs = kstd::make_shared<rootfs::filesystem>();
root_fs->mount(nullptr);
diff --git a/kernel/src/main.cpp b/kernel/src/main.cpp
index 6985e94..5063d18 100644
--- a/kernel/src/main.cpp
+++ b/kernel/src/main.cpp
@@ -1,3 +1,4 @@
+#include "kernel/filesystem/type_registry.hpp"
#include <kernel/devices/storage/management.hpp>
#include <kernel/filesystem/open_file_table.hpp>
#include <kernel/filesystem/vfs.hpp>
@@ -138,6 +139,7 @@ auto main() -> int
kernel::filesystem::open_file_table::init();
kstd::println("[OS] Global open file table initialized.");
+ kernel::filesystem::type_registry::init();
kernel::filesystem::vfs::init();
kstd::println("[OS] Virtual filesystem initialized.");