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;
}
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;
}
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,
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;
}
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,
/* 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)
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;
}
/*
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)
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 = {
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;
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)
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(). */
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)
#include "server/server.h"
#include "target/target.h"
-#include <helper/jim-nvp.h>
typedef int64_t threadid_t;
typedef int64_t symbol_address_t;
#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);
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;
}
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;