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