diff --git a/uefi-test-runner/src/boot/memory.rs b/uefi-test-runner/src/boot/memory.rs index c4cea3f40..d360fd1e5 100644 --- a/uefi-test-runner/src/boot/memory.rs +++ b/uefi-test-runner/src/boot/memory.rs @@ -1,26 +1,22 @@ // SPDX-License-Identifier: MIT OR Apache-2.0 -use alloc::vec::Vec; -use uefi::boot; -use uefi::mem::memory_map::{MemoryMap, MemoryMapMut}; -use uefi_raw::table::boot::MemoryType; - pub fn test() { info!("Testing memory functions"); bootservices::allocate_pages(); bootservices::allocate_pool(); + bootservices::memory_map(); global::alloc_vec(); global::alloc_alignment(); - - test_memory_map(); } /// Tests that directly use UEFI boot services to allocate memory. mod bootservices { + use alloc::vec::Vec; use uefi::boot; use uefi::boot::AllocateType; + use uefi::mem::memory_map::{MemoryMap, MemoryMapMut}; use uefi_raw::table::boot::MemoryType; /// Tests the `allocate_pages` boot service. @@ -53,6 +49,44 @@ mod bootservices { } unsafe { boot::free_pool(ptr) }.unwrap(); } + + /// Tests getting the memory map and performing a few sanity checks on it. + pub fn memory_map() { + info!("Testing memory map functions"); + + let mut memory_map = + boot::memory_map(MemoryType::LOADER_DATA).expect("Failed to retrieve UEFI memory map"); + + memory_map.sort(); + + // Collect the descriptors into a vector + let descriptors = memory_map.entries().copied().collect::>(); + + // Ensured we have at least one entry. + // Real memory maps usually have dozens of entries. + assert!(!descriptors.is_empty(), "Memory map is empty"); + + let mut curr_value = descriptors[0]; + + for value in descriptors.iter().skip(1) { + if value.phys_start <= curr_value.phys_start { + panic!("memory map sorting failed"); + } + curr_value = *value; + } + + // This is pretty much a basic sanity test to ensure returned memory + // isn't filled with random values. + let first_desc = descriptors[0]; + + #[cfg(target_arch = "x86_64")] + { + let phys_start = first_desc.phys_start; + assert_eq!(phys_start, 0, "Memory does not start at address 0"); + } + let page_count = first_desc.page_count; + assert!(page_count != 0, "Memory map entry has size zero"); + } } /// Tests that use [`uefi::allocator::Allocator`], which is configured as the @@ -97,40 +131,3 @@ mod global { } } } - -fn test_memory_map() { - info!("Testing memory map functions"); - - let mut memory_map = - boot::memory_map(MemoryType::LOADER_DATA).expect("Failed to retrieve UEFI memory map"); - - memory_map.sort(); - - // Collect the descriptors into a vector - let descriptors = memory_map.entries().copied().collect::>(); - - // Ensured we have at least one entry. - // Real memory maps usually have dozens of entries. - assert!(!descriptors.is_empty(), "Memory map is empty"); - - let mut curr_value = descriptors[0]; - - for value in descriptors.iter().skip(1) { - if value.phys_start <= curr_value.phys_start { - panic!("memory map sorting failed"); - } - curr_value = *value; - } - - // This is pretty much a basic sanity test to ensure returned memory - // isn't filled with random values. - let first_desc = descriptors[0]; - - #[cfg(target_arch = "x86_64")] - { - let phys_start = first_desc.phys_start; - assert_eq!(phys_start, 0, "Memory does not start at address 0"); - } - let page_count = first_desc.page_count; - assert!(page_count != 0, "Memory map entry has size zero"); -}