X-Git-Url: https://review.openocd.org/gitweb?p=openocd.git;a=blobdiff_plain;f=src%2Frtos%2Frtos.c;h=61fc7936ff20f4a0f3f0c173e27e8ccb05baf731;hp=9002f1a8cfe64960785063465453d90f4eb12630;hb=b5c616b90ec3e2e75d48dc6765b06a86ca44e05f;hpb=43902905bbc8fdc9d764f3843d697161d9b5fd92 diff --git a/src/rtos/rtos.c b/src/rtos/rtos.c index 9002f1a8cf..61fc7936ff 100644 --- a/src/rtos/rtos.c +++ b/src/rtos/rtos.c @@ -34,12 +34,14 @@ extern struct rtos_type FreeRTOS_rtos; extern struct rtos_type ThreadX_rtos; extern struct rtos_type eCos_rtos; extern struct rtos_type Linux_os; +extern struct rtos_type ChibiOS_rtos; static struct rtos_type *rtos_types[] = { &ThreadX_rtos, &FreeRTOS_rtos, &eCos_rtos, &Linux_os, + &ChibiOS_rtos, NULL }; @@ -194,13 +196,33 @@ int rtos_qsymbol(struct connection *connection, char *packet, int packet_size) reply_len = sprintf(reply, "OK"); - 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)) + if (!os) 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; @@ -210,16 +232,10 @@ int rtos_qsymbol(struct connection *connection, char *packet, int packet_size) LOG_OUTPUT("Auto-detected RTOS: %s\r\n", 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)) { @@ -239,7 +255,7 @@ int rtos_thread_packet(struct connection *connection, char *packet, int packet_s { 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; @@ -301,14 +317,14 @@ int rtos_thread_packet(struct connection *connection, char *packet, int packet_s } 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)) { @@ -327,21 +343,25 @@ int rtos_thread_packet(struct connection *connection, char *packet, int packet_s 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);