aboutsummaryrefslogtreecommitdiff
path: root/arch/x86_64/src
diff options
context:
space:
mode:
authorMatteo Gmür <matteo.gmuer1@ost.ch>2024-11-03 13:52:22 +0000
committerMatteo Gmür <matteo.gmuer1@ost.ch>2024-11-03 13:52:22 +0000
commitdb70018fc76800dd56b4421be797bffd00d7619d (patch)
tree290f13c811e382b4ebd7e74e336a98eec066ae43 /arch/x86_64/src
parent74c53bed107b87f064484b926d8ed02018eb3a3e (diff)
downloadteachos-db70018fc76800dd56b4421be797bffd00d7619d.tar.xz
teachos-db70018fc76800dd56b4421be797bffd00d7619d.zip
Convert elf section flags to entry flags
Diffstat (limited to 'arch/x86_64/src')
-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