From dc7e823f70a9f75829ba744111d259d2b9905cea Mon Sep 17 00:00:00 2001 From: bjorn3 <17426603+bjorn3@users.noreply.github.com> Date: Thu, 2 Apr 2026 19:37:32 +0200 Subject: [PATCH] Deduplicate kernel page flags --- src/arch/aarch64/mod.rs | 2 -- src/arch/aarch64/rmm.rs | 17 ----------------- src/arch/riscv64/mod.rs | 1 - src/arch/riscv64/rmm.rs | 17 ----------------- src/arch/x86_shared/mod.rs | 2 -- src/arch/x86_shared/rmm.rs | 18 ------------------ src/startup/memory.rs | 27 ++++++++++++++++++++++----- 7 files changed, 22 insertions(+), 62 deletions(-) delete mode 100644 src/arch/aarch64/rmm.rs delete mode 100644 src/arch/riscv64/rmm.rs delete mode 100644 src/arch/x86_shared/rmm.rs diff --git a/src/arch/aarch64/mod.rs b/src/arch/aarch64/mod.rs index ddd338cc2d..2248c85a30 100644 --- a/src/arch/aarch64/mod.rs +++ b/src/arch/aarch64/mod.rs @@ -19,8 +19,6 @@ pub mod misc; /// Paging pub mod paging; -pub mod rmm; - /// Initialization and start function pub mod start; diff --git a/src/arch/aarch64/rmm.rs b/src/arch/aarch64/rmm.rs deleted file mode 100644 index 453382c44c..0000000000 --- a/src/arch/aarch64/rmm.rs +++ /dev/null @@ -1,17 +0,0 @@ -use rmm::{Arch, PageFlags, VirtualAddress}; - -pub unsafe fn page_flags(virt: VirtualAddress) -> PageFlags { - use crate::kernel_executable_offsets::*; - let virt_addr = virt.data(); - - if virt_addr >= __text_start() && virt_addr < __text_end() { - // Remap text read-only, execute - PageFlags::new().execute(true) - } else if virt_addr >= __rodata_start() && virt_addr < __rodata_end() { - // Remap rodata read-only, no execute - PageFlags::new() - } else { - // Remap everything else read-write, no execute - PageFlags::new().write(true) - } -} diff --git a/src/arch/riscv64/mod.rs b/src/arch/riscv64/mod.rs index 9fca214972..12ad0c8254 100644 --- a/src/arch/riscv64/mod.rs +++ b/src/arch/riscv64/mod.rs @@ -5,7 +5,6 @@ pub mod interrupt; pub mod ipi; pub mod misc; pub mod paging; -pub mod rmm; pub mod start; pub mod stop; pub mod time; diff --git a/src/arch/riscv64/rmm.rs b/src/arch/riscv64/rmm.rs deleted file mode 100644 index 453382c44c..0000000000 --- a/src/arch/riscv64/rmm.rs +++ /dev/null @@ -1,17 +0,0 @@ -use rmm::{Arch, PageFlags, VirtualAddress}; - -pub unsafe fn page_flags(virt: VirtualAddress) -> PageFlags { - use crate::kernel_executable_offsets::*; - let virt_addr = virt.data(); - - if virt_addr >= __text_start() && virt_addr < __text_end() { - // Remap text read-only, execute - PageFlags::new().execute(true) - } else if virt_addr >= __rodata_start() && virt_addr < __rodata_end() { - // Remap rodata read-only, no execute - PageFlags::new() - } else { - // Remap everything else read-write, no execute - PageFlags::new().write(true) - } -} diff --git a/src/arch/x86_shared/mod.rs b/src/arch/x86_shared/mod.rs index 3878669fb7..3c18631226 100644 --- a/src/arch/x86_shared/mod.rs +++ b/src/arch/x86_shared/mod.rs @@ -25,8 +25,6 @@ pub mod paging; /// Page table isolation pub mod pti; -pub mod rmm; - /// Initialization and start function pub mod start; diff --git a/src/arch/x86_shared/rmm.rs b/src/arch/x86_shared/rmm.rs deleted file mode 100644 index 7516603a25..0000000000 --- a/src/arch/x86_shared/rmm.rs +++ /dev/null @@ -1,18 +0,0 @@ -use rmm::{Arch, PageFlags, VirtualAddress}; - -pub unsafe fn page_flags(virt: VirtualAddress) -> PageFlags { - use crate::kernel_executable_offsets::*; - let virt_addr = virt.data(); - - (if virt_addr >= __text_start() && virt_addr < __text_end() { - // Remap text read-only, execute - PageFlags::new().execute(true) - } else if virt_addr >= __rodata_start() && virt_addr < __rodata_end() { - // Remap rodata read-only, no execute - PageFlags::new() - } else { - // Remap everything else read-write, no execute - PageFlags::new().write(true) - }) - .global(cfg!(all(target_arch = "x86_64", not(feature = "pti")))) -} diff --git a/src/startup/memory.rs b/src/startup/memory.rs index 25d89edadf..603d9a7cad 100644 --- a/src/startup/memory.rs +++ b/src/startup/memory.rs @@ -1,5 +1,5 @@ use crate::{ - arch::{consts::KERNEL_OFFSET, rmm::page_flags, CurrentRmmArch}, + arch::{consts::KERNEL_OFFSET, CurrentRmmArch}, memory::PAGE_SIZE, startup::{memory::BootloaderMemoryKind::Null, KernelArgs}, }; @@ -290,6 +290,23 @@ unsafe fn add_memory(areas: &mut [MemoryArea], area_i: &mut usize, mut area: Mem } } +fn kernel_page_flags(virt: VirtualAddress) -> PageFlags { + use crate::kernel_executable_offsets::*; + let virt_addr = virt.data(); + + (if virt_addr >= __text_start() && virt_addr < __text_end() { + // Remap text read-only, execute + PageFlags::new().execute(true) + } else if virt_addr >= __rodata_start() && virt_addr < __rodata_end() { + // Remap rodata read-only, no execute + PageFlags::new() + } else { + // Remap everything else read-write, no execute + PageFlags::new().write(true) + }) + .global(cfg!(all(target_arch = "x86_64", not(feature = "pti")))) +} + unsafe fn map_memory(areas: &[MemoryArea], mut bump_allocator: &mut BumpAllocator) { unsafe { let mut mapper = PageMapper::::create(TableKind::Kernel, &mut bump_allocator) @@ -300,7 +317,7 @@ unsafe fn map_memory(areas: &[MemoryArea], mut bump_allocator: &mut Bum for i in 0..area.size / PAGE_SIZE { let phys = area.base.add(i * PAGE_SIZE); let virt = A::phys_to_virt(phys); - let flags = page_flags::(virt); + let flags = kernel_page_flags::(virt); let flush = mapper .map_phys(virt, phys, flags) .expect("failed to map frame"); @@ -315,7 +332,7 @@ unsafe fn map_memory(areas: &[MemoryArea], mut bump_allocator: &mut Bum for i in 0..kernel_size / A::PAGE_SIZE { let phys = PhysicalAddress::new(kernel_base + i * PAGE_SIZE); let virt = VirtualAddress::new(KERNEL_OFFSET + i * PAGE_SIZE); - let flags = page_flags::(virt); + let flags = kernel_page_flags::(virt); let flush = mapper .map_phys(virt, phys, flags) .expect("failed to map frame"); @@ -334,7 +351,7 @@ unsafe fn map_memory(areas: &[MemoryArea], mut bump_allocator: &mut Bum for i in 0..size / PAGE_SIZE { let phys = PhysicalAddress::new(base + i * PAGE_SIZE); let virt = A::phys_to_virt(phys); - let flags = page_flags::(virt); + let flags = kernel_page_flags::(virt); let flush = mapper .map_phys(virt, phys, flags) .expect("failed to map frame"); @@ -349,7 +366,7 @@ unsafe fn map_memory(areas: &[MemoryArea], mut bump_allocator: &mut Bum for i in 0..size / PAGE_SIZE { let phys = PhysicalAddress::new(base + i * PAGE_SIZE); let virt = A::phys_to_virt(phys); - let flags = page_flags::(virt).device_memory(true); + let flags = kernel_page_flags::(virt).device_memory(true); let flush = mapper .map_phys(virt, phys, flags) .expect("failed to map frame");