@@ -63,45 +63,41 @@ fn alloc_alignment() {
6363fn memory_map ( bt : & BootServices ) {
6464 info ! ( "Testing memory map functions" ) ;
6565
66- // Get the memory descriptor size and an estimate of the memory map size
67- let sizes = bt. memory_map_size ( ) ;
66+ // Ensure that the memory map is freed after each iteration (on drop).
67+ // Otherwise, we will have an OOM.
68+ for _ in 0 ..200000 {
69+ let mut memory_map = bt
70+ . memory_map ( MemoryType :: LOADER_DATA )
71+ . expect ( "Failed to retrieve UEFI memory map" ) ;
6872
69- // 2 extra descriptors should be enough.
70- let buf_sz = sizes. map_size + 2 * sizes. entry_size ;
73+ memory_map. sort ( ) ;
7174
72- // We will use vectors for convenience.
73- let mut buffer = vec ! [ 0_u8 ; buf_sz ] ;
75+ // Collect the descriptors into a vector
76+ let descriptors = memory_map . entries ( ) . copied ( ) . collect :: < Vec < _ > > ( ) ;
7477
75- let mut memory_map = bt
76- . memory_map ( & mut buffer )
77- . expect ( "Failed to retrieve UEFI memory map ") ;
78+ // Ensured we have at least one entry.
79+ // Real memory maps usually have dozens of entries.
80+ assert ! ( !descriptors . is_empty ( ) , "Memory map is empty ") ;
7881
79- memory_map . sort ( ) ;
82+ let mut curr_value = descriptors [ 0 ] ;
8083
81- // Collect the descriptors into a vector
82- let descriptors = memory_map. entries ( ) . copied ( ) . collect :: < Vec < _ > > ( ) ;
83-
84- // Ensured we have at least one entry.
85- // Real memory maps usually have dozens of entries.
86- assert ! ( !descriptors. is_empty( ) , "Memory map is empty" ) ;
87-
88- let mut curr_value = descriptors[ 0 ] ;
89-
90- for value in descriptors. iter ( ) . skip ( 1 ) {
91- if value. phys_start <= curr_value. phys_start {
92- panic ! ( "memory map sorting failed" ) ;
84+ for value in descriptors. iter ( ) . skip ( 1 ) {
85+ if value. phys_start <= curr_value. phys_start {
86+ panic ! ( "memory map sorting failed" ) ;
87+ }
88+ curr_value = * value;
9389 }
94- curr_value = * value;
95- }
9690
97- // This is pretty much a sanity test to ensure returned memory isn't filled with random values.
98- let first_desc = descriptors[ 0 ] ;
91+ // This is pretty much a basic sanity test to ensure returned memory
92+ // isn't filled with random values.
93+ let first_desc = descriptors[ 0 ] ;
9994
100- #[ cfg( target_arch = "x86_64" ) ]
101- {
102- let phys_start = first_desc. phys_start ;
103- assert_eq ! ( phys_start, 0 , "Memory does not start at address 0" ) ;
95+ #[ cfg( target_arch = "x86_64" ) ]
96+ {
97+ let phys_start = first_desc. phys_start ;
98+ assert_eq ! ( phys_start, 0 , "Memory does not start at address 0" ) ;
99+ }
100+ let page_count = first_desc. page_count ;
101+ assert ! ( page_count != 0 , "Memory map entry has size zero" ) ;
104102 }
105- let page_count = first_desc. page_count ;
106- assert ! ( page_count != 0 , "Memory map entry has zero size" ) ;
107103}
0 commit comments