aboutsummaryrefslogtreecommitdiff
path: root/arch/x86_64/src/memory/kernel_mapper.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'arch/x86_64/src/memory/kernel_mapper.cpp')
-rw-r--r--arch/x86_64/src/memory/kernel_mapper.cpp25
1 files changed, 12 insertions, 13 deletions
diff --git a/arch/x86_64/src/memory/kernel_mapper.cpp b/arch/x86_64/src/memory/kernel_mapper.cpp
index f46b5b5..a28cf00 100644
--- a/arch/x86_64/src/memory/kernel_mapper.cpp
+++ b/arch/x86_64/src/memory/kernel_mapper.cpp
@@ -5,8 +5,6 @@
#include "kapi/system.hpp"
#include "x86_64/boot/ld.hpp"
-#include "x86_64/memory/page_table.hpp"
-#include "x86_64/memory/paging_root.hpp"
#include <elf/format.hpp>
#include <elf/section_header.hpp>
@@ -17,7 +15,7 @@
namespace teachos::memory::x86_64
{
- inline namespace
+ namespace
{
using namespace std::string_view_literals;
@@ -37,7 +35,7 @@ namespace teachos::memory::x86_64
, m_kernel_load_base{std::bit_cast<std::uintptr_t>(&boot::x86_64::TEACHOS_VMA)}
{}
- auto kernel_mapper::remap_kernel() -> void
+ auto kernel_mapper::remap_kernel(page_mapper & mapper) -> void
{
auto elf_information = m_mbi->maybe_elf_symbols<elf::format::elf64>();
if (!elf_information)
@@ -60,10 +58,11 @@ namespace teachos::memory::x86_64
}
std::ranges::for_each(allocated_sections,
- [&](auto const & section) -> auto { map_section(section, sections.name(section)); });
+ [&](auto const & section) -> auto { map_section(section, sections.name(section), mapper); });
}
- auto kernel_mapper::map_section(section_header_type const & section, std::string_view name) -> void
+ auto kernel_mapper::map_section(section_header_type const & section, std::string_view name, page_mapper & mapper)
+ -> void
{
cio::print("[x86_64:MEM] mapping ");
cio::println(name);
@@ -76,30 +75,30 @@ namespace teachos::memory::x86_64
auto first_page = page::containing(linear_start_address);
auto first_frame = frame::containing(physical_start_address);
- auto page_flags = page_table::entry::flags::empty;
+ auto page_flags = page_mapper::flags::empty;
if (section.writable())
{
- page_flags |= page_table::entry::flags::writable;
+ page_flags |= page_mapper::flags::writable;
}
- if (!section.executable())
+ if (section.executable())
{
- page_flags |= page_table::entry::flags::no_execute;
+ page_flags |= page_mapper::flags::executable;
}
auto is_prefix_of_name = [=](auto prefix) -> bool {
return name.starts_with(prefix);
};
- if (std::ranges::any_of(user_accessible_prefixes, is_prefix_of_name))
+ if (!std::ranges::any_of(user_accessible_prefixes, is_prefix_of_name))
{
- page_flags |= page_table::entry::flags::user_accessible;
+ page_flags |= page_mapper::flags::supervisor_only;
}
for (auto i = 0uz; i < number_of_pages; ++i)
{
- paging_root::get().map(page{first_page.number() + i}, frame{first_frame.number() + i}, page_flags);
+ mapper.map(first_page + i, first_frame + i, page_flags);
}
}