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.
This commit is contained in:
Broadcom Corporation (Evan Hunter)
2011-04-14 10:25:01 +02:00
committed by Øyvind Harboe
parent f9feeacb7f
commit b69119668e
13 changed files with 1975 additions and 10 deletions

View File

@@ -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(