(
&self,
guest_memory: &GuestMemoryAtomic<GuestMemoryMmap>,
cpu_id: usize,
vaddr: GuestAddress,
len: usize,
)
| 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, |
nothing calls this directly
no test coverage detected