Browse Source

multiboot2: improved debug formatting for EFIMemoryMapTag

Philipp Schuster 6 months ago
parent
commit
aadcf8b6fa
3 changed files with 42 additions and 2 deletions
  1. 4 0
      multiboot2/Changelog.md
  2. 24 0
      multiboot2/src/efi.rs
  3. 14 2
      multiboot2/src/memory_map.rs

+ 4 - 0
multiboot2/Changelog.md

@@ -1,5 +1,9 @@
 # CHANGELOG for crate `multiboot2`
 
+## Unreleased
+
+- Improve debug formatting for EFIMemoryMapTag
+
 ## v0.22.1 (2024-08-20)
 
 Minor documentation fixes.

+ 24 - 0
multiboot2/src/efi.rs

@@ -214,6 +214,8 @@ impl Tag for EFIBootServicesNotExitedTag {
 #[cfg(all(test, feature = "builder"))]
 mod tests {
     use super::{EFIImageHandle32Tag, EFIImageHandle64Tag, EFISdt32Tag, EFISdt64Tag};
+    use crate::{EFIMemoryDesc, EFIMemoryMapTag};
+    use uefi_raw::table::boot::{MemoryAttribute, MemoryType};
 
     const ADDR: usize = 0xABCDEF;
 
@@ -240,4 +242,26 @@ mod tests {
         let tag = EFIImageHandle64Tag::new(ADDR.try_into().unwrap());
         assert_eq!(tag.image_handle(), ADDR);
     }
+
+    #[test]
+    fn test_construct_efi_mmap_tag() {
+        let tag = EFIMemoryMapTag::new_from_descs(&[
+            EFIMemoryDesc {
+                ty: MemoryType::BOOT_SERVICES_CODE,
+                phys_start: 0x1000,
+                virt_start: 0x1000,
+                page_count: 1,
+                att: MemoryAttribute::WRITE_COMBINE,
+            },
+            EFIMemoryDesc {
+                ty: MemoryType::LOADER_DATA,
+                phys_start: 0x2000,
+                virt_start: 0x2000,
+                page_count: 2,
+                att: MemoryAttribute::NON_VOLATILE,
+            },
+        ]);
+        // Test for Miri
+        dbg!(tag);
+    }
 }

+ 14 - 2
multiboot2/src/memory_map.rs

@@ -384,9 +384,10 @@ impl Debug for EFIMemoryMapTag {
             .field("typ", &self.header.typ)
             .field("size", &self.header.size)
             .field("desc_size", &self.desc_size)
+            .field("desc_version", &self.desc_version)
             .field("buf", &self.memory_map.as_ptr())
             .field("buf_len", &self.memory_map.len())
-            .field("entries", &self.memory_areas().len())
+            .field("entries", &self.memory_areas())
             .finish()
     }
 }
@@ -409,7 +410,7 @@ impl Tag for EFIMemoryMapTag {
 }
 
 /// An iterator over the EFI memory areas emitting [`EFIMemoryDesc`] items.
-#[derive(Clone, Debug)]
+#[derive(Clone)]
 pub struct EFIMemoryAreaIter<'a> {
     mmap_tag: &'a EFIMemoryMapTag,
     i: usize,
@@ -460,6 +461,17 @@ impl<'a> ExactSizeIterator for EFIMemoryAreaIter<'a> {
     }
 }
 
+impl<'a> Debug for EFIMemoryAreaIter<'a> {
+    fn fmt(&self, f: &mut Formatter<'_>) -> core::fmt::Result {
+        let mut debug = f.debug_list();
+        let iter = self.clone();
+        for elem in iter {
+            debug.entry(elem);
+        }
+        debug.finish()
+    }
+}
+
 #[cfg(all(test, feature = "builder"))]
 mod tests {
     use super::*;