ipdbg: fix double free of virtual-ir data
[openocd.git] / src / target / arc_cmd.c
index e7c54446e25c0f7f48aadf7c616f208e0cd29694..e7760b0378dd6c695967c0739de1fd1b785d9c71 100644 (file)
@@ -13,6 +13,7 @@
 #endif
 
 #include "arc.h"
+#include <helper/nvp.h>
 
 /* --------------------------------------------------------------------------
  *
@@ -32,7 +33,7 @@ enum add_reg_type_flags {
        CFG_ADD_REG_TYPE_FLAGS_FLAG,
 };
 
-static struct jim_nvp nvp_add_reg_type_flags_opts[] = {
+static const struct nvp nvp_add_reg_type_flags_opts[] = {
        { .name = "-name",  .value = CFG_ADD_REG_TYPE_FLAGS_NAME },
        { .name = "-flag",  .value = CFG_ADD_REG_TYPE_FLAGS_FLAG },
        { .name = NULL,     .value = -1 }
@@ -54,113 +55,113 @@ static const char *validate_register(const struct arc_reg_desc * const reg, bool
        return NULL;
 }
 
-/* Helper function to read the name of register type or register from
- * configure files  */
-static int jim_arc_read_reg_name_field(struct jim_getopt_info *goi,
-       const char **name, int *name_len)
+static COMMAND_HELPER(arc_handle_add_reg_type_flags_ops, struct arc_reg_data_type *type)
 {
-       int e = JIM_OK;
+       struct reg_data_type_flags_field *fields = type->reg_type_flags_field;
+       struct arc_reg_bitfield *bitfields = type->bitfields;
+       struct reg_data_type_flags *flags = &type->data_type_flags;
+       unsigned int cur_field = 0;
 
-       if (!goi->argc) {
-               Jim_WrongNumArgs(goi->interp, goi->argc, goi->argv, "-name <name> ...");
-               return JIM_ERR;
-       }
-       e = jim_getopt_string(goi, name, name_len);
-       return e;
-}
+       while (CMD_ARGC) {
+               const struct nvp *n = nvp_name2value(nvp_add_reg_type_flags_opts, CMD_ARGV[0]);
+               CMD_ARGC--;
+               CMD_ARGV++;
+               switch (n->value) {
+               case CFG_ADD_REG_TYPE_FLAGS_NAME:
+                       if (!CMD_ARGC)
+                               return ERROR_COMMAND_ARGUMENT_INVALID;
 
-/* Helper function to read bitfields/flags of register type. */
-static int jim_arc_read_reg_type_field(struct jim_getopt_info *goi, const char **field_name, int *field_name_len,
-        struct arc_reg_bitfield *bitfields, int cur_field, int type)
-{
-               jim_wide start_pos, end_pos;
+                       const char *name = CMD_ARGV[0];
+                       CMD_ARGC--;
+                       CMD_ARGV++;
+
+                       if (strlen(name) >= REG_TYPE_MAX_NAME_LENGTH) {
+                               command_print(CMD, "Reg type name is too big.");
+                               return ERROR_COMMAND_ARGUMENT_INVALID;
+                       }
+
+                       strcpy((void *)type->data_type.id, name);
+                       break;
+
+               case CFG_ADD_REG_TYPE_FLAGS_FLAG:
+                       if (CMD_ARGC < 2)
+                               return ERROR_COMMAND_ARGUMENT_INVALID;
+
+                       uint32_t val;
+                       const char *field_name = CMD_ARGV[0];
+                       COMMAND_PARSE_NUMBER(u32, CMD_ARGV[1], val);
+                       CMD_ARGC -= 2;
+                       CMD_ARGV += 2;
+                       bitfields[cur_field].bitfield.start = val;
+                       bitfields[cur_field].bitfield.end = val;
+
+                       if (strlen(field_name) >= REG_TYPE_MAX_NAME_LENGTH) {
+                               command_print(CMD, "Reg type field_name is too big.");
+                               return ERROR_COMMAND_ARGUMENT_INVALID;
+                       }
+
+                       fields[cur_field].name = bitfields[cur_field].name;
+                       strcpy(bitfields[cur_field].name, field_name);
+
+                       fields[cur_field].bitfield = &bitfields[cur_field].bitfield;
+                       if (cur_field > 0)
+                               fields[cur_field - 1].next = &fields[cur_field];
+                       else
+                               flags->fields = fields;
 
-               int e = JIM_OK;
-               if ((type == CFG_ADD_REG_TYPE_STRUCT && goi->argc < 3) ||
-                (type == CFG_ADD_REG_TYPE_FLAG && goi->argc < 2)) {
-                       Jim_SetResultFormatted(goi->interp, "Not enough arguments after -flag/-bitfield");
-                       return JIM_ERR;
+                       cur_field += 1;
+                       break;
+
+               default:
+                       nvp_unknown_command_print(CMD, nvp_add_reg_type_flags_opts, NULL, CMD_ARGV[-1]);
+                       return ERROR_COMMAND_ARGUMENT_INVALID;
                }
+       }
 
-               e = jim_getopt_string(goi, field_name, field_name_len);
-               if (e != JIM_OK)
-                                       return e;
-
-               /* read start position of bitfield/flag */
-               e = jim_getopt_wide(goi, &start_pos);
-               if (e != JIM_OK)
-                                       return e;
-
-               end_pos = start_pos;
-
-               /* Check if any arguments remain,
-                * set bitfields[cur_field].end if flag is multibit */
-               if (goi->argc > 0)
-                       /* Check current argv[0], if it is equal to "-flag",
-                        * than bitfields[cur_field].end remains start */
-                       if ((strcmp(Jim_String(goi->argv[0]), "-flag") && type == CFG_ADD_REG_TYPE_FLAG)
-                                       || (type == CFG_ADD_REG_TYPE_STRUCT)) {
-                                                               e = jim_getopt_wide(goi, &end_pos);
-                                                               if (e != JIM_OK) {
-                                                                       Jim_SetResultFormatted(goi->interp, "Error reading end position");
-                                                                       return e;
-                                                               }
-                                                       }
-
-               bitfields[cur_field].bitfield.start = start_pos;
-               bitfields[cur_field].bitfield.end = end_pos;
-               if ((end_pos != start_pos) || (type == CFG_ADD_REG_TYPE_STRUCT))
-                       bitfields[cur_field].bitfield.type = REG_TYPE_INT;
-       return e;
+       if (!type->data_type.id) {
+               command_print(CMD, "-name is a required option");
+               return ERROR_COMMAND_ARGUMENT_INVALID;
+       }
+
+       return ERROR_OK;
 }
 
-static int jim_arc_add_reg_type_flags(Jim_Interp *interp, int argc,
-       Jim_Obj * const *argv)
+COMMAND_HANDLER(arc_handle_add_reg_type_flags)
 {
-       struct jim_getopt_info goi;
-       JIM_CHECK_RETVAL(jim_getopt_setup(&goi, interp, argc-1, argv+1));
+       int retval;
 
        LOG_DEBUG("-");
 
-       struct command_context *ctx;
-       struct target *target;
-
-       ctx = current_command_context(interp);
-       assert(ctx);
-       target = get_current_target(ctx);
+       struct target *target = get_current_target(CMD_CTX);
        if (!target) {
-               Jim_SetResultFormatted(goi.interp, "No current target");
-               return JIM_ERR;
+               command_print(CMD, "No current target");
+               return ERROR_FAIL;
        }
 
-       int e = JIM_OK;
-
        /* Check if the amount of arguments is not zero */
-       if (goi.argc <= 0) {
-               Jim_SetResultFormatted(goi.interp, "The command has no arguments");
-               return JIM_ERR;
-       }
+       if (CMD_ARGC == 0)
+               return ERROR_COMMAND_SYNTAX_ERROR;
 
        /* Estimate number of registers as (argc - 2)/3 as each -flag option has 2
         * arguments while -name is required. */
-       unsigned int fields_sz = (goi.argc - 2) / 3;
-       unsigned int cur_field = 0;
+       unsigned int fields_sz = (CMD_ARGC - 2) / 3;
 
        /* The maximum amount of bitfields is 32 */
        if (fields_sz > 32) {
-               Jim_SetResultFormatted(goi.interp, "The amount of bitfields exceed 32");
-               return JIM_ERR;
+               command_print(CMD, "The amount of bitfields exceed 32");
+               return ERROR_COMMAND_ARGUMENT_INVALID;
        }
 
        struct arc_reg_data_type *type = calloc(1, sizeof(*type));
-       struct reg_data_type_flags *flags = &type->data_type_flags;
        struct reg_data_type_flags_field *fields = calloc(fields_sz, sizeof(*fields));
-       type->reg_type_flags_field = fields;
        struct arc_reg_bitfield *bitfields = calloc(fields_sz, sizeof(*bitfields));
-       if (!(type && fields && bitfields)) {
-               Jim_SetResultFormatted(goi.interp, "Failed to allocate memory.");
+       if (!type || !fields || !bitfields) {
+               LOG_ERROR("Out of memory");
+               retval = ERROR_FAIL;
                goto fail;
        }
+       struct reg_data_type_flags *flags = &type->data_type_flags;
+       type->reg_type_flags_field = fields;
 
        /* Initialize type */
        type->bitfields = bitfields;
@@ -170,92 +171,22 @@ static int jim_arc_add_reg_type_flags(Jim_Interp *interp, int argc,
        type->data_type.reg_type_flags = flags;
        flags->size = 4; /* For now ARC has only 32-bit registers */
 
-       while (goi.argc > 0 && e == JIM_OK) {
-               struct jim_nvp *n;
-               e = jim_getopt_nvp(&goi, nvp_add_reg_type_flags_opts, &n);
-               if (e != JIM_OK) {
-                       jim_getopt_nvp_unknown(&goi, nvp_add_reg_type_flags_opts, 0);
-                       continue;
-               }
-
-               switch (n->value) {
-                       case CFG_ADD_REG_TYPE_FLAGS_NAME:
-                       {
-                               const char *name = NULL;
-                               int name_len = 0;
-
-                               e = jim_arc_read_reg_name_field(&goi, &name, &name_len);
-                               if (e != JIM_OK) {
-                                       Jim_SetResultFormatted(goi.interp, "Unable to read reg name.");
-                                       goto fail;
-                               }
-
-                               if (name_len > REG_TYPE_MAX_NAME_LENGTH) {
-                                       Jim_SetResultFormatted(goi.interp, "Reg type name is too big.");
-                                       goto fail;
-                               }
-
-                               strncpy((void *)type->data_type.id, name, name_len);
-                               if (!type->data_type.id) {
-                                       Jim_SetResultFormatted(goi.interp, "Unable to setup reg type name.");
-                                       goto fail;
-                               }
-
-                               break;
-                       }
-
-                       case CFG_ADD_REG_TYPE_FLAGS_FLAG:
-                       {
-                               const char *field_name = NULL;
-                               int field_name_len = 0;
-
-                               e = jim_arc_read_reg_type_field(&goi, &field_name, &field_name_len, bitfields,
-                                                                       cur_field, CFG_ADD_REG_TYPE_FLAG);
-                               if (e != JIM_OK) {
-                                       Jim_SetResultFormatted(goi.interp, "Unable to add reg_type_flag field.");
-                                       goto fail;
-                               }
-
-                               if (field_name_len > REG_TYPE_MAX_NAME_LENGTH) {
-                                       Jim_SetResultFormatted(goi.interp, "Reg type field_name_len is too big.");
-                                       goto fail;
-                               }
-
-                               fields[cur_field].name = bitfields[cur_field].name;
-                               strncpy(bitfields[cur_field].name, field_name, field_name_len);
-                               if (!fields[cur_field].name) {
-                                       Jim_SetResultFormatted(goi.interp, "Unable to setup field name. ");
-                                       goto fail;
-                               }
-
-                               fields[cur_field].bitfield = &(bitfields[cur_field].bitfield);
-                               if (cur_field > 0)
-                                       fields[cur_field - 1].next = &(fields[cur_field]);
-                               else
-                                       flags->fields = fields;
-
-                               cur_field += 1;
-                               break;
-                       }
-               }
-       }
-
-       if (!type->data_type.id) {
-               Jim_SetResultFormatted(goi.interp, "-name is a required option");
+       retval = CALL_COMMAND_HANDLER(arc_handle_add_reg_type_flags_ops, type);
+       if (retval != ERROR_OK)
                goto fail;
-       }
 
        arc_reg_data_type_add(target, type);
 
        LOG_DEBUG("added flags type {name=%s}", type->data_type.id);
 
-       return JIM_OK;
+       return ERROR_OK;
+
 fail:
        free(type);
        free(fields);
        free(bitfields);
 
-       return JIM_ERR;
+       return retval;
 }
 
 /* Add struct register data type */
@@ -264,7 +195,7 @@ enum add_reg_type_struct {
        CFG_ADD_REG_TYPE_STRUCT_BITFIELD,
 };
 
-static struct jim_nvp nvp_add_reg_type_struct_opts[] = {
+static const struct nvp nvp_add_reg_type_struct_opts[] = {
        { .name = "-name",     .value = CFG_ADD_REG_TYPE_STRUCT_NAME },
        { .name = "-bitfield", .value = CFG_ADD_REG_TYPE_STRUCT_BITFIELD },
        { .name = NULL,     .value = -1 }
@@ -433,53 +364,117 @@ static const struct command_registration arc_jtag_command_group[] = {
 
 
 /* This function supports only bitfields. */
-static int jim_arc_add_reg_type_struct(Jim_Interp *interp, int argc,
-       Jim_Obj * const *argv)
+static COMMAND_HELPER(arc_handle_add_reg_type_struct_opts, struct arc_reg_data_type *type)
 {
-       struct jim_getopt_info goi;
-       JIM_CHECK_RETVAL(jim_getopt_setup(&goi, interp, argc-1, argv+1));
+       struct reg_data_type_struct_field *fields = type->reg_type_struct_field;
+       struct arc_reg_bitfield *bitfields = type->bitfields;
+       struct reg_data_type_struct *struct_type = &type->data_type_struct;
+       unsigned int cur_field = 0;
 
-       LOG_DEBUG("-");
+       while (CMD_ARGC) {
+               const struct nvp *n = nvp_name2value(nvp_add_reg_type_struct_opts, CMD_ARGV[0]);
+               CMD_ARGC--;
+               CMD_ARGV++;
+               switch (n->value) {
+               case CFG_ADD_REG_TYPE_STRUCT_NAME:
+                       if (!CMD_ARGC)
+                               return ERROR_COMMAND_ARGUMENT_INVALID;
 
-       struct command_context *ctx;
-       struct target *target;
+                       const char *name = CMD_ARGV[0];
+                       CMD_ARGC--;
+                       CMD_ARGV++;
 
-       ctx = current_command_context(interp);
-       assert(ctx);
-       target = get_current_target(ctx);
-       if (!target) {
-               Jim_SetResultFormatted(goi.interp, "No current target");
-               return JIM_ERR;
+                       if (strlen(name) >= REG_TYPE_MAX_NAME_LENGTH) {
+                               command_print(CMD, "Reg type name is too big.");
+                               return ERROR_COMMAND_ARGUMENT_INVALID;
+                       }
+
+                       strcpy((void *)type->data_type.id, name);
+                       break;
+
+               case CFG_ADD_REG_TYPE_STRUCT_BITFIELD:
+                       if (CMD_ARGC < 3)
+                               return ERROR_COMMAND_ARGUMENT_INVALID;
+
+                       uint32_t start_pos, end_pos;
+                       const char *field_name = CMD_ARGV[0];
+                       COMMAND_PARSE_NUMBER(u32, CMD_ARGV[1], start_pos);
+                       COMMAND_PARSE_NUMBER(u32, CMD_ARGV[2], end_pos);
+                       CMD_ARGC -= 3;
+                       CMD_ARGV += 3;
+                       bitfields[cur_field].bitfield.start = start_pos;
+                       bitfields[cur_field].bitfield.end = end_pos;
+                       bitfields[cur_field].bitfield.type = REG_TYPE_INT;
+
+                       if (strlen(field_name) >= REG_TYPE_MAX_NAME_LENGTH) {
+                               command_print(CMD, "Reg type field_name is too big.");
+                               return ERROR_COMMAND_ARGUMENT_INVALID;
+                       }
+
+                       fields[cur_field].name = bitfields[cur_field].name;
+                       strcpy(bitfields[cur_field].name, field_name);
+
+                       fields[cur_field].bitfield = &bitfields[cur_field].bitfield;
+                       fields[cur_field].use_bitfields = true;
+                       if (cur_field > 0)
+                               fields[cur_field - 1].next = &fields[cur_field];
+                       else
+                               struct_type->fields = fields;
+
+                       cur_field += 1;
+
+                       break;
+
+               default:
+                       nvp_unknown_command_print(CMD, nvp_add_reg_type_struct_opts, NULL, CMD_ARGV[-1]);
+                       return ERROR_COMMAND_ARGUMENT_INVALID;
+               }
        }
 
-       int e = JIM_OK;
+       if (!type->data_type.id) {
+               command_print(CMD, "-name is a required option");
+               return ERROR_COMMAND_ARGUMENT_INVALID;
+       }
 
-       /* Check if the amount of arguments is not zero */
-       if (goi.argc <= 0) {
-               Jim_SetResultFormatted(goi.interp, "The command has no arguments");
-               return JIM_ERR;
+       return ERROR_OK;
+}
+
+COMMAND_HANDLER(arc_handle_add_reg_type_struct)
+{
+       int retval;
+
+       LOG_DEBUG("-");
+
+       struct target *target = get_current_target(CMD_CTX);
+       if (!target) {
+               command_print(CMD, "No current target");
+               return ERROR_FAIL;
        }
 
+       /* Check if the amount of arguments is not zero */
+       if (CMD_ARGC == 0)
+               return ERROR_COMMAND_SYNTAX_ERROR;
+
        /* Estimate number of registers as (argc - 2)/4 as each -bitfield option has 3
         * arguments while -name is required. */
-       unsigned int fields_sz = (goi.argc - 2) / 4;
-       unsigned int cur_field = 0;
+       unsigned int fields_sz = (CMD_ARGC - 2) / 4;
 
        /* The maximum amount of bitfields is 32 */
        if (fields_sz > 32) {
-                       Jim_SetResultFormatted(goi.interp, "The amount of bitfields exceed 32");
-                       return JIM_ERR;
+               command_print(CMD, "The amount of bitfields exceed 32");
+               return ERROR_COMMAND_ARGUMENT_INVALID;
        }
 
        struct arc_reg_data_type *type = calloc(1, sizeof(*type));
-       struct reg_data_type_struct *struct_type = &type->data_type_struct;
        struct reg_data_type_struct_field *fields = calloc(fields_sz, sizeof(*fields));
-       type->reg_type_struct_field = fields;
        struct arc_reg_bitfield *bitfields = calloc(fields_sz, sizeof(*bitfields));
-       if (!(type && fields && bitfields)) {
-               Jim_SetResultFormatted(goi.interp, "Failed to allocate memory.");
+       if (!type || !fields || !bitfields) {
+               LOG_ERROR("Out of memory");
+               retval = ERROR_FAIL;
                goto fail;
        }
+       struct reg_data_type_struct *struct_type = &type->data_type_struct;
+       type->reg_type_struct_field = fields;
 
        /* Initialize type */
        type->data_type.id = type->data_type_id;
@@ -489,91 +484,22 @@ static int jim_arc_add_reg_type_struct(Jim_Interp *interp, int argc,
        type->data_type.reg_type_struct = struct_type;
        struct_type->size = 4; /* For now ARC has only 32-bit registers */
 
-       while (goi.argc > 0 && e == JIM_OK) {
-               struct jim_nvp *n;
-               e = jim_getopt_nvp(&goi, nvp_add_reg_type_struct_opts, &n);
-               if (e != JIM_OK) {
-                       jim_getopt_nvp_unknown(&goi, nvp_add_reg_type_struct_opts, 0);
-                       continue;
-               }
-
-               switch (n->value) {
-                       case CFG_ADD_REG_TYPE_STRUCT_NAME:
-                       {
-                               const char *name = NULL;
-                               int name_len = 0;
-
-                               e = jim_arc_read_reg_name_field(&goi, &name, &name_len);
-                               if (e != JIM_OK) {
-                                       Jim_SetResultFormatted(goi.interp, "Unable to read reg name.");
-                                       goto fail;
-                               }
-
-                               if (name_len > REG_TYPE_MAX_NAME_LENGTH) {
-                                       Jim_SetResultFormatted(goi.interp, "Reg type name is too big.");
-                                       goto fail;
-                               }
-
-                               strncpy((void *)type->data_type.id, name, name_len);
-                               if (!type->data_type.id) {
-                                       Jim_SetResultFormatted(goi.interp, "Unable to setup reg type name.");
-                                       goto fail;
-                               }
-
-                               break;
-                       }
-                       case CFG_ADD_REG_TYPE_STRUCT_BITFIELD:
-                       {
-                               const char *field_name = NULL;
-                               int field_name_len = 0;
-                               e = jim_arc_read_reg_type_field(&goi, &field_name, &field_name_len, bitfields,
-                                                                       cur_field, CFG_ADD_REG_TYPE_STRUCT);
-                               if (e != JIM_OK) {
-                                       Jim_SetResultFormatted(goi.interp, "Unable to add reg_type_struct field.");
-                                       goto fail;
-                               }
-
-                               if (field_name_len > REG_TYPE_MAX_NAME_LENGTH) {
-                                       Jim_SetResultFormatted(goi.interp, "Reg type field_name_len is too big.");
-                                       goto fail;
-                               }
-
-                               fields[cur_field].name = bitfields[cur_field].name;
-                               strncpy(bitfields[cur_field].name, field_name, field_name_len);
-                               if (!fields[cur_field].name) {
-                                       Jim_SetResultFormatted(goi.interp, "Unable to setup field name. ");
-                                       goto fail;
-                               }
-
-                               fields[cur_field].bitfield = &(bitfields[cur_field].bitfield);
-                               fields[cur_field].use_bitfields = true;
-                               if (cur_field > 0)
-                                       fields[cur_field - 1].next = &(fields[cur_field]);
-                               else
-                                       struct_type->fields = fields;
-
-                               cur_field += 1;
-
-                               break;
-                       }
-               }
-       }
-
-       if (!type->data_type.id) {
-               Jim_SetResultFormatted(goi.interp, "-name is a required option");
+       retval = CALL_COMMAND_HANDLER(arc_handle_add_reg_type_struct_opts, type);
+       if (retval != ERROR_OK)
                goto fail;
-       }
 
        arc_reg_data_type_add(target, type);
+
        LOG_DEBUG("added struct type {name=%s}", type->data_type.id);
-       return JIM_OK;
+
+       return ERROR_OK;
 
 fail:
-                       free(type);
-                       free(fields);
-                       free(bitfields);
+       free(type);
+       free(fields);
+       free(bitfields);
 
-                       return JIM_ERR;
+       return retval;
 }
 
 /* Add register */
@@ -587,7 +513,7 @@ enum opts_add_reg {
        CFG_ADD_REG_GENERAL,
 };
 
-static struct jim_nvp opts_nvp_add_reg[] = {
+static const struct nvp opts_nvp_add_reg[] = {
        { .name = "-name",    .value = CFG_ADD_REG_NAME },
        { .name = "-num",     .value = CFG_ADD_REG_ARCH_NUM },
        { .name = "-core",    .value = CFG_ADD_REG_IS_CORE },
@@ -605,155 +531,133 @@ void free_reg_desc(struct arc_reg_desc *r)
        free(r);
 }
 
-static int jim_arc_add_reg(Jim_Interp *interp, int argc, Jim_Obj * const *argv)
+static COMMAND_HELPER(arc_handle_add_reg_do, struct arc_reg_desc *reg)
 {
-       struct jim_getopt_info goi;
-       JIM_CHECK_RETVAL(jim_getopt_setup(&goi, interp, argc-1, argv+1));
-
-       struct arc_reg_desc *reg = calloc(1, sizeof(*reg));
-       if (!reg) {
-               Jim_SetResultFormatted(goi.interp, "Failed to allocate memory.");
-               return JIM_ERR;
-       }
-
        /* There is no architecture number that we could treat as invalid, so
         * separate variable required to ensure that arch num has been set. */
        bool arch_num_set = false;
        const char *type_name = "int"; /* Default type */
-       int type_name_len = strlen(type_name);
-       int e = ERROR_OK;
 
        /* At least we need to specify 4 parameters: name, number and gdb_feature,
         * which means there should be 6 arguments. Also there can be additional parameters
         * "-type <type>", "-g" and  "-core" or "-bcr" which makes maximum 10 parameters. */
-       if (goi.argc < 6 || goi.argc > 10) {
-               free_reg_desc(reg);
-               Jim_SetResultFormatted(goi.interp,
-                       "Should be at least 6 arguments and not greater than 10: "
-                       " -name <name> -num <num> -feature <gdb_feature> "
-                       " [-type <type_name>] [-core|-bcr] [-g].");
-               return JIM_ERR;
-       }
+       if (CMD_ARGC < 6 || CMD_ARGC > 10)
+               return ERROR_COMMAND_SYNTAX_ERROR;
 
        /* Parse options. */
-       while (goi.argc > 0) {
-               struct jim_nvp *n;
-               e = jim_getopt_nvp(&goi, opts_nvp_add_reg, &n);
-               if (e != JIM_OK) {
-                       jim_getopt_nvp_unknown(&goi, opts_nvp_add_reg, 0);
-                       free_reg_desc(reg);
-                       return e;
-               }
-
+       while (CMD_ARGC) {
+               const struct nvp *n = nvp_name2value(opts_nvp_add_reg, CMD_ARGV[0]);
+               CMD_ARGC--;
+               CMD_ARGV++;
                switch (n->value) {
-                       case CFG_ADD_REG_NAME:
-                       {
-                               const char *reg_name = NULL;
-                               int reg_name_len = 0;
-
-                               e = jim_arc_read_reg_name_field(&goi, &reg_name, &reg_name_len);
-                               if (e != JIM_OK) {
-                                       Jim_SetResultFormatted(goi.interp, "Unable to read register name.");
-                                       free_reg_desc(reg);
-                                       return e;
-                               }
-
-                               reg->name = strndup(reg_name, reg_name_len);
-                               break;
+               case CFG_ADD_REG_NAME:
+                       if (!CMD_ARGC)
+                               return ERROR_COMMAND_ARGUMENT_INVALID;
+
+                       reg->name = strdup(CMD_ARGV[0]);
+                       if (!reg->name) {
+                               LOG_ERROR("Out of memory");
+                               return ERROR_FAIL;
                        }
-                       case CFG_ADD_REG_IS_CORE:
-                               reg->is_core = true;
-                               break;
-                       case CFG_ADD_REG_IS_BCR:
-                               reg->is_bcr = true;
-                               break;
-                       case CFG_ADD_REG_ARCH_NUM:
-                       {
-                               jim_wide archnum;
-
-                               if (!goi.argc) {
-                                       free_reg_desc(reg);
-                                       Jim_WrongNumArgs(interp, goi.argc, goi.argv, "-num <int> ...");
-                                       return JIM_ERR;
-                               }
-
-                               e = jim_getopt_wide(&goi, &archnum);
-                               if (e != JIM_OK) {
-                                       free_reg_desc(reg);
-                                       return e;
-                               }
-
-                               reg->arch_num = archnum;
-                               arch_num_set = true;
-                               break;
-                       }
-                       case CFG_ADD_REG_GDB_FEATURE:
-                       {
-                               const char *feature = NULL;
-                               int feature_len = 0;
-
-                               e = jim_arc_read_reg_name_field(&goi, &feature, &feature_len);
-                               if (e != JIM_OK) {
-                                       Jim_SetResultFormatted(goi.interp, "Unable to read gdb_feature.");
-                                       free_reg_desc(reg);
-                                       return e;
-                               }
-
-                               reg->gdb_xml_feature = strndup(feature, feature_len);
-                               break;
+
+                       CMD_ARGC--;
+                       CMD_ARGV++;
+                       break;
+
+               case CFG_ADD_REG_IS_CORE:
+                       reg->is_core = true;
+                       break;
+
+               case CFG_ADD_REG_IS_BCR:
+                       reg->is_bcr = true;
+                       break;
+
+               case CFG_ADD_REG_ARCH_NUM:
+                       if (!CMD_ARGC)
+                               return ERROR_COMMAND_ARGUMENT_INVALID;
+
+                       COMMAND_PARSE_NUMBER(u32, CMD_ARGV[0], reg->arch_num);
+                       CMD_ARGC--;
+                       CMD_ARGV++;
+
+                       arch_num_set = true;
+                       break;
+
+               case CFG_ADD_REG_GDB_FEATURE:
+                       if (!CMD_ARGC)
+                               return ERROR_COMMAND_ARGUMENT_INVALID;
+
+                       reg->gdb_xml_feature = strdup(CMD_ARGV[0]);
+                       if (!reg->gdb_xml_feature) {
+                               LOG_ERROR("Out of memory");
+                               return ERROR_FAIL;
                        }
-                       case CFG_ADD_REG_TYPE:
-                               e = jim_arc_read_reg_name_field(&goi, &type_name, &type_name_len);
-                               if (e != JIM_OK) {
-                                       Jim_SetResultFormatted(goi.interp, "Unable to read register type.");
-                                       free_reg_desc(reg);
-                                       return e;
-                               }
-
-                               break;
-                       case CFG_ADD_REG_GENERAL:
-                               reg->is_general = true;
-                               break;
-                       default:
-                               LOG_DEBUG("Error: Unknown parameter");
-                               free_reg_desc(reg);
-                               return JIM_ERR;
+
+                       CMD_ARGC--;
+                       CMD_ARGV++;
+                       break;
+
+               case CFG_ADD_REG_TYPE:
+                       if (!CMD_ARGC)
+                               return ERROR_COMMAND_ARGUMENT_INVALID;
+
+                       type_name = CMD_ARGV[0];
+                       CMD_ARGC--;
+                       CMD_ARGV++;
+                       break;
+
+               case CFG_ADD_REG_GENERAL:
+                       reg->is_general = true;
+                       break;
+
+               default:
+                       nvp_unknown_command_print(CMD, opts_nvp_add_reg, NULL, CMD_ARGV[-1]);
+                       return ERROR_COMMAND_ARGUMENT_INVALID;
                }
        }
 
        /* Check that required fields are set */
        const char * const errmsg = validate_register(reg, arch_num_set);
        if (errmsg) {
-               Jim_SetResultFormatted(goi.interp, errmsg);
-               free_reg_desc(reg);
-               return JIM_ERR;
+               command_print(CMD, "%s", errmsg);
+               return ERROR_COMMAND_ARGUMENT_INVALID;
        }
 
        /* Add new register */
-       struct command_context *ctx;
-       struct target *target;
-
-       ctx = current_command_context(interp);
-       assert(ctx);
-       target = get_current_target(ctx);
+       struct target *target = get_current_target(CMD_CTX);
        if (!target) {
-               Jim_SetResultFormatted(goi.interp, "No current target");
-               free_reg_desc(reg);
-               return JIM_ERR;
+               command_print(CMD, "No current target");
+               return ERROR_FAIL;
        }
 
        reg->target = target;
 
-       e = arc_reg_add(target, reg, type_name, type_name_len);
-       if (e == ERROR_ARC_REGTYPE_NOT_FOUND) {
-               Jim_SetResultFormatted(goi.interp,
+       int retval = arc_reg_add(target, reg, type_name, strlen(type_name));
+       if (retval == ERROR_ARC_REGTYPE_NOT_FOUND) {
+               command_print(CMD,
                        "Cannot find type `%s' for register `%s'.",
                        type_name, reg->name);
+               return retval;
+       }
+
+       return ERROR_OK;
+}
+
+COMMAND_HANDLER(arc_handle_add_reg)
+{
+       struct arc_reg_desc *reg = calloc(1, sizeof(*reg));
+       if (!reg) {
+               LOG_ERROR("Out of memory");
+               return ERROR_FAIL;
+       }
+
+       int retval = CALL_COMMAND_HANDLER(arc_handle_add_reg_do, reg);
+       if (retval != ERROR_OK) {
                free_reg_desc(reg);
-               return JIM_ERR;
+               return retval;
        }
 
-       return e;
+       return ERROR_OK;
 }
 
 /* arc set-reg-exists ($reg_name)+
@@ -763,7 +667,7 @@ COMMAND_HANDLER(arc_set_reg_exists)
        struct target * const target = get_current_target(CMD_CTX);
        if (!target) {
                command_print(CMD, "Unable to get current target.");
-               return JIM_ERR;
+               return ERROR_FAIL;
        }
 
        if (!CMD_ARGC) {
@@ -783,7 +687,7 @@ COMMAND_HANDLER(arc_set_reg_exists)
                r->exist = true;
        }
 
-       return JIM_OK;
+       return ERROR_OK;
 }
 
 /* arc reg-field  ($reg_name) ($reg_field)
@@ -924,7 +828,7 @@ static const struct command_registration arc_cache_group_handlers[] = {
 static const struct command_registration arc_core_command_handlers[] = {
        {
                .name = "add-reg-type-flags",
-               .jim_handler = jim_arc_add_reg_type_flags,
+               .handler = arc_handle_add_reg_type_flags,
                .mode = COMMAND_CONFIG,
                .usage = "-name <string> -flag <name> <position> "
                        "[-flag <name> <position>]...",
@@ -934,7 +838,7 @@ static const struct command_registration arc_core_command_handlers[] = {
        },
        {
                .name = "add-reg-type-struct",
-               .jim_handler = jim_arc_add_reg_type_struct,
+               .handler = arc_handle_add_reg_type_struct,
                .mode = COMMAND_CONFIG,
                .usage = "-name <string> -bitfield <name> <start> <end> "
                        "[-bitfield <name> <start> <end>]...",
@@ -946,7 +850,7 @@ static const struct command_registration arc_core_command_handlers[] = {
        },
        {
                .name = "add-reg",
-               .jim_handler = jim_arc_add_reg,
+               .handler = arc_handle_add_reg,
                .mode = COMMAND_CONFIG,
                .usage = "-name <string> -num <int> -feature <string> [-gdbnum <int>] "
                        "[-core|-bcr] [-type <type_name>] [-g]",

Linking to existing account procedure

If you already have an account and want to add another login method you MUST first sign in with your existing account and then change URL to read https://review.openocd.org/login/?link to get to this page again but this time it'll work for linking. Thank you.

SSH host keys fingerprints

1024 SHA256:YKx8b7u5ZWdcbp7/4AeXNaqElP49m6QrwfXaqQGJAOk gerrit-code-review@openocd.zylin.com (DSA)
384 SHA256:jHIbSQa4REvwCFG4cq5LBlBLxmxSqelQPem/EXIrxjk gerrit-code-review@openocd.org (ECDSA)
521 SHA256:UAOPYkU9Fjtcao0Ul/Rrlnj/OsQvt+pgdYSZ4jOYdgs gerrit-code-review@openocd.org (ECDSA)
256 SHA256:A13M5QlnozFOvTllybRZH6vm7iSt0XLxbA48yfc2yfY gerrit-code-review@openocd.org (ECDSA)
256 SHA256:spYMBqEYoAOtK7yZBrcwE8ZpYt6b68Cfh9yEVetvbXg gerrit-code-review@openocd.org (ED25519)
+--[ED25519 256]--+
|=..              |
|+o..   .         |
|*.o   . .        |
|+B . . .         |
|Bo. = o S        |
|Oo.+ + =         |
|oB=.* = . o      |
| =+=.+   + E     |
|. .=o   . o      |
+----[SHA256]-----+
2048 SHA256:0Onrb7/PHjpo6iVZ7xQX2riKN83FJ3KGU0TvI0TaFG4 gerrit-code-review@openocd.zylin.com (RSA)