/* RTOSs */
extern struct rtos_type FreeRTOS_rtos;
extern struct rtos_type ThreadX_rtos;
+extern struct rtos_type eCos_rtos;
static struct rtos_type *rtos_types[] =
{
&ThreadX_rtos,
&FreeRTOS_rtos,
+ &eCos_rtos,
NULL
};
-int gdb_thread_packet(struct connection *connection, struct target *target, char *packet, int packet_size)
+int gdb_thread_packet(struct connection *connection, char *packet, int packet_size)
{
- if (strstr(packet, "qP"))
- {
- #define TAG_THREADID 1 /* Echo the thread identifier */
- #define TAG_EXISTS 2 /* Is this process defined enough to
- fetch registers and its stack */
- #define TAG_DISPLAY 4 /* A short thing maybe to put on a window */
- #define TAG_THREADNAME 8 /* string, maps 1-to-1 with a thread is */
- #define TAG_MOREDISPLAY 16 /* Whatever the kernel wants to say about */
-
- // TODO: need to scanf the mode variable (or it with the tags), and the threadid
-
- unsigned long mode;
- threadid_t threadid = 0;
- struct thread_detail* detail;
- sscanf(packet, "qP%8lx%16" SCNx64, &mode, &threadid);
-
-
- int found = -1;
-
- if ((target->rtos != NULL) && (target->rtos->thread_details
- != NULL)) {
- int thread_num;
- for (thread_num = 0; thread_num
- < target->rtos->thread_count; thread_num++) {
- if (target->rtos->thread_details[thread_num].threadid
- == threadid) {
- if (target->rtos->thread_details[thread_num].exists) {
- found = thread_num;
- }
- }
- }
- }
- if (found == -1) {
- gdb_put_packet(connection, "E01", 3); // thread not found
- return ERROR_OK;
- }
-
- detail = &target->rtos->thread_details[found];
-
- if ( detail->display_str != NULL )
- {
- mode &= TAG_DISPLAY;
- }
- if ( detail->thread_name_str != NULL )
- {
- mode &= TAG_THREADNAME;
- }
- if ( detail->extra_info_str != NULL )
- {
- mode &= TAG_MOREDISPLAY;
- }
-
-
- mode &= TAG_THREADID | TAG_EXISTS;
-
- char thread_str[1000];
+ struct target *target = get_target_from_connection(connection);
- sprintf(thread_str, "%08lx", mode);
- sprintf(thread_str, "%016" PRIx64, threadid);
-
-
- if (mode & TAG_THREADID) {
- sprintf(thread_str, "%08" PRIx32 "10%016" PRIx64, TAG_THREADID, threadid);
- }
- if (mode & TAG_EXISTS) {
- sprintf(thread_str, "%08" PRIx32 "08%08" PRIx32, TAG_EXISTS, (detail->exists==true)?1:0);
- }
- if (mode & TAG_DISPLAY) {
- sprintf(thread_str, "%08" PRIx32 "%02x%s", TAG_DISPLAY, (unsigned char)strlen(detail->display_str), detail->display_str );
- }
- if (mode & TAG_MOREDISPLAY) {
- sprintf(thread_str, "%08" PRIx32 "%02x%s", TAG_MOREDISPLAY, (unsigned char)strlen(detail->extra_info_str), detail->extra_info_str );
- }
- if (mode & TAG_THREADNAME) {
- sprintf(thread_str, "%08" PRIx32 "%02x%s", TAG_THREADNAME, (unsigned char)strlen(detail->thread_name_str), detail->thread_name_str );
- }
-
- //gdb_put_packet(connection, tmpstr, sizeof(tmpstr)-1);
- gdb_put_packet(connection, thread_str, strlen(thread_str));
-
- // gdb_put_packet(connection, "", 0);
- // gdb_put_packet(connection, "OK", 2); // all threads alive
- return ERROR_OK;
- }
- else if (strstr(packet, "qThreadExtraInfo,"))
+ if (strstr(packet, "qThreadExtraInfo,"))
{
if ((target->rtos != NULL) && (target->rtos->thread_details != NULL) && (target->rtos->thread_count != 0))
{
tmp_str_ptr += sprintf( tmp_str_ptr, " : %s", detail->extra_info_str );
}
+ assert(strlen(tmp_str) ==
+ (size_t) (tmp_str_ptr - tmp_str));
+
char * hex_str = (char*) malloc( strlen(tmp_str)*2 +1 );
str_to_hex( hex_str, tmp_str );
int symbol_num;
char* found = strstr( packet, "qSymbol::" );
- int numconv;
if (0 == found )
{
- numconv =sscanf(packet, "qSymbol:%" SCNx64 ":%s", &value, hex_name_str);
+ sscanf(packet, "qSymbol:%" SCNx64 ":%s", &value, hex_name_str);
}
else
{
// No value returned by GDB - symbol was not found
- numconv =sscanf(packet, "qSymbol::%s", hex_name_str);
+ sscanf(packet, "qSymbol::%s", hex_name_str);
}
name_str = (char*) malloc( 1+ strlen(hex_name_str) / 2 );
}
else if (strstr(packet, "qC"))
{
- gdb_put_packet(connection, "QC0", 3);
+ if( target->rtos!=NULL )
+ {
+ char buffer[15];
+ int size;
+ size = snprintf(buffer, 15, "QC%08X", (int)target->rtos->current_thread);
+ gdb_put_packet(connection, buffer, size);
+ }
+ else
+ {
+ gdb_put_packet(connection, "QC0", 3);
+ }
return ERROR_OK;
}
else if ( packet[0] == 'T' ) // Is thread alive?
} else {
gdb_put_packet(connection, "E01", 3); // thread not found
}
+ return ERROR_OK;
}
else if ( packet[0] == 'H') // Set current thread ( 'c' for step and continue, 'g' for all other operations )
{
sscanf(packet, "Hg%16" SCNx64, ¤t_threadid);
}
gdb_put_packet(connection, "OK", 2);
+ return ERROR_OK;
}
return GDB_THREAD_PACKET_NOT_CONSUMED;
}
-int rtos_get_gdb_reg_list(struct connection *connection, struct target *target, struct reg **reg_list[], int *reg_list_size)
+int rtos_get_gdb_reg_list(struct connection *connection, struct reg **reg_list[], int *reg_list_size)
{
+ struct target *target = get_target_from_connection(connection);
+
if ( ( target->rtos != NULL ) &&
- ( current_threadid != 1 ) &&
+ ( current_threadid != -1 ) &&
( current_threadid != 0 ) &&
( current_threadid != target->rtos->current_thread ) )
{