aboutsummaryrefslogtreecommitdiff
path: root/arch/x86_64/src/memory
diff options
context:
space:
mode:
Diffstat (limited to 'arch/x86_64/src/memory')
-rw-r--r--arch/x86_64/src/memory/paging/page_entry.cpp22
1 files changed, 21 insertions, 1 deletions
diff --git a/arch/x86_64/src/memory/paging/page_entry.cpp b/arch/x86_64/src/memory/paging/page_entry.cpp
index 23c700f..5c4bc67 100644
--- a/arch/x86_64/src/memory/paging/page_entry.cpp
+++ b/arch/x86_64/src/memory/paging/page_entry.cpp
@@ -7,7 +7,8 @@ namespace teachos::arch::memory::paging
namespace
{
std::size_t constexpr PHYSICAL_ADDRESS_MASK = 0x000fffff'fffff000;
- }
+ std::size_t constexpr ENTRY_FLAGS_MASK = 0xfff00000'00000fff;
+ } // namespace
entry::entry(uint64_t flags)
: flags(flags)
@@ -15,6 +16,23 @@ namespace teachos::arch::memory::paging
// Nothing to do.
}
+ entry::entry(multiboot::elf_section_flags elf_flags)
+ {
+ if (elf_flags.contains_flags(multiboot::elf_section_flags::OCCUPIES_MEMORY))
+ {
+ flags = flags.to_ulong() | entry::PRESENT;
+ }
+ if (elf_flags.contains_flags(multiboot::elf_section_flags::WRITABLE))
+ {
+ flags = flags.to_ulong() | entry::WRITABLE;
+ }
+ if (!elf_flags.contains_flags(multiboot::elf_section_flags::EXECUTABLE_CODE))
+ {
+ // TODO: Ensure to set the NXE bit, if we don't using this entry flag causes crashes
+ // flags = flags.to_ulong() | entry::EXECUTING_CODE_FORBIDDEN;
+ }
+ }
+
auto entry::is_unused() const -> bool { return flags == 0U; }
auto entry::set_unused() -> void { flags = 0U; }
@@ -37,4 +55,6 @@ namespace teachos::arch::memory::paging
"[Paging Entry] Start address is not aligned with page");
flags = frame.start_address() | additional_flags.to_ulong();
}
+
+ auto entry::get_flags() -> std::bitset<64U> { return flags.to_ulong() & ENTRY_FLAGS_MASK; }
} // namespace teachos::arch::memory::paging