blob: 0d7be6191e3c272ebe872d95d6bb8247603b497a [file] [log] [blame]
use uefi::mem::memory_map::*;
/// This test imitates a kernel that receives the UEFI memory map as boot
/// information.
#[test]
fn parse_boot_information_efi_mmap() {
let desc_size = size_of::<MemoryDescriptor>();
let mut mmap_source = [
MemoryDescriptor {
ty: MemoryType::CONVENTIONAL,
phys_start: 0x3000,
virt_start: 0x3000,
page_count: 1,
att: MemoryAttribute::WRITE_BACK,
},
MemoryDescriptor {
ty: MemoryType::CONVENTIONAL,
phys_start: 0x2000,
virt_start: 0x2000,
page_count: 1,
att: MemoryAttribute::WRITE_BACK,
},
MemoryDescriptor {
ty: MemoryType::CONVENTIONAL,
phys_start: 0x1000,
virt_start: 0x1000,
page_count: 1,
att: MemoryAttribute::WRITE_BACK,
},
];
let map_size = mmap_source.len() * desc_size;
let meta = MemoryMapMeta {
map_size,
desc_size,
map_key: Default::default(),
desc_version: MemoryDescriptor::VERSION,
};
let mmap =
unsafe { core::slice::from_raw_parts_mut(mmap_source.as_mut_ptr().cast::<u8>(), map_size) };
// BOOT INFORMATION END
//
// BEGIN PARSING
// This scenario is similar to what a kernel parsing a boot information
// would do.
let mmap = MemoryMapRefMut::new(mmap, meta).unwrap();
assert_eq!(mmap.entries().copied().collect::<Vec<_>>(), mmap_source);
}