From 433ca26f1abe59f39844eeac0dafef6cb7fdd520 Mon Sep 17 00:00:00 2001 From: Michel JAOUEN Date: Tue, 3 Jan 2012 17:12:29 +0100 Subject: [PATCH] rtos : create qsymbol interface and add str_to_hex interface MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: I1b26f7efd3ad4a060f772dd12408e77a03d93cea Signed-off-by: Michel JAOUEN Reviewed-on: http://openocd.zylin.com/347 Tested-by: jenkins Reviewed-by: Evan Hunter Reviewed-by: Øyvind Harboe --- src/rtos/rtos.c | 198 +++++++++++++++++++++--------------------------- src/rtos/rtos.h | 3 + 2 files changed, 89 insertions(+), 112 deletions(-) diff --git a/src/rtos/rtos.c b/src/rtos/rtos.c index 815025704..a0bbc82b5 100644 --- a/src/rtos/rtos.c +++ b/src/rtos/rtos.c @@ -31,7 +31,6 @@ static void hex_to_str( char* dst, char * hex_src ); -static int str_to_hex( char* hex_dst, char* src ); /* RTOSs */ @@ -142,8 +141,87 @@ int gdb_thread_packet(struct connection *connection, char *packet, int packet_si return rtos_thread_packet(connection, packet, packet_size); /* thread not found*/ return target->rtos->gdb_thread_packet(connection, packet, packet_size); } +/* return -1 if no rtos defined, 0 if rtos and symbol to be asked, 1 if all + * symbol have been asked*/ +int rtos_qsymbol(struct connection *connection, char *packet, int packet_size) +{ + struct target *target = get_target_from_connection(connection); + if (target->rtos != NULL) { + int next_symbol_num = -1; + if (target->rtos->symbols == NULL) + target->rtos->type->get_symbol_list_to_lookup(&target->rtos->symbols); + if (0 == strcmp("qSymbol::", packet)) + /* first query - */ + next_symbol_num = 0; + else { + int64_t value = 0; + char *hex_name_str = malloc(strlen(packet)); + char *name_str; + int symbol_num; + char *found = strstr(packet, "qSymbol::"); + if (0 == found) + sscanf(packet, "qSymbol:%" SCNx64 ":%s", &value, hex_name_str); + else + /* No value returned by GDB - symbol was not found*/ + sscanf(packet, "qSymbol::%s", hex_name_str); + name_str = (char *) malloc(1 + strlen(hex_name_str) / 2); + hex_to_str(name_str, hex_name_str); + symbol_num = 0; + while ((target->rtos->symbols[symbol_num].symbol_name != NULL) + && (0 != strcmp(target->rtos->symbols[symbol_num].symbol_name, name_str))) + symbol_num++; + + if (target->rtos->symbols[symbol_num].symbol_name == NULL) { + LOG_OUTPUT("ERROR: unknown symbol\r\n"); + gdb_put_packet(connection, "OK", 2); + return ERROR_OK; + } + + target->rtos->symbols[symbol_num].address = value; + + next_symbol_num = symbol_num+1; + free(hex_name_str); + free(name_str); + } + + int symbols_done = 0; + if (target->rtos->symbols[next_symbol_num].symbol_name == NULL) { + if ((target->rtos_auto_detect == false) || + (1 == target->rtos->type->detect_rtos(target))) { + /* Found correct RTOS or not autodetecting */ + if (target->rtos_auto_detect == true) + LOG_OUTPUT("Auto-detected RTOS: %s\r\n", target->rtos->type->name); + symbols_done = 1; + } else { + /* Auto detecting RTOS and currently not found */ + if (1 != rtos_try_next(target)) + /* No more RTOS's to try */ + symbols_done = 1; + else { + next_symbol_num = 0; + target->rtos->type->get_symbol_list_to_lookup(&target->rtos->symbols); + } + } + } + if (symbols_done == 1) + return symbols_done; + else { + char *symname = target->rtos->symbols[next_symbol_num].symbol_name; + char qsymstr[] = "qSymbol:"; + char *opstring = (char *)malloc(sizeof(qsymstr)+strlen(symname)*2+1); + char *posptr = opstring; + posptr += sprintf(posptr, "%s", qsymstr); + str_to_hex(posptr, symname); + gdb_put_packet(connection, opstring, strlen(opstring)); + free(opstring); + return symbols_done; + } + } + gdb_put_packet(connection, "OK", 2); + return -1; +} int rtos_thread_packet(struct connection *connection, char *packet, int packet_size) @@ -233,118 +311,14 @@ int rtos_thread_packet(struct connection *connection, char *packet, int packet_s } else if (strstr(packet, "qSymbol")) { - if ( target->rtos != NULL ) + if (rtos_qsymbol(connection, packet, packet_size) == 1) { - int next_symbol_num = -1; - if (target->rtos->symbols == NULL) - { - target->rtos->type->get_symbol_list_to_lookup( &target->rtos->symbols ); - } - if (0 == strcmp( "qSymbol::", packet ) ) - { - // first query - - next_symbol_num = 0; - } - else - { - int64_t value = 0; - char * hex_name_str = malloc( strlen(packet)); - char * name_str; - int symbol_num; - - char* found = strstr( packet, "qSymbol::" ); - if (0 == found ) - { - sscanf(packet, "qSymbol:%" SCNx64 ":%s", &value, hex_name_str); - } - else - { - // No value returned by GDB - symbol was not found - sscanf(packet, "qSymbol::%s", hex_name_str); - } - name_str = (char*) malloc( 1+ strlen(hex_name_str) / 2 ); - - hex_to_str( name_str, hex_name_str ); - - - symbol_num = 0; - while ( ( target->rtos->symbols[ symbol_num ].symbol_name != NULL ) && ( 0 != strcmp( target->rtos->symbols[ symbol_num ].symbol_name, name_str ) ) ) - { - symbol_num++; - } - - - if ( target->rtos->symbols[ symbol_num ].symbol_name == NULL ) - { - LOG_OUTPUT("ERROR: unknown symbol\r\n"); - gdb_put_packet(connection, "OK", 2); - return ERROR_OK; - } - - target->rtos->symbols[ symbol_num ].address = value; - - next_symbol_num = symbol_num+1; - free( hex_name_str ); - free( name_str ); - - } - - int symbols_done = 0; - if ( target->rtos->symbols[ next_symbol_num ].symbol_name == NULL ) - { - if ( ( target->rtos_auto_detect == false ) || - ( 1 == target->rtos->type->detect_rtos( target ) ) ) - { - // Found correct RTOS or not autodetecting - if ( target->rtos_auto_detect == true ) - { - LOG_OUTPUT( "Auto-detected RTOS: %s\r\n",target->rtos->type->name ); - } - symbols_done = 1; - } - else - { - // Auto detecting RTOS and currently not found - if( 1 != rtos_try_next( target ) ) - { - // No more RTOS's to try - symbols_done = 1; - } - else - { - next_symbol_num = 0; - target->rtos->type->get_symbol_list_to_lookup( &target->rtos->symbols ); - } - - } - } - - - if ( symbols_done == 1 ) - { - target->rtos_auto_detect = false; - target->rtos->type->create( target ); - target->rtos->type->update_threads(target->rtos); - // No more symbols needed - gdb_put_packet(connection, "OK", 2); - return ERROR_OK; - - } - else - { - char* symname = target->rtos->symbols[ next_symbol_num ].symbol_name; - char qsymstr[] = "qSymbol:"; - char * opstring = (char*)malloc(sizeof(qsymstr)+strlen(symname)*2+1); - char * posptr = opstring; - posptr += sprintf( posptr, "%s", qsymstr ); - str_to_hex( posptr, symname ); - gdb_put_packet(connection, opstring, strlen(opstring)); - free(opstring); - return ERROR_OK; - } - + target->rtos_auto_detect = false; + target->rtos->type->create(target); + target->rtos->type->update_threads(target->rtos); + /* No more symbols needed */ + gdb_put_packet(connection, "OK", 2); } - gdb_put_packet(connection, "OK", 2); return ERROR_OK; } else if (strstr(packet, "qfThreadInfo")) @@ -594,7 +568,7 @@ static void hex_to_str( char* dst, char * hex_src ) } -static int str_to_hex( char* hex_dst, char* src ) +int str_to_hex(char *hex_dst, char *src) { char * posptr = hex_dst; unsigned i; diff --git a/src/rtos/rtos.h b/src/rtos/rtos.h index 3d231481a..80ba0e269 100644 --- a/src/rtos/rtos.h +++ b/src/rtos/rtos.h @@ -109,5 +109,8 @@ int gdb_thread_packet(struct connection *connection, char *packet, int packet_si int rtos_get_gdb_reg_list(struct connection *connection); int rtos_update_threads( struct target *target ); int rtos_smp_init(struct target *target); +/* function for handling symbol access */ +int rtos_qsymbol(struct connection *connection, char *packet, int packet_size); +int str_to_hex(char *hex_dst, char *src); #endif // RTOS_H