vmm: save guest memory for coredump

Guest memory is needed for analysis in crash tool, so save it
for coredump.

Signed-off-by: Yi Wang <wang.yi59@zte.com.cn>
Co-authored-by: Sebastien Boeuf <sebastien.boeuf@intel.com>
This commit is contained in:
Yi Wang 2022-05-23 10:26:02 +08:00 committed by Sebastien Boeuf
parent 7e280b6f70
commit 0e65ca4a6c
2 changed files with 46 additions and 2 deletions

View File

@ -8,7 +8,7 @@ use crate::config::{HotplugMethod, MemoryConfig, MemoryZoneConfig};
#[cfg(feature = "guest_debug")]
use crate::coredump::{CoredumpMemoryRegion, CoredumpMemoryRegions};
#[cfg(feature = "guest_debug")]
use crate::coredump::{DumpState, GuestDebuggable, GuestDebuggableError};
use crate::coredump::{DumpState, GuestDebuggableError};
use crate::migration::url_to_path;
use crate::MEMORY_MANAGER_SNAPSHOT_ID;
use crate::{GuestMemoryMmap, GuestRegionMmap};
@ -1877,6 +1877,47 @@ impl MemoryManager {
CoredumpMemoryRegions { ram_maps }
}
#[cfg(feature = "guest_debug")]
pub fn coredump_iterate_save_mem(
&mut self,
dump_state: &DumpState,
) -> std::result::Result<(), GuestDebuggableError> {
let snapshot_memory_ranges = self
.memory_range_table(false)
.map_err(|e| GuestDebuggableError::Coredump(e.into()))?;
if snapshot_memory_ranges.is_empty() {
return Ok(());
}
let mut coredump_file = dump_state.file.as_ref().unwrap();
let guest_memory = self.guest_memory.memory();
let mut total_bytes: u64 = 0;
for range in snapshot_memory_ranges.regions() {
let mut offset: u64 = 0;
loop {
let bytes_written = guest_memory
.write_to(
GuestAddress(range.gpa + offset),
&mut coredump_file,
(range.length - offset) as usize,
)
.map_err(|e| GuestDebuggableError::Coredump(e.into()))?;
offset += bytes_written as u64;
total_bytes += bytes_written as u64;
if offset == range.length {
break;
}
}
}
debug!("coredump total bytes {}", total_bytes);
Ok(())
}
}
struct MemoryNotify {

View File

@ -3052,7 +3052,10 @@ impl GuestDebuggable for Vm {
self.write_note(&coredump_state)?;
self.write_loads(&coredump_state)?;
Ok(())
self.memory_manager
.lock()
.unwrap()
.coredump_iterate_save_mem(&coredump_state)
}
}