From e040dda7a4172d98466f1f24b23dedd2c2d34836 Mon Sep 17 00:00:00 2001 From: Ruihan Li Date: Tue, 1 Apr 2025 23:28:14 +0800 Subject: [PATCH] Ignore unusable regions for `max_paddr` --- ostd/src/mm/frame/meta.rs | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/ostd/src/mm/frame/meta.rs b/ostd/src/mm/frame/meta.rs index fb130a359..5b4e47b0f 100644 --- a/ostd/src/mm/frame/meta.rs +++ b/ostd/src/mm/frame/meta.rs @@ -53,6 +53,7 @@ use log::info; use crate::{ arch::mm::PagingConsts, + boot::memory_region::MemoryRegionType, const_assert, mm::{ frame::allocator::{self, EarlyAllocatedFrameMeta}, @@ -451,7 +452,12 @@ impl_frame_meta_for!(MetaPageMeta); pub(crate) unsafe fn init() -> Segment { let max_paddr = { let regions = &crate::boot::EARLY_INFO.get().unwrap().memory_regions; - regions.iter().map(|r| r.base() + r.len()).max().unwrap() + regions + .iter() + .filter(|r| r.typ() == MemoryRegionType::Usable) + .map(|r| r.base() + r.len()) + .max() + .unwrap() }; info!( @@ -567,8 +573,11 @@ macro_rules! mark_ranges { fn mark_unusable_ranges() { let regions = &crate::boot::EARLY_INFO.get().unwrap().memory_regions; - for region in regions.iter() { - use crate::boot::memory_region::MemoryRegionType; + for region in regions + .iter() + .rev() + .skip_while(|r| r.typ() != MemoryRegionType::Usable) + { match region.typ() { MemoryRegionType::BadMemory => mark_ranges!(region, UnusableMemoryMeta), MemoryRegionType::Unknown => mark_ranges!(region, UnusableMemoryMeta),