From bd1290706a650f6c059c54024fa7d63ba528bfe5 Mon Sep 17 00:00:00 2001 From: Bananymous Date: Mon, 3 Jun 2024 03:41:00 +0300 Subject: [PATCH] Kernel: Implement SharedMemoryObject cloning --- kernel/include/kernel/Memory/SharedMemoryObject.h | 3 ++- kernel/kernel/Memory/SharedMemoryObject.cpp | 7 +++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/kernel/include/kernel/Memory/SharedMemoryObject.h b/kernel/include/kernel/Memory/SharedMemoryObject.h index 94e15eff..94f82b54 100644 --- a/kernel/include/kernel/Memory/SharedMemoryObject.h +++ b/kernel/include/kernel/Memory/SharedMemoryObject.h @@ -32,6 +32,7 @@ namespace Kernel { ~Object(); + Key key; size_t size; PageTable::flags_t flags; BAN::Vector paddrs; @@ -54,7 +55,7 @@ namespace Kernel public: static BAN::ErrorOr> create(BAN::RefPtr, PageTable&, AddressRange); - virtual BAN::ErrorOr> clone(PageTable& new_page_table) override { return BAN::Error::from_errno(ENOTSUP); } + virtual BAN::ErrorOr> clone(PageTable& new_page_table) override; virtual BAN::ErrorOr msync(vaddr_t, size_t, int) override { return {}; } protected: diff --git a/kernel/kernel/Memory/SharedMemoryObject.cpp b/kernel/kernel/Memory/SharedMemoryObject.cpp index 1a8425fc..e6bb7285 100644 --- a/kernel/kernel/Memory/SharedMemoryObject.cpp +++ b/kernel/kernel/Memory/SharedMemoryObject.cpp @@ -45,6 +45,7 @@ namespace Kernel Key key = generate_key(); while (m_objects.contains(key)) key = generate_key(); + object->key = key; TRY(m_objects.insert(key, object)); return key; @@ -80,6 +81,12 @@ namespace Kernel return BAN::move(smo); } + BAN::ErrorOr> SharedMemoryObject::clone(PageTable& new_page_table) + { + auto region = TRY(SharedMemoryObjectManager::get().map_object(m_object->key, new_page_table, { .start = vaddr(), .end = vaddr() + size() })); + return BAN::UniqPtr(BAN::move(region)); + } + BAN::ErrorOr SharedMemoryObject::allocate_page_containing_impl(vaddr_t address) { ASSERT(contains(address));