chore: kmem: make memory reserving rules more robust

This commit is contained in:
Paul Pan 2024-06-09 00:16:27 +08:00
parent 95713e2af4
commit a007e299d2

View File

@ -32,14 +32,14 @@ pub unsafe fn setup_memory(fdt_addr: usize) {
// Exclude memory occupied by UEFI
for region in fdt.memory_reservations() {
debug!(
"Reserving memory:\tstart: {:x?}, size: {:x?}",
"Reserving UEFI memory:\tstart: {:x?}, size: {:x?}",
region.address(),
region.size()
);
mem.reserve(PhysAddr::from(region.address()), align_up(region.size(), PAGE_SIZE));
}
// Exclude memory occupied by OpenSBI
// Exclude memory in /reserved-memory
let reserved_memory = fdt
.find_node("/reserved-memory")
.map(|node| node.children())
@ -47,7 +47,7 @@ pub unsafe fn setup_memory(fdt_addr: usize) {
for child in reserved_memory {
let region = child.reg().unwrap().next().unwrap();
debug!(
"Reserving memory:\tstart: {:x?}, size: {:x?}",
"Reserving memory marked in /reserved-memory:\tstart: {:x?}, size: {:x?}",
region.starting_address, region.size
);
mem.reserve(
@ -56,6 +56,19 @@ pub unsafe fn setup_memory(fdt_addr: usize) {
);
}
// Exclude memory in mmode_resv
fdt.all_nodes().filter(|n| n.name.starts_with("mmode_resv")).for_each(|node| {
let region = node.reg().unwrap().next().unwrap();
debug!(
"Reserving memory marked in /mmode_resv:\tstart: {:x?}, size: {:x?}",
region.starting_address, region.size
);
mem.reserve(
PhysAddr::from(region.starting_address),
align_up(region.size.unwrap(), PAGE_SIZE),
);
});
// Exclude kernel memory
let kernel_start = kernel_virt_to_phys(KERNEL_START.as_virt_addr());
let kernel_end = kernel_virt_to_phys(KERNEL_END.as_virt_addr()).align_up(PAGE_SIZE);