From 7eb707f0c220e619c8f200a5a78e0df4dfe41ac0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Kr=C3=B6ning?= Date: Sun, 2 Aug 2026 20:29:07 +0200 Subject: [PATCH] fix(mm): don't account for kernel executable memory twice `physicalmem::total_memory_size()` already accounts for the kernel executable. --- src/env.rs | 8 -------- src/mm/mod.rs | 12 ++---------- 2 files changed, 2 insertions(+), 18 deletions(-) diff --git a/src/env.rs b/src/env.rs index 963cd5f592..e1ae185267 100644 --- a/src/env.rs +++ b/src/env.rs @@ -12,7 +12,6 @@ use hashbrown::HashMap; use hashbrown::hash_map::Iter; use hermit_entry::boot_info::{BootInfo, RawBootInfo}; use hermit_sync::OnceCell; -use memory_addresses::PhysAddr; use shlex::Shlex; static BOOT_INFO: OnceCell = OnceCell::new(); @@ -108,13 +107,6 @@ pub fn fdt() -> Option> { }) } -pub(crate) fn get_ram_address() -> Option { - let fdt = fdt()?; - let memory = fdt.memory(); - let ptr = memory.regions().next()?.starting_address; - Some(ptr.expose_provenance().into()) -} - /// Returns the RSDP physical address if available. #[cfg(all(target_arch = "x86_64", feature = "acpi"))] pub fn rsdp() -> Option> { diff --git a/src/mm/mod.rs b/src/mm/mod.rs index 9f16f4104f..e31e44e53f 100644 --- a/src/mm/mod.rs +++ b/src/mm/mod.rs @@ -61,11 +61,11 @@ use talc::source::Manual; pub use self::page_range_alloc::{PageRangeAllocator, PageRangeBox}; pub use self::physicalmem::{FrameAlloc, FrameBox}; pub use self::virtualmem::{PageAlloc, PageBox}; +use crate::arch; #[cfg(any(target_arch = "x86_64", target_arch = "riscv64"))] use crate::arch::mm::paging::HugePageSize; pub use crate::arch::mm::paging::virtual_to_physical; use crate::arch::mm::paging::{BasePageSize, LargePageSize, PageSize}; -use crate::{arch, env}; #[cfg(target_os = "none")] #[global_allocator] @@ -135,20 +135,12 @@ pub(crate) fn init() { let npage_3tables = npages / npage_div + 1; let npage_2tables = npage_3tables / npage_div + 1; let npage_1tables = npage_2tables / npage_div + 1; - let reserved_space = (npage_3tables + npage_2tables + npage_1tables) - * BasePageSize::SIZE as usize + let min_mem = (npage_3tables + npage_2tables + npage_1tables) * BasePageSize::SIZE as usize + 2 * LargePageSize::SIZE as usize; #[cfg(any(target_arch = "x86_64", target_arch = "riscv64"))] let has_1gib_pages = arch::kernel::processor::supports_1gib_pages(); let has_2mib_pages = arch::kernel::processor::supports_2mib_pages(); - let min_mem = if env::is_uefi() { - // On UEFI, the given memory is guaranteed free memory and the kernel is located before the given memory - reserved_space - } else { - (kernel_addr_range.end.as_u64() - env::get_ram_address().unwrap().as_u64() - + reserved_space as u64) as usize - }; info!("Minimum memory size: {} MiB", min_mem >> 20); let avail_mem = total_mem .checked_sub(min_mem)