From db70018fc76800dd56b4421be797bffd00d7619d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matteo=20Gm=C3=BCr?= Date: Sun, 3 Nov 2024 13:52:22 +0000 Subject: Convert elf section flags to entry flags --- arch/x86_64/src/memory/paging/page_entry.cpp | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) (limited to 'arch/x86_64/src') 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 -- cgit v1.2.3