Skip to content

Commit f1cf911

Browse files
committed
uefi: mem: unit test for MemoryMapOwned + streamline test usage
Simplify MemoryMapOwned::from_initialized_mem to simplify and streamline the construction in unit tests.
1 parent d1e1e6c commit f1cf911

File tree

2 files changed

+45
-32
lines changed

2 files changed

+45
-32
lines changed

uefi/src/mem/memory_map/impl_.rs

Lines changed: 30 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -102,10 +102,7 @@ pub struct MemoryMapRefMut<'a> {
102102

103103
impl<'a> MemoryMapRefMut<'a> {
104104
/// Constructs a new [`MemoryMapRefMut`].
105-
pub fn new(
106-
buffer: &'a mut [u8],
107-
meta: MemoryMapMeta,
108-
) -> Result<Self, MemoryMapError> {
105+
pub fn new(buffer: &'a mut [u8], meta: MemoryMapMeta) -> Result<Self, MemoryMapError> {
109106
if buffer.as_ptr().align_offset(8) != 0 {
110107
return Err(MemoryMapError::Misaligned);
111108
}
@@ -301,10 +298,12 @@ impl MemoryMapBackingMemory {
301298
Self(slice)
302299
}
303300

301+
/// INTERNAL, for unit tests.
302+
///
304303
/// Creates an instance from the provided memory, which is not necessarily
305304
/// on the UEFI heap.
306305
#[cfg(test)]
307-
fn from_slice(buffer: &mut [u8]) -> Self {
306+
pub(crate) fn from_slice(buffer: &mut [u8]) -> Self {
308307
let len = buffer.len();
309308
unsafe { Self::from_raw(buffer.as_mut_ptr(), len) }
310309
}
@@ -347,6 +346,10 @@ impl Drop for MemoryMapBackingMemory {
347346
log::error!("Failed to deallocate memory map: {e:?}");
348347
}
349348
} else {
349+
#[cfg(test)]
350+
log::debug!("Boot services are not available in unit tests.");
351+
352+
#[cfg(not(test))]
350353
log::debug!("Boot services are excited. Memory map won't be freed using the UEFI boot services allocator.");
351354
}
352355
}
@@ -362,30 +365,13 @@ pub struct MemoryMapOwned {
362365
}
363366

364367
impl MemoryMapOwned {
365-
/// Creates a [`MemoryMapOwned`] from the give initialized memory map behind
366-
/// the buffer and the reported `desc_size` from UEFI.
368+
/// Creates a [`MemoryMapOwned`] from the given **initialized** memory map
369+
/// (stored inside the provided buffer) and the corresponding
370+
/// [`MemoryMapMeta`].
367371
pub(crate) fn from_initialized_mem(buf: MemoryMapBackingMemory, meta: MemoryMapMeta) -> Self {
368372
assert!(meta.desc_size >= mem::size_of::<MemoryDescriptor>());
369373
let len = meta.entry_count();
370-
MemoryMapOwned {
371-
buf,
372-
meta,
373-
len,
374-
}
375-
}
376-
377-
#[cfg(test)]
378-
pub(super) fn from_raw(buf: &mut [u8], desc_size: usize) -> Self {
379-
let mem = MemoryMapBackingMemory::from_slice(buf);
380-
Self::from_initialized_mem(
381-
mem,
382-
MemoryMapMeta {
383-
map_size: buf.len(),
384-
desc_size,
385-
map_key: MemoryMapKey(0),
386-
desc_version: MemoryDescriptor::VERSION,
387-
},
388-
)
374+
MemoryMapOwned { buf, meta, len }
389375
}
390376
}
391377

@@ -523,4 +509,22 @@ mod tests {
523509
mmap.sort();
524510
assert!(mmap.is_sorted());
525511
}
512+
513+
/// Basic sanity checks for the type [`MemoryMapOwned`].
514+
#[test]
515+
fn memory_map_owned() {
516+
let mut memory = new_mmap_memory();
517+
let (mmap, meta) = mmap_raw(&mut memory);
518+
let mmap = MemoryMapBackingMemory::from_slice(mmap);
519+
let mut mmap = MemoryMapOwned::from_initialized_mem(mmap, meta);
520+
521+
assert_eq!(mmap.entries().count(), 3);
522+
assert_eq!(
523+
mmap.entries().copied().collect::<Vec<_>>().as_slice(),
524+
&BASE_MMAP_UNSORTED
525+
);
526+
assert!(!mmap.is_sorted());
527+
mmap.sort();
528+
assert!(mmap.is_sorted());
529+
}
526530
}

uefi/src/mem/memory_map/mod.rs

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -106,13 +106,21 @@ mod tests_mmap_artificial {
106106
use core::mem::{size_of, size_of_val};
107107

108108
fn buffer_to_map(buffer: &mut [MemoryDescriptor]) -> MemoryMapOwned {
109-
let byte_buffer = {
110-
unsafe {
111-
core::slice::from_raw_parts_mut(buffer.as_mut_ptr() as *mut u8, size_of_val(buffer))
112-
}
109+
let mmap_len = size_of_val(buffer);
110+
let mmap = {
111+
unsafe { core::slice::from_raw_parts_mut(buffer.as_mut_ptr() as *mut u8, mmap_len) }
113112
};
114113

115-
MemoryMapOwned::from_raw(byte_buffer, size_of::<MemoryDescriptor>())
114+
let mmap = MemoryMapBackingMemory::from_slice(mmap);
115+
MemoryMapOwned::from_initialized_mem(
116+
mmap,
117+
MemoryMapMeta {
118+
map_size: mmap_len,
119+
desc_size: size_of::<MemoryDescriptor>(),
120+
map_key: Default::default(),
121+
desc_version: MemoryDescriptor::VERSION,
122+
},
123+
)
116124
}
117125

118126
#[test]
@@ -259,7 +267,8 @@ mod tests_mmap_real {
259267
let mut buf = MMAP_RAW;
260268
let buf =
261269
unsafe { slice::from_raw_parts_mut(buf.as_mut_ptr().cast::<u8>(), MMAP_META.map_size) };
262-
let mut mmap = MemoryMapOwned::from_raw(buf, MMAP_META.desc_size);
270+
let buf = MemoryMapBackingMemory::from_slice(buf);
271+
let mut mmap = MemoryMapOwned::from_initialized_mem(buf, MMAP_META);
263272
mmap.sort();
264273

265274
let entries = mmap.entries().copied().collect::<Vec<_>>();

0 commit comments

Comments
 (0)