1 //! Base operations required to debug most targets (e.g: read/write 2 //! memory/registers, step/resume, etc...) 3 //! 4 //! It is **highly recommended** that single threaded targets implement the 5 //! simplified `singlethread` API, as `gdbstub` includes optimized 6 //! implementations of certain internal routines when operating in single 7 //! threaded mode. 8 9 use crate::arch::Arch; 10 11 pub mod multithread; 12 pub mod reverse_exec; 13 pub mod single_register_access; 14 pub mod singlethread; 15 16 /// Base required operations for single/multi threaded targets. 17 pub enum BaseOps<'a, A, E> { 18 /// Single-threaded target 19 SingleThread(&'a mut dyn singlethread::SingleThreadBase<Arch = A, Error = E>), 20 /// Multi-threaded target 21 MultiThread(&'a mut dyn multithread::MultiThreadBase<Arch = A, Error = E>), 22 } 23 24 pub(crate) enum ResumeOps<'a, A, E> { 25 /// Single-threaded target 26 SingleThread(&'a mut dyn singlethread::SingleThreadResume<Arch = A, Error = E>), 27 /// Multi-threaded target 28 MultiThread(&'a mut dyn multithread::MultiThreadResume<Arch = A, Error = E>), 29 } 30 31 impl<'a, A: Arch, E> BaseOps<'a, A, E> { 32 #[inline(always)] resume_ops(self) -> Option<ResumeOps<'a, A, E>>33 pub(crate) fn resume_ops(self) -> Option<ResumeOps<'a, A, E>> { 34 let ret = match self { 35 BaseOps::SingleThread(ops) => ResumeOps::SingleThread(ops.support_resume()?), 36 BaseOps::MultiThread(ops) => ResumeOps::MultiThread(ops.support_resume()?), 37 }; 38 Some(ret) 39 } 40 } 41