X-Git-Url: https://review.openocd.org/gitweb?p=openocd.git;a=blobdiff_plain;f=src%2Frtos%2Frtos.c;h=dff36502ebb8d7f2353932f3c852e07457f84d78;hp=349f84df0a7c959f2881331af3f7695517a031c1;hb=4a5c9a4965eff5aa678ccc7d1f50da714238b77a;hpb=538a86c3395d0476d2fdcc9bddc4e9e550734c96 diff --git a/src/rtos/rtos.c b/src/rtos/rtos.c index 349f84df0a..dff36502eb 100644 --- a/src/rtos/rtos.c +++ b/src/rtos/rtos.c @@ -199,36 +199,47 @@ int rtos_qsymbol(struct connection *connection, char *packet, int packet_size) if (!os) goto done; - if (sscanf(packet, "qSymbol:%" SCNx64 ":", &addr)) - hex_to_str(cur_sym, strchr(packet + 8, ':') + 1); - else if (target->rtos_auto_detect && !rtos_try_next(target)) - goto done; + /* Decode any symbol name in the packet*/ + hex_to_str(cur_sym, strchr(packet + 8, ':') + 1); + + if ((strcmp(packet, "qSymbol::") != 0) && /* GDB is not offering symbol lookup for the first time */ + (!sscanf(packet, "qSymbol:%" SCNx64 ":", &addr))) { /* GDB did not found an address for a symbol */ + /* GDB could not find an address for the previous symbol */ + if (!target->rtos_auto_detect) { + LOG_WARNING("RTOS %s not detected. (GDB could not find symbol \'%s\')", os->type->name, cur_sym); + goto done; + } else { + /* Autodetecting RTOS - try next RTOS */ + if (!rtos_try_next(target)) + goto done; + /* Next RTOS selected - invalidate current symbol */ + cur_sym[0] = '\x00'; + + } + } next_sym = next_symbol(os, cur_sym, addr); + if (!next_sym) { + /* No more symbols need looking up */ + if (!target->rtos_auto_detect) { rtos_detected = 1; goto done; } if (os->type->detect_rtos(target)) { - LOG_OUTPUT("Auto-detected RTOS: %s\r\n", os->type->name); + LOG_INFO("Auto-detected RTOS: %s", os->type->name); rtos_detected = 1; goto done; - } - - if (!rtos_try_next(target)) - goto done; - - os->type->get_symbol_list_to_lookup(&os->symbols); - - next_sym = os->symbols[0].symbol_name; - if (!next_sym) + } else { + LOG_WARNING("No RTOS could be auto-detected!"); goto done; + } } if (8 + (strlen(next_sym) * 2) + 1 > sizeof(reply)) { - LOG_OUTPUT("ERROR: RTOS symbol '%s' name is too long for GDB!", next_sym); + LOG_ERROR("ERROR: RTOS symbol '%s' name is too long for GDB!", next_sym); goto done; } @@ -342,6 +353,10 @@ int rtos_thread_packet(struct connection *connection, char *packet, int packet_s char offsets[] = "Text=0;Data=0;Bss=0"; gdb_put_packet(connection, offsets, sizeof(offsets)-1); return ERROR_OK; + } else if (strncmp(packet, "qCRC:", 5) == 0) { + /* make sure we check this before "qC" packet below + * otherwise it gets incorrectly handled */ + return GDB_THREAD_PACKET_NOT_CONSUMED; } else if (strncmp(packet, "qC", 2) == 0) { if (target->rtos != NULL) { char buffer[19]; @@ -414,7 +429,7 @@ int rtos_generic_stack_read(struct target *target, int retval; if (stack_ptr == 0) { - LOG_OUTPUT("Error: null stack pointer in thread\r\n"); + LOG_ERROR("Error: null stack pointer in thread"); return -5; } /* Read the stack */ @@ -425,7 +440,7 @@ int rtos_generic_stack_read(struct target *target, address -= stacking->stack_registers_size; 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"); + LOG_ERROR("Error reading stack frame from thread"); return retval; } #if 0