Skip to content

Commit 694de94

Browse files
committed
mm: Add unit tests for kernel mapping, guestmem ops, address checks
Add unit tests to evaluate offline correct behavior of memory components: kernel mappings (address_space.rs), read and write operations (guestmem.rs) and valid physical address checking (memory.rs). Signed-off-by: Carlos Bilbao <[email protected]>
1 parent 6138015 commit 694de94

File tree

3 files changed

+111
-0
lines changed

3 files changed

+111
-0
lines changed

src/mm/address_space.rs

+62
Original file line numberDiff line numberDiff line change
@@ -168,3 +168,65 @@ pub const SVSM_PERTASK_DYNAMIC_MEMORY: VirtAddr = SVSM_PERTASK_BASE;
168168
/// Task stack
169169
pub const SVSM_PERTASK_STACK_BASE: VirtAddr = SVSM_PERTASK_BASE.const_add(0xffffff0000);
170170
pub const SVSM_PERTASK_STACK_TOP: VirtAddr = SVSM_PERTASK_STACK_BASE.const_add(0x10000);
171+
172+
#[cfg(test)]
173+
mod tests {
174+
use super::*;
175+
176+
fn init_km_testing() {
177+
let _result = KERNEL_MAPPING
178+
.init(&KernelMapping {
179+
virt_start: VirtAddr::new(0x1000),
180+
virt_end: VirtAddr::new(0x2000),
181+
phys_start: PhysAddr::new(0x3000),
182+
})
183+
.unwrap();
184+
}
185+
186+
#[test]
187+
fn test_init_kernel_mapping_info() {
188+
init_km_testing();
189+
190+
let km = &KERNEL_MAPPING;
191+
192+
assert_eq!(km.virt_start, VirtAddr::new(0x1000));
193+
assert_eq!(km.virt_end, VirtAddr::new(0x2000));
194+
assert_eq!(km.phys_start, PhysAddr::new(0x3000));
195+
}
196+
197+
#[test]
198+
#[cfg(target_os = "none")]
199+
fn test_virt_to_phys() {
200+
let vaddr = VirtAddr::new(0x1500);
201+
let paddr = virt_to_phys(vaddr);
202+
203+
assert_eq!(paddr, PhysAddr::new(0x4500));
204+
}
205+
206+
#[test]
207+
#[cfg(not(target_os = "none"))]
208+
fn test_virt_to_phys() {
209+
let vaddr = VirtAddr::new(0x1500);
210+
let paddr = virt_to_phys(vaddr);
211+
212+
assert_eq!(paddr, PhysAddr::new(0x1500));
213+
}
214+
215+
#[test]
216+
#[cfg(target_os = "none")]
217+
fn test_phys_to_virt() {
218+
let paddr = PhysAddr::new(0x4500);
219+
let vaddr = phys_to_virt(paddr);
220+
221+
assert_eq!(vaddr, VirtAddr::new(0x1500));
222+
}
223+
224+
#[test]
225+
#[cfg(not(target_os = "none"))]
226+
fn test_phys_to_virt() {
227+
let paddr = PhysAddr::new(0x4500);
228+
let vaddr = phys_to_virt(paddr);
229+
230+
assert_eq!(vaddr, VirtAddr::new(0x4500));
231+
}
232+
}

src/mm/guestmem.rs

+28
Original file line numberDiff line numberDiff line change
@@ -221,3 +221,31 @@ impl<T: Sized + Copy> GuestPtr<T> {
221221
unsafe { GuestPtr::from_ptr(self.ptr.offset(count)) }
222222
}
223223
}
224+
225+
mod tests {
226+
227+
#[test]
228+
fn test_read_u8_valid_address() {
229+
use crate::mm::guestmem::*;
230+
// Create a region to read from
231+
let test_buffer: [u8; 6] = [0; 6];
232+
let test_address = &test_buffer as *const u8 as usize;
233+
234+
let result = read_u8(VirtAddr::new(test_address)).unwrap();
235+
236+
assert_eq!(result, test_buffer[0]);
237+
}
238+
239+
#[test]
240+
fn test_write_u8_valid_address() {
241+
use crate::mm::guestmem::*;
242+
// Create a mutable region we can write into
243+
let mut test_buffer: [u8; 6] = [0; 6];
244+
let test_address = &mut test_buffer as *mut u8 as usize;
245+
let data_to_write = 0x42;
246+
247+
write_u8(VirtAddr::new(test_address), data_to_write).unwrap();
248+
249+
assert_eq!(test_buffer[0], data_to_write);
250+
}
251+
}

src/mm/memory.rs

+21
Original file line numberDiff line numberDiff line change
@@ -107,3 +107,24 @@ pub fn writable_phys_addr(paddr: PhysAddr) -> bool {
107107

108108
valid_phys_address(paddr)
109109
}
110+
111+
#[cfg(test)]
112+
mod tests {
113+
use super::*;
114+
use crate::address::PhysAddr;
115+
116+
#[test]
117+
fn test_valid_phys_address() {
118+
let region = MemoryRegion {
119+
start: 0x1000,
120+
end: 0x2000,
121+
};
122+
123+
MEMORY_MAP.lock_write().push(region);
124+
125+
// Inside the region
126+
assert!(valid_phys_address(PhysAddr::new(0x1500)));
127+
// Outside the region
128+
assert!(!valid_phys_address(PhysAddr::new(0x3000)));
129+
}
130+
}

0 commit comments

Comments
 (0)