From a007e299d2d5082e17f016cf53a5814f4e3b4f3a Mon Sep 17 00:00:00 2001 From: Paul Pan Date: Sun, 9 Jun 2024 00:16:27 +0800 Subject: [PATCH] chore: kmem: make memory reserving rules more robust --- kernel/src/arch/riscv/vspace/kmem.rs | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/kernel/src/arch/riscv/vspace/kmem.rs b/kernel/src/arch/riscv/vspace/kmem.rs index 08ba8a4..8a51444 100644 --- a/kernel/src/arch/riscv/vspace/kmem.rs +++ b/kernel/src/arch/riscv/vspace/kmem.rs @@ -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);