diff options
author | Nathan Ringo <nathan@remexre.com> | 2024-08-27 00:20:19 -0500 |
---|---|---|
committer | Nathan Ringo <nathan@remexre.com> | 2024-08-27 00:20:19 -0500 |
commit | 251ea035fa2338db7b001af338d65875a9bc65ad (patch) | |
tree | f260a8da1b5bfef4337f06ff1567de30ad1d4c70 /kernel/src/device_tree.rs | |
parent | f988949d7e57f005fba0dbc14491ed9b065c2e36 (diff) |
Adds a free-list for physical memory.
Diffstat (limited to 'kernel/src/device_tree.rs')
-rw-r--r-- | kernel/src/device_tree.rs | 28 |
1 files changed, 27 insertions, 1 deletions
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<Item = Range<usize>> { + // 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 { |