aboutsummaryrefslogtreecommitdiff
path: root/arch/x86_64/src/memory/scoped_mapping.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'arch/x86_64/src/memory/scoped_mapping.cpp')
-rw-r--r--arch/x86_64/src/memory/scoped_mapping.cpp99
1 files changed, 8 insertions, 91 deletions
diff --git a/arch/x86_64/src/memory/scoped_mapping.cpp b/arch/x86_64/src/memory/scoped_mapping.cpp
index 44dbf45..6f3461c 100644
--- a/arch/x86_64/src/memory/scoped_mapping.cpp
+++ b/arch/x86_64/src/memory/scoped_mapping.cpp
@@ -5,10 +5,8 @@
#include "x86_64/memory/mmu.hpp"
#include "x86_64/memory/page_table.hpp"
-#include "x86_64/memory/page_utilities.hpp"
#include "x86_64/memory/paging_root.hpp"
-#include <memory>
#include <utility>
namespace teachos::memory::x86_64
@@ -16,16 +14,12 @@ namespace teachos::memory::x86_64
scoped_mapping::scoped_mapping(scoped_mapping && other) noexcept
: m_page{std::exchange(other.m_page, page{})}
- , m_allocator{std::exchange(other.m_allocator, nullptr)}
, m_mapped{std::exchange(other.m_mapped, false)}
- , m_allocated{std::exchange(other.m_allocated, 0)}
{}
- scoped_mapping::scoped_mapping(page page, frame_allocator & allocator)
+ scoped_mapping::scoped_mapping(page page)
: m_page{page}
- , m_allocator{&allocator}
, m_mapped{false}
- , m_allocated{}
{
if (paging_root::get().translate(page))
{
@@ -44,105 +38,28 @@ namespace teachos::memory::x86_64
auto scoped_mapping::operator=(scoped_mapping && other) noexcept -> scoped_mapping &
{
- this->swap(other);
+ swap(*this, other);
return *this;
}
auto scoped_mapping::map(frame frame, page_table::entry::flags flags) -> std::byte *
{
- auto & pml4 = paging_root::get();
- auto pml4_index = pml_index<4>(m_page);
- if (!pml4[pml4_index].present())
- {
- auto new_frame = m_allocator->allocate();
- pml4[pml4_index].frame(*new_frame, page_table::entry::flags::present | flags);
- std::construct_at(pml4.next(pml4_index).value());
- m_allocated |= 1uz << 2;
- }
-
- auto pml3 = pml4.next(pml4_index).value();
- auto pml3_index = pml_index<3>(m_page);
- if (!(*pml3)[pml3_index].present())
- {
- auto new_frame = m_allocator->allocate();
- (*pml3)[pml3_index].frame(*new_frame, page_table::entry::flags::present | flags);
- std::construct_at((*pml3).next(pml3_index).value());
- m_allocated |= 1uz << 1;
- }
-
- auto pml2 = (*pml3).next(pml3_index).value();
- auto pml2_index = pml_index<2>(m_page);
- if (!(*pml2)[pml2_index].present())
- {
- auto new_frame = m_allocator->allocate();
- (*pml2)[pml2_index].frame(*new_frame, page_table::entry::flags::present | flags);
- std::construct_at((*pml2).next(pml2_index).value());
- m_allocated |= 1uz << 0;
- }
-
- auto pml1 = (*pml2).next(pml2_index).value();
- auto pml1_index = pml_index<1>(m_page);
- (*pml1)[pml1_index].frame(frame, page_table::entry::flags::present | flags);
-
+ auto result = active_mapper().map(m_page, frame, to_mapper_flags(flags));
m_mapped = true;
-
- return static_cast<std::byte *>(m_page.start_address());
+ return result;
}
auto scoped_mapping::unmap() -> void
{
- if (!m_mapped)
- {
- system::panic("[MEM] Tried to release an unmapped temporary mapping!");
- }
-
- auto pml4 = &paging_root::get();
- auto pml3 = pml4->next(pml_index<4>(m_page)).value();
- auto pml2 = pml3->next(pml_index<3>(m_page)).value();
- auto pml1 = pml2->next(pml_index<2>(m_page)).value();
-
- (*pml1)[pml_index<1>(m_page)].clear();
-
- if (m_allocated & 1uz << 0)
- {
- auto pml1_frame = (*pml2)[pml_index<2>(m_page)].frame().value();
- m_allocator->release(pml1_frame);
- (*pml2)[pml_index<2>(m_page)].clear();
- }
-
- if (m_allocated & 1uz << 1)
- {
- auto pml2_frame = (*pml3)[pml_index<3>(m_page)].frame().value();
- m_allocator->release(pml2_frame);
- (*pml3)[pml_index<3>(m_page)].clear();
- }
-
- if (m_allocated & 1uz << 2)
- {
- auto pml3_frame = (*pml4)[pml_index<4>(m_page)].frame().value();
- m_allocator->release(pml3_frame);
- (*pml4)[pml_index<4>(m_page)].clear();
- }
-
+ active_mapper().unmap(m_page);
m_mapped = false;
}
- auto scoped_mapping::swap(scoped_mapping & other) -> void
- {
- using std::swap;
-
- if (&other == this)
- return;
-
- swap(m_page, other.m_page);
- swap(m_allocator, other.m_allocator);
- swap(m_mapped, other.m_mapped);
- swap(m_allocated, other.m_allocated);
- }
-
auto swap(scoped_mapping & lhs, scoped_mapping & rhs) -> void
{
- lhs.swap(rhs);
+ using std::swap;
+ swap(lhs.m_page, rhs.m_page);
+ swap(lhs.m_mapped, rhs.m_mapped);
}
} // namespace teachos::memory::x86_64 \ No newline at end of file