use crate::arch::Arch;
use crate::common::Signal;
use crate::target::Target;
use crate::target::TargetResult;
pub trait SingleThreadBase: Target {
fn read_registers(
&mut self,
regs: &mut <Self::Arch as Arch>::Registers,
) -> TargetResult<(), Self>;
fn write_registers(&mut self, regs: &<Self::Arch as Arch>::Registers)
-> TargetResult<(), Self>;
#[inline(always)]
fn support_single_register_access(
&mut self,
) -> Option<super::single_register_access::SingleRegisterAccessOps<'_, (), Self>> {
None
}
fn read_addrs(
&mut self,
start_addr: <Self::Arch as Arch>::Usize,
data: &mut [u8],
) -> TargetResult<usize, Self>;
fn write_addrs(
&mut self,
start_addr: <Self::Arch as Arch>::Usize,
data: &[u8],
) -> TargetResult<(), Self>;
#[inline(always)]
fn support_resume(&mut self) -> Option<SingleThreadResumeOps<'_, Self>> {
None
}
}
pub trait SingleThreadResume: Target {
fn resume(&mut self, signal: Option<Signal>) -> Result<(), Self::Error>;
#[inline(always)]
fn support_single_step(&mut self) -> Option<SingleThreadSingleStepOps<'_, Self>> {
None
}
#[inline(always)]
fn support_range_step(&mut self) -> Option<SingleThreadRangeSteppingOps<'_, Self>> {
None
}
#[inline(always)]
fn support_reverse_step(
&mut self,
) -> Option<super::reverse_exec::ReverseStepOps<'_, (), Self>> {
None
}
#[inline(always)]
fn support_reverse_cont(
&mut self,
) -> Option<super::reverse_exec::ReverseContOps<'_, (), Self>> {
None
}
}
define_ext!(SingleThreadResumeOps, SingleThreadResume);
pub trait SingleThreadSingleStep: Target + SingleThreadResume {
fn step(&mut self, signal: Option<Signal>) -> Result<(), Self::Error>;
}
define_ext!(SingleThreadSingleStepOps, SingleThreadSingleStep);
pub trait SingleThreadRangeStepping: Target + SingleThreadResume {
fn resume_range_step(
&mut self,
start: <Self::Arch as Arch>::Usize,
end: <Self::Arch as Arch>::Usize,
) -> Result<(), Self::Error>;
}
define_ext!(SingleThreadRangeSteppingOps, SingleThreadRangeStepping);