diff options
| author | 2019-04-05 23:46:37 -0400 | |
|---|---|---|
| committer | 2019-04-05 23:46:37 -0400 | |
| commit | 54c7e8e40ed44a7331f5b8bf88bea866078fda51 (patch) | |
| tree | 9e116ce7842b417ac2c8998a682efedb52ca6254 /src | |
| parent | Merge pull request #2346 from lioncash/header (diff) | |
| parent | gdbstub: Fix some bugs in IsMemoryBreak() and ServeBreak. Add workaround to l... (diff) | |
| download | yuzu-54c7e8e40ed44a7331f5b8bf88bea866078fda51.tar.gz yuzu-54c7e8e40ed44a7331f5b8bf88bea866078fda51.tar.xz yuzu-54c7e8e40ed44a7331f5b8bf88bea866078fda51.zip | |
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."
Diffstat (limited to 'src')
| -rw-r--r-- | src/core/arm/unicorn/arm_unicorn.cpp | 5 | ||||
| -rw-r--r-- | src/core/arm/unicorn/arm_unicorn.h | 2 | ||||
| -rw-r--r-- | src/core/gdbstub/gdbstub.cpp | 2 |
3 files changed, 5 insertions, 4 deletions
diff --git a/src/core/arm/unicorn/arm_unicorn.cpp b/src/core/arm/unicorn/arm_unicorn.cpp index a542a098b..27309280c 100644 --- a/src/core/arm/unicorn/arm_unicorn.cpp +++ b/src/core/arm/unicorn/arm_unicorn.cpp | |||
| @@ -192,12 +192,13 @@ void ARM_Unicorn::ExecuteInstructions(int num_instructions) { | |||
| 192 | CHECKED(uc_emu_start(uc, GetPC(), 1ULL << 63, 0, num_instructions)); | 192 | CHECKED(uc_emu_start(uc, GetPC(), 1ULL << 63, 0, num_instructions)); |
| 193 | core_timing.AddTicks(num_instructions); | 193 | core_timing.AddTicks(num_instructions); |
| 194 | if (GDBStub::IsServerEnabled()) { | 194 | if (GDBStub::IsServerEnabled()) { |
| 195 | if (last_bkpt_hit) { | 195 | if (last_bkpt_hit && last_bkpt.type == GDBStub::BreakpointType::Execute) { |
| 196 | uc_reg_write(uc, UC_ARM64_REG_PC, &last_bkpt.address); | 196 | uc_reg_write(uc, UC_ARM64_REG_PC, &last_bkpt.address); |
| 197 | } | 197 | } |
| 198 | |||
| 198 | Kernel::Thread* thread = Kernel::GetCurrentThread(); | 199 | Kernel::Thread* thread = Kernel::GetCurrentThread(); |
| 199 | SaveContext(thread->GetContext()); | 200 | SaveContext(thread->GetContext()); |
| 200 | if (last_bkpt_hit || GDBStub::GetCpuStepFlag()) { | 201 | if (last_bkpt_hit || GDBStub::IsMemoryBreak() || GDBStub::GetCpuStepFlag()) { |
| 201 | last_bkpt_hit = false; | 202 | last_bkpt_hit = false; |
| 202 | GDBStub::Break(); | 203 | GDBStub::Break(); |
| 203 | GDBStub::SendTrap(thread, 5); | 204 | GDBStub::SendTrap(thread, 5); |
diff --git a/src/core/arm/unicorn/arm_unicorn.h b/src/core/arm/unicorn/arm_unicorn.h index f313b7394..1e44f0736 100644 --- a/src/core/arm/unicorn/arm_unicorn.h +++ b/src/core/arm/unicorn/arm_unicorn.h | |||
| @@ -50,7 +50,7 @@ private: | |||
| 50 | uc_engine* uc{}; | 50 | uc_engine* uc{}; |
| 51 | Timing::CoreTiming& core_timing; | 51 | Timing::CoreTiming& core_timing; |
| 52 | GDBStub::BreakpointAddress last_bkpt{}; | 52 | GDBStub::BreakpointAddress last_bkpt{}; |
| 53 | bool last_bkpt_hit; | 53 | bool last_bkpt_hit = false; |
| 54 | }; | 54 | }; |
| 55 | 55 | ||
| 56 | } // namespace Core | 56 | } // namespace Core |
diff --git a/src/core/gdbstub/gdbstub.cpp b/src/core/gdbstub/gdbstub.cpp index dafb32aae..afa812598 100644 --- a/src/core/gdbstub/gdbstub.cpp +++ b/src/core/gdbstub/gdbstub.cpp | |||
| @@ -1030,7 +1030,7 @@ static void Step() { | |||
| 1030 | 1030 | ||
| 1031 | /// Tell the CPU if we hit a memory breakpoint. | 1031 | /// Tell the CPU if we hit a memory breakpoint. |
| 1032 | bool IsMemoryBreak() { | 1032 | bool IsMemoryBreak() { |
| 1033 | if (IsConnected()) { | 1033 | if (!IsConnected()) { |
| 1034 | return false; | 1034 | return false; |
| 1035 | } | 1035 | } |
| 1036 | 1036 | ||