libfdt: Add Fdt::symbols() and Fdt::symbols_mut()

Bug: 277993056
Test: TH, liblibfdt.integration_test
Change-Id: I20f4226ef45f03c5ed3b54edaf9fb941379a8a5f
diff --git a/libs/libfdt/src/lib.rs b/libs/libfdt/src/lib.rs
index 0d45494..b187c33 100644
--- a/libs/libfdt/src/lib.rs
+++ b/libs/libfdt/src/lib.rs
@@ -975,6 +975,16 @@
         self.node(cstr!("/"))?.ok_or(FdtError::Internal)
     }
 
+    /// Returns the standard /__symbols__ node.
+    pub fn symbols(&self) -> Result<Option<FdtNode>> {
+        self.node(cstr!("/__symbols__"))
+    }
+
+    /// Returns the standard /__symbols__ node as mutable
+    pub fn symbols_mut(&mut self) -> Result<Option<FdtNodeMut>> {
+        self.node_mut(cstr!("/__symbols__"))
+    }
+
     /// Returns a tree node by its full path.
     pub fn node(&self, path: &CStr) -> Result<Option<FdtNode>> {
         Ok(self.path_offset(path.to_bytes())?.map(|offset| FdtNode { fdt: self, offset }))
diff --git a/libs/libfdt/tests/api_test.rs b/libs/libfdt/tests/api_test.rs
index 78c640e..f4a4af5 100644
--- a/libs/libfdt/tests/api_test.rs
+++ b/libs/libfdt/tests/api_test.rs
@@ -16,7 +16,7 @@
 
 //! Integration tests of the library libfdt.
 
-use libfdt::{Fdt, FdtError, Phandle};
+use libfdt::{Fdt, FdtError, FdtNodeMut, Phandle};
 use std::ffi::{CStr, CString};
 use std::fs;
 use std::ops::Range;
@@ -247,3 +247,15 @@
         assert_eq!(subnode.name(), Ok(name.as_c_str()));
     }
 }
+
+#[test]
+fn fdt_symbols() {
+    let mut data = fs::read(TEST_TREE_PHANDLE_PATH).unwrap();
+    let fdt = Fdt::from_mut_slice(&mut data).unwrap();
+
+    let symbols = fdt.symbols().unwrap().unwrap();
+    assert_eq!(symbols.name(), Ok(cstr!("__symbols__")));
+
+    // Validates type.
+    let _symbols: FdtNodeMut = fdt.symbols_mut().unwrap().unwrap();
+}
diff --git a/libs/libfdt/tests/data/test_tree_phandle.dts b/libs/libfdt/tests/data/test_tree_phandle.dts
index 0438241..97d9028 100644
--- a/libs/libfdt/tests/data/test_tree_phandle.dts
+++ b/libs/libfdt/tests/data/test_tree_phandle.dts
@@ -32,4 +32,8 @@
             };
         };
     };
+
+    __symbols__ {
+        symbol_a = "/node_a";
+    };
 };
\ No newline at end of file