helper: Code cleanup for hexify()
[fw/openocd] / src / rtos / rtos.c
index 448c49c060cc96f1690c09ce4cc5dbda03d9e28a..84ee498beaa1af2b0ca19b5ae656bda04f6d00eb 100644 (file)
@@ -34,6 +34,7 @@ extern struct rtos_type Linux_os;
 extern struct rtos_type ChibiOS_rtos;
 extern struct rtos_type embKernel_rtos;
 extern struct rtos_type mqx_rtos;
+extern struct rtos_type uCOS_III_rtos;
 
 static struct rtos_type *rtos_types[] = {
        &ThreadX_rtos,
@@ -43,6 +44,7 @@ static struct rtos_type *rtos_types[] = {
        &ChibiOS_rtos,
        &embKernel_rtos,
        &mqx_rtos,
+       &uCOS_III_rtos,
        NULL
 };
 
@@ -104,6 +106,7 @@ int rtos_create(Jim_GetOptInfo *goi, struct target *target)
        int x;
        const char *cp;
        struct Jim_Obj *res;
+       int e;
 
        if (!goi->isconfigure && goi->argc != 0) {
                Jim_WrongNumArgs(goi->interp, goi->argc, goi->argv, "NO PARAMS");
@@ -112,7 +115,9 @@ int rtos_create(Jim_GetOptInfo *goi, struct target *target)
 
        os_free(target);
 
-       Jim_GetOpt_String(goi, &cp, NULL);
+       e = Jim_GetOpt_String(goi, &cp, NULL);
+       if (e != JIM_OK)
+               return e;
 
        if (0 == strcmp(cp, "auto")) {
                /* Auto detect tries to look up all symbols for each RTOS,
@@ -261,7 +266,9 @@ int rtos_qsymbol(struct connection *connection, char const *packet, int packet_s
        }
 
        reply_len = snprintf(reply, sizeof(reply), "qSymbol:");
-       reply_len += hexify(reply + reply_len, next_sym->symbol_name, 0, sizeof(reply) - reply_len);
+       reply_len += hexify(reply + reply_len,
+               (const uint8_t *)next_sym->symbol_name, strlen(next_sym->symbol_name),
+               sizeof(reply) - reply_len);
 
 done:
        gdb_put_packet(connection, reply, reply_len);
@@ -301,14 +308,14 @@ int rtos_thread_packet(struct connection *connection, char const *packet, int pa
                        if (detail->extra_info_str != NULL)
                                str_size += strlen(detail->extra_info_str);
 
-                       char *tmp_str = calloc(str_size + 4, sizeof(char));
+                       char *tmp_str = calloc(str_size + 9, sizeof(char));
                        char *tmp_str_ptr = tmp_str;
 
                        if (detail->thread_name_str != NULL)
-                               tmp_str_ptr += sprintf(tmp_str_ptr, "%s", detail->thread_name_str);
+                               tmp_str_ptr += sprintf(tmp_str_ptr, "Name: %s", detail->thread_name_str);
                        if (detail->extra_info_str != NULL) {
                                if (tmp_str_ptr != tmp_str)
-                                       tmp_str_ptr += sprintf(tmp_str_ptr, " : ");
+                                       tmp_str_ptr += sprintf(tmp_str_ptr, ", ");
                                tmp_str_ptr += sprintf(tmp_str_ptr, "%s", detail->extra_info_str);
                        }
 
@@ -316,7 +323,8 @@ int rtos_thread_packet(struct connection *connection, char const *packet, int pa
                                (size_t) (tmp_str_ptr - tmp_str));
 
                        char *hex_str = malloc(strlen(tmp_str) * 2 + 1);
-                       int pkt_len = hexify(hex_str, tmp_str, 0, strlen(tmp_str) * 2 + 1);
+                       size_t pkt_len = hexify(hex_str, (const uint8_t *)tmp_str,
+                               strlen(tmp_str), strlen(tmp_str) * 2 + 1);
 
                        gdb_put_packet(connection, hex_str, pkt_len);
                        free(hex_str);
@@ -397,9 +405,14 @@ int rtos_thread_packet(struct connection *connection, char const *packet, int pa
        } else if (packet[0] == 'H') {  /* Set current thread ( 'c' for step and continue, 'g' for
                                         * all other operations ) */
                if ((packet[1] == 'g') && (target->rtos != NULL)) {
-                       sscanf(packet, "Hg%16" SCNx64, &target->rtos->current_threadid);
-                       LOG_DEBUG("RTOS: GDB requested to set current thread to 0x%" PRIx64 "\r\n",
-                                                                               target->rtos->current_threadid);
+                       threadid_t threadid;
+                       sscanf(packet, "Hg%16" SCNx64, &threadid);
+                       LOG_DEBUG("RTOS: GDB requested to set current thread to 0x%" PRIx64, threadid);
+                       /* threadid of 0 indicates target should choose */
+                       if (threadid == 0)
+                               target->rtos->current_threadid = target->rtos->current_thread;
+                       else
+                               target->rtos->current_threadid = threadid;
                }
                gdb_put_packet(connection, "OK", 2);
                return ERROR_OK;
@@ -423,9 +436,13 @@ int rtos_get_gdb_reg_list(struct connection *connection)
                                                                                current_threadid,
                                                                                target->rtos->current_thread);
 
-               target->rtos->type->get_thread_reg_list(target->rtos,
-                       current_threadid,
-                       &hex_reg_list);
+               int retval = target->rtos->type->get_thread_reg_list(target->rtos,
+                               current_threadid,
+                               &hex_reg_list);
+               if (retval != ERROR_OK) {
+                       LOG_ERROR("RTOS: failed to get register list");
+                       return retval;
+               }
 
                if (hex_reg_list != NULL) {
                        gdb_put_packet(connection, hex_reg_list, strlen(hex_reg_list));
@@ -543,5 +560,7 @@ void rtos_free_threadlist(struct rtos *rtos)
                free(rtos->thread_details);
                rtos->thread_details = NULL;
                rtos->thread_count = 0;
+               rtos->current_threadid = -1;
+               rtos->current_thread = 0;
        }
 }