diff --git a/src/memory/paging/entry.rs b/src/memory/paging/entry.rs index 18e47e8..6571581 100644 --- a/src/memory/paging/entry.rs +++ b/src/memory/paging/entry.rs @@ -1,4 +1,5 @@ use memory::Frame; +use multiboot2::ElfSection; pub struct Entry(u64); @@ -45,3 +46,26 @@ bitflags! { const NO_EXECUTE = 1 << 63, } } + + +impl EntryFlags { + pub fn from_elf_section_flags(section: &ElfSection) -> EntryFlags { + use multiboot2::{ELF_SECTION_ALLOCATED, ELF_SECTION_WRITABLE, + ELF_SECTION_EXECUTABLE}; + + let mut flags = EntryFlags::empty(); + + if section.flags().contains(ELF_SECTION_ALLOCATED) { + // section is loaded to memory + flags = flags | PRESENT; + } + if section.flags().contains(ELF_SECTION_WRITABLE) { + flags = flags | WRITABLE; + } + if !section.flags().contains(ELF_SECTION_EXECUTABLE) { + flags = flags | NO_EXECUTE; + } + + flags + } +} diff --git a/src/memory/paging/mod.rs b/src/memory/paging/mod.rs index 1aa8b08..73b0d53 100644 --- a/src/memory/paging/mod.rs +++ b/src/memory/paging/mod.rs @@ -173,7 +173,7 @@ pub fn remap_the_kernel(allocator: &mut A, boot_info: &BootInformation) println!("mapping section at addr: {:#x}, size: {:#x}", section.addr, section.size); - let flags = WRITABLE; // TODO use real section flags + let flags = EntryFlags::from_elf_section_flags(section); let start_frame = Frame::containing_address(section.start_address()); let end_frame = Frame::containing_address(section.end_address() - 1);