Skip to content

Commit 7514103

Browse files
committed
add gdb resume capabilities
Signed-off-by: Doru Blânzeanu <[email protected]>
1 parent fc26f99 commit 7514103

File tree

3 files changed

+44
-2
lines changed

3 files changed

+44
-2
lines changed

src/hyperlight_host/src/hypervisor/gdb/event_loop.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,12 @@ impl run_blocking::BlockingEventLoop for GdbBlockingEventLoop {
3434
.get_stop_reason()
3535
.map_err(WaitForStopReasonError::Target)?;
3636

37+
// Resume execution if unknown reason for stop
3738
let Some(stop_response) = stop_reason else {
39+
target
40+
.resume_vcpu()
41+
.map_err(WaitForStopReasonError::Target)?;
42+
3843
continue;
3944
};
4045

src/hyperlight_host/src/hypervisor/gdb/mod.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ pub enum GdbTargetError {
1818
QueueError,
1919
ReadRegistersError,
2020
ReceiveMsgError,
21+
CannotResume,
2122
SendMsgError,
2223
SetGuestDebugError,
2324
SpawnThreadError,
@@ -26,7 +27,6 @@ pub enum GdbTargetError {
2627
WriteRegistersError,
2728
}
2829

29-
#[allow(dead_code)]
3030
/// Trait that provides common communication methods for targets
3131
pub trait GdbDebug {
3232
/// Sends a message to the Hypervisor
@@ -37,7 +37,6 @@ pub trait GdbDebug {
3737
fn try_recv(&self) -> Result<DebugMessage, TryRecvError>;
3838
}
3939

40-
#[allow(dead_code)]
4140
/// Event sent to the VCPU execution loop
4241
#[derive(Debug)]
4342
pub enum DebugMessage {

src/hyperlight_host/src/hypervisor/gdb/target.rs

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,11 @@ use std::sync::{Arc, Mutex};
22

33
use crossbeam_channel::TryRecvError;
44
use gdbstub::arch::Arch;
5+
use gdbstub::common::Signal;
56
use gdbstub::stub::{BaseStopReason, SingleThreadStopReason};
67
use gdbstub::target::ext::base::singlethread::{
78
SingleThreadBase,
9+
SingleThreadResume, SingleThreadResumeOps,
810
};
911
use gdbstub::target::ext::base::BaseOps;
1012
use gdbstub::target::ext::breakpoints::{
@@ -185,6 +187,31 @@ impl HyperlightKvmSandboxTarget {
185187
self.paused = true;
186188
}
187189

190+
/// Sends an event to the Hypervisor that tells it to resume vCPU execution
191+
/// Note: The method waits for a confirmation message
192+
pub fn resume_vcpu(&mut self) -> Result<(), GdbTargetError> {
193+
if self.paused {
194+
log::info!("Attempted to resume running vCPU");
195+
196+
self.send(DebugMessage::VcpuResumeEv)
197+
.map_err(|_| GdbTargetError::CannotResume)?;
198+
199+
// TODO: Maybe add timeout here because if the confirmation is not
200+
// sent right away, it means something is not right
201+
let response = self.recv().map_err(|_| GdbTargetError::CannotResume)?;
202+
log::info!("Got message {:?}", response);
203+
204+
if let DebugMessage::RspOk = response {
205+
self.paused = false;
206+
} else {
207+
log::error!("Error when resuming");
208+
return Err(GdbTargetError::CannotResume);
209+
}
210+
}
211+
212+
Ok(())
213+
}
214+
188215
/// Add new breakpoint at provided address if there is enough space
189216
fn add_breakpoint(&mut self, addr: u64) -> Result<bool, GdbTargetError> {
190217
log::debug!("Add breakpoint at address {:X}", addr);
@@ -399,6 +426,10 @@ impl SingleThreadBase for HyperlightKvmSandboxTarget {
399426
) -> TargetResult<(), Self> {
400427
self.write_regs(regs).map_err(TargetError::Fatal)
401428
}
429+
430+
fn support_resume(&mut self) -> Option<SingleThreadResumeOps<Self>> {
431+
Some(self)
432+
}
402433
}
403434

404435
impl SectionOffsets for HyperlightKvmSandboxTarget {
@@ -436,4 +467,11 @@ impl HwBreakpoint for HyperlightKvmSandboxTarget {
436467
) -> TargetResult<bool, Self> {
437468
self.remove_breakpoint(addr).map_err(TargetError::Fatal)
438469
}
470+
}
471+
472+
impl SingleThreadResume for HyperlightKvmSandboxTarget {
473+
fn resume(&mut self, _signal: Option<Signal>) -> Result<(), Self::Error> {
474+
log::debug!("Resume");
475+
self.resume_vcpu()
476+
}
439477
}

0 commit comments

Comments
 (0)