@@ -2,9 +2,11 @@ use std::sync::{Arc, Mutex};
22
33use crossbeam_channel:: TryRecvError ;
44use gdbstub:: arch:: Arch ;
5+ use gdbstub:: common:: Signal ;
56use gdbstub:: stub:: { BaseStopReason , SingleThreadStopReason } ;
67use gdbstub:: target:: ext:: base:: singlethread:: {
78 SingleThreadBase ,
9+ SingleThreadResume , SingleThreadResumeOps ,
810} ;
911use gdbstub:: target:: ext:: base:: BaseOps ;
1012use 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
404435impl 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