Skip to content

Commit dde1fa2

Browse files
committed
Sort and remove overlaps from memory map
1 parent a04ca8e commit dde1fa2

File tree

1 file changed

+16
-1
lines changed

1 file changed

+16
-1
lines changed

src/boot_info.rs

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use core::slice;
22

3-
use os_bootinfo::{E820MemoryRegion, MemoryMap, MemoryRegion};
3+
use os_bootinfo::{E820MemoryRegion, MemoryMap, MemoryRegion, MemoryRegionType};
44
use usize_conversions::usize_from;
55
use x86_64::VirtAddr;
66

@@ -14,5 +14,20 @@ pub(crate) fn create_from(memory_map_addr: VirtAddr, entry_count: u64) -> Memory
1414
memory_map.add_region(MemoryRegion::from(*region));
1515
}
1616

17+
memory_map.sort();
18+
19+
let mut iter = memory_map.iter_mut().peekable();
20+
while let Some(region) = iter.next() {
21+
if let Some(next) = iter.peek() {
22+
if region.range.end > next.range.start {
23+
if region.region_type == MemoryRegionType::Usable {
24+
region.range.end = next.range.start;
25+
} else {
26+
panic!("two non-usable regions overlap: {:?} {:?}", region, next);
27+
}
28+
}
29+
}
30+
}
31+
1732
memory_map
1833
}

0 commit comments

Comments
 (0)