From 251ea035fa2338db7b001af338d65875a9bc65ad Mon Sep 17 00:00:00 2001 From: Nathan Ringo Date: Tue, 27 Aug 2024 00:20:19 -0500 Subject: Adds a free-list for physical memory. --- kernel/src/device_tree.rs | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) (limited to 'kernel/src/device_tree.rs') diff --git a/kernel/src/device_tree.rs b/kernel/src/device_tree.rs index 5fdc3e9..c045cfd 100644 --- a/kernel/src/device_tree.rs +++ b/kernel/src/device_tree.rs @@ -6,13 +6,13 @@ use contracts::requires; use core::{ fmt, iter, num::ParseIntError, + ops::Range, slice, str::{self, Utf8Error}, }; use either::Either; /// A reference to a flattened DeviceTree (DTB) in memory. -#[derive(Debug)] pub struct FlattenedDeviceTree<'dt> { header: &'dt FdtHeader, struct_block: &'dt [u32], @@ -127,6 +127,24 @@ impl<'dt> FlattenedDeviceTree<'dt> { Ok(()) } + /// Returns an iterator over the reserved ranges of addresses. + /// + /// Addresses may be reserved by: + /// + /// - Overlapping with the DeviceTree itself. + /// - Overlapping with any memory reservations in the DeviceTree. + pub fn iter_reserved(&self) -> impl '_ + Iterator> { + // Make the address range of the DeviceTree. + let dt_start = self.header as *const FdtHeader as usize; + let dt_end = dt_start + u32::from_be(self.header.totalsize) as usize; + + iter::once(dt_start..dt_end).chain(self.memrsv_block.iter().map(|memrsv| { + let addr = u64::from_be(memrsv.addr) as usize; + let size = u64::from_be(memrsv.size) as usize; + addr..addr + size + })) + } + /// Returns an iterator over the events in the structure block of the DeviceTree, starting at /// the current offset from the start of the structure block. /// @@ -244,6 +262,14 @@ impl<'dt> FlattenedDeviceTree<'dt> { } } +impl<'dt> fmt::Debug for FlattenedDeviceTree<'dt> { + fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result { + let addr = self.header as *const FdtHeader; + // Intentionally not using `fmt.debug_tuple`, it's wasted space here. + write!(fmt, "FlattenedDeviceTree::from_ptr({addr:p})") + } +} + /// An error encountered when reading a DeviceTree. #[derive(Debug)] pub enum DeviceTreeError { -- cgit v1.2.3