|
|
@ -173,6 +173,7 @@ struct Breakpoint {
|
|
|
|
bool active;
|
|
|
|
bool active;
|
|
|
|
VAddr addr;
|
|
|
|
VAddr addr;
|
|
|
|
u64 len;
|
|
|
|
u64 len;
|
|
|
|
|
|
|
|
std::array<u8, 4> inst;
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
using BreakpointMap = std::map<VAddr, Breakpoint>;
|
|
|
|
using BreakpointMap = std::map<VAddr, Breakpoint>;
|
|
|
@ -453,6 +454,8 @@ static void RemoveBreakpoint(BreakpointType type, VAddr addr) {
|
|
|
|
|
|
|
|
|
|
|
|
LOG_DEBUG(Debug_GDBStub, "gdb: removed a breakpoint: {:016X} bytes at {:016X} of type {}",
|
|
|
|
LOG_DEBUG(Debug_GDBStub, "gdb: removed a breakpoint: {:016X} bytes at {:016X} of type {}",
|
|
|
|
bp->second.len, bp->second.addr, static_cast<int>(type));
|
|
|
|
bp->second.len, bp->second.addr, static_cast<int>(type));
|
|
|
|
|
|
|
|
Memory::WriteBlock(bp->second.addr, bp->second.inst.data(), bp->second.inst.size());
|
|
|
|
|
|
|
|
Core::System::GetInstance().InvalidateCpuInstructionCaches();
|
|
|
|
p.erase(addr);
|
|
|
|
p.erase(addr);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
@ -937,6 +940,7 @@ static void WriteMemory() {
|
|
|
|
|
|
|
|
|
|
|
|
GdbHexToMem(data.data(), len_pos + 1, len);
|
|
|
|
GdbHexToMem(data.data(), len_pos + 1, len);
|
|
|
|
Memory::WriteBlock(addr, data.data(), len);
|
|
|
|
Memory::WriteBlock(addr, data.data(), len);
|
|
|
|
|
|
|
|
Core::System::GetInstance().InvalidateCpuInstructionCaches();
|
|
|
|
SendReply("OK");
|
|
|
|
SendReply("OK");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
@ -956,6 +960,7 @@ static void Step() {
|
|
|
|
step_loop = true;
|
|
|
|
step_loop = true;
|
|
|
|
halt_loop = true;
|
|
|
|
halt_loop = true;
|
|
|
|
send_trap = true;
|
|
|
|
send_trap = true;
|
|
|
|
|
|
|
|
Core::System::GetInstance().InvalidateCpuInstructionCaches();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// Tell the CPU if we hit a memory breakpoint.
|
|
|
|
/// Tell the CPU if we hit a memory breakpoint.
|
|
|
@ -972,6 +977,7 @@ static void Continue() {
|
|
|
|
memory_break = false;
|
|
|
|
memory_break = false;
|
|
|
|
step_loop = false;
|
|
|
|
step_loop = false;
|
|
|
|
halt_loop = false;
|
|
|
|
halt_loop = false;
|
|
|
|
|
|
|
|
Core::System::GetInstance().InvalidateCpuInstructionCaches();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
@ -988,6 +994,10 @@ static bool CommitBreakpoint(BreakpointType type, VAddr addr, u64 len) {
|
|
|
|
breakpoint.active = true;
|
|
|
|
breakpoint.active = true;
|
|
|
|
breakpoint.addr = addr;
|
|
|
|
breakpoint.addr = addr;
|
|
|
|
breakpoint.len = len;
|
|
|
|
breakpoint.len = len;
|
|
|
|
|
|
|
|
Memory::ReadBlock(addr, breakpoint.inst.data(), breakpoint.inst.size());
|
|
|
|
|
|
|
|
static constexpr std::array<u8, 4> btrap{{0xd4, 0x20, 0x7d, 0x0}};
|
|
|
|
|
|
|
|
Memory::WriteBlock(addr, btrap.data(), btrap.size());
|
|
|
|
|
|
|
|
Core::System::GetInstance().InvalidateCpuInstructionCaches();
|
|
|
|
p.insert({addr, breakpoint});
|
|
|
|
p.insert({addr, breakpoint});
|
|
|
|
|
|
|
|
|
|
|
|
LOG_DEBUG(Debug_GDBStub, "gdb: added {} breakpoint: {:016X} bytes at {:016X}",
|
|
|
|
LOG_DEBUG(Debug_GDBStub, "gdb: added {} breakpoint: {:016X} bytes at {:016X}",
|
|
|
|