@@ -1999,21 +1999,27 @@ pub struct ProtocolSearchKey(NonNull<c_void>);
19991999
20002000#[ cfg( test) ]
20012001mod tests {
2002- use core:: mem:: { size_of, size_of_val} ;
2003- use uefi:: table:: boot:: MemoryMapKey ;
2004-
2005- use crate :: table:: boot:: { MemoryAttribute , MemoryMap , MemoryType } ;
2006-
2007- use super :: { MemoryDescriptor , MemoryMapIter } ;
2008-
2009- fn buffer_to_map ( buffer : & mut [ MemoryDescriptor ] ) -> MemoryMap {
2010- let byte_buffer = {
2011- unsafe {
2012- core:: slice:: from_raw_parts_mut ( buffer. as_mut_ptr ( ) as * mut u8 , size_of_val ( buffer) )
2013- }
2014- } ;
2015-
2016- MemoryMap :: from_raw ( byte_buffer. len ( ) , byte_buffer, size_of :: < MemoryDescriptor > ( ) , MemoryMapKey ( 0 ) )
2002+ use super :: * ;
2003+
2004+ /// Builds an EFI memory map buffer from the provider [`MemoryDescriptor`]s
2005+ /// that is close to a real world structure. This means that the reference
2006+ /// for an entry is not `size_of::<MemoryDescriptor>` but `desc_size`,
2007+ /// which is usually a few byte larger.
2008+ fn descs_to_buffer ( descs : & [ MemoryDescriptor ] ) -> ( Vec < u8 > , usize ) {
2009+ let desc_size = unsafe { MemoryDescriptor :: uefi_desc_size ( ) } ;
2010+ let diff = desc_size - mem:: size_of :: < MemoryDescriptor > ( ) ;
2011+
2012+ let mut buf = Vec :: with_capacity ( descs. len ( ) * desc_size) ;
2013+
2014+ for desc in descs {
2015+ let bytes = unsafe {
2016+ let ptr = ptr:: addr_of!( * desc) ;
2017+ slice:: from_raw_parts ( ptr. cast :: < u8 > ( ) , mem:: size_of :: < MemoryDescriptor > ( ) )
2018+ } ;
2019+ buf. extend ( bytes) ;
2020+ buf. extend ( [ 0 ] . repeat ( diff) ) ;
2021+ }
2022+ ( buf, desc_size)
20172023 }
20182024
20192025 #[ test]
@@ -2029,7 +2035,7 @@ mod tests {
20292035 att : MemoryAttribute :: empty ( ) ,
20302036 } ;
20312037
2032- let mut buffer = [
2038+ let descs = [
20332039 MemoryDescriptor {
20342040 phys_start : 2000 ,
20352041 ..BASE
@@ -2045,7 +2051,8 @@ mod tests {
20452051 } ,
20462052 ] ;
20472053
2048- let mut mem_map = buffer_to_map ( & mut buffer) ;
2054+ let ( mut buffer, desc_size) = descs_to_buffer ( & descs) ;
2055+ let mut mem_map = MemoryMap :: from_raw ( & mut buffer, desc_size, MemoryMapKey ( 0 ) ) ;
20492056
20502057 mem_map. sort ( ) ;
20512058
@@ -2067,7 +2074,7 @@ mod tests {
20672074 att : MemoryAttribute :: empty ( ) ,
20682075 } ;
20692076
2070- const BUFFER : [ MemoryDescriptor ; 4 ] = [
2077+ let descs = [
20712078 MemoryDescriptor {
20722079 phys_start : 2000 ,
20732080 ..BASE
@@ -2083,12 +2090,11 @@ mod tests {
20832090 } ,
20842091 ] ;
20852092
2086- let mut buffer = BUFFER ;
2087-
2088- let mut mem_map = buffer_to_map ( & mut buffer) ;
2093+ let ( mut buffer, desc_size) = descs_to_buffer ( & descs) ;
2094+ let mut mem_map = MemoryMap :: from_raw ( & mut buffer, desc_size, MemoryMapKey ( 0 ) ) ;
20892095
20902096 for index in 0 ..3 {
2091- assert_eq ! ( mem_map. get( index) , BUFFER . get( index) )
2097+ assert_eq ! ( mem_map. get( index) , descs . get( index) )
20922098 }
20932099
20942100 let mut_desc = mem_map. get_mut ( 2 ) . unwrap ( ) ;
@@ -2097,7 +2103,7 @@ mod tests {
20972103
20982104 let desc = mem_map. get ( 2 ) . unwrap ( ) ;
20992105
2100- assert_ne ! ( * desc, BUFFER [ 2 ] ) ;
2106+ assert_ne ! ( * desc, descs [ 2 ] ) ;
21012107 }
21022108
21032109 // Added for debug purposes on test failure
0 commit comments