Browse Source
Merge pull request #2240 from FearlessTobi/port-4651
Port citra-emu/citra#4651: "gdbstub: Fix some bugs in IsMemoryBreak() and ServeBreak. Add workaround to let watchpoints break into GDB."
pull/15/merge
bunnei
7 years ago
committed by
GitHub
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with
5 additions and
4 deletions
-
src/core/arm/unicorn/arm_unicorn.cpp
-
src/core/arm/unicorn/arm_unicorn.h
-
src/core/gdbstub/gdbstub.cpp
|
|
|
@ -192,12 +192,13 @@ void ARM_Unicorn::ExecuteInstructions(int num_instructions) { |
|
|
|
CHECKED(uc_emu_start(uc, GetPC(), 1ULL << 63, 0, num_instructions)); |
|
|
|
core_timing.AddTicks(num_instructions); |
|
|
|
if (GDBStub::IsServerEnabled()) { |
|
|
|
if (last_bkpt_hit) { |
|
|
|
if (last_bkpt_hit && last_bkpt.type == GDBStub::BreakpointType::Execute) { |
|
|
|
uc_reg_write(uc, UC_ARM64_REG_PC, &last_bkpt.address); |
|
|
|
} |
|
|
|
|
|
|
|
Kernel::Thread* thread = Kernel::GetCurrentThread(); |
|
|
|
SaveContext(thread->GetContext()); |
|
|
|
if (last_bkpt_hit || GDBStub::GetCpuStepFlag()) { |
|
|
|
if (last_bkpt_hit || GDBStub::IsMemoryBreak() || GDBStub::GetCpuStepFlag()) { |
|
|
|
last_bkpt_hit = false; |
|
|
|
GDBStub::Break(); |
|
|
|
GDBStub::SendTrap(thread, 5); |
|
|
|
|
|
|
|
@ -50,7 +50,7 @@ private: |
|
|
|
uc_engine* uc{}; |
|
|
|
Timing::CoreTiming& core_timing; |
|
|
|
GDBStub::BreakpointAddress last_bkpt{}; |
|
|
|
bool last_bkpt_hit; |
|
|
|
bool last_bkpt_hit = false; |
|
|
|
}; |
|
|
|
|
|
|
|
} // namespace Core |
|
|
|
@ -1030,7 +1030,7 @@ static void Step() { |
|
|
|
|
|
|
|
/// Tell the CPU if we hit a memory breakpoint.
|
|
|
|
bool IsMemoryBreak() { |
|
|
|
if (IsConnected()) { |
|
|
|
if (!IsConnected()) { |
|
|
|
return false; |
|
|
|
} |
|
|
|
|
|
|
|
|