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;
}
{
struct target *target = get_target_from_connection(connection);
- if (strstr(packet, "qThreadExtraInfo,")) {
+ if (strncmp(packet, "qThreadExtraInfo,", 17) == 0) {
if ((target->rtos != NULL) && (target->rtos->thread_details != NULL) &&
(target->rtos->thread_count != 0)) {
threadid_t threadid = 0;
}
gdb_put_packet(connection, "", 0);
return ERROR_OK;
- } else if (strstr(packet, "qSymbol")) {
+ } else if (strncmp(packet, "qSymbol", 7) == 0) {
if (rtos_qsymbol(connection, packet, packet_size) == 1) {
target->rtos_auto_detect = false;
target->rtos->type->create(target);
target->rtos->type->update_threads(target->rtos);
}
return ERROR_OK;
- } else if (strstr(packet, "qfThreadInfo")) {
+ } else if (strncmp(packet, "qfThreadInfo", 12) == 0) {
int i;
if ((target->rtos != NULL) && (target->rtos->thread_count != 0)) {
gdb_put_packet(connection, "", 0);
return ERROR_OK;
- } else if (strstr(packet, "qsThreadInfo")) {
+ } else if (strncmp(packet, "qsThreadInfo", 12) == 0) {
gdb_put_packet(connection, "l", 1);
return ERROR_OK;
- } else if (strstr(packet, "qAttached")) {
+ } else if (strncmp(packet, "qAttached", 9) == 0) {
gdb_put_packet(connection, "1", 1);
return ERROR_OK;
- } else if (strstr(packet, "qOffsets")) {
+ } else if (strncmp(packet, "qOffsets", 8) == 0) {
char offsets[] = "Text=0;Data=0;Bss=0";
gdb_put_packet(connection, offsets, sizeof(offsets)-1);
return ERROR_OK;
- } else if (strstr(packet, "qC")) {
+ } 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[15];
+ char buffer[19];
int size;
- size = snprintf(buffer, 15, "QC%08X", (int)target->rtos->current_thread);
+ size = snprintf(buffer, 19, "QC%016" PRIx64, target->rtos->current_thread);
gdb_put_packet(connection, buffer, size);
} else
gdb_put_packet(connection, "QC0", 3);
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 */
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