forked from suyu/suyu
gdbstub: Use type alias for breakpoint maps
Rather than having to type out the full std::map type signature, we can just use a straightforward alias. While we're at it, rename GetBreakpointList to GetBreakpointMap, which makes the name more accurate. We can also get rid of unnecessary u64 static_casts, since VAddr is an alias for a u64.
This commit is contained in:
parent
89c076b4b1
commit
00f7e584ce
1 changed files with 42 additions and 37 deletions
|
@ -175,9 +175,10 @@ struct Breakpoint {
|
||||||
u64 len;
|
u64 len;
|
||||||
};
|
};
|
||||||
|
|
||||||
std::map<u64, Breakpoint> breakpoints_execute;
|
using BreakpointMap = std::map<VAddr, Breakpoint>;
|
||||||
std::map<u64, Breakpoint> breakpoints_read;
|
BreakpointMap breakpoints_execute;
|
||||||
std::map<u64, Breakpoint> breakpoints_write;
|
BreakpointMap breakpoints_read;
|
||||||
|
BreakpointMap breakpoints_write;
|
||||||
|
|
||||||
struct Module {
|
struct Module {
|
||||||
std::string name;
|
std::string name;
|
||||||
|
@ -419,11 +420,11 @@ static u8 CalculateChecksum(const u8* buffer, size_t length) {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the list of breakpoints for a given breakpoint type.
|
* Get the map of breakpoints for a given breakpoint type.
|
||||||
*
|
*
|
||||||
* @param type Type of breakpoint list.
|
* @param type Type of breakpoint map.
|
||||||
*/
|
*/
|
||||||
static std::map<u64, Breakpoint>& GetBreakpointList(BreakpointType type) {
|
static BreakpointMap& GetBreakpointMap(BreakpointType type) {
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case BreakpointType::Execute:
|
case BreakpointType::Execute:
|
||||||
return breakpoints_execute;
|
return breakpoints_execute;
|
||||||
|
@ -443,19 +444,21 @@ static std::map<u64, Breakpoint>& GetBreakpointList(BreakpointType type) {
|
||||||
* @param addr Address of breakpoint.
|
* @param addr Address of breakpoint.
|
||||||
*/
|
*/
|
||||||
static void RemoveBreakpoint(BreakpointType type, VAddr addr) {
|
static void RemoveBreakpoint(BreakpointType type, VAddr addr) {
|
||||||
std::map<u64, Breakpoint>& p = GetBreakpointList(type);
|
BreakpointMap& p = GetBreakpointMap(type);
|
||||||
|
|
||||||
auto bp = p.find(static_cast<u64>(addr));
|
const auto bp = p.find(addr);
|
||||||
if (bp != p.end()) {
|
if (bp == p.end()) {
|
||||||
LOG_DEBUG(Debug_GDBStub, "gdb: removed a breakpoint: {:016X} bytes at {:016X} of type {}",
|
return;
|
||||||
bp->second.len, bp->second.addr, static_cast<int>(type));
|
|
||||||
p.erase(static_cast<u64>(addr));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
LOG_DEBUG(Debug_GDBStub, "gdb: removed a breakpoint: {:016X} bytes at {:016X} of type {}",
|
||||||
|
bp->second.len, bp->second.addr, static_cast<int>(type));
|
||||||
|
p.erase(addr);
|
||||||
}
|
}
|
||||||
|
|
||||||
BreakpointAddress GetNextBreakpointFromAddress(VAddr addr, BreakpointType type) {
|
BreakpointAddress GetNextBreakpointFromAddress(VAddr addr, BreakpointType type) {
|
||||||
std::map<u64, Breakpoint>& p = GetBreakpointList(type);
|
const BreakpointMap& p = GetBreakpointMap(type);
|
||||||
auto next_breakpoint = p.lower_bound(static_cast<u64>(addr));
|
const auto next_breakpoint = p.lower_bound(addr);
|
||||||
BreakpointAddress breakpoint;
|
BreakpointAddress breakpoint;
|
||||||
|
|
||||||
if (next_breakpoint != p.end()) {
|
if (next_breakpoint != p.end()) {
|
||||||
|
@ -474,31 +477,33 @@ bool CheckBreakpoint(VAddr addr, BreakpointType type) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::map<u64, Breakpoint>& p = GetBreakpointList(type);
|
const BreakpointMap& p = GetBreakpointMap(type);
|
||||||
|
const auto bp = p.find(addr);
|
||||||
|
|
||||||
auto bp = p.find(static_cast<u64>(addr));
|
if (bp == p.end()) {
|
||||||
if (bp != p.end()) {
|
return false;
|
||||||
u64 len = bp->second.len;
|
}
|
||||||
|
|
||||||
// IDA Pro defaults to 4-byte breakpoints for all non-hardware breakpoints
|
u64 len = bp->second.len;
|
||||||
// no matter if it's a 4-byte or 2-byte instruction. When you execute a
|
|
||||||
// Thumb instruction with a 4-byte breakpoint set, it will set a breakpoint on
|
|
||||||
// two instructions instead of the single instruction you placed the breakpoint
|
|
||||||
// on. So, as a way to make sure that execution breakpoints are only breaking
|
|
||||||
// on the instruction that was specified, set the length of an execution
|
|
||||||
// breakpoint to 1. This should be fine since the CPU should never begin executing
|
|
||||||
// an instruction anywhere except the beginning of the instruction.
|
|
||||||
if (type == BreakpointType::Execute) {
|
|
||||||
len = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (bp->second.active && (addr >= bp->second.addr && addr < bp->second.addr + len)) {
|
// IDA Pro defaults to 4-byte breakpoints for all non-hardware breakpoints
|
||||||
LOG_DEBUG(Debug_GDBStub,
|
// no matter if it's a 4-byte or 2-byte instruction. When you execute a
|
||||||
"Found breakpoint type {} @ {:016X}, range: {:016X}"
|
// Thumb instruction with a 4-byte breakpoint set, it will set a breakpoint on
|
||||||
" - {:016X} ({:X} bytes)",
|
// two instructions instead of the single instruction you placed the breakpoint
|
||||||
static_cast<int>(type), addr, bp->second.addr, bp->second.addr + len, len);
|
// on. So, as a way to make sure that execution breakpoints are only breaking
|
||||||
return true;
|
// on the instruction that was specified, set the length of an execution
|
||||||
}
|
// breakpoint to 1. This should be fine since the CPU should never begin executing
|
||||||
|
// an instruction anywhere except the beginning of the instruction.
|
||||||
|
if (type == BreakpointType::Execute) {
|
||||||
|
len = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (bp->second.active && (addr >= bp->second.addr && addr < bp->second.addr + len)) {
|
||||||
|
LOG_DEBUG(Debug_GDBStub,
|
||||||
|
"Found breakpoint type {} @ {:016X}, range: {:016X}"
|
||||||
|
" - {:016X} ({:X} bytes)",
|
||||||
|
static_cast<int>(type), addr, bp->second.addr, bp->second.addr + len, len);
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
|
@ -977,7 +982,7 @@ static void Continue() {
|
||||||
* @param len Length of breakpoint.
|
* @param len Length of breakpoint.
|
||||||
*/
|
*/
|
||||||
static bool CommitBreakpoint(BreakpointType type, VAddr addr, u64 len) {
|
static bool CommitBreakpoint(BreakpointType type, VAddr addr, u64 len) {
|
||||||
std::map<u64, Breakpoint>& p = GetBreakpointList(type);
|
BreakpointMap& p = GetBreakpointMap(type);
|
||||||
|
|
||||||
Breakpoint breakpoint;
|
Breakpoint breakpoint;
|
||||||
breakpoint.active = true;
|
breakpoint.active = true;
|
||||||
|
|
Loading…
Reference in a new issue