Merge changes Ie31f6c6f,I56678bd0,Ic6e651a7
* changes:
libs: libfdt: Fix Fdt::header() using bad pointer
pvmfw: Remove unnecessary flush of the guest DT
pvmfw: apply_debug_policy: Backup DT before unpacking
diff --git a/libs/libfdt/src/lib.rs b/libs/libfdt/src/lib.rs
index 61b69f5..9785941 100644
--- a/libs/libfdt/src/lib.rs
+++ b/libs/libfdt/src/lib.rs
@@ -780,11 +780,11 @@
/// Return a shared pointer to the device tree.
pub fn as_ptr(&self) -> *const c_void {
- self as *const _ as *const c_void
+ self.buffer.as_ptr().cast::<_>()
}
fn as_mut_ptr(&mut self) -> *mut c_void {
- self as *mut _ as *mut c_void
+ self.buffer.as_mut_ptr().cast::<_>()
}
fn capacity(&self) -> usize {
@@ -792,8 +792,9 @@
}
fn header(&self) -> &libfdt_bindgen::fdt_header {
+ let p = self.as_ptr().cast::<_>();
// SAFETY - A valid FDT (verified by constructor) must contain a valid fdt_header.
- unsafe { &*(&self as *const _ as *const libfdt_bindgen::fdt_header) }
+ unsafe { &*p }
}
fn totalsize(&self) -> usize {
diff --git a/pvmfw/src/entry.rs b/pvmfw/src/entry.rs
index 3897c1f..999baee 100644
--- a/pvmfw/src/entry.rs
+++ b/pvmfw/src/entry.rs
@@ -255,7 +255,6 @@
)?;
helpers::flushed_zeroize(bcc_slice);
- helpers::flush(slices.fdt.as_slice());
info!("Expecting a bug making MMIO_GUARD_UNMAP return NOT_SUPPORTED on success");
MEMORY.lock().as_mut().unwrap().mmio_unmap_all().map_err(|e| {
diff --git a/pvmfw/src/fdt.rs b/pvmfw/src/fdt.rs
index 4c1362d..5ecb038 100644
--- a/pvmfw/src/fdt.rs
+++ b/pvmfw/src/fdt.rs
@@ -722,21 +722,26 @@
debug_policy: Option<&mut [u8]>,
debuggable: bool,
) -> libfdt::Result<()> {
- fdt.unpack()?;
+ if let Some(debug_policy) = debug_policy {
+ let backup = Vec::from(fdt.as_slice());
+ fdt.unpack()?;
+ let backup_fdt = Fdt::from_slice(backup.as_slice()).unwrap();
+ if apply_debug_policy(fdt, backup_fdt, debug_policy)? {
+ info!("Debug policy applied.");
+ } else {
+ // apply_debug_policy restored fdt to backup_fdt so unpack it again.
+ fdt.unpack()?;
+ }
+ } else {
+ info!("No debug policy found.");
+ fdt.unpack()?;
+ }
patch_dice_node(fdt, bcc.as_ptr() as usize, bcc.len())?;
set_or_clear_chosen_flag(fdt, cstr!("avf,strict-boot"), strict_boot)?;
set_or_clear_chosen_flag(fdt, cstr!("avf,new-instance"), new_instance)?;
- if let Some(debug_policy) = debug_policy {
- if apply_debug_policy(fdt, debug_policy)? {
- info!("Debug policy applied.");
- }
- } else {
- info!("No debug policy found.");
- }
-
if debuggable {
if let Some(bootargs) = read_bootargs_from(fdt)? {
filter_out_dangerous_bootargs(fdt, &bootargs)?;
@@ -779,9 +784,11 @@
/// Apply the debug policy overlay to the guest DT.
///
/// Returns Ok(true) on success, Ok(false) on recovered failure and Err(_) on corruption of the DT.
-fn apply_debug_policy(fdt: &mut Fdt, debug_policy: &[u8]) -> libfdt::Result<bool> {
- let backup_fdt = Vec::from(fdt.as_slice());
-
+fn apply_debug_policy(
+ fdt: &mut Fdt,
+ backup_fdt: &Fdt,
+ debug_policy: &[u8],
+) -> libfdt::Result<bool> {
let mut debug_policy = Vec::from(debug_policy);
let overlay = match Fdt::from_mut_slice(debug_policy.as_mut_slice()) {
Ok(overlay) => overlay,