From: openocd-gerrit <ope...@us...> - 2025-05-09 12:07:52
|
This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "Main OpenOCD repository". The branch, master has been updated via b3b790e4e01331f79b196f8312193ae0130d2394 (commit) from afbd01b0a46f3a81fe6076c002ad66973dcfb64c (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit b3b790e4e01331f79b196f8312193ae0130d2394 Author: Antonio Borneo <bor...@gm...> Date: Sun Dec 3 22:54:51 2023 +0100 rtos: rework rtos_create() 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 <bor...@gm...> Reviewed-on: https://review.openocd.org/c/openocd/+/8830 Tested-by: jenkins diff --git a/src/rtos/chibios.c b/src/rtos/chibios.c index af590c2cb..0cd99e472 100644 --- a/src/rtos/chibios.c +++ b/src/rtos/chibios.c @@ -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; } diff --git a/src/rtos/ecos.c b/src/rtos/ecos.c index 7048b006e..a70084b4f 100644 --- a/src/rtos/ecos.c +++ b/src/rtos/ecos.c @@ -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; } diff --git a/src/rtos/embkernel.c b/src/rtos/embkernel.c index 7e6de7902..7ad937be5 100644 --- a/src/rtos/embkernel.c +++ b/src/rtos/embkernel.c @@ -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, diff --git a/src/rtos/freertos.c b/src/rtos/freertos.c index 20977e07e..bd7b4220e 100644 --- a/src/rtos/freertos.c +++ b/src/rtos/freertos.c @@ -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; } diff --git a/src/rtos/hwthread.c b/src/rtos/hwthread.c index 6332bd8ad..76571c6b6 100644 --- a/src/rtos/hwthread.c +++ b/src/rtos/hwthread.c @@ -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, diff --git a/src/rtos/linux.c b/src/rtos/linux.c index 5efdc9f60..4ca02605e 100644 --- a/src/rtos/linux.c +++ b/src/rtos/linux.c @@ -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) diff --git a/src/rtos/mqx.c b/src/rtos/mqx.c index 017fd2b01..dbb48952f 100644 --- a/src/rtos/mqx.c +++ b/src/rtos/mqx.c @@ -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; } /* diff --git a/src/rtos/nuttx.c b/src/rtos/nuttx.c index 821e55088..27bf086c8 100644 --- a/src/rtos/nuttx.c +++ b/src/rtos/nuttx.c @@ -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) diff --git a/src/rtos/rtkernel.c b/src/rtos/rtkernel.c index aebbf3d94..2be1996fc 100644 --- a/src/rtos/rtkernel.c +++ b/src/rtos/rtkernel.c @@ -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 = { diff --git a/src/rtos/rtos.c b/src/rtos/rtos.c index 2c563d522..5cac316ed 100644 --- a/src/rtos/rtos.c +++ b/src/rtos/rtos.c @@ -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) diff --git a/src/rtos/rtos.h b/src/rtos/rtos.h index 5ba8b2694..05beab145 100644 --- a/src/rtos/rtos.h +++ b/src/rtos/rtos.h @@ -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); diff --git a/src/rtos/threadx.c b/src/rtos/threadx.c index 61c49264e..620f43cc8 100644 --- a/src/rtos/threadx.c +++ b/src/rtos/threadx.c @@ -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; } diff --git a/src/target/target.c b/src/target/target.c index 40c8d3ed3..8ccab7e0a 100644 --- a/src/target/target.c +++ b/src/target/target.c @@ -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; ----------------------------------------------------------------------- Summary of changes: src/rtos/chibios.c | 4 ++-- src/rtos/ecos.c | 4 ++-- src/rtos/embkernel.c | 4 ++-- src/rtos/freertos.c | 4 ++-- src/rtos/hwthread.c | 2 +- src/rtos/linux.c | 2 +- src/rtos/mqx.c | 4 ++-- src/rtos/nuttx.c | 4 ++-- src/rtos/rtkernel.c | 4 ++-- src/rtos/rtos.c | 66 ++++++++++++++++++++++++++-------------------------- src/rtos/rtos.h | 4 ++-- src/rtos/threadx.c | 4 ++-- src/target/target.c | 13 +++-------- 13 files changed, 56 insertions(+), 63 deletions(-) hooks/post-receive -- Main OpenOCD repository |