@@ -1999,21 +1999,27 @@ pub struct ProtocolSearchKey(NonNull<c_void>);
1999
1999
2000
2000
#[ cfg( test) ]
2001
2001
mod 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)
2017
2023
}
2018
2024
2019
2025
#[ test]
@@ -2029,7 +2035,7 @@ mod tests {
2029
2035
att : MemoryAttribute :: empty ( ) ,
2030
2036
} ;
2031
2037
2032
- let mut buffer = [
2038
+ let descs = [
2033
2039
MemoryDescriptor {
2034
2040
phys_start : 2000 ,
2035
2041
..BASE
@@ -2045,7 +2051,8 @@ mod tests {
2045
2051
} ,
2046
2052
] ;
2047
2053
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 ) ) ;
2049
2056
2050
2057
mem_map. sort ( ) ;
2051
2058
@@ -2067,7 +2074,7 @@ mod tests {
2067
2074
att : MemoryAttribute :: empty ( ) ,
2068
2075
} ;
2069
2076
2070
- const BUFFER : [ MemoryDescriptor ; 4 ] = [
2077
+ let descs = [
2071
2078
MemoryDescriptor {
2072
2079
phys_start : 2000 ,
2073
2080
..BASE
@@ -2083,12 +2090,11 @@ mod tests {
2083
2090
} ,
2084
2091
] ;
2085
2092
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 ) ) ;
2089
2095
2090
2096
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) )
2092
2098
}
2093
2099
2094
2100
let mut_desc = mem_map. get_mut ( 2 ) . unwrap ( ) ;
@@ -2097,7 +2103,7 @@ mod tests {
2097
2103
2098
2104
let desc = mem_map. get ( 2 ) . unwrap ( ) ;
2099
2105
2100
- assert_ne ! ( * desc, BUFFER [ 2 ] ) ;
2106
+ assert_ne ! ( * desc, descs [ 2 ] ) ;
2101
2107
}
2102
2108
2103
2109
// Added for debug purposes on test failure
0 commit comments