diff options
Diffstat (limited to 'sys_util')
-rw-r--r-- | sys_util/src/guest_memory.rs | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/sys_util/src/guest_memory.rs b/sys_util/src/guest_memory.rs index 23c8a2f..31500ca 100644 --- a/sys_util/src/guest_memory.rs +++ b/sys_util/src/guest_memory.rs @@ -106,6 +106,15 @@ impl GuestMemory { .map_or(GuestAddress(0), |region| region_end(region)) } + /// Returns the total size of memory in bytes. + pub fn memory_size(&self) -> u64 + { + self.regions + .iter() + .map(|region| region.mapping.size() as u64) + .sum() + } + /// Returns true if the given address is within the memory range available to the guest. pub fn address_in_range(&self, addr: GuestAddress) -> bool { addr < self.end_addr() @@ -462,6 +471,20 @@ mod tests { assert_eq!(val2, num2); } + #[test] + fn test_memory_size() { + let start_region1 = GuestAddress(0x0); + let size_region1 = 0x1000; + let start_region2 = GuestAddress(0x10000); + let size_region2 = 0x2000; + let gm = GuestMemory::new(&vec![(start_region1, size_region1), + (start_region2, size_region2)]).unwrap(); + + let mem_size = gm.memory_size(); + assert_eq!(mem_size, size_region1 + size_region2); + } + + // Get the base address of the mapping for a GuestAddress. fn get_mapping(mem: &GuestMemory, addr: GuestAddress) -> Result<*const u8> { mem.do_in_region(addr, |mapping, _| Ok(mapping.as_ptr() as *const u8)) |