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:
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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 = {
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user