1 use uefi::mem::memory_map::*;
2
3 /// This test imitates a kernel that receives the UEFI memory map as boot
4 /// information.
5 #[test]
parse_boot_information_efi_mmap()6 fn parse_boot_information_efi_mmap() {
7 let desc_size = size_of::<MemoryDescriptor>();
8 let mut mmap_source = [
9 MemoryDescriptor {
10 ty: MemoryType::CONVENTIONAL,
11 phys_start: 0x3000,
12 virt_start: 0x3000,
13 page_count: 1,
14 att: MemoryAttribute::WRITE_BACK,
15 },
16 MemoryDescriptor {
17 ty: MemoryType::CONVENTIONAL,
18 phys_start: 0x2000,
19 virt_start: 0x2000,
20 page_count: 1,
21 att: MemoryAttribute::WRITE_BACK,
22 },
23 MemoryDescriptor {
24 ty: MemoryType::CONVENTIONAL,
25 phys_start: 0x1000,
26 virt_start: 0x1000,
27 page_count: 1,
28 att: MemoryAttribute::WRITE_BACK,
29 },
30 ];
31 let map_size = mmap_source.len() * desc_size;
32 let meta = MemoryMapMeta {
33 map_size,
34 desc_size,
35 map_key: Default::default(),
36 desc_version: MemoryDescriptor::VERSION,
37 };
38 let mmap =
39 unsafe { core::slice::from_raw_parts_mut(mmap_source.as_mut_ptr().cast::<u8>(), map_size) };
40
41 // BOOT INFORMATION END
42 //
43 // BEGIN PARSING
44 // This scenario is similar to what a kernel parsing a boot information
45 // would do.
46
47 let mmap = MemoryMapRefMut::new(mmap, meta).unwrap();
48 assert_eq!(mmap.entries().copied().collect::<Vec<_>>(), mmap_source);
49 }
50