https://sourceware.org/git/gitweb.cgi?p=valgrind.git;h=706c5dd0bae49be20ce15c2eeacbbf2c9d49a852
commit 706c5dd0bae49be20ce15c2eeacbbf2c9d49a852
Author: Philippe Waroquiers <phi...@sk...>
Date: Sat Dec 21 15:45:20 2024 +0100
Implement the new GDB 16.0 'x addr,len' packet.
GDB can read memory faster with this packet than with the 'm addr,len' packet.
Diff:
---
NEWS | 4 ++++
coregrind/m_gdbserver/server.c | 14 ++++++++++++++
2 files changed, 18 insertions(+)
diff --git a/NEWS b/NEWS
index d78d9e9a5d..b668ad2e4b 100644
--- a/NEWS
+++ b/NEWS
@@ -10,6 +10,10 @@ AMD64/macOS 10.13 and nanoMIPS/Linux.
* ==================== CORE CHANGES ===================
+* The valgrind gdbserver now supports the GDB remote protocol packet
+ 'x addr,len' (available in GDB release >= 16).
+ The x packet can reduce the time taken by GDB to read memory from valgrind.
+
* ================== PLATFORM CHANGES =================
* ==================== TOOL CHANGES ===================
diff --git a/coregrind/m_gdbserver/server.c b/coregrind/m_gdbserver/server.c
index 19a360c7a7..939b7f2931 100644
--- a/coregrind/m_gdbserver/server.c
+++ b/coregrind/m_gdbserver/server.c
@@ -1376,6 +1376,20 @@ void server_main (void)
else
write_enn (own_buf);
break;
+ case 'x':
+ decode_m_packet (&own_buf[1], &mem_addr, &len);
+ if (valgrind_read_memory (mem_addr, mem_buf, len) == 0) {
+ // Read memory is successful.
+ // Complete the reply packet and indicate its length.
+ int out_len;
+ own_buf[0] = 'b';
+ new_packet_len
+ = 1 + remote_escape_output(mem_buf, len,
+ (unsigned char *) &own_buf[1], &out_len,
+ PBUFSIZ - POVERHSIZ - 1);
+ } else
+ write_enn (own_buf);
+ break;
case 'X':
if (decode_X_packet (&own_buf[1], packet_len - 1,
&mem_addr, &len, mem_buf) < 0
|