@@ -11,7 +11,7 @@ use core::fmt::{Debug, Formatter};
1111use core:: marker:: PhantomData ;
1212use core:: mem;
1313#[ cfg( feature = "builder" ) ]
14- use { crate :: builder :: AsBytes , crate :: new_boxed, alloc:: boxed:: Box } ;
14+ use { crate :: new_boxed, alloc:: boxed:: Box , core :: slice } ;
1515
1616const METADATA_SIZE : usize = mem:: size_of :: < TagHeader > ( ) + 2 * mem:: size_of :: < u32 > ( ) ;
1717
@@ -39,13 +39,14 @@ impl MemoryMapTag {
3939 #[ cfg( feature = "builder" ) ]
4040 #[ must_use]
4141 pub fn new ( areas : & [ MemoryArea ] ) -> Box < Self > {
42- let entry_size: u32 = mem:: size_of :: < MemoryArea > ( ) . try_into ( ) . unwrap ( ) ;
43- let entry_version: u32 = 0 ;
44- let mut bytes = [ entry_size. to_le_bytes ( ) , entry_version. to_le_bytes ( ) ] . concat ( ) ;
45- for area in areas {
46- bytes. extend ( area. as_bytes ( ) ) ;
47- }
48- new_boxed ( bytes. as_slice ( ) )
42+ let entry_size = mem:: size_of :: < MemoryArea > ( ) . to_ne_bytes ( ) ;
43+ let entry_version = 0_u32 . to_ne_bytes ( ) ;
44+ let areas = {
45+ let ptr = areas. as_ptr ( ) . cast :: < u8 > ( ) ;
46+ let len = areas. len ( ) * size_of :: < MemoryArea > ( ) ;
47+ unsafe { slice:: from_raw_parts ( ptr, len) }
48+ } ;
49+ new_boxed ( & [ & entry_size, & entry_version, areas] )
4950 }
5051
5152 /// Returns the entry size.
@@ -139,9 +140,6 @@ impl Debug for MemoryArea {
139140 }
140141}
141142
142- #[ cfg( feature = "builder" ) ]
143- impl AsBytes for MemoryArea { }
144-
145143/// ABI-friendly version of [`MemoryAreaType`].
146144#[ derive( Copy , Clone , PartialEq , Eq , PartialOrd , Ord , Hash ) ]
147145#[ repr( C ) ]
@@ -292,9 +290,6 @@ impl TagTrait for BasicMemoryInfoTag {
292290
293291const EFI_METADATA_SIZE : usize = mem:: size_of :: < TagTypeId > ( ) + 3 * mem:: size_of :: < u32 > ( ) ;
294292
295- #[ cfg( feature = "builder" ) ]
296- impl AsBytes for EFIMemoryDesc { }
297-
298293/// EFI memory map tag. The embedded [`EFIMemoryDesc`]s follows the EFI
299294/// specification.
300295#[ derive( ptr_meta:: Pointee , PartialEq , Eq , PartialOrd , Ord , Hash ) ]
@@ -322,54 +317,30 @@ pub struct EFIMemoryMapTag {
322317
323318impl EFIMemoryMapTag {
324319 /// Create a new EFI memory map tag with the given memory descriptors.
325- /// Version and size can't be set because you're passing a slice of
326- /// EFIMemoryDescs, not the ones you might have gotten from the firmware.
327320 #[ cfg( feature = "builder" ) ]
328321 #[ must_use]
329322 pub fn new_from_descs ( descs : & [ EFIMemoryDesc ] ) -> Box < Self > {
330- // TODO replace this EfiMemorydesc::uefi_desc_size() in the next uefi_raw
331- // release.
332-
333- let size_base = mem:: size_of :: < EFIMemoryDesc > ( ) ;
334- // Taken from https://github.com/tianocore/edk2/blob/7142e648416ff5d3eac6c6d607874805f5de0ca8/MdeModulePkg/Core/PiSmmCore/Page.c#L1059
335- let desc_size_diff = mem:: size_of :: < u64 > ( ) - size_base % mem:: size_of :: < u64 > ( ) ;
336- let desc_size = size_base + desc_size_diff;
337-
338- assert ! ( desc_size >= size_base) ;
339-
340- let mut efi_mmap = alloc:: vec:: Vec :: with_capacity ( descs. len ( ) * desc_size) ;
341- for desc in descs {
342- efi_mmap. extend ( desc. as_bytes ( ) ) ;
343- // fill with zeroes
344- efi_mmap. extend ( [ 0 ] . repeat ( desc_size_diff) ) ;
345- }
323+ let efi_mmap = {
324+ let ptr = descs. as_ptr ( ) . cast :: < u8 > ( ) ;
325+ let len = descs. len ( ) * size_of :: < EFIMemoryDesc > ( ) ;
326+ unsafe { slice:: from_raw_parts ( ptr, len) }
327+ } ;
346328
347329 Self :: new_from_map (
348- desc_size as u32 ,
330+ mem :: size_of :: < EFIMemoryDesc > ( ) as u32 ,
349331 EFIMemoryDesc :: VERSION ,
350- efi_mmap. as_slice ( ) ,
332+ efi_mmap,
351333 )
352334 }
353335
354336 /// Create a new EFI memory map tag from the given EFI memory map.
355337 #[ cfg( feature = "builder" ) ]
356338 #[ must_use]
357339 pub fn new_from_map ( desc_size : u32 , desc_version : u32 , efi_mmap : & [ u8 ] ) -> Box < Self > {
358- assert ! ( desc_size > 0 ) ;
359- assert_eq ! ( efi_mmap. len( ) % desc_size as usize , 0 ) ;
360- assert_eq ! (
361- efi_mmap
362- . as_ptr( )
363- . align_offset( mem:: align_of:: <EFIMemoryDesc >( ) ) ,
364- 0
365- ) ;
366- let bytes = [
367- & desc_size. to_le_bytes ( ) ,
368- & desc_version. to_le_bytes ( ) ,
369- efi_mmap,
370- ]
371- . concat ( ) ;
372- new_boxed ( & bytes)
340+ assert_ne ! ( desc_size, 0 ) ;
341+ let desc_size = desc_size. to_ne_bytes ( ) ;
342+ let desc_version = desc_version. to_ne_bytes ( ) ;
343+ new_boxed ( & [ & desc_size, & desc_version, efi_mmap] )
373344 }
374345
375346 /// Returns an iterator over the provided memory areas.
@@ -491,8 +462,6 @@ mod tests {
491462 ] ;
492463 let efi_mmap_tag = EFIMemoryMapTag :: new_from_descs ( & descs) ;
493464
494- assert_eq ! ( efi_mmap_tag. desc_size, 48 /* 40 + 8 */ ) ;
495-
496465 let mut iter = efi_mmap_tag. memory_areas ( ) ;
497466
498467 assert_eq ! ( iter. next( ) , Some ( & descs[ 0 ] ) ) ;
0 commit comments