diff options
author | Broadcom 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 |
commit | b69119668ed8d9633280f8b596fe9af60f51644b (patch) | |
tree | 68a8f525c679f6ce4a9a852b90116afa214329e0 /src/server | |
parent | f9feeacb7fa9b1f60d803708b831bde2187f29b5 (diff) | |
download | openocd_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.c | 36 | ||||
-rw-r--r-- | src/server/gdb_server.h | 5 |
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, ®_list, ®_list_size) ) ) + { + return ERROR_OK; + } + if ((retval = target_get_gdb_reg_list(target, ®_list, ®_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) |