(&mut self, destination_url: &str)
| 3570 | #[cfg(all(target_arch = "x86_64", feature = "guest_debug"))] |
| 3571 | impl GuestDebuggable for Vm { |
| 3572 | fn coredump(&mut self, destination_url: &str) -> std::result::Result<(), GuestDebuggableError> { |
| 3573 | event!("vm", "coredumping"); |
| 3574 | |
| 3575 | let mut resume = false; |
| 3576 | |
| 3577 | #[cfg(feature = "tdx")] |
| 3578 | { |
| 3579 | if let Some(ref platform) = self.config.lock().unwrap().platform |
| 3580 | && platform.tdx |
| 3581 | { |
| 3582 | return Err(GuestDebuggableError::Coredump(anyhow!( |
| 3583 | "Coredump not possible with TDX VM" |
| 3584 | ))); |
| 3585 | } |
| 3586 | } |
| 3587 | |
| 3588 | match self.get_state() { |
| 3589 | VmState::Running => { |
| 3590 | self.pause().map_err(GuestDebuggableError::Pause)?; |
| 3591 | resume = true; |
| 3592 | } |
| 3593 | VmState::Paused => {} |
| 3594 | _ => { |
| 3595 | return Err(GuestDebuggableError::Coredump(anyhow!( |
| 3596 | "Trying to coredump while VM is not running or paused" |
| 3597 | ))); |
| 3598 | } |
| 3599 | } |
| 3600 | |
| 3601 | let coredump_state = self.get_dump_state(destination_url)?; |
| 3602 | |
| 3603 | self.write_header(&coredump_state)?; |
| 3604 | self.write_note(&coredump_state)?; |
| 3605 | self.write_loads(&coredump_state)?; |
| 3606 | |
| 3607 | self.cpu_manager |
| 3608 | .lock() |
| 3609 | .unwrap() |
| 3610 | .cpu_write_elf64_note(&coredump_state)?; |
| 3611 | self.cpu_manager |
| 3612 | .lock() |
| 3613 | .unwrap() |
| 3614 | .cpu_write_vmm_note(&coredump_state)?; |
| 3615 | |
| 3616 | self.memory_manager |
| 3617 | .lock() |
| 3618 | .unwrap() |
| 3619 | .coredump_iterate_save_mem(&coredump_state)?; |
| 3620 | |
| 3621 | if resume { |
| 3622 | self.resume().map_err(GuestDebuggableError::Resume)?; |
| 3623 | } |
| 3624 | |
| 3625 | Ok(()) |
| 3626 | } |
| 3627 | } |
| 3628 | |
| 3629 | #[cfg(all(feature = "kvm", target_arch = "x86_64"))] |
no test coverage detected