-
Notifications
You must be signed in to change notification settings - Fork 0
/
boot_info.rs
40 lines (33 loc) · 1.33 KB
/
boot_info.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
// Forked from bootloader 0.9.22, copyright 2018 Philipp Oppermann.
//
// Use of the original source code is governed by the MIT
// license that can be found in the LICENSE.orig file.
//
// Subsequent work copyright 2022 The Firefly Authors.
//
// Use of new and modified source code is governed by a BSD 3-clause
// license that can be found in the LICENSE file.
use core::slice;
use bootinfo::{E820MemoryRegion, MemoryMap, MemoryRegion, MemoryRegionType};
use x86_64::VirtAddr;
pub(crate) fn create_from(memory_map_addr: VirtAddr, entry_count: u64) -> MemoryMap {
let memory_map_start_ptr = memory_map_addr.as_u64() as usize as *const E820MemoryRegion;
let e820_memory_map =
unsafe { slice::from_raw_parts(memory_map_start_ptr, entry_count as usize) };
let mut memory_map = MemoryMap::new();
for region in e820_memory_map {
memory_map.add_region(MemoryRegion::from(*region));
}
memory_map.sort();
let mut iter = memory_map.iter_mut().peekable();
while let Some(region) = iter.next() {
if let Some(next) = iter.peek() {
if region.range.end_frame_number > next.range.start_frame_number
&& region.region_type == MemoryRegionType::Usable
{
region.range.end_frame_number = next.range.start_frame_number;
}
}
}
memory_map
}