aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIan Thompson <ianst@cadence.com>2022-07-10 17:14:10 -0700
committerAntonio Borneo <borneo.antonio@gmail.com>2022-08-15 13:23:05 +0000
commit48db36f436fe212fdda8d3fb7f79db43d9a2aa99 (patch)
tree1e59b50598f89f22a25bd69ae3c3c05248845ea5
parentd9b2607ca094898d8d7180085a913e8a5b46ecac (diff)
downloadriscv-openocd-48db36f436fe212fdda8d3fb7f79db43d9a2aa99.zip
riscv-openocd-48db36f436fe212fdda8d3fb7f79db43d9a2aa99.tar.gz
riscv-openocd-48db36f436fe212fdda8d3fb7f79db43d9a2aa99.tar.bz2
gdb_server: custom target-specific GDB queries
Provide a customizable hook for handling target-specific GDB queries Valgrind-clean, no new Clang analyzer warnings Signed-off-by: Ian Thompson <ianst@cadence.com> Change-Id: I684a259ed29f3651cbce668101cff421e522f79e Reviewed-on: https://review.openocd.org/c/openocd/+/7082 Tested-by: jenkins Reviewed-by: Antonio Borneo <borneo.antonio@gmail.com>
-rw-r--r--src/server/gdb_server.c5
-rw-r--r--src/target/target_type.h9
2 files changed, 14 insertions, 0 deletions
diff --git a/src/server/gdb_server.c b/src/server/gdb_server.c
index 3052d0a..1e50b43 100644
--- a/src/server/gdb_server.c
+++ b/src/server/gdb_server.c
@@ -2965,6 +2965,11 @@ static int gdb_query_packet(struct connection *connection,
gdb_connection->noack_mode = 1;
gdb_put_packet(connection, "OK", 2);
return ERROR_OK;
+ } else if (target->type->gdb_query_custom) {
+ char *buffer = NULL;
+ int ret = target->type->gdb_query_custom(target, packet, &buffer);
+ gdb_put_packet(connection, buffer, strlen(buffer));
+ return ret;
}
gdb_put_packet(connection, "", 0);
diff --git a/src/target/target_type.h b/src/target/target_type.h
index 1933e1c..9470803 100644
--- a/src/target/target_type.h
+++ b/src/target/target_type.h
@@ -286,6 +286,15 @@ struct target_type {
*/
int (*gdb_fileio_end)(struct target *target, int retcode, int fileio_errno, bool ctrl_c);
+ /* Parse target-specific GDB query commands.
+ * The string pointer "response_p" is always assigned by the called function
+ * to a pointer to a NULL-terminated string, even when the function returns
+ * an error. The string memory is not freed by the caller, so this function
+ * must pay attention for possible memory leaks if the string memory is
+ * dynamically allocated.
+ */
+ int (*gdb_query_custom)(struct target *target, const char *packet, char **response_p);
+
/* do target profiling
*/
int (*profiling)(struct target *target, uint32_t *samples,