summaryrefslogtreecommitdiff
path: root/crates/device_tree/src/lib.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/device_tree/src/lib.rs')
-rw-r--r--crates/device_tree/src/lib.rs23
1 files changed, 16 insertions, 7 deletions
diff --git a/crates/device_tree/src/lib.rs b/crates/device_tree/src/lib.rs
index fe6108f..ce29546 100644
--- a/crates/device_tree/src/lib.rs
+++ b/crates/device_tree/src/lib.rs
@@ -23,10 +23,12 @@ pub struct FlattenedDeviceTree<'dt> {
struct_block: &'dt [u32],
strings_block: &'dt BStr,
memrsv_block: &'dt [FdtMemRsv],
+ kernel_addrs: Range<usize>,
}
impl<'dt> FlattenedDeviceTree<'dt> {
- /// Looks for a DeviceTree at the given address, and returns it if it looks valid.
+ /// Looks for a DeviceTree at the given address, and returns it if it looks valid. Also accepts
+ /// the bounds of the kernel, so that `iter_reserved` can reserve them.
///
/// # Safety
///
@@ -36,7 +38,10 @@ impl<'dt> FlattenedDeviceTree<'dt> {
/// - The memory contained by the flattened DeviceTree must not be mutated for the duration of
/// lifetime `'dt`.
#[requires((ptr as *const FdtHeader).is_aligned())]
- pub unsafe fn from_ptr(ptr: *const u8) -> Result<FlattenedDeviceTree<'dt>, DeviceTreeError> {
+ pub unsafe fn from_ptr(
+ ptr: *const u8,
+ kernel_addrs: Range<usize>,
+ ) -> Result<FlattenedDeviceTree<'dt>, DeviceTreeError> {
// Check that the header appears to point to a valid flattened DeviceTree.
let header: &'dt FdtHeader = &*(ptr as *const FdtHeader);
let magic = u32::from_be(header.magic);
@@ -94,6 +99,7 @@ impl<'dt> FlattenedDeviceTree<'dt> {
struct_block,
strings_block,
memrsv_block,
+ kernel_addrs,
};
fdt.iter_struct_events_from(0)
.try_for_each(|r| r.map(|_| ()))?;
@@ -222,6 +228,7 @@ impl<'dt> FlattenedDeviceTree<'dt> {
///
/// Addresses may be reserved by:
///
+ /// - Overlapping with the kernel.
/// - Overlapping with the DeviceTree itself.
/// - Overlapping with any memory reservations in the DeviceTree.
pub fn iter_reserved(&self) -> impl '_ + Iterator<Item = Range<usize>> {
@@ -229,11 +236,13 @@ impl<'dt> FlattenedDeviceTree<'dt> {
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
- }))
+ iter::once(self.kernel_addrs.clone())
+ .chain(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