Skip to content

Commit c1df8b9

Browse files
borneoaerhankur
authored andcommitted
target: arc: rewrite command 'arc add-reg' as COMMAND_HANDLER
While there, fix some coding style error and remove the now unused function jim_arc_read_reg_name_field() and the macro JIM_CHECK_RETVAL(). Change-Id: I140b4b929978b2936f2310e0b7d1735ba726c517 Signed-off-by: Antonio Borneo <[email protected]> Reviewed-on: https://review.openocd.org/c/openocd/+/7426 Tested-by: jenkins Reviewed-by: Evgeniy Didin <[email protected]>
1 parent 0a6a76d commit c1df8b9

File tree

2 files changed

+96
-143
lines changed

2 files changed

+96
-143
lines changed

src/target/arc.h

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -253,16 +253,6 @@ struct arc_common {
253253
} \
254254
} while (0)
255255

256-
#define JIM_CHECK_RETVAL(action) \
257-
do { \
258-
int __retval = (action); \
259-
if (__retval != JIM_OK) { \
260-
LOG_DEBUG("error while calling \"%s\"", \
261-
# action); \
262-
return __retval; \
263-
} \
264-
} while (0)
265-
266256
static inline struct arc_common *target_to_arc(struct target *target)
267257
{
268258
return target->arch_info;

src/target/arc_cmd.c

Lines changed: 96 additions & 133 deletions
Original file line numberDiff line numberDiff line change
@@ -55,21 +55,6 @@ static const char *validate_register(const struct arc_reg_desc * const reg, bool
5555
return NULL;
5656
}
5757

58-
/* Helper function to read the name of register type or register from
59-
* configure files */
60-
static int jim_arc_read_reg_name_field(struct jim_getopt_info *goi,
61-
const char **name, int *name_len)
62-
{
63-
int e = JIM_OK;
64-
65-
if (!goi->argc) {
66-
Jim_WrongNumArgs(goi->interp, goi->argc, goi->argv, "-name <name> ...");
67-
return JIM_ERR;
68-
}
69-
e = jim_getopt_string(goi, name, name_len);
70-
return e;
71-
}
72-
7358
static COMMAND_HELPER(arc_handle_add_reg_type_flags_ops, struct arc_reg_data_type *type)
7459
{
7560
struct reg_data_type_flags_field *fields = type->reg_type_flags_field;
@@ -528,7 +513,7 @@ enum opts_add_reg {
528513
CFG_ADD_REG_GENERAL,
529514
};
530515

531-
static struct jim_nvp opts_nvp_add_reg[] = {
516+
static const struct nvp opts_nvp_add_reg[] = {
532517
{ .name = "-name", .value = CFG_ADD_REG_NAME },
533518
{ .name = "-num", .value = CFG_ADD_REG_ARCH_NUM },
534519
{ .name = "-core", .value = CFG_ADD_REG_IS_CORE },
@@ -546,155 +531,133 @@ void free_reg_desc(struct arc_reg_desc *r)
546531
free(r);
547532
}
548533

549-
static int jim_arc_add_reg(Jim_Interp *interp, int argc, Jim_Obj * const *argv)
534+
static COMMAND_HELPER(arc_handle_add_reg_do, struct arc_reg_desc *reg)
550535
{
551-
struct jim_getopt_info goi;
552-
JIM_CHECK_RETVAL(jim_getopt_setup(&goi, interp, argc-1, argv+1));
553-
554-
struct arc_reg_desc *reg = calloc(1, sizeof(*reg));
555-
if (!reg) {
556-
Jim_SetResultFormatted(goi.interp, "Failed to allocate memory.");
557-
return JIM_ERR;
558-
}
559-
560536
/* There is no architecture number that we could treat as invalid, so
561537
* separate variable required to ensure that arch num has been set. */
562538
bool arch_num_set = false;
563539
const char *type_name = "int"; /* Default type */
564-
int type_name_len = strlen(type_name);
565-
int e = ERROR_OK;
566540

567541
/* At least we need to specify 4 parameters: name, number and gdb_feature,
568542
* which means there should be 6 arguments. Also there can be additional parameters
569543
* "-type <type>", "-g" and "-core" or "-bcr" which makes maximum 10 parameters. */
570-
if (goi.argc < 6 || goi.argc > 10) {
571-
free_reg_desc(reg);
572-
Jim_SetResultFormatted(goi.interp,
573-
"Should be at least 6 arguments and not greater than 10: "
574-
" -name <name> -num <num> -feature <gdb_feature> "
575-
" [-type <type_name>] [-core|-bcr] [-g].");
576-
return JIM_ERR;
577-
}
544+
if (CMD_ARGC < 6 || CMD_ARGC > 10)
545+
return ERROR_COMMAND_SYNTAX_ERROR;
578546

579547
/* Parse options. */
580-
while (goi.argc > 0) {
581-
struct jim_nvp *n;
582-
e = jim_getopt_nvp(&goi, opts_nvp_add_reg, &n);
583-
if (e != JIM_OK) {
584-
jim_getopt_nvp_unknown(&goi, opts_nvp_add_reg, 0);
585-
free_reg_desc(reg);
586-
return e;
587-
}
588-
548+
while (CMD_ARGC) {
549+
const struct nvp *n = nvp_name2value(opts_nvp_add_reg, CMD_ARGV[0]);
550+
CMD_ARGC--;
551+
CMD_ARGV++;
589552
switch (n->value) {
590-
case CFG_ADD_REG_NAME:
591-
{
592-
const char *reg_name = NULL;
593-
int reg_name_len = 0;
594-
595-
e = jim_arc_read_reg_name_field(&goi, &reg_name, &reg_name_len);
596-
if (e != JIM_OK) {
597-
Jim_SetResultFormatted(goi.interp, "Unable to read register name.");
598-
free_reg_desc(reg);
599-
return e;
600-
}
601-
602-
reg->name = strndup(reg_name, reg_name_len);
603-
break;
604-
}
605-
case CFG_ADD_REG_IS_CORE:
606-
reg->is_core = true;
607-
break;
608-
case CFG_ADD_REG_IS_BCR:
609-
reg->is_bcr = true;
610-
break;
611-
case CFG_ADD_REG_ARCH_NUM:
612-
{
613-
jim_wide archnum;
614-
615-
if (!goi.argc) {
616-
free_reg_desc(reg);
617-
Jim_WrongNumArgs(interp, goi.argc, goi.argv, "-num <int> ...");
618-
return JIM_ERR;
619-
}
620-
621-
e = jim_getopt_wide(&goi, &archnum);
622-
if (e != JIM_OK) {
623-
free_reg_desc(reg);
624-
return e;
625-
}
626-
627-
reg->arch_num = archnum;
628-
arch_num_set = true;
629-
break;
553+
case CFG_ADD_REG_NAME:
554+
if (!CMD_ARGC)
555+
return ERROR_COMMAND_ARGUMENT_INVALID;
556+
557+
reg->name = strdup(CMD_ARGV[0]);
558+
if (!reg->name) {
559+
LOG_ERROR("Out of memory");
560+
return ERROR_FAIL;
630561
}
631-
case CFG_ADD_REG_GDB_FEATURE:
632-
{
633-
const char *feature = NULL;
634-
int feature_len = 0;
635-
636-
e = jim_arc_read_reg_name_field(&goi, &feature, &feature_len);
637-
if (e != JIM_OK) {
638-
Jim_SetResultFormatted(goi.interp, "Unable to read gdb_feature.");
639-
free_reg_desc(reg);
640-
return e;
641-
}
642-
643-
reg->gdb_xml_feature = strndup(feature, feature_len);
644-
break;
562+
563+
CMD_ARGC--;
564+
CMD_ARGV++;
565+
break;
566+
567+
case CFG_ADD_REG_IS_CORE:
568+
reg->is_core = true;
569+
break;
570+
571+
case CFG_ADD_REG_IS_BCR:
572+
reg->is_bcr = true;
573+
break;
574+
575+
case CFG_ADD_REG_ARCH_NUM:
576+
if (!CMD_ARGC)
577+
return ERROR_COMMAND_ARGUMENT_INVALID;
578+
579+
COMMAND_PARSE_NUMBER(u32, CMD_ARGV[0], reg->arch_num);
580+
CMD_ARGC--;
581+
CMD_ARGV++;
582+
583+
arch_num_set = true;
584+
break;
585+
586+
case CFG_ADD_REG_GDB_FEATURE:
587+
if (!CMD_ARGC)
588+
return ERROR_COMMAND_ARGUMENT_INVALID;
589+
590+
reg->gdb_xml_feature = strdup(CMD_ARGV[0]);
591+
if (!reg->gdb_xml_feature) {
592+
LOG_ERROR("Out of memory");
593+
return ERROR_FAIL;
645594
}
646-
case CFG_ADD_REG_TYPE:
647-
e = jim_arc_read_reg_name_field(&goi, &type_name, &type_name_len);
648-
if (e != JIM_OK) {
649-
Jim_SetResultFormatted(goi.interp, "Unable to read register type.");
650-
free_reg_desc(reg);
651-
return e;
652-
}
653-
654-
break;
655-
case CFG_ADD_REG_GENERAL:
656-
reg->is_general = true;
657-
break;
658-
default:
659-
LOG_DEBUG("Error: Unknown parameter");
660-
free_reg_desc(reg);
661-
return JIM_ERR;
595+
596+
CMD_ARGC--;
597+
CMD_ARGV++;
598+
break;
599+
600+
case CFG_ADD_REG_TYPE:
601+
if (!CMD_ARGC)
602+
return ERROR_COMMAND_ARGUMENT_INVALID;
603+
604+
type_name = CMD_ARGV[0];
605+
CMD_ARGC--;
606+
CMD_ARGV++;
607+
break;
608+
609+
case CFG_ADD_REG_GENERAL:
610+
reg->is_general = true;
611+
break;
612+
613+
default:
614+
nvp_unknown_command_print(CMD, opts_nvp_add_reg, NULL, CMD_ARGV[-1]);
615+
return ERROR_COMMAND_ARGUMENT_INVALID;
662616
}
663617
}
664618

665619
/* Check that required fields are set */
666620
const char * const errmsg = validate_register(reg, arch_num_set);
667621
if (errmsg) {
668-
Jim_SetResultFormatted(goi.interp, errmsg);
669-
free_reg_desc(reg);
670-
return JIM_ERR;
622+
command_print(CMD, "%s", errmsg);
623+
return ERROR_COMMAND_ARGUMENT_INVALID;
671624
}
672625

673626
/* Add new register */
674-
struct command_context *ctx;
675-
struct target *target;
676-
677-
ctx = current_command_context(interp);
678-
assert(ctx);
679-
target = get_current_target(ctx);
627+
struct target *target = get_current_target(CMD_CTX);
680628
if (!target) {
681-
Jim_SetResultFormatted(goi.interp, "No current target");
682-
free_reg_desc(reg);
683-
return JIM_ERR;
629+
command_print(CMD, "No current target");
630+
return ERROR_FAIL;
684631
}
685632

686633
reg->target = target;
687634

688-
e = arc_reg_add(target, reg, type_name, type_name_len);
689-
if (e == ERROR_ARC_REGTYPE_NOT_FOUND) {
690-
Jim_SetResultFormatted(goi.interp,
635+
int retval = arc_reg_add(target, reg, type_name, strlen(type_name));
636+
if (retval == ERROR_ARC_REGTYPE_NOT_FOUND) {
637+
command_print(CMD,
691638
"Cannot find type `%s' for register `%s'.",
692639
type_name, reg->name);
640+
return retval;
641+
}
642+
643+
return ERROR_OK;
644+
}
645+
646+
COMMAND_HANDLER(arc_handle_add_reg)
647+
{
648+
struct arc_reg_desc *reg = calloc(1, sizeof(*reg));
649+
if (!reg) {
650+
LOG_ERROR("Out of memory");
651+
return ERROR_FAIL;
652+
}
653+
654+
int retval = CALL_COMMAND_HANDLER(arc_handle_add_reg_do, reg);
655+
if (retval != ERROR_OK) {
693656
free_reg_desc(reg);
694-
return JIM_ERR;
657+
return retval;
695658
}
696659

697-
return e;
660+
return ERROR_OK;
698661
}
699662

700663
/* arc set-reg-exists ($reg_name)+
@@ -887,7 +850,7 @@ static const struct command_registration arc_core_command_handlers[] = {
887850
},
888851
{
889852
.name = "add-reg",
890-
.jim_handler = jim_arc_add_reg,
853+
.handler = arc_handle_add_reg,
891854
.mode = COMMAND_CONFIG,
892855
.usage = "-name <string> -num <int> -feature <string> [-gdbnum <int>] "
893856
"[-core|-bcr] [-type <type_name>] [-g]",

0 commit comments

Comments
 (0)