1 /***************************************************************************
2 * Copyright (C) 2013-2015,2019-2020 Synopsys, Inc. *
3 * Frank Dols <frank.dols@synopsys.com> *
4 * Mischa Jonker <mischa.jonker@synopsys.com> *
5 * Anton Kolesov <anton.kolesov@synopsys.com> *
6 * Evgeniy Didin <didin@synopsys.com> *
8 * SPDX-License-Identifier: GPL-2.0-or-later *
9 ***************************************************************************/
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(Jim_GetOptInfo
*goi
, uint32_t *value
)
28 JIM_CHECK_RETVAL(Jim_GetOpt_Wide(goi
, &value_wide
));
29 *value
= (uint32_t)value_wide
;
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 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
51 static const char *validate_register(const struct arc_reg_desc
* const reg
, bool arch_num_set
)
53 /* Check that required fields are set */
55 return "-name option is required";
56 if (!reg
->gdb_xml_feature
)
57 return "-feature option is required";
59 return "-num option is required";
60 if (reg
->is_bcr
&& reg
->is_core
)
61 return "Register cannot be both -core and -bcr.";
65 /* Helper function to read the name of register type or register from
67 static int jim_arc_read_reg_name_field(Jim_GetOptInfo
*goi
,
68 const char **name
, int *name_len
)
73 Jim_WrongNumArgs(goi
->interp
, goi
->argc
, goi
->argv
, "-name <name> ...");
76 e
= Jim_GetOpt_String(goi
, name
, name_len
);
80 /* Helper function to read bitfields/flags of register type. */
81 static int jim_arc_read_reg_type_field(Jim_GetOptInfo
*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
;
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 argmunets after -flag/-bitfield");
93 e
= Jim_GetOpt_String(goi
, field_name
, field_name_len
);
97 /* read start position of bitfield/flag */
98 e
= Jim_GetOpt_Wide(goi
, &start_pos
);
104 /* Check if any argnuments remain,
105 * set bitfields[cur_field].end if flag is multibit */
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
);
113 Jim_SetResultFormatted(goi
->interp
, "Error reading end position");
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
;
125 static int jim_arc_add_reg_type_flags(Jim_Interp
*interp
, int argc
,
126 Jim_Obj
* const *argv
)
129 JIM_CHECK_RETVAL(Jim_GetOpt_Setup(&goi
, interp
, argc
-1, argv
+1));
133 struct command_context
*ctx
;
134 struct target
*target
;
136 ctx
= current_command_context(interp
);
138 target
= get_current_target(ctx
);
140 Jim_SetResultFormatted(goi
.interp
, "No current target");
146 /* Check if the amount of argnuments is not zero */
148 Jim_SetResultFormatted(goi
.interp
, "The command has no argnuments");
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 /* Tha maximum amount of bitfilds is 32 */
158 if (fields_sz
> 32) {
159 Jim_SetResultFormatted(goi
.interp
, "The amount of bitfields exceed 32");
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 struct arc_reg_bitfield
*bitfields
= calloc(fields_sz
, sizeof(*type
));
167 if (!(type
&& fields
&& bitfields
)) {
168 Jim_SetResultFormatted(goi
.interp
, "Failed to allocate memory.");
172 /* Initialize type */
173 type
->bitfields
= bitfields
;
174 type
->data_type
.id
= type
->data_type_id
;
175 type
->data_type
.type
= REG_TYPE_ARCH_DEFINED
;
176 type
->data_type
.type_class
= REG_TYPE_CLASS_FLAGS
;
177 type
->data_type
.reg_type_flags
= flags
;
178 flags
->size
= 4; /* For now ARC has only 32-bit registers */
180 while (goi
.argc
> 0 && e
== JIM_OK
) {
182 e
= Jim_GetOpt_Nvp(&goi
, nvp_add_reg_type_flags_opts
, &n
);
184 Jim_GetOpt_NvpUnknown(&goi
, nvp_add_reg_type_flags_opts
, 0);
189 case CFG_ADD_REG_TYPE_FLAGS_NAME
:
191 const char *name
= NULL
;
194 e
= jim_arc_read_reg_name_field(&goi
, &name
, &name_len
);
196 Jim_SetResultFormatted(goi
.interp
, "Unable to read reg name.");
200 if (name_len
> REG_TYPE_MAX_NAME_LENGTH
) {
201 Jim_SetResultFormatted(goi
.interp
, "Reg type name is too big.");
205 strncpy((void *)type
->data_type
.id
, name
, name_len
);
206 if (!type
->data_type
.id
) {
207 Jim_SetResultFormatted(goi
.interp
, "Unable to setup reg type name.");
214 case CFG_ADD_REG_TYPE_FLAGS_FLAG
:
216 const char *field_name
= NULL
;
217 int field_name_len
= 0;
219 e
= jim_arc_read_reg_type_field(&goi
, &field_name
, &field_name_len
, bitfields
,
220 cur_field
, CFG_ADD_REG_TYPE_FLAG
);
222 Jim_SetResultFormatted(goi
.interp
, "Unable to add reg_type_flag field.");
226 if (field_name_len
> REG_TYPE_MAX_NAME_LENGTH
) {
227 Jim_SetResultFormatted(goi
.interp
, "Reg type field_name_len is too big.");
231 fields
[cur_field
].name
= bitfields
[cur_field
].name
;
232 strncpy(bitfields
[cur_field
].name
, field_name
, field_name_len
);
233 if (!fields
[cur_field
].name
) {
234 Jim_SetResultFormatted(goi
.interp
, "Unable to setup field name. ");
238 fields
[cur_field
].bitfield
= &(bitfields
[cur_field
].bitfield
);
240 fields
[cur_field
- 1].next
= &(fields
[cur_field
]);
242 flags
->fields
= fields
;
250 if (!type
->data_type
.id
) {
251 Jim_SetResultFormatted(goi
.interp
, "-name is a required option");
255 arc_reg_data_type_add(target
, type
);
257 LOG_DEBUG("added flags type {name=%s}", type
->data_type
.id
);
268 /* Add struct register data type */
269 enum add_reg_type_struct
{
270 CFG_ADD_REG_TYPE_STRUCT_NAME
,
271 CFG_ADD_REG_TYPE_STRUCT_BITFIELD
,
274 static Jim_Nvp nvp_add_reg_type_struct_opts
[] = {
275 { .name
= "-name", .value
= CFG_ADD_REG_TYPE_STRUCT_NAME
},
276 { .name
= "-bitfield", .value
= CFG_ADD_REG_TYPE_STRUCT_BITFIELD
},
277 { .name
= NULL
, .value
= -1 }
280 static int jim_arc_set_aux_reg(Jim_Interp
*interp
, int argc
, Jim_Obj
* const *argv
)
283 struct command_context
*context
;
284 struct target
*target
;
289 JIM_CHECK_RETVAL(Jim_GetOpt_Setup(&goi
, interp
, argc
-1, argv
+1));
292 Jim_SetResultFormatted(goi
.interp
,
293 "usage: %s <aux_reg_num> <aux_reg_value>", Jim_GetString(argv
[0], NULL
));
297 context
= current_command_context(interp
);
300 target
= get_current_target(context
);
302 Jim_SetResultFormatted(goi
.interp
, "No current target");
306 /* Register number */
307 JIM_CHECK_RETVAL(arc_cmd_jim_get_uint32(&goi
, ®num
));
310 JIM_CHECK_RETVAL(arc_cmd_jim_get_uint32(&goi
, &value
));
312 struct arc_common
*arc
= target_to_arc(target
);
315 CHECK_RETVAL(arc_jtag_write_aux_reg_one(&arc
->jtag_info
, regnum
, value
));
320 static int jim_arc_get_aux_reg(Jim_Interp
*interp
, int argc
, Jim_Obj
* const *argv
)
322 struct command_context
*context
;
323 struct target
*target
;
328 JIM_CHECK_RETVAL(Jim_GetOpt_Setup(&goi
, interp
, argc
-1, argv
+1));
331 Jim_SetResultFormatted(goi
.interp
,
332 "usage: %s <aux_reg_num>", Jim_GetString(argv
[0], NULL
));
336 context
= current_command_context(interp
);
339 target
= get_current_target(context
);
341 Jim_SetResultFormatted(goi
.interp
, "No current target");
345 /* Register number */
346 JIM_CHECK_RETVAL(arc_cmd_jim_get_uint32(&goi
, ®num
));
348 struct arc_common
*arc
= target_to_arc(target
);
351 CHECK_RETVAL(arc_jtag_read_aux_reg_one(&arc
->jtag_info
, regnum
, &value
));
352 Jim_SetResultInt(interp
, value
);
357 static int jim_arc_get_core_reg(Jim_Interp
*interp
, int argc
, Jim_Obj
* const *argv
)
359 struct command_context
*context
;
360 struct target
*target
;
365 JIM_CHECK_RETVAL(Jim_GetOpt_Setup(&goi
, interp
, argc
-1, argv
+1));
368 Jim_SetResultFormatted(goi
.interp
,
369 "usage: %s <core_reg_num>", Jim_GetString(argv
[0], NULL
));
373 context
= current_command_context(interp
);
376 target
= get_current_target(context
);
378 Jim_SetResultFormatted(goi
.interp
, "No current target");
382 /* Register number */
383 JIM_CHECK_RETVAL(arc_cmd_jim_get_uint32(&goi
, ®num
));
384 if (regnum
> CORE_REG_MAX_NUMBER
|| regnum
== CORE_R61_NUM
|| regnum
== CORE_R62_NUM
) {
385 Jim_SetResultFormatted(goi
.interp
, "Core register number %i " \
386 "is invalid. Must less then 64 and not 61 and 62.", regnum
);
390 struct arc_common
*arc
= target_to_arc(target
);
394 CHECK_RETVAL(arc_jtag_read_core_reg_one(&arc
->jtag_info
, regnum
, &value
));
395 Jim_SetResultInt(interp
, value
);
400 static int jim_arc_set_core_reg(Jim_Interp
*interp
, int argc
, Jim_Obj
* const *argv
)
402 struct command_context
*context
;
403 struct target
*target
;
408 JIM_CHECK_RETVAL(Jim_GetOpt_Setup(&goi
, interp
, argc
-1, argv
+1));
411 Jim_SetResultFormatted(goi
.interp
,
412 "usage: %s <core_reg_num> <core_reg_value>", Jim_GetString(argv
[0], NULL
));
416 context
= current_command_context(interp
);
419 target
= get_current_target(context
);
421 Jim_SetResultFormatted(goi
.interp
, "No current target");
425 /* Register number */
426 JIM_CHECK_RETVAL(arc_cmd_jim_get_uint32(&goi
, ®num
));
427 if (regnum
> CORE_REG_MAX_NUMBER
|| regnum
== CORE_R61_NUM
|| regnum
== CORE_R62_NUM
) {
428 Jim_SetResultFormatted(goi
.interp
, "Core register number %i " \
429 "is invalid. Must less then 64 and not 61 and 62.", regnum
);
434 JIM_CHECK_RETVAL(arc_cmd_jim_get_uint32(&goi
, &value
));
436 struct arc_common
*arc
= target_to_arc(target
);
439 CHECK_RETVAL(arc_jtag_write_core_reg_one(&arc
->jtag_info
, regnum
, value
));
444 static const struct command_registration arc_jtag_command_group
[] = {
446 .name
= "get-aux-reg",
447 .jim_handler
= jim_arc_get_aux_reg
,
448 .mode
= COMMAND_EXEC
,
449 .help
= "Get AUX register by number. This command does a " \
450 "raw JTAG request that bypasses OpenOCD register cache "\
451 "and thus is unsafe and can have unexpected consequences. "\
452 "Use at your own risk.",
453 .usage
= "arc jtag get-aux-reg <regnum>"
456 .name
= "set-aux-reg",
457 .jim_handler
= jim_arc_set_aux_reg
,
458 .mode
= COMMAND_EXEC
,
459 .help
= "Set AUX register by number. This command does a " \
460 "raw JTAG request that bypasses OpenOCD register cache "\
461 "and thus is unsafe and can have unexpected consequences. "\
462 "Use at your own risk.",
463 .usage
= "arc jtag set-aux-reg <regnum> <value>"
466 .name
= "get-core-reg",
467 .jim_handler
= jim_arc_get_core_reg
,
468 .mode
= COMMAND_EXEC
,
469 .help
= "Get/Set core register by number. This command does a " \
470 "raw JTAG request that bypasses OpenOCD register cache "\
471 "and thus is unsafe and can have unexpected consequences. "\
472 "Use at your own risk.",
473 .usage
= "arc jtag get-core-reg <regnum> [<value>]"
476 .name
= "set-core-reg",
477 .jim_handler
= jim_arc_set_core_reg
,
478 .mode
= COMMAND_EXEC
,
479 .help
= "Get/Set core register by number. This command does a " \
480 "raw JTAG request that bypasses OpenOCD register cache "\
481 "and thus is unsafe and can have unexpected consequences. "\
482 "Use at your own risk.",
483 .usage
= "arc jtag set-core-reg <regnum> [<value>]"
485 COMMAND_REGISTRATION_DONE
489 /* This function supports only bitfields. */
490 static int jim_arc_add_reg_type_struct(Jim_Interp
*interp
, int argc
,
491 Jim_Obj
* const *argv
)
494 JIM_CHECK_RETVAL(Jim_GetOpt_Setup(&goi
, interp
, argc
-1, argv
+1));
498 struct command_context
*ctx
;
499 struct target
*target
;
501 ctx
= current_command_context(interp
);
503 target
= get_current_target(ctx
);
505 Jim_SetResultFormatted(goi
.interp
, "No current target");
511 /* Check if the amount of argnuments is not zero */
513 Jim_SetResultFormatted(goi
.interp
, "The command has no argnuments");
517 /* Estimate number of registers as (argc - 2)/4 as each -bitfield option has 3
518 * arguments while -name is required. */
519 unsigned int fields_sz
= (goi
.argc
- 2) / 4;
520 unsigned int cur_field
= 0;
522 /* Tha maximum amount of bitfilds is 32 */
523 if (fields_sz
> 32) {
524 Jim_SetResultFormatted(goi
.interp
, "The amount of bitfields exceed 32");
528 struct arc_reg_data_type
*type
= calloc(1, sizeof(*type
));
529 struct reg_data_type_struct
*struct_type
= &type
->data_type_struct
;
530 struct reg_data_type_struct_field
*fields
= calloc(fields_sz
, sizeof(*fields
));
531 struct arc_reg_bitfield
*bitfields
= calloc(fields_sz
, sizeof(*type
));
532 if (!(type
&& fields
&& bitfields
)) {
533 Jim_SetResultFormatted(goi
.interp
, "Failed to allocate memory.");
537 /* Initialize type */
538 type
->data_type
.id
= type
->data_type_id
;
539 type
->bitfields
= bitfields
;
540 type
->data_type
.type
= REG_TYPE_ARCH_DEFINED
;
541 type
->data_type
.type_class
= REG_TYPE_CLASS_STRUCT
;
542 type
->data_type
.reg_type_struct
= struct_type
;
543 struct_type
->size
= 4; /* For now ARC has only 32-bit registers */
545 while (goi
.argc
> 0 && e
== JIM_OK
) {
547 e
= Jim_GetOpt_Nvp(&goi
, nvp_add_reg_type_struct_opts
, &n
);
549 Jim_GetOpt_NvpUnknown(&goi
, nvp_add_reg_type_struct_opts
, 0);
554 case CFG_ADD_REG_TYPE_STRUCT_NAME
:
556 const char *name
= NULL
;
559 e
= jim_arc_read_reg_name_field(&goi
, &name
, &name_len
);
561 Jim_SetResultFormatted(goi
.interp
, "Unable to read reg name.");
565 if (name_len
> REG_TYPE_MAX_NAME_LENGTH
) {
566 Jim_SetResultFormatted(goi
.interp
, "Reg type name is too big.");
570 strncpy((void *)type
->data_type
.id
, name
, name_len
);
571 if (!type
->data_type
.id
) {
572 Jim_SetResultFormatted(goi
.interp
, "Unable to setup reg type name.");
578 case CFG_ADD_REG_TYPE_STRUCT_BITFIELD
:
580 const char *field_name
= NULL
;
581 int field_name_len
= 0;
582 e
= jim_arc_read_reg_type_field(&goi
, &field_name
, &field_name_len
, bitfields
,
583 cur_field
, CFG_ADD_REG_TYPE_STRUCT
);
585 Jim_SetResultFormatted(goi
.interp
, "Unable to add reg_type_struct field.");
589 if (field_name_len
> REG_TYPE_MAX_NAME_LENGTH
) {
590 Jim_SetResultFormatted(goi
.interp
, "Reg type field_name_len is too big.");
594 fields
[cur_field
].name
= bitfields
[cur_field
].name
;
595 strncpy(bitfields
[cur_field
].name
, field_name
, field_name_len
);
596 if (!fields
[cur_field
].name
) {
597 Jim_SetResultFormatted(goi
.interp
, "Unable to setup field name. ");
601 fields
[cur_field
].bitfield
= &(bitfields
[cur_field
].bitfield
);
602 fields
[cur_field
].use_bitfields
= true;
604 fields
[cur_field
- 1].next
= &(fields
[cur_field
]);
606 struct_type
->fields
= fields
;
615 if (!type
->data_type
.id
) {
616 Jim_SetResultFormatted(goi
.interp
, "-name is a required option");
620 arc_reg_data_type_add(target
, type
);
621 LOG_DEBUG("added struct type {name=%s}", type
->data_type
.id
);
635 CFG_ADD_REG_ARCH_NUM
,
638 CFG_ADD_REG_GDB_FEATURE
,
643 static Jim_Nvp opts_nvp_add_reg
[] = {
644 { .name
= "-name", .value
= CFG_ADD_REG_NAME
},
645 { .name
= "-num", .value
= CFG_ADD_REG_ARCH_NUM
},
646 { .name
= "-core", .value
= CFG_ADD_REG_IS_CORE
},
647 { .name
= "-bcr", .value
= CFG_ADD_REG_IS_BCR
},
648 { .name
= "-feature", .value
= CFG_ADD_REG_GDB_FEATURE
},
649 { .name
= "-type", .value
= CFG_ADD_REG_TYPE
},
650 { .name
= "-g", .value
= CFG_ADD_REG_GENERAL
},
651 { .name
= NULL
, .value
= -1 }
654 void free_reg_desc(struct arc_reg_desc
*r
)
657 free(r
->gdb_xml_feature
);
661 static int jim_arc_add_reg(Jim_Interp
*interp
, int argc
, Jim_Obj
* const *argv
)
664 JIM_CHECK_RETVAL(Jim_GetOpt_Setup(&goi
, interp
, argc
-1, argv
+1));
666 struct arc_reg_desc
*reg
= calloc(1, sizeof(*reg
));
668 Jim_SetResultFormatted(goi
.interp
, "Failed to allocate memory.");
672 /* There is no architecture number that we could treat as invalid, so
673 * separate variable requried to ensure that arch num has been set. */
674 bool arch_num_set
= false;
675 const char *type_name
= "int"; /* Default type */
676 int type_name_len
= strlen(type_name
);
679 /* At least we need to specify 4 parameters: name, number, type and gdb_feature,
680 * which means there should be 8 arguments */
683 Jim_SetResultFormatted(goi
.interp
,
684 "Should be at least 8 argnuments: -name <name> "
685 "-num <num> -type <type> -feature <gdb_feature>.");
690 while (goi
.argc
> 0) {
692 e
= Jim_GetOpt_Nvp(&goi
, opts_nvp_add_reg
, &n
);
694 Jim_GetOpt_NvpUnknown(&goi
, opts_nvp_add_reg
, 0);
700 case CFG_ADD_REG_NAME
:
702 const char *reg_name
= NULL
;
703 int reg_name_len
= 0;
705 e
= jim_arc_read_reg_name_field(&goi
, ®_name
, ®_name_len
);
707 Jim_SetResultFormatted(goi
.interp
, "Unable to read register name.");
712 reg
->name
= strndup(reg_name
, reg_name_len
);
715 case CFG_ADD_REG_IS_CORE
:
718 case CFG_ADD_REG_IS_BCR
:
721 case CFG_ADD_REG_ARCH_NUM
:
727 Jim_WrongNumArgs(interp
, goi
.argc
, goi
.argv
, "-num <int> ...");
731 e
= Jim_GetOpt_Wide(&goi
, &archnum
);
737 reg
->arch_num
= archnum
;
741 case CFG_ADD_REG_GDB_FEATURE
:
743 const char *feature
= NULL
;
746 e
= jim_arc_read_reg_name_field(&goi
, &feature
, &feature_len
);
748 Jim_SetResultFormatted(goi
.interp
, "Unable to read gdb_feature.");
753 reg
->gdb_xml_feature
= strndup(feature
, feature_len
);
756 case CFG_ADD_REG_TYPE
:
757 e
= jim_arc_read_reg_name_field(&goi
, &type_name
, &type_name_len
);
759 Jim_SetResultFormatted(goi
.interp
, "Unable to read register type.");
765 case CFG_ADD_REG_GENERAL
:
766 reg
->is_general
= true;
769 LOG_DEBUG("Error: Unknown parameter");
775 /* Check that required fields are set */
776 const char * const errmsg
= validate_register(reg
, arch_num_set
);
778 Jim_SetResultFormatted(goi
.interp
, errmsg
);
783 /* Add new register */
784 struct command_context
*ctx
;
785 struct target
*target
;
787 ctx
= current_command_context(interp
);
789 target
= get_current_target(ctx
);
791 Jim_SetResultFormatted(goi
.interp
, "No current target");
795 reg
->target
= target
;
797 e
= arc_reg_add(target
, reg
, type_name
, type_name_len
);
798 if (e
== ERROR_ARC_REGTYPE_NOT_FOUND
) {
799 Jim_SetResultFormatted(goi
.interp
,
800 "Cannot find type `%s' for register `%s'.",
801 type_name
, reg
->name
);
809 /* arc set-reg-exists ($reg_name)+
810 * Accepts any amount of register names - will set them as existing in a loop.*/
811 COMMAND_HANDLER(arc_set_reg_exists
)
813 struct target
* const target
= get_current_target(CMD_CTX
);
815 command_print(CMD
, "Unable to get current target.");
820 command_print(CMD
, "At least one register name must be specified.");
821 return ERROR_COMMAND_SYNTAX_ERROR
;
824 for (unsigned int i
= 0; i
< CMD_ARGC
; i
++) {
825 const char * const reg_name
= CMD_ARGV
[i
];
826 struct reg
* const r
= arc_reg_get_by_name(target
->reg_cache
, reg_name
, true);
829 command_print(CMD
, "Register `%s' is not found.", reg_name
);
830 return ERROR_COMMAND_ARGUMENT_INVALID
;
839 /* arc reg-field ($reg_name) ($reg_field)
840 * Reads struct type register field */
841 static int jim_arc_get_reg_field(Jim_Interp
*interp
, int argc
, Jim_Obj
* const *argv
)
844 const char *reg_name
, *field_name
;
848 JIM_CHECK_RETVAL(Jim_GetOpt_Setup(&goi
, interp
, argc
-1, argv
+1));
850 LOG_DEBUG("Reading register field");
853 Jim_WrongNumArgs(interp
, goi
.argc
, goi
.argv
, "<regname> <fieldname>");
854 else if (goi
.argc
== 1)
855 Jim_WrongNumArgs(interp
, goi
.argc
, goi
.argv
, "<fieldname>");
857 Jim_WrongNumArgs(interp
, goi
.argc
, goi
.argv
, "<regname> <fieldname>");
858 return ERROR_COMMAND_SYNTAX_ERROR
;
861 JIM_CHECK_RETVAL(Jim_GetOpt_String(&goi
, ®_name
, NULL
));
862 JIM_CHECK_RETVAL(Jim_GetOpt_String(&goi
, &field_name
, NULL
));
866 struct command_context
* const ctx
= current_command_context(interp
);
868 struct target
* const target
= get_current_target(ctx
);
870 Jim_SetResultFormatted(goi
.interp
, "No current target");
874 retval
= arc_reg_get_field(target
, reg_name
, field_name
, &value
);
879 case ERROR_ARC_REGISTER_NOT_FOUND
:
880 Jim_SetResultFormatted(goi
.interp
,
881 "Register `%s' has not been found.", reg_name
);
882 return ERROR_COMMAND_ARGUMENT_INVALID
;
883 case ERROR_ARC_REGISTER_IS_NOT_STRUCT
:
884 Jim_SetResultFormatted(goi
.interp
,
885 "Register `%s' must have 'struct' type.", reg_name
);
886 return ERROR_COMMAND_ARGUMENT_INVALID
;
887 case ERROR_ARC_REGISTER_FIELD_NOT_FOUND
:
888 Jim_SetResultFormatted(goi
.interp
,
889 "Field `%s' has not been found in register `%s'.",
890 field_name
, reg_name
);
891 return ERROR_COMMAND_ARGUMENT_INVALID
;
892 case ERROR_ARC_FIELD_IS_NOT_BITFIELD
:
893 Jim_SetResultFormatted(goi
.interp
,
894 "Field `%s' is not a 'bitfield' field in a structure.",
896 return ERROR_COMMAND_ARGUMENT_INVALID
;
898 /* Pass through other errors. */
902 Jim_SetResultInt(interp
, value
);
907 /* ----- Exported target commands ------------------------------------------ */
909 static const struct command_registration arc_core_command_handlers
[] = {
911 .name
= "add-reg-type-flags",
912 .jim_handler
= jim_arc_add_reg_type_flags
,
913 .mode
= COMMAND_CONFIG
,
914 .usage
= "arc ardd-reg-type-flags -name <string> -flag <name> <position> "
915 "[-flag <name> <position>]...",
916 .help
= "Add new 'flags' register data type. Only single bit flags "
917 "are supported. Type name is global. Bitsize of register is fixed "
921 .name
= "add-reg-type-struct",
922 .jim_handler
= jim_arc_add_reg_type_struct
,
923 .mode
= COMMAND_CONFIG
,
924 .usage
= "arc add-reg-type-struct -name <string> -bitfield <name> <start> <end> "
925 "[-bitfield <name> <start> <end>]...",
926 .help
= "Add new 'struct' register data type. Only bit-fields are "
927 "supported so far, which means that for each bitfield start and end "
928 "position bits must be specified. GDB also support type-fields, "
929 "where common type can be used instead. Type name is global. Bitsize of "
930 "register is fixed at 32 bits.",
934 .jim_handler
= jim_arc_add_reg
,
935 .mode
= COMMAND_CONFIG
,
936 .usage
= "arc add-reg -name <string> -num <int> -feature <string> [-gdbnum <int>] "
937 "[-core|-bcr] [-type <type_name>] [-g]",
938 .help
= "Add new register. Name, architectural number and feature name "
939 "are requried options. GDB regnum will default to previous register "
940 "(gdbnum + 1) and shouldn't be specified in most cases. Type "
941 "defaults to default GDB 'int'.",
944 .name
= "set-reg-exists",
945 .handler
= arc_set_reg_exists
,
947 .usage
= "arc set-reg-exists <register-name> [<register-name>]...",
948 .help
= "Set that register exists. Accepts multiple register names as "
952 .name
= "get-reg-field",
953 .jim_handler
= jim_arc_get_reg_field
,
955 .usage
= "arc get-reg-field <regname> <field_name>",
956 .help
= "Returns value of field in a register with 'struct' type.",
961 .help
= "ARC JTAG specific commands",
963 .chain
= arc_jtag_command_group
,
965 COMMAND_REGISTRATION_DONE
968 const struct command_registration arc_monitor_command_handlers
[] = {
972 .help
= "ARC monitor command group",
973 .usage
= "Help info ...",
974 .chain
= arc_core_command_handlers
,
976 COMMAND_REGISTRATION_DONE
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)