aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorFelix Morgner <felix.morgner@ost.ch>2025-12-15 16:28:16 +0100
committerFelix Morgner <felix.morgner@ost.ch>2025-12-15 16:28:16 +0100
commit43ddde5e30a0d71aa11025a5ae232cea83e7fbde (patch)
tree0b6366b98fe7c6968ae297d5c72ad4ee11c2715d /src
parentb9a733b87e4ef1a2dcd17387cedf16402acd9fd7 (diff)
downloadteachos-43ddde5e30a0d71aa11025a5ae232cea83e7fbde.tar.xz
teachos-43ddde5e30a0d71aa11025a5ae232cea83e7fbde.zip
kapi: remodel memory API to follow cio API
Diffstat (limited to 'src')
-rw-r--r--src/kapi/memory.cpp91
1 files changed, 91 insertions, 0 deletions
diff --git a/src/kapi/memory.cpp b/src/kapi/memory.cpp
new file mode 100644
index 0000000..d6c84e1
--- /dev/null
+++ b/src/kapi/memory.cpp
@@ -0,0 +1,91 @@
+#include "kapi/memory.hpp"
+
+#include "kapi/system.hpp"
+
+#include <cstddef>
+#include <optional>
+#include <utility>
+
+namespace teachos::memory
+{
+
+ namespace
+ {
+ struct bad_frame_allocator final : public frame_allocator
+ {
+ bad_frame_allocator static instance;
+
+ auto allocate() noexcept -> std::optional<frame> override
+ {
+ system::panic("Tried to allocate a frame without an active allocator.");
+ }
+
+ auto release(frame) -> void override
+ {
+ system::panic("Tried to release a frame without an active allocator.");
+ }
+ };
+
+ struct bad_page_mapper final : public page_mapper
+ {
+ bad_page_mapper static instance;
+
+ auto map(page, frame, flags) -> std::byte * override
+ {
+ system::panic("Tried to map a page without an active mapper.");
+ }
+
+ auto unmap(page) -> void override
+ {
+ system::panic("Tried to unmap a page without an active mapper.");
+ }
+
+ auto try_unmap(page) noexcept -> bool override
+ {
+ return false;
+ }
+ };
+
+ constinit bad_frame_allocator bad_frame_allocator::instance{};
+ constinit bad_page_mapper bad_page_mapper::instance{};
+ } // namespace
+
+ // NOLINTNEXTLINE(cppcoreguidelines-avoid-non-const-global-variables)
+ constinit auto active_frame_allocator = static_cast<frame_allocator *>(&bad_frame_allocator::instance);
+ // NOLINTNEXTLINE(cppcoreguidelines-avoid-non-const-global-variables)
+ constinit auto active_page_mapper = static_cast<page_mapper *>(&bad_page_mapper::instance);
+
+ auto set_frame_allocator(frame_allocator & allocator) -> std::optional<frame_allocator *>
+ {
+ if (&allocator == active_frame_allocator)
+ {
+ return {};
+ }
+ return std::exchange(active_frame_allocator, &allocator);
+ }
+
+ auto set_page_mapper(page_mapper & mapper) -> std::optional<page_mapper *>
+ {
+ if (&mapper == active_page_mapper)
+ {
+ return {};
+ }
+ return std::exchange(active_page_mapper, &mapper);
+ }
+
+ auto allocate_frame() -> std::optional<frame>
+ {
+ return active_frame_allocator->allocate();
+ }
+
+ auto map(page page, frame frame) -> std::byte *
+ {
+ return active_page_mapper->map(page, frame, page_mapper::flags::empty);
+ }
+
+ auto unmap(page page) -> void
+ {
+ return active_page_mapper->unmap(page);
+ }
+
+} // namespace teachos::memory \ No newline at end of file