summaryrefslogtreecommitdiff
path: root/kernel/src/lib.rs
diff options
context:
space:
mode:
authorNathan Ringo <nathan@remexre.com>2024-08-27 00:20:19 -0500
committerNathan Ringo <nathan@remexre.com>2024-08-27 00:20:19 -0500
commit251ea035fa2338db7b001af338d65875a9bc65ad (patch)
treef260a8da1b5bfef4337f06ff1567de30ad1d4c70 /kernel/src/lib.rs
parentf988949d7e57f005fba0dbc14491ed9b065c2e36 (diff)
Adds a free-list for physical memory.
Diffstat (limited to 'kernel/src/lib.rs')
-rw-r--r--kernel/src/lib.rs24
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...");