aboutsummaryrefslogtreecommitdiff
path: root/arch/x86_64/src/memory/paging
diff options
context:
space:
mode:
Diffstat (limited to 'arch/x86_64/src/memory/paging')
-rw-r--r--arch/x86_64/src/memory/paging/page_entry.cpp5
-rw-r--r--arch/x86_64/src/memory/paging/temporary_page.cpp8
2 files changed, 9 insertions, 4 deletions
diff --git a/arch/x86_64/src/memory/paging/page_entry.cpp b/arch/x86_64/src/memory/paging/page_entry.cpp
index 5aa0982..57045ca 100644
--- a/arch/x86_64/src/memory/paging/page_entry.cpp
+++ b/arch/x86_64/src/memory/paging/page_entry.cpp
@@ -21,10 +21,12 @@ namespace teachos::arch::memory::paging
{
flags |= entry::PRESENT;
}
+
if (elf_flags.contains_flags(multiboot::elf_section_flags::WRITABLE))
{
flags |= entry::WRITABLE;
}
+
if (!elf_flags.contains_flags(multiboot::elf_section_flags::EXECUTABLE_CODE))
{
flags |= entry::EXECUTING_CODE_FORBIDDEN;
@@ -35,6 +37,8 @@ namespace teachos::arch::memory::paging
auto entry::set_unused() -> void { flags = 0U; }
+ auto entry::set_user_accessible() -> void { flags |= entry::USER_ACCESSIBLE; }
+
auto entry::calculate_pointed_to_frame() const -> std::optional<allocator::physical_frame>
{
if (contains_flags(PRESENT))
@@ -51,6 +55,7 @@ namespace teachos::arch::memory::paging
{
exception_handling::assert((frame.start_address() & ~PHYSICAL_ADDRESS_MASK) == 0,
"[Paging Entry] Start address is not aligned with page");
+
flags = frame.start_address() | additional_flags.to_ulong();
}
diff --git a/arch/x86_64/src/memory/paging/temporary_page.cpp b/arch/x86_64/src/memory/paging/temporary_page.cpp
index 152241d..8e73523 100644
--- a/arch/x86_64/src/memory/paging/temporary_page.cpp
+++ b/arch/x86_64/src/memory/paging/temporary_page.cpp
@@ -4,16 +4,16 @@
namespace teachos::arch::memory::paging
{
- auto temporary_page::map_table_frame(allocator::physical_frame frame,
- active_page_table & active_table) -> page_table_handle
+ auto temporary_page::map_table_frame(allocator::physical_frame frame, active_page_table & active_table)
+ -> page_table_handle
{
page_table_handle handle{reinterpret_cast<page_table *>(map_to_frame(frame, active_table)),
page_table_handle::LEVEL1};
return handle;
}
- auto temporary_page::map_to_frame(allocator::physical_frame frame,
- active_page_table & active_table) -> virtual_address
+ auto temporary_page::map_to_frame(allocator::physical_frame frame, active_page_table & active_table)
+ -> virtual_address
{
exception_handling::assert(!active_table.translate_page(page).has_value(),
"[Temporary page] Page is already mapped");