From e27696f6b04459e935a0a5f65f7f668cb02970dd Mon Sep 17 00:00:00 2001 From: ntfreak Date: Mon, 22 Oct 2007 08:44:34 +0000 Subject: - add verify_image command - add support for gdb qCRC packet (compare-sections command) git-svn-id: svn://svn.berlios.de/openocd/trunk@210 b42882b7-edfa-0310-969c-e2dbd0fdcd60 --- src/server/gdb_server.c | 48 +++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 45 insertions(+), 3 deletions(-) (limited to 'src/server') diff --git a/src/server/gdb_server.c b/src/server/gdb_server.c index 74928c87..175e0674 100644 --- a/src/server/gdb_server.c +++ b/src/server/gdb_server.c @@ -1167,7 +1167,7 @@ int gdb_breakpoint_watchpoint_packet(connection_t *connection, target_t *target, return ERROR_OK; } -void gdb_query_packet(connection_t *connection, char *packet, int packet_size) +int gdb_query_packet(connection_t *connection, target_t *target, char *packet, int packet_size) { command_context_t *cmd_ctx = connection->cmd_ctx; @@ -1189,10 +1189,52 @@ void gdb_query_packet(connection_t *connection, char *packet, int packet_size) free(cmd); } gdb_put_packet(connection, "OK", 2); - return; + return ERROR_OK; } + if (strstr(packet, "qCRC:")) + { + if (packet_size > 5) + { + int retval; + u8 gdb_reply[9]; + char *separator; + u32 checksum; + u32 addr = 0; + u32 len = 0; + + /* skip command character */ + packet += 5; + + addr = strtoul(packet, &separator, 16); + + if (*separator != ',') + { + ERROR("incomplete read memory packet received, dropping connection"); + return ERROR_SERVER_REMOTE_CLOSED; + } + + len = strtoul(separator+1, NULL, 16); + + retval = target_checksum_memory(target, addr, len, &checksum); + + if (retval == ERROR_OK) + { + snprintf(gdb_reply, 9, "C%2.2x", checksum); + gdb_put_packet(connection, gdb_reply, 9); + } + else + { + if ((retval = gdb_memory_packet_error(connection, retval)) != ERROR_OK) + return retval; + } + + return ERROR_OK; + } + } + gdb_put_packet(connection, "", 0); + return ERROR_OK; } int gdb_v_packet(connection_t *connection, target_t *target, char *packet, int packet_size) @@ -1382,7 +1424,7 @@ int gdb_input(connection_t *connection) gdb_put_packet(connection, NULL, 0); break; case 'q': - gdb_query_packet(connection, packet, packet_size); + retval = gdb_query_packet(connection, target, packet, packet_size); break; case 'g': retval = gdb_get_registers_packet(connection, target, packet, packet_size); -- cgit v1.2.3