X-Git-Url: https://review.openocd.org/gitweb?p=openocd.git;a=blobdiff_plain;f=src%2Frtos%2Frtos.c;h=28bbe5ee169072668bc4e1b62c6e8ea243c04ca3;hp=9002f1a8cfe64960785063465453d90f4eb12630;hb=26902bb317d1a5e7a7367e486b03580133ef3dd6;hpb=43902905bbc8fdc9d764f3843d697161d9b5fd92 diff --git a/src/rtos/rtos.c b/src/rtos/rtos.c index 9002f1a8cf..28bbe5ee16 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,6 +196,9 @@ int rtos_qsymbol(struct connection *connection, char *packet, int packet_size) reply_len = sprintf(reply, "OK"); + 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)) @@ -239,7 +244,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 +306,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 +332,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);