diff options
author | Nathan Ringo <nathan@remexre.com> | 2024-09-14 17:37:48 -0500 |
---|---|---|
committer | Nathan Ringo <nathan@remexre.com> | 2024-09-14 17:37:48 -0500 |
commit | 5a7617e4d524a74a4fb21f956fead71e789c454c (patch) | |
tree | 84832f1826f156d4ec54222c238fa247e4b09f34 /crates/device_tree | |
parent | ec991590e4e3b92e407060410ff33525dc740988 (diff) |
Start of a platform-independent paging interface.
Diffstat (limited to 'crates/device_tree')
-rw-r--r-- | crates/device_tree/src/lib.rs | 23 |
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 |