target/xtensa: virtualize XDM registers
[openocd.git] / src / target / arc_cmd.c
blob8c859f2d4d06b6721f3166b8cfe9c0f9c3af00e1
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
3 /***************************************************************************
4 * Copyright (C) 2013-2015,2019-2020 Synopsys, Inc. *
5 * Frank Dols <frank.dols@synopsys.com> *
6 * Mischa Jonker <mischa.jonker@synopsys.com> *
7 * Anton Kolesov <anton.kolesov@synopsys.com> *
8 * Evgeniy Didin <didin@synopsys.com> *
9 ***************************************************************************/
11 #ifdef HAVE_CONFIG_H
12 #include "config.h"
13 #endif
15 #include "arc.h"
17 /* --------------------------------------------------------------------------
19 * ARC targets expose command interface.
20 * It can be accessed via GDB through the (gdb) monitor command.
22 * ------------------------------------------------------------------------- */
25 static int arc_cmd_jim_get_uint32(struct jim_getopt_info *goi, uint32_t *value)
27 jim_wide value_wide;
28 JIM_CHECK_RETVAL(jim_getopt_wide(goi, &value_wide));
29 *value = (uint32_t)value_wide;
30 return JIM_OK;
33 enum add_reg_types {
34 CFG_ADD_REG_TYPE_FLAG,
35 CFG_ADD_REG_TYPE_STRUCT,
37 /* Add flags register data type */
38 enum add_reg_type_flags {
39 CFG_ADD_REG_TYPE_FLAGS_NAME,
40 CFG_ADD_REG_TYPE_FLAGS_FLAG,
43 static struct jim_nvp nvp_add_reg_type_flags_opts[] = {
44 { .name = "-name", .value = CFG_ADD_REG_TYPE_FLAGS_NAME },
45 { .name = "-flag", .value = CFG_ADD_REG_TYPE_FLAGS_FLAG },
46 { .name = NULL, .value = -1 }
49 /* Helper function to check if all field required for register
50 * are set up */
51 static const char *validate_register(const struct arc_reg_desc * const reg, bool arch_num_set)
53 /* Check that required fields are set */
54 if (!reg->name)
55 return "-name option is required";
56 if (!reg->gdb_xml_feature)
57 return "-feature option is required";
58 if (!arch_num_set)
59 return "-num option is required";
60 if (reg->is_bcr && reg->is_core)
61 return "Register cannot be both -core and -bcr.";
62 return NULL;
65 /* Helper function to read the name of register type or register from
66 * configure files */
67 static int jim_arc_read_reg_name_field(struct jim_getopt_info *goi,
68 const char **name, int *name_len)
70 int e = JIM_OK;
72 if (!goi->argc) {
73 Jim_WrongNumArgs(goi->interp, goi->argc, goi->argv, "-name <name> ...");
74 return JIM_ERR;
76 e = jim_getopt_string(goi, name, name_len);
77 return e;
80 /* Helper function to read bitfields/flags of register type. */
81 static int jim_arc_read_reg_type_field(struct jim_getopt_info *goi, const char **field_name, int *field_name_len,
82 struct arc_reg_bitfield *bitfields, int cur_field, int type)
84 jim_wide start_pos, end_pos;
86 int e = JIM_OK;
87 if ((type == CFG_ADD_REG_TYPE_STRUCT && goi->argc < 3) ||
88 (type == CFG_ADD_REG_TYPE_FLAG && goi->argc < 2)) {
89 Jim_SetResultFormatted(goi->interp, "Not enough arguments after -flag/-bitfield");
90 return JIM_ERR;
93 e = jim_getopt_string(goi, field_name, field_name_len);
94 if (e != JIM_OK)
95 return e;
97 /* read start position of bitfield/flag */
98 e = jim_getopt_wide(goi, &start_pos);
99 if (e != JIM_OK)
100 return e;
102 end_pos = start_pos;
104 /* Check if any arguments remain,
105 * set bitfields[cur_field].end if flag is multibit */
106 if (goi->argc > 0)
107 /* Check current argv[0], if it is equal to "-flag",
108 * than bitfields[cur_field].end remains start */
109 if ((strcmp(Jim_String(goi->argv[0]), "-flag") && type == CFG_ADD_REG_TYPE_FLAG)
110 || (type == CFG_ADD_REG_TYPE_STRUCT)) {
111 e = jim_getopt_wide(goi, &end_pos);
112 if (e != JIM_OK) {
113 Jim_SetResultFormatted(goi->interp, "Error reading end position");
114 return e;
118 bitfields[cur_field].bitfield.start = start_pos;
119 bitfields[cur_field].bitfield.end = end_pos;
120 if ((end_pos != start_pos) || (type == CFG_ADD_REG_TYPE_STRUCT))
121 bitfields[cur_field].bitfield.type = REG_TYPE_INT;
122 return e;
125 static int jim_arc_add_reg_type_flags(Jim_Interp *interp, int argc,
126 Jim_Obj * const *argv)
128 struct jim_getopt_info goi;
129 JIM_CHECK_RETVAL(jim_getopt_setup(&goi, interp, argc-1, argv+1));
131 LOG_DEBUG("-");
133 struct command_context *ctx;
134 struct target *target;
136 ctx = current_command_context(interp);
137 assert(ctx);
138 target = get_current_target(ctx);
139 if (!target) {
140 Jim_SetResultFormatted(goi.interp, "No current target");
141 return JIM_ERR;
144 int e = JIM_OK;
146 /* Check if the amount of arguments is not zero */
147 if (goi.argc <= 0) {
148 Jim_SetResultFormatted(goi.interp, "The command has no arguments");
149 return JIM_ERR;
152 /* Estimate number of registers as (argc - 2)/3 as each -flag option has 2
153 * arguments while -name is required. */
154 unsigned int fields_sz = (goi.argc - 2) / 3;
155 unsigned int cur_field = 0;
157 /* The maximum amount of bitfields is 32 */
158 if (fields_sz > 32) {
159 Jim_SetResultFormatted(goi.interp, "The amount of bitfields exceed 32");
160 return JIM_ERR;
163 struct arc_reg_data_type *type = calloc(1, sizeof(*type));
164 struct reg_data_type_flags *flags = &type->data_type_flags;
165 struct reg_data_type_flags_field *fields = calloc(fields_sz, sizeof(*fields));
166 type->reg_type_flags_field = fields;
167 struct arc_reg_bitfield *bitfields = calloc(fields_sz, sizeof(*bitfields));
168 if (!(type && fields && bitfields)) {
169 Jim_SetResultFormatted(goi.interp, "Failed to allocate memory.");
170 goto fail;
173 /* Initialize type */
174 type->bitfields = bitfields;
175 type->data_type.id = type->data_type_id;
176 type->data_type.type = REG_TYPE_ARCH_DEFINED;
177 type->data_type.type_class = REG_TYPE_CLASS_FLAGS;
178 type->data_type.reg_type_flags = flags;
179 flags->size = 4; /* For now ARC has only 32-bit registers */
181 while (goi.argc > 0 && e == JIM_OK) {
182 struct jim_nvp *n;
183 e = jim_getopt_nvp(&goi, nvp_add_reg_type_flags_opts, &n);
184 if (e != JIM_OK) {
185 jim_getopt_nvp_unknown(&goi, nvp_add_reg_type_flags_opts, 0);
186 continue;
189 switch (n->value) {
190 case CFG_ADD_REG_TYPE_FLAGS_NAME:
192 const char *name = NULL;
193 int name_len = 0;
195 e = jim_arc_read_reg_name_field(&goi, &name, &name_len);
196 if (e != JIM_OK) {
197 Jim_SetResultFormatted(goi.interp, "Unable to read reg name.");
198 goto fail;
201 if (name_len > REG_TYPE_MAX_NAME_LENGTH) {
202 Jim_SetResultFormatted(goi.interp, "Reg type name is too big.");
203 goto fail;
206 strncpy((void *)type->data_type.id, name, name_len);
207 if (!type->data_type.id) {
208 Jim_SetResultFormatted(goi.interp, "Unable to setup reg type name.");
209 goto fail;
212 break;
215 case CFG_ADD_REG_TYPE_FLAGS_FLAG:
217 const char *field_name = NULL;
218 int field_name_len = 0;
220 e = jim_arc_read_reg_type_field(&goi, &field_name, &field_name_len, bitfields,
221 cur_field, CFG_ADD_REG_TYPE_FLAG);
222 if (e != JIM_OK) {
223 Jim_SetResultFormatted(goi.interp, "Unable to add reg_type_flag field.");
224 goto fail;
227 if (field_name_len > REG_TYPE_MAX_NAME_LENGTH) {
228 Jim_SetResultFormatted(goi.interp, "Reg type field_name_len is too big.");
229 goto fail;
232 fields[cur_field].name = bitfields[cur_field].name;
233 strncpy(bitfields[cur_field].name, field_name, field_name_len);
234 if (!fields[cur_field].name) {
235 Jim_SetResultFormatted(goi.interp, "Unable to setup field name. ");
236 goto fail;
239 fields[cur_field].bitfield = &(bitfields[cur_field].bitfield);
240 if (cur_field > 0)
241 fields[cur_field - 1].next = &(fields[cur_field]);
242 else
243 flags->fields = fields;
245 cur_field += 1;
246 break;
251 if (!type->data_type.id) {
252 Jim_SetResultFormatted(goi.interp, "-name is a required option");
253 goto fail;
256 arc_reg_data_type_add(target, type);
258 LOG_DEBUG("added flags type {name=%s}", type->data_type.id);
260 return JIM_OK;
261 fail:
262 free(type);
263 free(fields);
264 free(bitfields);
266 return JIM_ERR;
269 /* Add struct register data type */
270 enum add_reg_type_struct {
271 CFG_ADD_REG_TYPE_STRUCT_NAME,
272 CFG_ADD_REG_TYPE_STRUCT_BITFIELD,
275 static struct jim_nvp nvp_add_reg_type_struct_opts[] = {
276 { .name = "-name", .value = CFG_ADD_REG_TYPE_STRUCT_NAME },
277 { .name = "-bitfield", .value = CFG_ADD_REG_TYPE_STRUCT_BITFIELD },
278 { .name = NULL, .value = -1 }
281 static int jim_arc_set_aux_reg(Jim_Interp *interp, int argc, Jim_Obj * const *argv)
284 struct command_context *context;
285 struct target *target;
286 uint32_t regnum;
287 uint32_t value;
289 struct jim_getopt_info goi;
290 JIM_CHECK_RETVAL(jim_getopt_setup(&goi, interp, argc-1, argv+1));
292 if (goi.argc != 2) {
293 Jim_SetResultFormatted(goi.interp,
294 "usage: %s <aux_reg_num> <aux_reg_value>", Jim_GetString(argv[0], NULL));
295 return JIM_ERR;
298 context = current_command_context(interp);
299 assert(context);
301 target = get_current_target(context);
302 if (!target) {
303 Jim_SetResultFormatted(goi.interp, "No current target");
304 return JIM_ERR;
307 /* Register number */
308 JIM_CHECK_RETVAL(arc_cmd_jim_get_uint32(&goi, &regnum));
310 /* Register value */
311 JIM_CHECK_RETVAL(arc_cmd_jim_get_uint32(&goi, &value));
313 struct arc_common *arc = target_to_arc(target);
314 assert(arc);
316 CHECK_RETVAL(arc_jtag_write_aux_reg_one(&arc->jtag_info, regnum, value));
318 return ERROR_OK;
321 static int jim_arc_get_aux_reg(Jim_Interp *interp, int argc, Jim_Obj * const *argv)
323 struct command_context *context;
324 struct target *target;
325 uint32_t regnum;
326 uint32_t value;
328 struct jim_getopt_info goi;
329 JIM_CHECK_RETVAL(jim_getopt_setup(&goi, interp, argc-1, argv+1));
331 if (goi.argc != 1) {
332 Jim_SetResultFormatted(goi.interp,
333 "usage: %s <aux_reg_num>", Jim_GetString(argv[0], NULL));
334 return JIM_ERR;
337 context = current_command_context(interp);
338 assert(context);
340 target = get_current_target(context);
341 if (!target) {
342 Jim_SetResultFormatted(goi.interp, "No current target");
343 return JIM_ERR;
346 /* Register number */
347 JIM_CHECK_RETVAL(arc_cmd_jim_get_uint32(&goi, &regnum));
349 struct arc_common *arc = target_to_arc(target);
350 assert(arc);
352 CHECK_RETVAL(arc_jtag_read_aux_reg_one(&arc->jtag_info, regnum, &value));
353 Jim_SetResultInt(interp, value);
355 return ERROR_OK;
358 static int jim_arc_get_core_reg(Jim_Interp *interp, int argc, Jim_Obj * const *argv)
360 struct command_context *context;
361 struct target *target;
362 uint32_t regnum;
363 uint32_t value;
365 struct jim_getopt_info goi;
366 JIM_CHECK_RETVAL(jim_getopt_setup(&goi, interp, argc-1, argv+1));
368 if (goi.argc != 1) {
369 Jim_SetResultFormatted(goi.interp,
370 "usage: %s <core_reg_num>", Jim_GetString(argv[0], NULL));
371 return JIM_ERR;
374 context = current_command_context(interp);
375 assert(context);
377 target = get_current_target(context);
378 if (!target) {
379 Jim_SetResultFormatted(goi.interp, "No current target");
380 return JIM_ERR;
383 /* Register number */
384 JIM_CHECK_RETVAL(arc_cmd_jim_get_uint32(&goi, &regnum));
385 if (regnum > CORE_REG_MAX_NUMBER || regnum == ARC_R61 || regnum == ARC_R62) {
386 Jim_SetResultFormatted(goi.interp, "Core register number %i "
387 "is invalid. Must less then 64 and not 61 and 62.", regnum);
388 return JIM_ERR;
391 struct arc_common *arc = target_to_arc(target);
392 assert(arc);
394 /* Read value */
395 CHECK_RETVAL(arc_jtag_read_core_reg_one(&arc->jtag_info, regnum, &value));
396 Jim_SetResultInt(interp, value);
398 return ERROR_OK;
401 static int jim_arc_set_core_reg(Jim_Interp *interp, int argc, Jim_Obj * const *argv)
403 struct command_context *context;
404 struct target *target;
405 uint32_t regnum;
406 uint32_t value;
408 struct jim_getopt_info goi;
409 JIM_CHECK_RETVAL(jim_getopt_setup(&goi, interp, argc-1, argv+1));
411 if (goi.argc != 2) {
412 Jim_SetResultFormatted(goi.interp,
413 "usage: %s <core_reg_num> <core_reg_value>", Jim_GetString(argv[0], NULL));
414 return JIM_ERR;
417 context = current_command_context(interp);
418 assert(context);
420 target = get_current_target(context);
421 if (!target) {
422 Jim_SetResultFormatted(goi.interp, "No current target");
423 return JIM_ERR;
426 /* Register number */
427 JIM_CHECK_RETVAL(arc_cmd_jim_get_uint32(&goi, &regnum));
428 if (regnum > CORE_REG_MAX_NUMBER || regnum == ARC_R61 || regnum == ARC_R62) {
429 Jim_SetResultFormatted(goi.interp, "Core register number %i "
430 "is invalid. Must less then 64 and not 61 and 62.", regnum);
431 return JIM_ERR;
434 /* Register value */
435 JIM_CHECK_RETVAL(arc_cmd_jim_get_uint32(&goi, &value));
437 struct arc_common *arc = target_to_arc(target);
438 assert(arc);
440 CHECK_RETVAL(arc_jtag_write_core_reg_one(&arc->jtag_info, regnum, value));
442 return ERROR_OK;
445 static const struct command_registration arc_jtag_command_group[] = {
447 .name = "get-aux-reg",
448 .jim_handler = jim_arc_get_aux_reg,
449 .mode = COMMAND_EXEC,
450 .help = "Get AUX register by number. This command does a "
451 "raw JTAG request that bypasses OpenOCD register cache "
452 "and thus is unsafe and can have unexpected consequences. "
453 "Use at your own risk.",
454 .usage = "<regnum>"
457 .name = "set-aux-reg",
458 .jim_handler = jim_arc_set_aux_reg,
459 .mode = COMMAND_EXEC,
460 .help = "Set AUX register by number. This command does a "
461 "raw JTAG request that bypasses OpenOCD register cache "
462 "and thus is unsafe and can have unexpected consequences. "
463 "Use at your own risk.",
464 .usage = "<regnum> <value>"
467 .name = "get-core-reg",
468 .jim_handler = jim_arc_get_core_reg,
469 .mode = COMMAND_EXEC,
470 .help = "Get/Set core register by number. This command does a "
471 "raw JTAG request that bypasses OpenOCD register cache "
472 "and thus is unsafe and can have unexpected consequences. "
473 "Use at your own risk.",
474 .usage = "<regnum> [<value>]"
477 .name = "set-core-reg",
478 .jim_handler = jim_arc_set_core_reg,
479 .mode = COMMAND_EXEC,
480 .help = "Get/Set core register by number. This command does a "
481 "raw JTAG request that bypasses OpenOCD register cache "
482 "and thus is unsafe and can have unexpected consequences. "
483 "Use at your own risk.",
484 .usage = "<regnum> [<value>]"
486 COMMAND_REGISTRATION_DONE
490 /* This function supports only bitfields. */
491 static int jim_arc_add_reg_type_struct(Jim_Interp *interp, int argc,
492 Jim_Obj * const *argv)
494 struct jim_getopt_info goi;
495 JIM_CHECK_RETVAL(jim_getopt_setup(&goi, interp, argc-1, argv+1));
497 LOG_DEBUG("-");
499 struct command_context *ctx;
500 struct target *target;
502 ctx = current_command_context(interp);
503 assert(ctx);
504 target = get_current_target(ctx);
505 if (!target) {
506 Jim_SetResultFormatted(goi.interp, "No current target");
507 return JIM_ERR;
510 int e = JIM_OK;
512 /* Check if the amount of arguments is not zero */
513 if (goi.argc <= 0) {
514 Jim_SetResultFormatted(goi.interp, "The command has no arguments");
515 return JIM_ERR;
518 /* Estimate number of registers as (argc - 2)/4 as each -bitfield option has 3
519 * arguments while -name is required. */
520 unsigned int fields_sz = (goi.argc - 2) / 4;
521 unsigned int cur_field = 0;
523 /* The maximum amount of bitfields is 32 */
524 if (fields_sz > 32) {
525 Jim_SetResultFormatted(goi.interp, "The amount of bitfields exceed 32");
526 return JIM_ERR;
529 struct arc_reg_data_type *type = calloc(1, sizeof(*type));
530 struct reg_data_type_struct *struct_type = &type->data_type_struct;
531 struct reg_data_type_struct_field *fields = calloc(fields_sz, sizeof(*fields));
532 type->reg_type_struct_field = fields;
533 struct arc_reg_bitfield *bitfields = calloc(fields_sz, sizeof(*bitfields));
534 if (!(type && fields && bitfields)) {
535 Jim_SetResultFormatted(goi.interp, "Failed to allocate memory.");
536 goto fail;
539 /* Initialize type */
540 type->data_type.id = type->data_type_id;
541 type->bitfields = bitfields;
542 type->data_type.type = REG_TYPE_ARCH_DEFINED;
543 type->data_type.type_class = REG_TYPE_CLASS_STRUCT;
544 type->data_type.reg_type_struct = struct_type;
545 struct_type->size = 4; /* For now ARC has only 32-bit registers */
547 while (goi.argc > 0 && e == JIM_OK) {
548 struct jim_nvp *n;
549 e = jim_getopt_nvp(&goi, nvp_add_reg_type_struct_opts, &n);
550 if (e != JIM_OK) {
551 jim_getopt_nvp_unknown(&goi, nvp_add_reg_type_struct_opts, 0);
552 continue;
555 switch (n->value) {
556 case CFG_ADD_REG_TYPE_STRUCT_NAME:
558 const char *name = NULL;
559 int name_len = 0;
561 e = jim_arc_read_reg_name_field(&goi, &name, &name_len);
562 if (e != JIM_OK) {
563 Jim_SetResultFormatted(goi.interp, "Unable to read reg name.");
564 goto fail;
567 if (name_len > REG_TYPE_MAX_NAME_LENGTH) {
568 Jim_SetResultFormatted(goi.interp, "Reg type name is too big.");
569 goto fail;
572 strncpy((void *)type->data_type.id, name, name_len);
573 if (!type->data_type.id) {
574 Jim_SetResultFormatted(goi.interp, "Unable to setup reg type name.");
575 goto fail;
578 break;
580 case CFG_ADD_REG_TYPE_STRUCT_BITFIELD:
582 const char *field_name = NULL;
583 int field_name_len = 0;
584 e = jim_arc_read_reg_type_field(&goi, &field_name, &field_name_len, bitfields,
585 cur_field, CFG_ADD_REG_TYPE_STRUCT);
586 if (e != JIM_OK) {
587 Jim_SetResultFormatted(goi.interp, "Unable to add reg_type_struct field.");
588 goto fail;
591 if (field_name_len > REG_TYPE_MAX_NAME_LENGTH) {
592 Jim_SetResultFormatted(goi.interp, "Reg type field_name_len is too big.");
593 goto fail;
596 fields[cur_field].name = bitfields[cur_field].name;
597 strncpy(bitfields[cur_field].name, field_name, field_name_len);
598 if (!fields[cur_field].name) {
599 Jim_SetResultFormatted(goi.interp, "Unable to setup field name. ");
600 goto fail;
603 fields[cur_field].bitfield = &(bitfields[cur_field].bitfield);
604 fields[cur_field].use_bitfields = true;
605 if (cur_field > 0)
606 fields[cur_field - 1].next = &(fields[cur_field]);
607 else
608 struct_type->fields = fields;
610 cur_field += 1;
612 break;
617 if (!type->data_type.id) {
618 Jim_SetResultFormatted(goi.interp, "-name is a required option");
619 goto fail;
622 arc_reg_data_type_add(target, type);
623 LOG_DEBUG("added struct type {name=%s}", type->data_type.id);
624 return JIM_OK;
626 fail:
627 free(type);
628 free(fields);
629 free(bitfields);
631 return JIM_ERR;
634 /* Add register */
635 enum opts_add_reg {
636 CFG_ADD_REG_NAME,
637 CFG_ADD_REG_ARCH_NUM,
638 CFG_ADD_REG_IS_CORE,
639 CFG_ADD_REG_IS_BCR,
640 CFG_ADD_REG_GDB_FEATURE,
641 CFG_ADD_REG_TYPE,
642 CFG_ADD_REG_GENERAL,
645 static struct jim_nvp opts_nvp_add_reg[] = {
646 { .name = "-name", .value = CFG_ADD_REG_NAME },
647 { .name = "-num", .value = CFG_ADD_REG_ARCH_NUM },
648 { .name = "-core", .value = CFG_ADD_REG_IS_CORE },
649 { .name = "-bcr", .value = CFG_ADD_REG_IS_BCR },
650 { .name = "-feature", .value = CFG_ADD_REG_GDB_FEATURE },
651 { .name = "-type", .value = CFG_ADD_REG_TYPE },
652 { .name = "-g", .value = CFG_ADD_REG_GENERAL },
653 { .name = NULL, .value = -1 }
656 void free_reg_desc(struct arc_reg_desc *r)
658 free(r->name);
659 free(r->gdb_xml_feature);
660 free(r);
663 static int jim_arc_add_reg(Jim_Interp *interp, int argc, Jim_Obj * const *argv)
665 struct jim_getopt_info goi;
666 JIM_CHECK_RETVAL(jim_getopt_setup(&goi, interp, argc-1, argv+1));
668 struct arc_reg_desc *reg = calloc(1, sizeof(*reg));
669 if (!reg) {
670 Jim_SetResultFormatted(goi.interp, "Failed to allocate memory.");
671 return JIM_ERR;
674 /* There is no architecture number that we could treat as invalid, so
675 * separate variable required to ensure that arch num has been set. */
676 bool arch_num_set = false;
677 const char *type_name = "int"; /* Default type */
678 int type_name_len = strlen(type_name);
679 int e = ERROR_OK;
681 /* At least we need to specify 4 parameters: name, number and gdb_feature,
682 * which means there should be 6 arguments. Also there can be additional parameters
683 * "-type <type>", "-g" and "-core" or "-bcr" which makes maximum 10 parameters. */
684 if (goi.argc < 6 || goi.argc > 10) {
685 free_reg_desc(reg);
686 Jim_SetResultFormatted(goi.interp,
687 "Should be at least 6 arguments and not greater than 10: "
688 " -name <name> -num <num> -feature <gdb_feature> "
689 " [-type <type_name>] [-core|-bcr] [-g].");
690 return JIM_ERR;
693 /* Parse options. */
694 while (goi.argc > 0) {
695 struct jim_nvp *n;
696 e = jim_getopt_nvp(&goi, opts_nvp_add_reg, &n);
697 if (e != JIM_OK) {
698 jim_getopt_nvp_unknown(&goi, opts_nvp_add_reg, 0);
699 free_reg_desc(reg);
700 return e;
703 switch (n->value) {
704 case CFG_ADD_REG_NAME:
706 const char *reg_name = NULL;
707 int reg_name_len = 0;
709 e = jim_arc_read_reg_name_field(&goi, &reg_name, &reg_name_len);
710 if (e != JIM_OK) {
711 Jim_SetResultFormatted(goi.interp, "Unable to read register name.");
712 free_reg_desc(reg);
713 return e;
716 reg->name = strndup(reg_name, reg_name_len);
717 break;
719 case CFG_ADD_REG_IS_CORE:
720 reg->is_core = true;
721 break;
722 case CFG_ADD_REG_IS_BCR:
723 reg->is_bcr = true;
724 break;
725 case CFG_ADD_REG_ARCH_NUM:
727 jim_wide archnum;
729 if (!goi.argc) {
730 free_reg_desc(reg);
731 Jim_WrongNumArgs(interp, goi.argc, goi.argv, "-num <int> ...");
732 return JIM_ERR;
735 e = jim_getopt_wide(&goi, &archnum);
736 if (e != JIM_OK) {
737 free_reg_desc(reg);
738 return e;
741 reg->arch_num = archnum;
742 arch_num_set = true;
743 break;
745 case CFG_ADD_REG_GDB_FEATURE:
747 const char *feature = NULL;
748 int feature_len = 0;
750 e = jim_arc_read_reg_name_field(&goi, &feature, &feature_len);
751 if (e != JIM_OK) {
752 Jim_SetResultFormatted(goi.interp, "Unable to read gdb_feature.");
753 free_reg_desc(reg);
754 return e;
757 reg->gdb_xml_feature = strndup(feature, feature_len);
758 break;
760 case CFG_ADD_REG_TYPE:
761 e = jim_arc_read_reg_name_field(&goi, &type_name, &type_name_len);
762 if (e != JIM_OK) {
763 Jim_SetResultFormatted(goi.interp, "Unable to read register type.");
764 free_reg_desc(reg);
765 return e;
768 break;
769 case CFG_ADD_REG_GENERAL:
770 reg->is_general = true;
771 break;
772 default:
773 LOG_DEBUG("Error: Unknown parameter");
774 free_reg_desc(reg);
775 return JIM_ERR;
779 /* Check that required fields are set */
780 const char * const errmsg = validate_register(reg, arch_num_set);
781 if (errmsg) {
782 Jim_SetResultFormatted(goi.interp, errmsg);
783 free_reg_desc(reg);
784 return JIM_ERR;
787 /* Add new register */
788 struct command_context *ctx;
789 struct target *target;
791 ctx = current_command_context(interp);
792 assert(ctx);
793 target = get_current_target(ctx);
794 if (!target) {
795 Jim_SetResultFormatted(goi.interp, "No current target");
796 free_reg_desc(reg);
797 return JIM_ERR;
800 reg->target = target;
802 e = arc_reg_add(target, reg, type_name, type_name_len);
803 if (e == ERROR_ARC_REGTYPE_NOT_FOUND) {
804 Jim_SetResultFormatted(goi.interp,
805 "Cannot find type `%s' for register `%s'.",
806 type_name, reg->name);
807 free_reg_desc(reg);
808 return JIM_ERR;
811 return e;
814 /* arc set-reg-exists ($reg_name)+
815 * Accepts any amount of register names - will set them as existing in a loop.*/
816 COMMAND_HANDLER(arc_set_reg_exists)
818 struct target * const target = get_current_target(CMD_CTX);
819 if (!target) {
820 command_print(CMD, "Unable to get current target.");
821 return JIM_ERR;
824 if (!CMD_ARGC) {
825 command_print(CMD, "At least one register name must be specified.");
826 return ERROR_COMMAND_SYNTAX_ERROR;
829 for (unsigned int i = 0; i < CMD_ARGC; i++) {
830 const char * const reg_name = CMD_ARGV[i];
831 struct reg * const r = arc_reg_get_by_name(target->reg_cache, reg_name, true);
833 if (!r) {
834 command_print(CMD, "Register `%s' is not found.", reg_name);
835 return ERROR_COMMAND_ARGUMENT_INVALID;
838 r->exist = true;
841 return JIM_OK;
844 /* arc reg-field ($reg_name) ($reg_field)
845 * Reads struct type register field */
846 static int jim_arc_get_reg_field(Jim_Interp *interp, int argc, Jim_Obj * const *argv)
848 struct jim_getopt_info goi;
849 const char *reg_name, *field_name;
850 uint32_t value;
851 int retval;
853 JIM_CHECK_RETVAL(jim_getopt_setup(&goi, interp, argc-1, argv+1));
855 LOG_DEBUG("Reading register field");
856 if (goi.argc != 2) {
857 if (!goi.argc)
858 Jim_WrongNumArgs(interp, goi.argc, goi.argv, "<regname> <fieldname>");
859 else if (goi.argc == 1)
860 Jim_WrongNumArgs(interp, goi.argc, goi.argv, "<fieldname>");
861 else
862 Jim_WrongNumArgs(interp, goi.argc, goi.argv, "<regname> <fieldname>");
863 return ERROR_COMMAND_SYNTAX_ERROR;
866 JIM_CHECK_RETVAL(jim_getopt_string(&goi, &reg_name, NULL));
867 JIM_CHECK_RETVAL(jim_getopt_string(&goi, &field_name, NULL));
868 assert(reg_name);
869 assert(field_name);
871 struct command_context * const ctx = current_command_context(interp);
872 assert(ctx);
873 struct target * const target = get_current_target(ctx);
874 if (!target) {
875 Jim_SetResultFormatted(goi.interp, "No current target");
876 return JIM_ERR;
879 retval = arc_reg_get_field(target, reg_name, field_name, &value);
881 switch (retval) {
882 case ERROR_OK:
883 break;
884 case ERROR_ARC_REGISTER_NOT_FOUND:
885 Jim_SetResultFormatted(goi.interp,
886 "Register `%s' has not been found.", reg_name);
887 return ERROR_COMMAND_ARGUMENT_INVALID;
888 case ERROR_ARC_REGISTER_IS_NOT_STRUCT:
889 Jim_SetResultFormatted(goi.interp,
890 "Register `%s' must have 'struct' type.", reg_name);
891 return ERROR_COMMAND_ARGUMENT_INVALID;
892 case ERROR_ARC_REGISTER_FIELD_NOT_FOUND:
893 Jim_SetResultFormatted(goi.interp,
894 "Field `%s' has not been found in register `%s'.",
895 field_name, reg_name);
896 return ERROR_COMMAND_ARGUMENT_INVALID;
897 case ERROR_ARC_FIELD_IS_NOT_BITFIELD:
898 Jim_SetResultFormatted(goi.interp,
899 "Field `%s' is not a 'bitfield' field in a structure.",
900 field_name);
901 return ERROR_COMMAND_ARGUMENT_INVALID;
902 default:
903 /* Pass through other errors. */
904 return retval;
907 Jim_SetResultInt(interp, value);
909 return JIM_OK;
912 COMMAND_HANDLER(arc_l1_cache_disable_auto_cmd)
914 bool value;
915 int retval = 0;
916 struct arc_common *arc = target_to_arc(get_current_target(CMD_CTX));
917 retval = CALL_COMMAND_HANDLER(handle_command_parse_bool,
918 &value, "target has caches enabled");
919 arc->has_l2cache = value;
920 arc->has_dcache = value;
921 arc->has_icache = value;
922 return retval;
925 COMMAND_HANDLER(arc_l2_cache_disable_auto_cmd)
927 struct arc_common *arc = target_to_arc(get_current_target(CMD_CTX));
928 return CALL_COMMAND_HANDLER(handle_command_parse_bool,
929 &arc->has_l2cache, "target has l2 cache enabled");
932 static int jim_handle_actionpoints_num(Jim_Interp *interp, int argc,
933 Jim_Obj * const *argv)
935 struct jim_getopt_info goi;
936 jim_getopt_setup(&goi, interp, argc - 1, argv + 1);
938 LOG_DEBUG("-");
940 if (goi.argc >= 2) {
941 Jim_WrongNumArgs(interp, goi.argc, goi.argv, "[<unsigned integer>]");
942 return JIM_ERR;
945 struct command_context *context = current_command_context(interp);
946 assert(context);
948 struct target *target = get_current_target(context);
950 if (!target) {
951 Jim_SetResultFormatted(goi.interp, "No current target");
952 return JIM_ERR;
955 struct arc_common *arc = target_to_arc(target);
956 /* It is not possible to pass &arc->actionpoints_num directly to
957 * handle_command_parse_uint, because this value should be valid during
958 * "actionpoint reset, initiated by arc_set_actionpoints_num. */
959 uint32_t ap_num = arc->actionpoints_num;
961 if (goi.argc == 1) {
962 JIM_CHECK_RETVAL(arc_cmd_jim_get_uint32(&goi, &ap_num));
963 int e = arc_set_actionpoints_num(target, ap_num);
964 if (e != ERROR_OK) {
965 Jim_SetResultFormatted(goi.interp,
966 "Failed to set number of actionpoints");
967 return JIM_ERR;
971 Jim_SetResultInt(interp, ap_num);
973 return JIM_OK;
976 /* ----- Exported target commands ------------------------------------------ */
978 const struct command_registration arc_l2_cache_group_handlers[] = {
980 .name = "auto",
981 .handler = arc_l2_cache_disable_auto_cmd,
982 .mode = COMMAND_ANY,
983 .usage = "(1|0)",
984 .help = "Disable or enable L2",
986 COMMAND_REGISTRATION_DONE
989 const struct command_registration arc_cache_group_handlers[] = {
991 .name = "auto",
992 .handler = arc_l1_cache_disable_auto_cmd,
993 .mode = COMMAND_ANY,
994 .help = "Disable or enable L1",
995 .usage = "(1|0)",
998 .name = "l2",
999 .mode = COMMAND_ANY,
1000 .help = "L2 cache command group",
1001 .usage = "",
1002 .chain = arc_l2_cache_group_handlers,
1004 COMMAND_REGISTRATION_DONE
1008 static const struct command_registration arc_core_command_handlers[] = {
1010 .name = "add-reg-type-flags",
1011 .jim_handler = jim_arc_add_reg_type_flags,
1012 .mode = COMMAND_CONFIG,
1013 .usage = "-name <string> -flag <name> <position> "
1014 "[-flag <name> <position>]...",
1015 .help = "Add new 'flags' register data type. Only single bit flags "
1016 "are supported. Type name is global. Bitsize of register is fixed "
1017 "at 32 bits.",
1020 .name = "add-reg-type-struct",
1021 .jim_handler = jim_arc_add_reg_type_struct,
1022 .mode = COMMAND_CONFIG,
1023 .usage = "-name <string> -bitfield <name> <start> <end> "
1024 "[-bitfield <name> <start> <end>]...",
1025 .help = "Add new 'struct' register data type. Only bit-fields are "
1026 "supported so far, which means that for each bitfield start and end "
1027 "position bits must be specified. GDB also support type-fields, "
1028 "where common type can be used instead. Type name is global. Bitsize of "
1029 "register is fixed at 32 bits.",
1032 .name = "add-reg",
1033 .jim_handler = jim_arc_add_reg,
1034 .mode = COMMAND_CONFIG,
1035 .usage = "-name <string> -num <int> -feature <string> [-gdbnum <int>] "
1036 "[-core|-bcr] [-type <type_name>] [-g]",
1037 .help = "Add new register. Name, architectural number and feature name "
1038 "are required options. GDB regnum will default to previous register "
1039 "(gdbnum + 1) and shouldn't be specified in most cases. Type "
1040 "defaults to default GDB 'int'.",
1043 .name = "set-reg-exists",
1044 .handler = arc_set_reg_exists,
1045 .mode = COMMAND_ANY,
1046 .usage = "<register-name> [<register-name>]...",
1047 .help = "Set that register exists. Accepts multiple register names as "
1048 "arguments.",
1051 .name = "get-reg-field",
1052 .jim_handler = jim_arc_get_reg_field,
1053 .mode = COMMAND_ANY,
1054 .usage = "<regname> <field_name>",
1055 .help = "Returns value of field in a register with 'struct' type.",
1058 .name = "jtag",
1059 .mode = COMMAND_ANY,
1060 .help = "ARC JTAG specific commands",
1061 .usage = "",
1062 .chain = arc_jtag_command_group,
1065 .name = "cache",
1066 .mode = COMMAND_ANY,
1067 .help = "cache command group",
1068 .usage = "",
1069 .chain = arc_cache_group_handlers,
1072 .name = "num-actionpoints",
1073 .jim_handler = jim_handle_actionpoints_num,
1074 .mode = COMMAND_ANY,
1075 .usage = "[<unsigned integer>]",
1076 .help = "Prints or sets amount of actionpoints in the processor.",
1078 COMMAND_REGISTRATION_DONE
1081 const struct command_registration arc_monitor_command_handlers[] = {
1083 .name = "arc",
1084 .mode = COMMAND_ANY,
1085 .help = "ARC monitor command group",
1086 .usage = "",
1087 .chain = arc_core_command_handlers,
1089 COMMAND_REGISTRATION_DONE