summaryrefslogtreecommitdiff
path: root/src/server
diff options
context:
space:
mode:
authorBroadcom Corporation (Evan Hunter) <ehunter@broadcom.com>2011-04-14 10:25:01 +0200
committerØyvind Harboe <oyvind.harboe@zylin.com>2011-04-15 08:24:18 +0200
commitb69119668ed8d9633280f8b596fe9af60f51644b (patch)
tree68a8f525c679f6ce4a9a852b90116afa214329e0 /src/server
parentf9feeacb7fa9b1f60d803708b831bde2187f29b5 (diff)
downloadopenocd_libswd-b69119668ed8d9633280f8b596fe9af60f51644b.tar.gz
openocd_libswd-b69119668ed8d9633280f8b596fe9af60f51644b.tar.bz2
openocd_libswd-b69119668ed8d9633280f8b596fe9af60f51644b.tar.xz
openocd_libswd-b69119668ed8d9633280f8b596fe9af60f51644b.zip
RTOS Thread awareness support wip
- works on Cortex-M3 with ThreadX and FreeRTOS Compared to original patch a few nits were fixed: - remove stricmp usage - unsigned compare fix - printf formatting fixes - fixed a bug with overrunning a memory buffer allocated with malloc.
Diffstat (limited to 'src/server')
-rw-r--r--src/server/gdb_server.c36
-rw-r--r--src/server/gdb_server.h5
2 files changed, 32 insertions, 9 deletions
diff --git a/src/server/gdb_server.c b/src/server/gdb_server.c
index 77142dfa..0b808589 100644
--- a/src/server/gdb_server.c
+++ b/src/server/gdb_server.c
@@ -8,6 +8,9 @@
* Copyright (C) 2008 by Spencer Oliver *
* spen@spen-soft.co.uk *
* *
+ * Copyright (C) 2011 by Broadcom Corporation *
+ * Evan Hunter - ehunter@broadcom.com *
+ * *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
@@ -35,6 +38,7 @@
#include "gdb_server.h"
#include <target/image.h>
#include <jtag/jtag.h>
+#include "rtos/rtos.h"
/**
@@ -479,7 +483,7 @@ static int gdb_put_packet_inner(struct connection *connection,
return ERROR_OK;
}
-static int gdb_put_packet(struct connection *connection, char *buffer, int len)
+int gdb_put_packet(struct connection *connection, char *buffer, int len)
{
struct gdb_connection *gdb_con = connection->priv;
gdb_con->busy = 1;
@@ -767,6 +771,7 @@ static void gdb_frontend_halted(struct target *target, struct connection *connec
snprintf(sig_reply, 4, "T%2.2x", signal_var);
gdb_put_packet(connection, sig_reply, 3);
gdb_connection->frontend_state = TARGET_HALTED;
+ rtos_update_threads( target );
}
}
@@ -1034,6 +1039,12 @@ static int gdb_get_registers_packet(struct connection *connection,
LOG_DEBUG("-");
#endif
+ if ( ( target->rtos != NULL ) &&
+ ( ERROR_FAIL != rtos_get_gdb_reg_list( connection, target, &reg_list, &reg_list_size) ) )
+ {
+ return ERROR_OK;
+ }
+
if ((retval = target_get_gdb_reg_list(target, &reg_list, &reg_list_size)) != ERROR_OK)
{
return gdb_error(connection, retval);
@@ -2187,16 +2198,23 @@ static int gdb_input_inner(struct connection *connection)
retval = ERROR_OK;
switch (packet[0])
{
- case 'H':
- /* Hct... -- set thread
- * we don't have threads, send empty reply */
- gdb_put_packet(connection, NULL, 0);
- break;
+ case 'T': // Is thread alive?
+ gdb_thread_packet(connection, target, packet, packet_size);
+ break;
+ case 'H': // Set current thread ( 'c' for step and continue, 'g' for all other operations )
+ gdb_thread_packet(connection, target, packet, packet_size);
+ break;
case 'q':
case 'Q':
- retval = gdb_query_packet(connection,
- target, packet,
- packet_size);
+ retval = gdb_thread_packet(connection,
+ target, packet,
+ packet_size);
+ if ( retval == GDB_THREAD_PACKET_NOT_CONSUMED )
+ {
+ retval = gdb_query_packet(connection,
+ target, packet,
+ packet_size);
+ }
break;
case 'g':
retval = gdb_get_registers_packet(
diff --git a/src/server/gdb_server.h b/src/server/gdb_server.h
index d7a6ad0a..cb3962ff 100644
--- a/src/server/gdb_server.h
+++ b/src/server/gdb_server.h
@@ -8,6 +8,9 @@
* Copyright (C) 2008 by Spencer Oliver *
* spen@spen-soft.co.uk *
* *
+ * Copyright (C) 2011 by Broadcom Corporation *
+ * Evan Hunter - ehunter@broadcom.com *
+ * *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
@@ -39,6 +42,8 @@ struct gdb_service
int gdb_target_add_all(struct target *target);
int gdb_register_commands(struct command_context *command_context);
+int gdb_put_packet(struct connection *connection, char *buffer, int len);
+
#define ERROR_GDB_BUFFER_TOO_SMALL (-800)
#define ERROR_GDB_TIMEOUT (-801)