Merge "pvmfw: Replace const_cstr! with now-const cstr!" into main
diff --git a/pvmfw/src/device_assignment.rs b/pvmfw/src/device_assignment.rs
index a2816c4..13ff6c0 100644
--- a/pvmfw/src/device_assignment.rs
+++ b/pvmfw/src/device_assignment.rs
@@ -28,32 +28,24 @@
 use core::mem;
 use libfdt::{Fdt, FdtError, FdtNode};
 
-// TODO(b/308694211): Move this to the vmbase
-macro_rules! const_cstr {
-    ($str:literal) => {{
-        #[allow(unused_unsafe)] // In case the macro is used within an unsafe block.
-        // SAFETY: Trailing null is guaranteed by concat!()
-        unsafe {
-            CStr::from_bytes_with_nul_unchecked(concat!($str, "\0").as_bytes())
-        }
-    }};
-}
-
 // TODO(b/308694211): Use cstr! from vmbase instead.
 macro_rules! cstr {
     ($str:literal) => {{
-        CStr::from_bytes_with_nul(concat!($str, "\0").as_bytes()).unwrap()
+        const S: &str = concat!($str, "\0");
+        const C: &::core::ffi::CStr = match ::core::ffi::CStr::from_bytes_with_nul(S.as_bytes()) {
+            Ok(v) => v,
+            Err(_) => panic!("string contains interior NUL"),
+        };
+        C
     }};
 }
 
 const FILTERED_VM_DTBO_PROP: [&CStr; 3] = [
-    const_cstr!("android,pvmfw,phy-reg"),
-    const_cstr!("android,pvmfw,phy-iommu"),
-    const_cstr!("android,pvmfw,phy-sid"),
+    cstr!("android,pvmfw,phy-reg"),
+    cstr!("android,pvmfw,phy-iommu"),
+    cstr!("android,pvmfw,phy-sid"),
 ];
 
-const REG_PROP_NAME: &CStr = const_cstr!("reg");
-const INTERRUPTS_PROP_NAME: &CStr = const_cstr!("interrupts");
 // TODO(b/277993056): Keep constants derived from platform.dts in one place.
 const CELLS_PER_INTERRUPT: usize = 3; // from /intc node in platform.dts
 
@@ -102,10 +94,6 @@
 pub struct VmDtbo(Fdt);
 
 impl VmDtbo {
-    const OVERLAY_NODE_NAME: &CStr = const_cstr!("__overlay__");
-    const TARGET_PATH_PROP: &CStr = const_cstr!("target-path");
-    const SYMBOLS_NODE_PATH: &CStr = const_cstr!("/__symbols__");
-
     /// Wraps a mutable slice containing a VM DTBO.
     ///
     /// Fails if the VM DTBO does not pass validation.
@@ -150,7 +138,7 @@
 
         let fragment_node = node.supernode_at_depth(1)?;
         let target_path = fragment_node
-            .getprop_str(Self::TARGET_PATH_PROP)?
+            .getprop_str(cstr!("target-path"))?
             .ok_or(DeviceAssignmentError::InvalidDtbo)?;
         if target_path != cstr!("/") {
             return Err(DeviceAssignmentError::UnsupportedOverlayTarget);
@@ -161,7 +149,7 @@
             .filter(|&component| !component.is_empty())
             .skip(1);
         let overlay_node_name = components.next();
-        if overlay_node_name != Some(Self::OVERLAY_NODE_NAME.to_bytes()) {
+        if overlay_node_name != Some(b"__overlay__") {
             return Err(DeviceAssignmentError::InvalidDtbo);
         }
         let mut overlaid_path = Vec::with_capacity(dtbo_node_path_bytes.len());
@@ -206,7 +194,7 @@
         // Validation: Validate if interrupts cell numbers are multiple of #interrupt-cells.
         // We can't know how many interrupts would exist.
         let interrupts_cells = node
-            .getprop_cells(INTERRUPTS_PROP_NAME)?
+            .getprop_cells(cstr!("interrupts"))?
             .ok_or(DeviceAssignmentError::InvalidInterrupts)?
             .count();
         if interrupts_cells % CELLS_PER_INTERRUPT != 0 {
@@ -214,7 +202,7 @@
         }
 
         // Once validated, keep the raw bytes so patch can be done with setprop()
-        Ok(node.getprop(INTERRUPTS_PROP_NAME).unwrap().unwrap().into())
+        Ok(node.getprop(cstr!("interrupts")).unwrap().unwrap().into())
     }
 
     // TODO(b/277993056): Read and validate iommu
@@ -224,7 +212,7 @@
         let Some(node) = fdt.node(&node_path)? else { return Ok(None) };
 
         // TODO(b/277993056): Validate reg with HVC, and keep reg with FdtNode::reg()
-        let reg = node.getprop(REG_PROP_NAME).unwrap().unwrap();
+        let reg = node.getprop(cstr!("reg")).unwrap().unwrap();
 
         let interrupts = Self::parse_interrupts(&node)?;
 
@@ -238,8 +226,8 @@
 
     fn patch(&self, fdt: &mut Fdt) -> Result<()> {
         let mut dst = fdt.node_mut(&self.node_path)?.unwrap();
-        dst.setprop(REG_PROP_NAME, &self.reg)?;
-        dst.setprop(INTERRUPTS_PROP_NAME, &self.interrupts)?;
+        dst.setprop(cstr!("reg"), &self.reg)?;
+        dst.setprop(cstr!("interrupts"), &self.interrupts)?;
         // TODO(b/277993056): Read and patch iommu
         Ok(())
     }
@@ -275,7 +263,7 @@
                 filtered_dtbo_paths.push(dtbo_node_path.into());
             }
         }
-        filtered_dtbo_paths.push(VmDtbo::SYMBOLS_NODE_PATH.into());
+        filtered_dtbo_paths.push(CString::new("/__symbols__").unwrap());
 
         if assigned_devices.is_empty() {
             return Ok(None);