69 lines
1.9 KiB
Rust
69 lines
1.9 KiB
Rust
use gdbstub::target;
|
|
use gdbstub::target::ext::breakpoints::WatchKind;
|
|
use gdbstub::target::TargetResult;
|
|
|
|
use crate::emu::Emu;
|
|
|
|
impl target::ext::breakpoints::Breakpoints for Emu {
|
|
#[inline(always)]
|
|
fn sw_breakpoint(&mut self) -> Option<target::ext::breakpoints::SwBreakpointOps<Self>> {
|
|
Some(self)
|
|
}
|
|
|
|
#[inline(always)]
|
|
fn hw_watchpoint(&mut self) -> Option<target::ext::breakpoints::HwWatchpointOps<Self>> {
|
|
Some(self)
|
|
}
|
|
}
|
|
|
|
impl target::ext::breakpoints::SwBreakpoint for Emu {
|
|
fn add_sw_breakpoint(
|
|
&mut self,
|
|
addr: u32,
|
|
_kind: gdbstub_arch::arm::ArmBreakpointKind,
|
|
) -> TargetResult<bool, Self> {
|
|
self.breakpoints.push(addr);
|
|
Ok(true)
|
|
}
|
|
|
|
fn remove_sw_breakpoint(
|
|
&mut self,
|
|
addr: u32,
|
|
_kind: gdbstub_arch::arm::ArmBreakpointKind,
|
|
) -> TargetResult<bool, Self> {
|
|
match self.breakpoints.iter().position(|x| *x == addr) {
|
|
None => return Ok(false),
|
|
Some(pos) => self.breakpoints.remove(pos),
|
|
};
|
|
|
|
Ok(true)
|
|
}
|
|
}
|
|
|
|
impl target::ext::breakpoints::HwWatchpoint for Emu {
|
|
fn add_hw_watchpoint(&mut self, addr: u32, kind: WatchKind) -> TargetResult<bool, Self> {
|
|
match kind {
|
|
WatchKind::Write => self.watchpoints.push(addr),
|
|
WatchKind::Read => self.watchpoints.push(addr),
|
|
WatchKind::ReadWrite => self.watchpoints.push(addr),
|
|
};
|
|
|
|
Ok(true)
|
|
}
|
|
|
|
fn remove_hw_watchpoint(&mut self, addr: u32, kind: WatchKind) -> TargetResult<bool, Self> {
|
|
let pos = match self.watchpoints.iter().position(|x| *x == addr) {
|
|
None => return Ok(false),
|
|
Some(pos) => pos,
|
|
};
|
|
|
|
match kind {
|
|
WatchKind::Write => self.watchpoints.remove(pos),
|
|
WatchKind::Read => self.watchpoints.remove(pos),
|
|
WatchKind::ReadWrite => self.watchpoints.remove(pos),
|
|
};
|
|
|
|
Ok(true)
|
|
}
|
|
}
|