mirror of
https://github.com/cloud-hypervisor/cloud-hypervisor.git
synced 2026-08-05 02:19:16 +00:00
vmm: Make gdb break/resuming more resilient
When starting the VM such that it is already on a breakpoint (via stop_on_boot) when attached to gdb then start the vCPUs in a paused state rather than starting the vCPUs later (upon resume). Further, make the resumption/break of the VM more resilient by only attempting to resume the vCPUs if were are already in a break point and only attempting to pause/break if we were already running. Fixes: #4354 Signed-off-by: Rob Bradford <robert.bradford@intel.com>
This commit is contained in:
committed by
Sebastien Boeuf
parent
23352c4945
commit
0e29379bcf
+10
-26
@@ -2143,13 +2143,11 @@ impl Vm {
|
||||
self.vm.tdx_finalize().map_err(Error::FinalizeTdx)?;
|
||||
}
|
||||
|
||||
if new_state == VmState::Running {
|
||||
self.cpu_manager
|
||||
.lock()
|
||||
.unwrap()
|
||||
.start_boot_vcpus()
|
||||
.map_err(Error::CpuManager)?;
|
||||
}
|
||||
self.cpu_manager
|
||||
.lock()
|
||||
.unwrap()
|
||||
.start_boot_vcpus(new_state == VmState::BreakPoint)
|
||||
.map_err(Error::CpuManager)?;
|
||||
|
||||
let mut state = self.state.try_write().map_err(|_| Error::PoisonedState)?;
|
||||
*state = new_state;
|
||||
@@ -2885,9 +2883,10 @@ impl Debuggable for Vm {
|
||||
}
|
||||
|
||||
fn debug_pause(&mut self) -> std::result::Result<(), DebuggableError> {
|
||||
if !self.cpu_manager.lock().unwrap().vcpus_paused() {
|
||||
if *self.state.read().unwrap() == VmState::Running {
|
||||
self.pause().map_err(DebuggableError::Pause)?;
|
||||
}
|
||||
|
||||
let mut state = self
|
||||
.state
|
||||
.try_write()
|
||||
@@ -2897,25 +2896,10 @@ impl Debuggable for Vm {
|
||||
}
|
||||
|
||||
fn debug_resume(&mut self) -> std::result::Result<(), DebuggableError> {
|
||||
if !self.cpu_manager.lock().unwrap().vcpus_paused() {
|
||||
self.cpu_manager
|
||||
.lock()
|
||||
.unwrap()
|
||||
.start_boot_vcpus()
|
||||
.map_err(|e| {
|
||||
DebuggableError::Resume(MigratableError::Resume(anyhow!(
|
||||
"Could not start boot vCPUs: {:?}",
|
||||
e
|
||||
)))
|
||||
})?;
|
||||
} else {
|
||||
self.resume().map_err(DebuggableError::Resume)?;
|
||||
if *self.state.read().unwrap() == VmState::BreakPoint {
|
||||
self.resume().map_err(DebuggableError::Pause)?;
|
||||
}
|
||||
let mut state = self
|
||||
.state
|
||||
.try_write()
|
||||
.map_err(|_| DebuggableError::PoisonedState)?;
|
||||
*state = VmState::Running;
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user