aboutsummaryrefslogtreecommitdiff
path: root/src/core
diff options
context:
space:
mode:
authorFernando S <fsahmkow27@gmail.com>2023-08-15 15:36:14 +0200
committerGitHub <noreply@github.com>2023-08-15 15:36:14 +0200
commitec3d07e68373f29e098acb014d8c27d48a5151ec (patch)
tree2db0c5b56534cca4b569b5832db84fc1cebba662 /src/core
parent2f2dbd9dfb7bc19b36b6381dc1693d8926fd7072 (diff)
parentefa3409a302ade38c393583b101bfd2c24bb9bc3 (diff)
Merge pull request #11287 from liamwhite/replaced-bytes
gdbstub: fixup replaced instruction bytes in memory reads
Diffstat (limited to 'src/core')
-rw-r--r--src/core/debugger/gdbstub.cpp17
1 files changed, 17 insertions, 0 deletions
diff --git a/src/core/debugger/gdbstub.cpp b/src/core/debugger/gdbstub.cpp
index 0f839d5b4c..e55831f27d 100644
--- a/src/core/debugger/gdbstub.cpp
+++ b/src/core/debugger/gdbstub.cpp
@@ -263,6 +263,23 @@ void GDBStub::ExecuteCommand(std::string_view packet, std::vector<DebuggerAction
std::vector<u8> mem(size);
if (system.ApplicationMemory().ReadBlock(addr, mem.data(), size)) {
+ // Restore any bytes belonging to replaced instructions.
+ auto it = replaced_instructions.lower_bound(addr);
+ for (; it != replaced_instructions.end() && it->first < addr + size; it++) {
+ // Get the bytes of the instruction we previously replaced.
+ const u32 original_bytes = it->second;
+
+ // Calculate where to start writing to the output buffer.
+ const size_t output_offset = it->first - addr;
+
+ // Calculate how many bytes to write.
+ // The loop condition ensures output_offset < size.
+ const size_t n = std::min<size_t>(size - output_offset, sizeof(u32));
+
+ // Write the bytes to the output buffer.
+ std::memcpy(mem.data() + output_offset, &original_bytes, n);
+ }
+
SendReply(Common::HexToString(mem));
} else {
SendReply(GDB_STUB_REPLY_ERR);