diff options
Diffstat (limited to 'kernel/src/lib.rs')
-rw-r--r-- | kernel/src/lib.rs | 24 |
1 files changed, 23 insertions, 1 deletions
diff --git a/kernel/src/lib.rs b/kernel/src/lib.rs index bc5c5c0..5e23109 100644 --- a/kernel/src/lib.rs +++ b/kernel/src/lib.rs @@ -14,7 +14,7 @@ pub mod prelude; #[cfg(not(test))] mod panic; -use crate::prelude::*; +use crate::{allocators::physical_memory_free_list::FreeList, prelude::*}; /// The entrypoint to the kernel. This should be executed by hart0 alone. It performs some early /// boot tasks, then wakes up any other harts. @@ -39,6 +39,7 @@ pub unsafe extern "C" fn hart0_boot(device_tree: *const u8) -> ! { // Find the available physical memory areas and initialize the physical memory // free-list. + let mut physical_memory_free_list = FreeList::new(&flattened_device_tree); flattened_device_tree .for_each_node(|node| { if node.is_unit(&["", "cpus"]) { @@ -58,6 +59,7 @@ pub unsafe extern "C" fn hart0_boot(device_tree: *const u8) -> ! { }; for (addr, size) in reg { + physical_memory_free_list.add_range(addr..addr + size); info!("found memory: addr = {addr:#x}, size = {size:#x}"); } } @@ -65,6 +67,26 @@ pub unsafe extern "C" fn hart0_boot(device_tree: *const u8) -> ! { }) .unwrap_or_else(|err| void::unreachable(err)); + // Log the physical memory we found. + debug!( + "found {} usable regions of physical memory{}", + physical_memory_free_list.len(), + if physical_memory_free_list.is_empty() { + "" + } else { + ":" + } + ); + for region in physical_memory_free_list.drain() { + debug!( + "{:p}..{:p} ({} byte{})", + region.start as *const u8, + region.end as *const u8, + region.len(), + if region.len() == 1 { "" } else { "s" } + ) + } + // After this point, everything else is for debugging. interrupts::example_timer(); info!("sleeping forever..."); |