[fdt] Add function to get the first range in /memory node of fdt
and test it. This function will be reused later in both pvmfw and
rialto.
Test: atest liblibfdt.integration_test
Test: atest vmbase_example.integration_test
Test: m pvmfw_img
Bug: 284462758
Change-Id: Ic547530f911281c2db14b9a59b7e2470be10361f
diff --git a/libs/libfdt/src/lib.rs b/libs/libfdt/src/lib.rs
index 91214b3..8e0bb65 100644
--- a/libs/libfdt/src/lib.rs
+++ b/libs/libfdt/src/lib.rs
@@ -25,6 +25,7 @@
use core::ffi::{c_int, c_void, CStr};
use core::fmt;
use core::mem;
+use core::ops::Range;
use core::result;
use zerocopy::AsBytes as _;
@@ -716,23 +717,24 @@
Ok(self)
}
- /// Return an iterator of memory banks specified the "/memory" node.
+ /// Returns an iterator of memory banks specified the "/memory" node.
+ /// Throws an error when the "/memory" is not found in the device tree.
///
/// NOTE: This does not support individual "/memory@XXXX" banks.
- pub fn memory(&self) -> Result<Option<MemRegIterator>> {
- let memory = CStr::from_bytes_with_nul(b"/memory\0").unwrap();
- let device_type = CStr::from_bytes_with_nul(b"memory\0").unwrap();
+ pub fn memory(&self) -> Result<MemRegIterator> {
+ let memory_node_name = CStr::from_bytes_with_nul(b"/memory\0").unwrap();
+ let memory_device_type = CStr::from_bytes_with_nul(b"memory\0").unwrap();
- if let Some(node) = self.node(memory)? {
- if node.device_type()? != Some(device_type) {
- return Err(FdtError::BadValue);
- }
- let reg = node.reg()?.ok_or(FdtError::BadValue)?;
-
- Ok(Some(MemRegIterator::new(reg)))
- } else {
- Ok(None)
+ let node = self.node(memory_node_name)?.ok_or(FdtError::NotFound)?;
+ if node.device_type()? != Some(memory_device_type) {
+ return Err(FdtError::BadValue);
}
+ node.reg()?.ok_or(FdtError::BadValue).map(MemRegIterator::new)
+ }
+
+ /// Returns the first memory range in the `/memory` node.
+ pub fn first_memory_range(&self) -> Result<Range<usize>> {
+ self.memory()?.next().ok_or(FdtError::NotFound)
}
/// Retrieve the standard /chosen node.