summaryrefslogtreecommitdiff
path: root/kernel/src/device_tree.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/device_tree.rs
parentf988949d7e57f005fba0dbc14491ed9b065c2e36 (diff)
Adds a free-list for physical memory.
Diffstat (limited to 'kernel/src/device_tree.rs')
-rw-r--r--kernel/src/device_tree.rs28
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 {