Support vendor partition in non-debuggable pVMs
Remove the "vendor_hashtree_descriptor_root_digest" prop from the avf
node by default. It will be re-added by virtue of being a trusted prop
in the case that the caller requested the vendor partition.
Stop adding the kerel param "androidboot.microdroid.mount_vendor=1" if
the vendorImage is supplied, as the kernel param is replaced by the
mechanism described above.
Bug: 340506965
Test: TH
Change-Id: I2994526c205ac3830efe0fb060b1ba16c747f14a
diff --git a/android/virtmgr/src/aidl.rs b/android/virtmgr/src/aidl.rs
index 87fb611..9d985ad 100644
--- a/android/virtmgr/src/aidl.rs
+++ b/android/virtmgr/src/aidl.rs
@@ -1105,7 +1105,9 @@
if let Some(file) = custom_config.vendorImage.as_ref() {
add_microdroid_vendor_image(clone_file(file)?, &mut vm_config);
- append_kernel_param("androidboot.microdroid.mount_vendor=1", &mut vm_config)
+ if !cfg!(tpu_assignable_device) {
+ append_kernel_param("androidboot.microdroid.mount_vendor=1", &mut vm_config);
+ }
}
vm_config.devices.clone_from(&custom_config.devices);
diff --git a/android/virtmgr/src/dt_overlay.rs b/android/virtmgr/src/dt_overlay.rs
index 108ed61..d226635 100644
--- a/android/virtmgr/src/dt_overlay.rs
+++ b/android/virtmgr/src/dt_overlay.rs
@@ -17,7 +17,7 @@
use anyhow::{anyhow, Result};
use cstr::cstr;
use fsfdt::FsFdt;
-use libfdt::Fdt;
+use libfdt::{Fdt, FdtError};
use std::ffi::CStr;
use std::path::Path;
@@ -90,7 +90,26 @@
fdt.overlay_onto(cstr!("/fragment@0/__overlay__"), path)?;
}
- if !trusted_props.is_empty() {
+ if cfg!(tpu_assignable_device) {
+ let mut avf = fdt
+ .node_mut(cstr!("/fragment@0/__overlay__/avf"))
+ .map_err(|e| anyhow!("Failed to search avf node: {e:?}"))?
+ .ok_or(anyhow!("Failed to get avf node"))?;
+ let vendor_digest = cstr!("vendor_hashtree_descriptor_root_digest");
+ // Remove the vendor digest.
+ // In the case it is actually requested, it will be re-added by virtue of being in
+ // `trusted_props`.
+ match avf.delprop(vendor_digest) {
+ Ok(()) | Err(FdtError::NotFound) => {}
+ Err(e) => {
+ return Err(anyhow!("Unexpected error pre-removing {vendor_digest:?}: {e:?}"))
+ }
+ }
+ for (name, value) in trusted_props {
+ avf.setprop(name, value)
+ .map_err(|e| anyhow!("Failed to set trusted property: {e:?}"))?;
+ }
+ } else if !trusted_props.is_empty() {
let mut avf = fdt
.node_mut(cstr!("/fragment@0/__overlay__/avf"))
.map_err(|e| anyhow!("Failed to search avf node: {e:?}"))?