Merge "Microdroid: Use libdice_policy_builder" into main
diff --git a/javalib/Android.bp b/javalib/Android.bp
index cbc2a17..e3cb2e3 100644
--- a/javalib/Android.bp
+++ b/javalib/Android.bp
@@ -64,39 +64,3 @@
         "//packages/modules/Virtualization:__subpackages__",
     ],
 }
-
-java_api_contribution {
-    name: "framework-virtualization-public-stubs",
-    api_surface: "public",
-    api_file: "api/current.txt",
-    visibility: [
-        "//build/orchestrator/apis",
-    ],
-}
-
-java_api_contribution {
-    name: "framework-virtualization-system-stubs",
-    api_surface: "system",
-    api_file: "api/system-current.txt",
-    visibility: [
-        "//build/orchestrator/apis",
-    ],
-}
-
-java_api_contribution {
-    name: "framework-virtualization-test-stubs",
-    api_surface: "test",
-    api_file: "api/test-current.txt",
-    visibility: [
-        "//build/orchestrator/apis",
-    ],
-}
-
-java_api_contribution {
-    name: "framework-virtualization-module-lib-stubs",
-    api_surface: "module-lib",
-    api_file: "api/module-lib-current.txt",
-    visibility: [
-        "//build/orchestrator/apis",
-    ],
-}
diff --git a/javalib/src/android/system/virtualmachine/VirtualMachineConfig.java b/javalib/src/android/system/virtualmachine/VirtualMachineConfig.java
index 474c2f2..a6381ac 100644
--- a/javalib/src/android/system/virtualmachine/VirtualMachineConfig.java
+++ b/javalib/src/android/system/virtualmachine/VirtualMachineConfig.java
@@ -126,7 +126,7 @@
 
     /**
      * Run VM with vCPU topology matching the physical CPU topology of the host. Usually takes
-     * longer to boot and cosumes more resources compared to a single vCPU. Typically a good option
+     * longer to boot and consumes more resources compared to a single vCPU. Typically a good option
      * for long-running workloads that benefit from parallel execution.
      *
      * @hide
diff --git a/libs/libfdt/src/iterators.rs b/libs/libfdt/src/iterators.rs
index 7406164..e818c68 100644
--- a/libs/libfdt/src/iterators.rs
+++ b/libs/libfdt/src/iterators.rs
@@ -304,7 +304,7 @@
 }
 
 impl<'a> SubnodeIterator<'a> {
-    pub(crate) fn new(node: &'a FdtNode) -> Result<Self, FdtError> {
+    pub(crate) fn new(node: &FdtNode<'a>) -> Result<Self, FdtError> {
         let subnode = node.first_subnode()?;
 
         Ok(Self { subnode })
diff --git a/libs/libfdt/src/lib.rs b/libs/libfdt/src/lib.rs
index d90f5f0..8a4e251 100644
--- a/libs/libfdt/src/lib.rs
+++ b/libs/libfdt/src/lib.rs
@@ -468,7 +468,7 @@
     }
 
     /// Returns an iterator of subnodes
-    pub fn subnodes(&'a self) -> Result<SubnodeIterator<'a>> {
+    pub fn subnodes(&self) -> Result<SubnodeIterator<'a>> {
         SubnodeIterator::new(self)
     }
 
@@ -750,6 +750,14 @@
         FdtNode { fdt: self.fdt, offset: self.offset }
     }
 
+    /// Adds new subnodes to the given node.
+    pub fn add_subnodes(&mut self, names: &[&CStr]) -> Result<()> {
+        for name in names {
+            self.add_subnode_offset(name.to_bytes())?;
+        }
+        Ok(())
+    }
+
     /// Adds a new subnode to the given node and return it as a FdtNodeMut on success.
     pub fn add_subnode(&'a mut self, name: &CStr) -> Result<Self> {
         let offset = self.add_subnode_offset(name.to_bytes())?;
diff --git a/libs/libfdt/tests/api_test.rs b/libs/libfdt/tests/api_test.rs
index 08fb8a5..cafbf97 100644
--- a/libs/libfdt/tests/api_test.rs
+++ b/libs/libfdt/tests/api_test.rs
@@ -19,6 +19,7 @@
 use core::ffi::CStr;
 use cstr::cstr;
 use libfdt::{Fdt, FdtError, FdtNodeMut, Phandle};
+use std::collections::HashSet;
 use std::ffi::CString;
 use std::fs;
 use std::ops::Range;
@@ -451,6 +452,22 @@
 }
 
 #[test]
+fn node_mut_add_subnodes() {
+    let mut data = vec![0_u8; 1000];
+    let fdt = Fdt::create_empty_tree(&mut data).unwrap();
+
+    let mut root = fdt.root_mut().unwrap();
+    let names = [cstr!("a"), cstr!("b")];
+    root.add_subnodes(&names).unwrap();
+
+    let expected: HashSet<_> = names.into_iter().collect();
+    let subnodes = fdt.root().unwrap().subnodes().unwrap();
+    let names: HashSet<_> = subnodes.map(|node| node.name().unwrap()).collect();
+
+    assert_eq!(expected, names);
+}
+
+#[test]
 #[ignore] // Borrow checker test. Compilation success is sufficient.
 fn node_subnode_lifetime() {
     let data = fs::read(TEST_TREE_PHANDLE_PATH).unwrap();
@@ -471,6 +488,28 @@
 
 #[test]
 #[ignore] // Borrow checker test. Compilation success is sufficient.
+fn node_subnodess_lifetime() {
+    let data = fs::read(TEST_TREE_PHANDLE_PATH).unwrap();
+    let fdt = Fdt::from_slice(&data).unwrap();
+
+    let first_subnode_name = {
+        let first_subnode = {
+            let mut subnodes_iter = {
+                let root = fdt.root().unwrap();
+                root.subnodes().unwrap()
+                // Make root to be dropped
+            };
+            subnodes_iter.next().unwrap()
+            // Make subnodess_iter to be dropped
+        };
+        first_subnode.name()
+        // Make first_subnode to be dropped
+    };
+    assert_eq!(Ok(cstr!("node_a")), first_subnode_name);
+}
+
+#[test]
+#[ignore] // Borrow checker test. Compilation success is sufficient.
 fn node_descendants_lifetime() {
     let data = fs::read(TEST_TREE_PHANDLE_PATH).unwrap();
     let fdt = Fdt::from_slice(&data).unwrap();