Merge pull request #4603 from DimitriPilot3/gdbstub-watchpoint-fix1

gdbstub: only let Execute breakpoints write/restore BKPT opcodes into memory
This commit is contained in:
Weiyi Wang 2019-02-01 10:49:09 -05:00 committed by GitHub
commit ae57d72b33
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -409,10 +409,13 @@ static void RemoveBreakpoint(BreakpointType type, VAddr addr) {
LOG_DEBUG(Debug_GDBStub, "gdb: removed a breakpoint: {:08x} bytes at {:08x} of type {}", LOG_DEBUG(Debug_GDBStub, "gdb: removed a breakpoint: {:08x} bytes at {:08x} of type {}",
bp->second.len, bp->second.addr, static_cast<int>(type)); bp->second.len, bp->second.addr, static_cast<int>(type));
if (type == BreakpointType::Execute) {
Core::System::GetInstance().Memory().WriteBlock( Core::System::GetInstance().Memory().WriteBlock(
*Core::System::GetInstance().Kernel().GetCurrentProcess(), bp->second.addr, *Core::System::GetInstance().Kernel().GetCurrentProcess(), bp->second.addr,
bp->second.inst.data(), bp->second.inst.size()); bp->second.inst.data(), bp->second.inst.size());
Core::CPU().ClearInstructionCache(); Core::CPU().ClearInstructionCache();
}
p.erase(addr); p.erase(addr);
} }
@ -921,11 +924,14 @@ static bool CommitBreakpoint(BreakpointType type, VAddr addr, u32 len) {
Core::System::GetInstance().Memory().ReadBlock( Core::System::GetInstance().Memory().ReadBlock(
*Core::System::GetInstance().Kernel().GetCurrentProcess(), addr, breakpoint.inst.data(), *Core::System::GetInstance().Kernel().GetCurrentProcess(), addr, breakpoint.inst.data(),
breakpoint.inst.size()); breakpoint.inst.size());
static constexpr std::array<u8, 4> btrap{0x70, 0x00, 0x20, 0xe1}; static constexpr std::array<u8, 4> btrap{0x70, 0x00, 0x20, 0xe1};
if (type == BreakpointType::Execute) {
Core::System::GetInstance().Memory().WriteBlock( Core::System::GetInstance().Memory().WriteBlock(
*Core::System::GetInstance().Kernel().GetCurrentProcess(), addr, btrap.data(), *Core::System::GetInstance().Kernel().GetCurrentProcess(), addr, btrap.data(),
btrap.size()); btrap.size());
Core::CPU().ClearInstructionCache(); Core::CPU().ClearInstructionCache();
}
p.insert({addr, breakpoint}); p.insert({addr, breakpoint});
LOG_DEBUG(Debug_GDBStub, "gdb: added {} breakpoint: {:08x} bytes at {:08x}\n", LOG_DEBUG(Debug_GDBStub, "gdb: added {} breakpoint: {:08x} bytes at {:08x}\n",