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 <borneo.antonio@gmail.com>
Reviewed-on: https://review.openocd.org/c/openocd/+/8830
Tested-by: jenkins
This commit is contained in:
Antonio Borneo
2023-12-03 22:54:51 +01:00
parent afbd01b0a4
commit b3b790e4e0
13 changed files with 56 additions and 63 deletions

View 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;
}

View 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;
}

View 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,

View 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;
}

View 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,

View 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)

View 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;
}
/*

View 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)

View 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 = {

View 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(rtos_name, "none") == 0)
return ERROR_OK;
if (strcmp(cp, "none") == 0)
return JIM_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;
}
}
return JIM_ERR;
command_print(cmd, "Unknown RTOS type %s, try one of: %s, auto or none",
rtos_name, all);
free(all);
return ERROR_COMMAND_ARGUMENT_INVALID;
}
void rtos_destroy(struct target *target)

View 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);

View 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;
}