]> www.infradead.org Git - users/borneoa/openocd-next.git/commitdiff
rtos: rework rtos_create()
authorAntonio Borneo <borneo.antonio@gmail.com>
Sun, 3 Dec 2023 21:54:51 +0000 (22:54 +0100)
committerAntonio Borneo <borneo.antonio@gmail.com>
Fri, 9 May 2025 12:06:54 +0000 (12:06 +0000)
To simplify the caller of rtos_create(), convert the code from
jimtcl oriented to OpenOCD commands.

While there, fix inconsistencies in almost every rtos create()
method and reset rtos_auto_detect to better cooperate on run-time
rtos configuration.

Change-Id: I59c443aaed77a48174facdfc86db75d6b28c8480
Signed-off-by: Antonio Borneo <borneo.antonio@gmail.com>
Reviewed-on: https://review.openocd.org/c/openocd/+/8830
Tested-by: jenkins
13 files changed:
src/rtos/chibios.c
src/rtos/ecos.c
src/rtos/embkernel.c
src/rtos/freertos.c
src/rtos/hwthread.c
src/rtos/linux.c
src/rtos/mqx.c
src/rtos/nuttx.c
src/rtos/rtkernel.c
src/rtos/rtos.c
src/rtos/rtos.h
src/rtos/threadx.c
src/target/target.c

index af590c2cb1ced65a4140cf37cdf02ff35cb063f1..0cd99e472053c20947390e52c9029b1414237054 100644 (file)
@@ -515,10 +515,10 @@ static int chibios_create(struct target *target)
        for (unsigned int i = 0; i < ARRAY_SIZE(chibios_params_list); i++)
                if (strcmp(chibios_params_list[i].target_name, target_type_name(target)) == 0) {
                        target->rtos->rtos_specific_params = (void *)&chibios_params_list[i];
-                       return 0;
+                       return ERROR_OK;
                }
 
        LOG_WARNING("Could not find target \"%s\" in ChibiOS compatibility "
                                "list", target_type_name(target));
-       return -1;
+       return ERROR_FAIL;
 }
index 7048b006e0991c06a2f0c26ce6ad682241e99603..a70084b4fbe040f554f8bada1b0556f8ad0d712e 100644 (file)
@@ -1213,12 +1213,12 @@ static int ecos_create(struct target *target)
                                target->rtos->gdb_thread_packet = ecos_packet_hook;
                                /* We do not currently use the target->rtos->gdb_target_for_threadid
                                 * hook. */
-                               return 0;
+                               return ERROR_OK;
                        }
                        tnames++;
                }
        }
 
        LOG_ERROR("Could not find target in eCos compatibility list");
-       return -1;
+       return ERROR_FAIL;
 }
index 7e6de7902abff871cffba7aaaea325b40370bb4a..7ad937be59fc1b90e7d57d35e6a1e08eda89450a 100644 (file)
@@ -115,11 +115,11 @@ static int embkernel_create(struct target *target)
        if (i >= ARRAY_SIZE(embkernel_params_list)) {
                LOG_WARNING("Could not find target \"%s\" in embKernel compatibility "
                                "list", target_type_name(target));
-               return -1;
+               return ERROR_FAIL;
        }
 
        target->rtos->rtos_specific_params = (void *) &embkernel_params_list[i];
-       return 0;
+       return ERROR_OK;
 }
 
 static int embkernel_get_tasks_details(struct rtos *rtos, int64_t iterable, const struct embkernel_params *param,
index 20977e07e9b0c74bc902e05489561c273cd647df..bd7b4220e37ab7a38550c29df601cde71860289b 100644 (file)
@@ -534,9 +534,9 @@ static int freertos_create(struct target *target)
        for (unsigned int i = 0; i < ARRAY_SIZE(freertos_params_list); i++)
                if (strcmp(freertos_params_list[i].target_name, target_type_name(target)) == 0) {
                        target->rtos->rtos_specific_params = (void *)&freertos_params_list[i];
-                       return 0;
+                       return ERROR_OK;
                }
 
        LOG_ERROR("Could not find target in FreeRTOS compatibility list");
-       return -1;
+       return ERROR_FAIL;
 }
index 6332bd8ad0882601cb7b50fff8bfe71de8dd1ed9..76571c6b6016ed6ade27c3f0df64cf4f09ad025e 100644 (file)
@@ -412,7 +412,7 @@ static int hwthread_create(struct target *target)
        target->rtos->thread_details = NULL;
        target->rtos->gdb_target_for_threadid = hwthread_target_for_threadid;
        target->rtos->gdb_thread_packet = hwthread_thread_packet;
-       return 0;
+       return ERROR_OK;
 }
 
 static int hwthread_read_buffer(struct rtos *rtos, target_addr_t address,
index 5efdc9f60979db646b8044895ccb8a61a8b5eb67..4ca02605ed755b6bfdeba5831630c29563693df6 100644 (file)
@@ -1424,7 +1424,7 @@ static int linux_os_create(struct target *target)
        /*  initialize a default virt 2 phys translation */
        os_linux->phys_mask = ~0xc0000000;
        os_linux->phys_base = 0x0;
-       return JIM_OK;
+       return ERROR_OK;
 }
 
 static char *linux_ps_command(struct target *target)
index 017fd2b01cd1a1c581e4d142ea39a7b3a527a551..dbb48952f256e367a5bca2aa6c0c6386e5586a78 100644 (file)
@@ -251,11 +251,11 @@ static int mqx_create(
                if (strcmp(mqx_params_list[i].target_name, target_type_name(target)) == 0) {
                        target->rtos->rtos_specific_params = (void *)&mqx_params_list[i];
                        /* LOG_DEBUG("MQX RTOS - valid architecture: %s", target_type_name(target)); */
-                       return 0;
+                       return ERROR_OK;
                }
        }
        LOG_ERROR("MQX RTOS - could not find target \"%s\" in MQX compatibility list", target_type_name(target));
-       return -1;
+       return ERROR_FAIL;
 }
 
 /*
index 821e550885533280662f0537be486cf8911f903f..27bf086c8346d005304cf36346708e846518a884 100644 (file)
@@ -129,13 +129,13 @@ static int nuttx_create(struct target *target)
 
        if (i >= ARRAY_SIZE(nuttx_params_list)) {
                LOG_ERROR("Could not find \"%s\" target in NuttX compatibility list", target_type_name(target));
-               return JIM_ERR;
+               return ERROR_FAIL;
        }
 
        /* We found a target in our list, copy its reference. */
        target->rtos->rtos_specific_params = (void *)param;
 
-       return JIM_OK;
+       return ERROR_OK;
 }
 
 static int nuttx_smp_init(struct target *target)
index aebbf3d94d6c1f61fc604f008dd04c7f32c54f44..2be1996fcd06452594d154e27b7f6fd08ee32a72 100644 (file)
@@ -364,12 +364,12 @@ static int rtkernel_create(struct target *target)
        for (size_t i = 0; i < ARRAY_SIZE(rtkernel_params_list); i++) {
                if (strcmp(rtkernel_params_list[i].target_name, target_type_name(target)) == 0) {
                        target->rtos->rtos_specific_params = (void *)&rtkernel_params_list[i];
-                       return 0;
+                       return ERROR_OK;
                }
        }
 
        LOG_ERROR("Could not find target in rt-kernel compatibility list");
-       return -1;
+       return ERROR_FAIL;
 }
 
 const struct rtos_type rtkernel_rtos = {
index 2c563d522b5654fc77e1566771e8ea329fe0fb29..5cac316ed35fa3eb59686b01d91ec0c612b1b29b 100644 (file)
@@ -57,7 +57,7 @@ static int os_alloc(struct target *target, const struct rtos_type *ostype)
        struct rtos *os = target->rtos = calloc(1, sizeof(struct rtos));
 
        if (!os)
-               return JIM_ERR;
+               return ERROR_FAIL;
 
        os->type = ostype;
        os->current_threadid = -1;
@@ -69,7 +69,7 @@ static int os_alloc(struct target *target, const struct rtos_type *ostype)
        os->gdb_thread_packet = rtos_thread_packet;
        os->gdb_target_for_threadid = rtos_target_for_threadid;
 
-       return JIM_OK;
+       return ERROR_OK;
 }
 
 static void os_free(struct target *target)
@@ -86,38 +86,26 @@ static void os_free(struct target *target)
 static int os_alloc_create(struct target *target, const struct rtos_type *ostype)
 {
        int ret = os_alloc(target, ostype);
+       if (ret != ERROR_OK)
+               return ret;
 
-       if (ret == JIM_OK) {
-               ret = target->rtos->type->create(target);
-               if (ret != JIM_OK)
-                       os_free(target);
-       }
+       ret = target->rtos->type->create(target);
+       if (ret != ERROR_OK)
+               os_free(target);
 
        return ret;
 }
 
-int rtos_create(struct jim_getopt_info *goi, struct target *target)
+int rtos_create(struct command_invocation *cmd, struct target *target,
+               const char *rtos_name)
 {
-       int x;
-       const char *cp;
-       Jim_Obj *res;
-       int e;
-
-       if (!goi->is_configure && goi->argc != 0) {
-               Jim_WrongNumArgs(goi->interp, goi->argc, goi->argv, "NO PARAMS");
-               return JIM_ERR;
-       }
-
        os_free(target);
+       target->rtos_auto_detect = false;
 
-       e = jim_getopt_string(goi, &cp, NULL);
-       if (e != JIM_OK)
-               return e;
-
-       if (strcmp(cp, "none") == 0)
-               return JIM_OK;
+       if (strcmp(rtos_name, "none") == 0)
+               return ERROR_OK;
 
-       if (strcmp(cp, "auto") == 0) {
+       if (strcmp(rtos_name, "auto") == 0) {
                /* Auto detect tries to look up all symbols for each RTOS,
                 * and runs the RTOS driver's _detect() function when GDB
                 * finds all symbols for any RTOS. See rtos_qsymbol(). */
@@ -128,17 +116,29 @@ int rtos_create(struct jim_getopt_info *goi, struct target *target)
                return os_alloc(target, rtos_types[0]);
        }
 
-       for (x = 0; rtos_types[x]; x++)
-               if (strcmp(cp, rtos_types[x]->name) == 0)
+       for (int x = 0; rtos_types[x]; x++)
+               if (strcmp(rtos_name, rtos_types[x]->name) == 0)
                        return os_alloc_create(target, rtos_types[x]);
 
-       Jim_SetResultFormatted(goi->interp, "Unknown RTOS type %s, try one of: ", cp);
-       res = Jim_GetResult(goi->interp);
-       for (x = 0; rtos_types[x]; x++)
-               Jim_AppendStrings(goi->interp, res, rtos_types[x]->name, ", ", NULL);
-       Jim_AppendStrings(goi->interp, res, ", auto or none", NULL);
+       char *all = NULL;
+       for (int x = 0; rtos_types[x]; x++) {
+               char *prev = all;
+               if (all)
+                       all = alloc_printf("%s, %s", all, rtos_types[x]->name);
+               else
+                       all = alloc_printf("%s", rtos_types[x]->name);
+               free(prev);
+               if (!all) {
+                       LOG_ERROR("Out of memory");
+                       return ERROR_FAIL;
+               }
+       }
+
+       command_print(cmd, "Unknown RTOS type %s, try one of: %s, auto or none",
+               rtos_name, all);
+       free(all);
 
-       return JIM_ERR;
+       return ERROR_COMMAND_ARGUMENT_INVALID;
 }
 
 void rtos_destroy(struct target *target)
index 5ba8b269451e24bb348d52a6e1c8c175ea520029..05beab1459077941cab559fda312f4d005f15aff 100644 (file)
@@ -10,7 +10,6 @@
 
 #include "server/server.h"
 #include "target/target.h"
-#include <helper/jim-nvp.h>
 
 typedef int64_t threadid_t;
 typedef int64_t symbol_address_t;
@@ -113,7 +112,8 @@ struct rtos_register_stacking {
 
 #define GDB_THREAD_PACKET_NOT_CONSUMED (-40)
 
-int rtos_create(struct jim_getopt_info *goi, struct target *target);
+int rtos_create(struct command_invocation *cmd, struct target *target,
+               const char *rtos_name);
 void rtos_destroy(struct target *target);
 int rtos_set_reg(struct connection *connection, int reg_num,
                uint8_t *reg_value);
index 61c49264e830a58e9804fee3ce4802f500ea0b02..620f43cc8ef4caaef63f4adec7533d7d8a293cb5 100644 (file)
@@ -611,9 +611,9 @@ static int threadx_create(struct target *target)
                        target->rtos->rtos_specific_params = (void *)&threadx_params_list[i];
                        target->rtos->current_thread = 0;
                        target->rtos->thread_details = NULL;
-                       return 0;
+                       return ERROR_OK;
                }
 
        LOG_ERROR("Could not find target in ThreadX compatibility list");
-       return -1;
+       return ERROR_FAIL;
 }
index 40c8d3ed360eb2c37e72a3f18c93fc19667f9c7e..8ccab7e0abd8e76f054c8f7bd09f8aed78a341ed 100644 (file)
@@ -5176,17 +5176,10 @@ static COMMAND_HELPER(target_configure, struct target *target, unsigned int inde
                                        command_print(CMD, "missing argument to %s", CMD_ARGV[index - 1]);
                                        return ERROR_COMMAND_ARGUMENT_INVALID;
                                }
-                               struct jim_getopt_info goi;
-                               jim_getopt_setup(&goi, CMD_CTX->interp, CMD_ARGC - index, CMD_JIMTCL_ARGV + index);
+                               retval = rtos_create(CMD, target, CMD_ARGV[index]);
+                               if (retval != ERROR_OK)
+                                       return retval;
                                index++;
-                               goi.is_configure = true;
-                               int resval = rtos_create(&goi, target);
-                               int reslen;
-                               const char *result = Jim_GetString(Jim_GetResult(CMD_CTX->interp), &reslen);
-                               if (reslen > 0)
-                                       command_print(CMD, "%s", result);
-                               if (resval != JIM_OK)
-                                       return ERROR_FAIL;
                        } else {
                                if (index != CMD_ARGC)
                                        return ERROR_COMMAND_SYNTAX_ERROR;