X-Git-Url: https://review.openocd.org/gitweb?p=openocd.git;a=blobdiff_plain;f=src%2Frtos%2Frtos.c;h=263795c6d89d928af5b85ab189d6efd33ea8a9c8;hp=129770e80137666044246dfae4faaa5eaeb10b95;hb=f6315d5e5b7b71515ef051711e5f818a42d6b3b3;hpb=b69119668ed8d9633280f8b596fe9af60f51644b diff --git a/src/rtos/rtos.c b/src/rtos/rtos.c index 129770e801..263795c6d8 100644 --- a/src/rtos/rtos.c +++ b/src/rtos/rtos.c @@ -29,7 +29,7 @@ #include "server/gdb_server.h" -static long long current_threadid = -1; +static int64_t current_threadid = -1; static void hex_to_str( char* dst, char * hex_src ); static int str_to_hex( char* hex_dst, char* src ); @@ -38,11 +38,13 @@ static int str_to_hex( char* hex_dst, char* src ); /* 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 }; @@ -306,21 +308,20 @@ int gdb_thread_packet(struct connection *connection, struct target *target, char } else { - long long value = 0; + int64_t value = 0; char * hex_name_str = malloc( strlen(packet)); char * name_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 ); @@ -451,7 +452,17 @@ int gdb_thread_packet(struct connection *connection, struct target *target, char } 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? @@ -493,7 +504,7 @@ int gdb_thread_packet(struct connection *connection, struct target *target, char int rtos_get_gdb_reg_list(struct connection *connection, struct target *target, struct reg **reg_list[], int *reg_list_size) { if ( ( target->rtos != NULL ) && - ( current_threadid != 1 ) && + ( current_threadid != -1 ) && ( current_threadid != 0 ) && ( current_threadid != target->rtos->current_thread ) ) { @@ -512,11 +523,11 @@ int rtos_get_gdb_reg_list(struct connection *connection, struct target *target, -int rtos_generic_stack_read( struct target * target, const struct rtos_register_stacking* stacking, long long stack_ptr, char ** hex_reg_list ) +int rtos_generic_stack_read( struct target * target, const struct rtos_register_stacking* stacking, int64_t stack_ptr, char ** hex_reg_list ) { int list_size = 0; char * tmp_str_ptr; - long long new_stack_ptr; + int64_t new_stack_ptr; int i; int retval; @@ -533,7 +544,7 @@ int rtos_generic_stack_read( struct target * target, const struct rtos_register_ { address -= stacking->stack_registers_size; } - retval = target_read_buffer( target, stack_ptr, stacking->stack_registers_size, stack_data); + retval = target_read_buffer( target, address, stacking->stack_registers_size, stack_data); if ( retval != ERROR_OK ) { LOG_OUTPUT("Error reading stack frame from FreeRTOS thread\r\n"); @@ -553,7 +564,7 @@ int rtos_generic_stack_read( struct target * target, const struct rtos_register_ } *hex_reg_list = (char*)malloc( list_size*2 +1 ); tmp_str_ptr = *hex_reg_list; - new_stack_ptr = stack_ptr + stacking->stack_growth_direction * stacking->stack_registers_size; + new_stack_ptr = stack_ptr - stacking->stack_growth_direction * stacking->stack_registers_size; for( i = 0; i < stacking->num_output_registers; i++ ) { int j;