From d09e3b79532fdb4df8469aa965ae09b7d7cc2f1b Mon Sep 17 00:00:00 2001 From: "Dr. Chat" Date: Fri, 27 Nov 2015 22:50:00 -0600 Subject: [PATCH] Fix incorrect backend breakpoints implementation --- src/xenia/cpu/backend/x64/x64_backend.cc | 26 ++++++++---------------- src/xenia/cpu/breakpoint.h | 10 ++++++--- 2 files changed, 15 insertions(+), 21 deletions(-) diff --git a/src/xenia/cpu/backend/x64/x64_backend.cc b/src/xenia/cpu/backend/x64/x64_backend.cc index 978c92e4e..dca4addbb 100644 --- a/src/xenia/cpu/backend/x64/x64_backend.cc +++ b/src/xenia/cpu/backend/x64/x64_backend.cc @@ -135,8 +135,10 @@ bool X64Backend::InstallBreakpoint(Breakpoint* bp) { auto code = guest_function->MapGuestAddressToMachineCode(bp->address()); assert_not_zero(code); - bp->set_backend_data( - xe::load_and_swap(reinterpret_cast(code + 0x0))); + auto orig_bytes = + xe::load_and_swap(reinterpret_cast(code + 0x0)); + bp->backend_data().push_back({code, orig_bytes }); + xe::store_and_swap(reinterpret_cast(code + 0x0), 0x0F0C); } @@ -144,24 +146,12 @@ bool X64Backend::InstallBreakpoint(Breakpoint* bp) { } bool X64Backend::UninstallBreakpoint(Breakpoint* bp) { - auto functions = processor()->FindFunctionsWithAddress(bp->address()); - if (functions.empty()) { - // This should not happen. - assert_always(); - return false; - } - - for (auto function : functions) { - assert_true(function->is_guest()); - auto guest_function = reinterpret_cast(function); - auto code = guest_function->MapGuestAddressToMachineCode(bp->address()); - assert_not_zero(code); - - xe::store_and_swap(reinterpret_cast(code + 0x0), - uint16_t(bp->backend_data())); - bp->set_backend_data(0); + for (auto pair : bp->backend_data()) { + xe::store_and_swap(reinterpret_cast(pair.first), + uint16_t(pair.second)); } + bp->backend_data().clear(); return true; } diff --git a/src/xenia/cpu/breakpoint.h b/src/xenia/cpu/breakpoint.h index e7740cd1a..d3399a5e1 100644 --- a/src/xenia/cpu/breakpoint.h +++ b/src/xenia/cpu/breakpoint.h @@ -35,8 +35,12 @@ class Breakpoint { void Hit(uint64_t host_pc) { hit_callback_(address_, host_pc); } // CPU backend data. Implementation specific - DO NOT TOUCH THIS! - uint64_t backend_data() const { return backend_data_; } - void set_backend_data(uint64_t backend_data) { backend_data_ = backend_data; } + std::vector> backend_data() const { + return backend_data_; + } + std::vector>& backend_data() { + return backend_data_; + } private: Processor* processor_ = nullptr; @@ -46,7 +50,7 @@ class Breakpoint { std::function hit_callback_; // Opaque backend data. Don't touch this. - uint64_t backend_data_ = 0; + std::vector> backend_data_; }; } // namespace cpu