aboutsummaryrefslogtreecommitdiff
path: root/src/server/gdb_server.c
diff options
context:
space:
mode:
authorSpencer Oliver <spen@spen-soft.co.uk>2013-01-31 17:01:19 +0000
committerØyvind Harboe <oyvindharboe@gmail.com>2013-02-26 20:49:49 +0000
commit3d62c3df6ddb09f1485c25d665e248856989d180 (patch)
treef4bd01d270d85f49f1f9876abedea4195fd5ec68 /src/server/gdb_server.c
parent80f78acf7350ca9f812b520ec80f9bc6159d7f0c (diff)
gdbserver: use common hexify/unhexify routines
Change-Id: I9989b625666e9c60ec9867cf6f4d94f41c998c3f Signed-off-by: Spencer Oliver <spen@spen-soft.co.uk> Reviewed-on: http://openocd.zylin.com/1105 Tested-by: jenkins Reviewed-by: Mathias Küster <kesmtp@freenet.de> Reviewed-by: Øyvind Harboe <oyvindharboe@gmail.com>
Diffstat (limited to 'src/server/gdb_server.c')
-rw-r--r--src/server/gdb_server.c40
1 files changed, 11 insertions, 29 deletions
diff --git a/src/server/gdb_server.c b/src/server/gdb_server.c
index ee7683a6..5e570f5d 100644
--- a/src/server/gdb_server.c
+++ b/src/server/gdb_server.c
@@ -662,20 +662,17 @@ static int gdb_get_packet(struct connection *connection, char *buffer, int *len)
static int gdb_output_con(struct connection *connection, const char *line)
{
char *hex_buffer;
- int i, bin_size;
+ int bin_size;
bin_size = strlen(line);
- hex_buffer = malloc(bin_size*2 + 2);
+ hex_buffer = malloc(bin_size * 2 + 2);
if (hex_buffer == NULL)
return ERROR_GDB_BUFFER_TOO_SMALL;
hex_buffer[0] = 'O';
- for (i = 0; i < bin_size; i++)
- snprintf(hex_buffer + 1 + i*2, 3, "%2.2x", line[i]);
- hex_buffer[bin_size*2 + 1] = 0;
-
- int retval = gdb_put_packet(connection, hex_buffer, bin_size*2 + 1);
+ int pkt_len = hexify(hex_buffer + 1, line, bin_size, bin_size * 2 + 1);
+ int retval = gdb_put_packet(connection, hex_buffer, pkt_len + 1);
free(hex_buffer);
return retval;
@@ -1231,14 +1228,9 @@ static int gdb_read_memory_packet(struct connection *connection,
if (retval == ERROR_OK) {
hex_buffer = malloc(len * 2 + 1);
- uint32_t i;
- for (i = 0; i < len; i++) {
- uint8_t t = buffer[i];
- hex_buffer[2 * i] = DIGITS[(t >> 4) & 0xf];
- hex_buffer[2 * i + 1] = DIGITS[t & 0xf];
- }
+ int pkt_len = hexify(hex_buffer, (char *)buffer, len, len * 2 + 1);
- gdb_put_packet(connection, hex_buffer, len * 2);
+ gdb_put_packet(connection, hex_buffer, pkt_len);
free(hex_buffer);
} else
@@ -1258,8 +1250,6 @@ static int gdb_write_memory_packet(struct connection *connection,
uint32_t len = 0;
uint8_t *buffer;
-
- uint32_t i;
int retval;
/* skip command character */
@@ -1283,11 +1273,8 @@ static int gdb_write_memory_packet(struct connection *connection,
LOG_DEBUG("addr: 0x%8.8" PRIx32 ", len: 0x%8.8" PRIx32 "", addr, len);
- for (i = 0; i < len; i++) {
- uint32_t tmp;
- sscanf(separator + 2*i, "%2" SCNx32, &tmp);
- buffer[i] = tmp;
- }
+ if (unhexify((char *)buffer, separator + 2, len) != (int)len)
+ LOG_ERROR("unable to decode memory packet");
retval = target_write_buffer(target, addr, len, buffer);
@@ -1708,14 +1695,9 @@ static int gdb_query_packet(struct connection *connection,
if (strncmp(packet, "qRcmd,", 6) == 0) {
if (packet_size > 6) {
char *cmd;
- int i;
- cmd = malloc((packet_size - 6)/2 + 1);
- for (i = 0; i < (packet_size - 6)/2; i++) {
- uint32_t tmp;
- sscanf(packet + 6 + 2*i, "%2" SCNx32, &tmp);
- cmd[i] = tmp;
- }
- cmd[(packet_size - 6)/2] = 0x0;
+ cmd = malloc((packet_size - 6) / 2 + 1);
+ int len = unhexify(cmd, packet + 6, (packet_size - 6) / 2);
+ cmd[len] = 0;
/* We want to print all debug output to GDB connection */
log_add_callback(gdb_log_callback, connection);