|  | @@ -11,7 +11,7 @@ use core::fmt::{Debug, Formatter};
 | 
											
												
													
														|  |  use core::marker::PhantomData;
 |  |  use core::marker::PhantomData;
 | 
											
												
													
														|  |  use core::mem;
 |  |  use core::mem;
 | 
											
												
													
														|  |  #[cfg(feature = "builder")]
 |  |  #[cfg(feature = "builder")]
 | 
											
												
													
														|  | -use {crate::builder::AsBytes, crate::new_boxed, alloc::boxed::Box};
 |  | 
 | 
											
												
													
														|  | 
 |  | +use {crate::new_boxed, alloc::boxed::Box, core::slice};
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  const METADATA_SIZE: usize = mem::size_of::<TagHeader>() + 2 * mem::size_of::<u32>();
 |  |  const METADATA_SIZE: usize = mem::size_of::<TagHeader>() + 2 * mem::size_of::<u32>();
 | 
											
												
													
														|  |  
 |  |  
 | 
											
										
											
												
													
														|  | @@ -39,13 +39,14 @@ impl MemoryMapTag {
 | 
											
												
													
														|  |      #[cfg(feature = "builder")]
 |  |      #[cfg(feature = "builder")]
 | 
											
												
													
														|  |      #[must_use]
 |  |      #[must_use]
 | 
											
												
													
														|  |      pub fn new(areas: &[MemoryArea]) -> Box<Self> {
 |  |      pub fn new(areas: &[MemoryArea]) -> Box<Self> {
 | 
											
												
													
														|  | -        let entry_size: u32 = mem::size_of::<MemoryArea>().try_into().unwrap();
 |  | 
 | 
											
												
													
														|  | -        let entry_version: u32 = 0;
 |  | 
 | 
											
												
													
														|  | -        let mut bytes = [entry_size.to_le_bytes(), entry_version.to_le_bytes()].concat();
 |  | 
 | 
											
												
													
														|  | -        for area in areas {
 |  | 
 | 
											
												
													
														|  | -            bytes.extend(area.as_bytes());
 |  | 
 | 
											
												
													
														|  | -        }
 |  | 
 | 
											
												
													
														|  | -        new_boxed(bytes.as_slice())
 |  | 
 | 
											
												
													
														|  | 
 |  | +        let entry_size = mem::size_of::<MemoryArea>().to_ne_bytes();
 | 
											
												
													
														|  | 
 |  | +        let entry_version = 0_u32.to_ne_bytes();
 | 
											
												
													
														|  | 
 |  | +        let areas = {
 | 
											
												
													
														|  | 
 |  | +            let ptr = areas.as_ptr().cast::<u8>();
 | 
											
												
													
														|  | 
 |  | +            let len = areas.len() * size_of::<MemoryArea>();
 | 
											
												
													
														|  | 
 |  | +            unsafe { slice::from_raw_parts(ptr, len) }
 | 
											
												
													
														|  | 
 |  | +        };
 | 
											
												
													
														|  | 
 |  | +        new_boxed(&[&entry_size, &entry_version, areas])
 | 
											
												
													
														|  |      }
 |  |      }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |      /// Returns the entry size.
 |  |      /// Returns the entry size.
 | 
											
										
											
												
													
														|  | @@ -139,9 +140,6 @@ impl Debug for MemoryArea {
 | 
											
												
													
														|  |      }
 |  |      }
 | 
											
												
													
														|  |  }
 |  |  }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -#[cfg(feature = "builder")]
 |  | 
 | 
											
												
													
														|  | -impl AsBytes for MemoryArea {}
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  |  /// ABI-friendly version of [`MemoryAreaType`].
 |  |  /// ABI-friendly version of [`MemoryAreaType`].
 | 
											
												
													
														|  |  #[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
 |  |  #[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
 | 
											
												
													
														|  |  #[repr(C)]
 |  |  #[repr(C)]
 | 
											
										
											
												
													
														|  | @@ -292,9 +290,6 @@ impl TagTrait for BasicMemoryInfoTag {
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  const EFI_METADATA_SIZE: usize = mem::size_of::<TagTypeId>() + 3 * mem::size_of::<u32>();
 |  |  const EFI_METADATA_SIZE: usize = mem::size_of::<TagTypeId>() + 3 * mem::size_of::<u32>();
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -#[cfg(feature = "builder")]
 |  | 
 | 
											
												
													
														|  | -impl AsBytes for EFIMemoryDesc {}
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  |  /// EFI memory map tag. The embedded [`EFIMemoryDesc`]s follows the EFI
 |  |  /// EFI memory map tag. The embedded [`EFIMemoryDesc`]s follows the EFI
 | 
											
												
													
														|  |  /// specification.
 |  |  /// specification.
 | 
											
												
													
														|  |  #[derive(ptr_meta::Pointee, PartialEq, Eq, PartialOrd, Ord, Hash)]
 |  |  #[derive(ptr_meta::Pointee, PartialEq, Eq, PartialOrd, Ord, Hash)]
 | 
											
										
											
												
													
														|  | @@ -322,32 +317,19 @@ pub struct EFIMemoryMapTag {
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  impl EFIMemoryMapTag {
 |  |  impl EFIMemoryMapTag {
 | 
											
												
													
														|  |      /// Create a new EFI memory map tag with the given memory descriptors.
 |  |      /// Create a new EFI memory map tag with the given memory descriptors.
 | 
											
												
													
														|  | -    /// Version and size can't be set because you're passing a slice of
 |  | 
 | 
											
												
													
														|  | -    /// EFIMemoryDescs, not the ones you might have gotten from the firmware.
 |  | 
 | 
											
												
													
														|  |      #[cfg(feature = "builder")]
 |  |      #[cfg(feature = "builder")]
 | 
											
												
													
														|  |      #[must_use]
 |  |      #[must_use]
 | 
											
												
													
														|  |      pub fn new_from_descs(descs: &[EFIMemoryDesc]) -> Box<Self> {
 |  |      pub fn new_from_descs(descs: &[EFIMemoryDesc]) -> Box<Self> {
 | 
											
												
													
														|  | -        // TODO replace this EfiMemorydesc::uefi_desc_size() in the next uefi_raw
 |  | 
 | 
											
												
													
														|  | -        // release.
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -        let size_base = mem::size_of::<EFIMemoryDesc>();
 |  | 
 | 
											
												
													
														|  | -        // Taken from https://github.com/tianocore/edk2/blob/7142e648416ff5d3eac6c6d607874805f5de0ca8/MdeModulePkg/Core/PiSmmCore/Page.c#L1059
 |  | 
 | 
											
												
													
														|  | -        let desc_size_diff = mem::size_of::<u64>() - size_base % mem::size_of::<u64>();
 |  | 
 | 
											
												
													
														|  | -        let desc_size = size_base + desc_size_diff;
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -        assert!(desc_size >= size_base);
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -        let mut efi_mmap = alloc::vec::Vec::with_capacity(descs.len() * desc_size);
 |  | 
 | 
											
												
													
														|  | -        for desc in descs {
 |  | 
 | 
											
												
													
														|  | -            efi_mmap.extend(desc.as_bytes());
 |  | 
 | 
											
												
													
														|  | -            // fill with zeroes
 |  | 
 | 
											
												
													
														|  | -            efi_mmap.extend([0].repeat(desc_size_diff));
 |  | 
 | 
											
												
													
														|  | -        }
 |  | 
 | 
											
												
													
														|  | 
 |  | +        let efi_mmap = {
 | 
											
												
													
														|  | 
 |  | +            let ptr = descs.as_ptr().cast::<u8>();
 | 
											
												
													
														|  | 
 |  | +            let len = descs.len() * size_of::<EFIMemoryDesc>();
 | 
											
												
													
														|  | 
 |  | +            unsafe { slice::from_raw_parts(ptr, len) }
 | 
											
												
													
														|  | 
 |  | +        };
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |          Self::new_from_map(
 |  |          Self::new_from_map(
 | 
											
												
													
														|  | -            desc_size as u32,
 |  | 
 | 
											
												
													
														|  | 
 |  | +            mem::size_of::<EFIMemoryDesc>() as u32,
 | 
											
												
													
														|  |              EFIMemoryDesc::VERSION,
 |  |              EFIMemoryDesc::VERSION,
 | 
											
												
													
														|  | -            efi_mmap.as_slice(),
 |  | 
 | 
											
												
													
														|  | 
 |  | +            efi_mmap,
 | 
											
												
													
														|  |          )
 |  |          )
 | 
											
												
													
														|  |      }
 |  |      }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
										
											
												
													
														|  | @@ -355,21 +337,10 @@ impl EFIMemoryMapTag {
 | 
											
												
													
														|  |      #[cfg(feature = "builder")]
 |  |      #[cfg(feature = "builder")]
 | 
											
												
													
														|  |      #[must_use]
 |  |      #[must_use]
 | 
											
												
													
														|  |      pub fn new_from_map(desc_size: u32, desc_version: u32, efi_mmap: &[u8]) -> Box<Self> {
 |  |      pub fn new_from_map(desc_size: u32, desc_version: u32, efi_mmap: &[u8]) -> Box<Self> {
 | 
											
												
													
														|  | -        assert!(desc_size > 0);
 |  | 
 | 
											
												
													
														|  | -        assert_eq!(efi_mmap.len() % desc_size as usize, 0);
 |  | 
 | 
											
												
													
														|  | -        assert_eq!(
 |  | 
 | 
											
												
													
														|  | -            efi_mmap
 |  | 
 | 
											
												
													
														|  | -                .as_ptr()
 |  | 
 | 
											
												
													
														|  | -                .align_offset(mem::align_of::<EFIMemoryDesc>()),
 |  | 
 | 
											
												
													
														|  | -            0
 |  | 
 | 
											
												
													
														|  | -        );
 |  | 
 | 
											
												
													
														|  | -        let bytes = [
 |  | 
 | 
											
												
													
														|  | -            &desc_size.to_le_bytes(),
 |  | 
 | 
											
												
													
														|  | -            &desc_version.to_le_bytes(),
 |  | 
 | 
											
												
													
														|  | -            efi_mmap,
 |  | 
 | 
											
												
													
														|  | -        ]
 |  | 
 | 
											
												
													
														|  | -        .concat();
 |  | 
 | 
											
												
													
														|  | -        new_boxed(&bytes)
 |  | 
 | 
											
												
													
														|  | 
 |  | +        assert_ne!(desc_size, 0);
 | 
											
												
													
														|  | 
 |  | +        let desc_size = desc_size.to_ne_bytes();
 | 
											
												
													
														|  | 
 |  | +        let desc_version = desc_version.to_ne_bytes();
 | 
											
												
													
														|  | 
 |  | +        new_boxed(&[&desc_size, &desc_version, efi_mmap])
 | 
											
												
													
														|  |      }
 |  |      }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |      /// Returns an iterator over the provided memory areas.
 |  |      /// Returns an iterator over the provided memory areas.
 | 
											
										
											
												
													
														|  | @@ -491,8 +462,6 @@ mod tests {
 | 
											
												
													
														|  |          ];
 |  |          ];
 | 
											
												
													
														|  |          let efi_mmap_tag = EFIMemoryMapTag::new_from_descs(&descs);
 |  |          let efi_mmap_tag = EFIMemoryMapTag::new_from_descs(&descs);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -        assert_eq!(efi_mmap_tag.desc_size, 48 /* 40 + 8 */);
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  |          let mut iter = efi_mmap_tag.memory_areas();
 |  |          let mut iter = efi_mmap_tag.memory_areas();
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |          assert_eq!(iter.next(), Some(&descs[0]));
 |  |          assert_eq!(iter.next(), Some(&descs[0]));
 |