MCPcopy Create free account
hub / github.com/cloud-hypervisor/cloud-hypervisor / read_mem

Method read_mem

vmm/src/cpu.rs:2851–2880  ·  view source on GitHub ↗
(
        &self,
        guest_memory: &GuestMemoryAtomic<GuestMemoryMmap>,
        cpu_id: usize,
        vaddr: GuestAddress,
        len: usize,
    )

Source from the content-addressed store, hash-verified

2849 }
2850
2851 fn read_mem(
2852 &self,
2853 guest_memory: &GuestMemoryAtomic<GuestMemoryMmap>,
2854 cpu_id: usize,
2855 vaddr: GuestAddress,
2856 len: usize,
2857 ) -> std::result::Result<Vec<u8>, DebuggableError> {
2858 let mut buf = vec![0; len];
2859 let mut total_read = 0_u64;
2860
2861 while total_read < len as u64 {
2862 let gaddr = vaddr.0 + total_read;
2863 let paddr = match self.translate_gva(guest_memory, cpu_id as u8, gaddr) {
2864 Ok(paddr) => paddr,
2865 Err(_) if gaddr == u64::MIN => gaddr, // Silently return GVA as GPA if GVA == 0.
2866 Err(e) => return Err(DebuggableError::TranslateGva(e)),
2867 };
2868 let psize = arch::PAGE_SIZE as u64;
2869 let read_len = std::cmp::min(len as u64 - total_read, psize - (paddr & (psize - 1)));
2870 guest_memory
2871 .memory()
2872 .read(
2873 &mut buf[total_read as usize..total_read as usize + read_len as usize],
2874 GuestAddress(paddr),
2875 )
2876 .map_err(DebuggableError::ReadMem)?;
2877 total_read += read_len;
2878 }
2879 Ok(buf)
2880 }
2881
2882 fn write_mem(
2883 &self,

Callers

nothing calls this directly

Calls 3

memoryMethod · 0.80
translate_gvaMethod · 0.45
readMethod · 0.45

Tested by

no test coverage detected