You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

1091 lines
30 KiB

  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> *
  7. * *
  8. * SPDX-License-Identifier: GPL-2.0-or-later *
  9. ***************************************************************************/
  10. #ifdef HAVE_CONFIG_H
  11. #include "config.h"
  12. #endif
  13. #include "arc.h"
  14. /* --------------------------------------------------------------------------
  15. *
  16. * ARC targets expose command interface.
  17. * It can be accessed via GDB through the (gdb) monitor command.
  18. *
  19. * ------------------------------------------------------------------------- */
  20. static int arc_cmd_jim_get_uint32(struct jim_getopt_info *goi, uint32_t *value)
  21. {
  22. jim_wide value_wide;
  23. JIM_CHECK_RETVAL(jim_getopt_wide(goi, &value_wide));
  24. *value = (uint32_t)value_wide;
  25. return JIM_OK;
  26. }
  27. enum add_reg_types {
  28. CFG_ADD_REG_TYPE_FLAG,
  29. CFG_ADD_REG_TYPE_STRUCT,
  30. };
  31. /* Add flags register data type */
  32. enum add_reg_type_flags {
  33. CFG_ADD_REG_TYPE_FLAGS_NAME,
  34. CFG_ADD_REG_TYPE_FLAGS_FLAG,
  35. };
  36. static struct jim_nvp nvp_add_reg_type_flags_opts[] = {
  37. { .name = "-name", .value = CFG_ADD_REG_TYPE_FLAGS_NAME },
  38. { .name = "-flag", .value = CFG_ADD_REG_TYPE_FLAGS_FLAG },
  39. { .name = NULL, .value = -1 }
  40. };
  41. /* Helper function to check if all field required for register
  42. * are set up */
  43. static const char *validate_register(const struct arc_reg_desc * const reg, bool arch_num_set)
  44. {
  45. /* Check that required fields are set */
  46. if (!reg->name)
  47. return "-name option is required";
  48. if (!reg->gdb_xml_feature)
  49. return "-feature option is required";
  50. if (!arch_num_set)
  51. return "-num option is required";
  52. if (reg->is_bcr && reg->is_core)
  53. return "Register cannot be both -core and -bcr.";
  54. return NULL;
  55. }
  56. /* Helper function to read the name of register type or register from
  57. * configure files */
  58. static int jim_arc_read_reg_name_field(struct jim_getopt_info *goi,
  59. const char **name, int *name_len)
  60. {
  61. int e = JIM_OK;
  62. if (!goi->argc) {
  63. Jim_WrongNumArgs(goi->interp, goi->argc, goi->argv, "-name <name> ...");
  64. return JIM_ERR;
  65. }
  66. e = jim_getopt_string(goi, name, name_len);
  67. return e;
  68. }
  69. /* Helper function to read bitfields/flags of register type. */
  70. static int jim_arc_read_reg_type_field(struct jim_getopt_info *goi, const char **field_name, int *field_name_len,
  71. struct arc_reg_bitfield *bitfields, int cur_field, int type)
  72. {
  73. jim_wide start_pos, end_pos;
  74. int e = JIM_OK;
  75. if ((type == CFG_ADD_REG_TYPE_STRUCT && goi->argc < 3) ||
  76. (type == CFG_ADD_REG_TYPE_FLAG && goi->argc < 2)) {
  77. Jim_SetResultFormatted(goi->interp, "Not enough arguments after -flag/-bitfield");
  78. return JIM_ERR;
  79. }
  80. e = jim_getopt_string(goi, field_name, field_name_len);
  81. if (e != JIM_OK)
  82. return e;
  83. /* read start position of bitfield/flag */
  84. e = jim_getopt_wide(goi, &start_pos);
  85. if (e != JIM_OK)
  86. return e;
  87. end_pos = start_pos;
  88. /* Check if any arguments remain,
  89. * set bitfields[cur_field].end if flag is multibit */
  90. if (goi->argc > 0)
  91. /* Check current argv[0], if it is equal to "-flag",
  92. * than bitfields[cur_field].end remains start */
  93. if ((strcmp(Jim_String(goi->argv[0]), "-flag") && type == CFG_ADD_REG_TYPE_FLAG)
  94. || (type == CFG_ADD_REG_TYPE_STRUCT)) {
  95. e = jim_getopt_wide(goi, &end_pos);
  96. if (e != JIM_OK) {
  97. Jim_SetResultFormatted(goi->interp, "Error reading end position");
  98. return e;
  99. }
  100. }
  101. bitfields[cur_field].bitfield.start = start_pos;
  102. bitfields[cur_field].bitfield.end = end_pos;
  103. if ((end_pos != start_pos) || (type == CFG_ADD_REG_TYPE_STRUCT))
  104. bitfields[cur_field].bitfield.type = REG_TYPE_INT;
  105. return e;
  106. }
  107. static int jim_arc_add_reg_type_flags(Jim_Interp *interp, int argc,
  108. Jim_Obj * const *argv)
  109. {
  110. struct jim_getopt_info goi;
  111. JIM_CHECK_RETVAL(jim_getopt_setup(&goi, interp, argc-1, argv+1));
  112. LOG_DEBUG("-");
  113. struct command_context *ctx;
  114. struct target *target;
  115. ctx = current_command_context(interp);
  116. assert(ctx);
  117. target = get_current_target(ctx);
  118. if (!target) {
  119. Jim_SetResultFormatted(goi.interp, "No current target");
  120. return JIM_ERR;
  121. }
  122. int e = JIM_OK;
  123. /* Check if the amount of arguments is not zero */
  124. if (goi.argc <= 0) {
  125. Jim_SetResultFormatted(goi.interp, "The command has no arguments");
  126. return JIM_ERR;
  127. }
  128. /* Estimate number of registers as (argc - 2)/3 as each -flag option has 2
  129. * arguments while -name is required. */
  130. unsigned int fields_sz = (goi.argc - 2) / 3;
  131. unsigned int cur_field = 0;
  132. /* The maximum amount of bitfields is 32 */
  133. if (fields_sz > 32) {
  134. Jim_SetResultFormatted(goi.interp, "The amount of bitfields exceed 32");
  135. return JIM_ERR;
  136. }
  137. struct arc_reg_data_type *type = calloc(1, sizeof(*type));
  138. struct reg_data_type_flags *flags = &type->data_type_flags;
  139. struct reg_data_type_flags_field *fields = calloc(fields_sz, sizeof(*fields));
  140. type->reg_type_flags_field = fields;
  141. struct arc_reg_bitfield *bitfields = calloc(fields_sz, sizeof(*bitfields));
  142. if (!(type && fields && bitfields)) {
  143. Jim_SetResultFormatted(goi.interp, "Failed to allocate memory.");
  144. goto fail;
  145. }
  146. /* Initialize type */
  147. type->bitfields = bitfields;
  148. type->data_type.id = type->data_type_id;
  149. type->data_type.type = REG_TYPE_ARCH_DEFINED;
  150. type->data_type.type_class = REG_TYPE_CLASS_FLAGS;
  151. type->data_type.reg_type_flags = flags;
  152. flags->size = 4; /* For now ARC has only 32-bit registers */
  153. while (goi.argc > 0 && e == JIM_OK) {
  154. struct jim_nvp *n;
  155. e = jim_getopt_nvp(&goi, nvp_add_reg_type_flags_opts, &n);
  156. if (e != JIM_OK) {
  157. jim_getopt_nvp_unknown(&goi, nvp_add_reg_type_flags_opts, 0);
  158. continue;
  159. }
  160. switch (n->value) {
  161. case CFG_ADD_REG_TYPE_FLAGS_NAME:
  162. {
  163. const char *name = NULL;
  164. int name_len = 0;
  165. e = jim_arc_read_reg_name_field(&goi, &name, &name_len);
  166. if (e != JIM_OK) {
  167. Jim_SetResultFormatted(goi.interp, "Unable to read reg name.");
  168. goto fail;
  169. }
  170. if (name_len > REG_TYPE_MAX_NAME_LENGTH) {
  171. Jim_SetResultFormatted(goi.interp, "Reg type name is too big.");
  172. goto fail;
  173. }
  174. strncpy((void *)type->data_type.id, name, name_len);
  175. if (!type->data_type.id) {
  176. Jim_SetResultFormatted(goi.interp, "Unable to setup reg type name.");
  177. goto fail;
  178. }
  179. break;
  180. }
  181. case CFG_ADD_REG_TYPE_FLAGS_FLAG:
  182. {
  183. const char *field_name = NULL;
  184. int field_name_len = 0;
  185. e = jim_arc_read_reg_type_field(&goi, &field_name, &field_name_len, bitfields,
  186. cur_field, CFG_ADD_REG_TYPE_FLAG);
  187. if (e != JIM_OK) {
  188. Jim_SetResultFormatted(goi.interp, "Unable to add reg_type_flag field.");
  189. goto fail;
  190. }
  191. if (field_name_len > REG_TYPE_MAX_NAME_LENGTH) {
  192. Jim_SetResultFormatted(goi.interp, "Reg type field_name_len is too big.");
  193. goto fail;
  194. }
  195. fields[cur_field].name = bitfields[cur_field].name;
  196. strncpy(bitfields[cur_field].name, field_name, field_name_len);
  197. if (!fields[cur_field].name) {
  198. Jim_SetResultFormatted(goi.interp, "Unable to setup field name. ");
  199. goto fail;
  200. }
  201. fields[cur_field].bitfield = &(bitfields[cur_field].bitfield);
  202. if (cur_field > 0)
  203. fields[cur_field - 1].next = &(fields[cur_field]);
  204. else
  205. flags->fields = fields;
  206. cur_field += 1;
  207. break;
  208. }
  209. }
  210. }
  211. if (!type->data_type.id) {
  212. Jim_SetResultFormatted(goi.interp, "-name is a required option");
  213. goto fail;
  214. }
  215. arc_reg_data_type_add(target, type);
  216. LOG_DEBUG("added flags type {name=%s}", type->data_type.id);
  217. return JIM_OK;
  218. fail:
  219. free(type);
  220. free(fields);
  221. free(bitfields);
  222. return JIM_ERR;
  223. }
  224. /* Add struct register data type */
  225. enum add_reg_type_struct {
  226. CFG_ADD_REG_TYPE_STRUCT_NAME,
  227. CFG_ADD_REG_TYPE_STRUCT_BITFIELD,
  228. };
  229. static struct jim_nvp nvp_add_reg_type_struct_opts[] = {
  230. { .name = "-name", .value = CFG_ADD_REG_TYPE_STRUCT_NAME },
  231. { .name = "-bitfield", .value = CFG_ADD_REG_TYPE_STRUCT_BITFIELD },
  232. { .name = NULL, .value = -1 }
  233. };
  234. static int jim_arc_set_aux_reg(Jim_Interp *interp, int argc, Jim_Obj * const *argv)
  235. {
  236. struct command_context *context;
  237. struct target *target;
  238. uint32_t regnum;
  239. uint32_t value;
  240. struct jim_getopt_info goi;
  241. JIM_CHECK_RETVAL(jim_getopt_setup(&goi, interp, argc-1, argv+1));
  242. if (goi.argc != 2) {
  243. Jim_SetResultFormatted(goi.interp,
  244. "usage: %s <aux_reg_num> <aux_reg_value>", Jim_GetString(argv[0], NULL));
  245. return JIM_ERR;
  246. }
  247. context = current_command_context(interp);
  248. assert(context);
  249. target = get_current_target(context);
  250. if (!target) {
  251. Jim_SetResultFormatted(goi.interp, "No current target");
  252. return JIM_ERR;
  253. }
  254. /* Register number */
  255. JIM_CHECK_RETVAL(arc_cmd_jim_get_uint32(&goi, &regnum));
  256. /* Register value */
  257. JIM_CHECK_RETVAL(arc_cmd_jim_get_uint32(&goi, &value));
  258. struct arc_common *arc = target_to_arc(target);
  259. assert(arc);
  260. CHECK_RETVAL(arc_jtag_write_aux_reg_one(&arc->jtag_info, regnum, value));
  261. return ERROR_OK;
  262. }
  263. static int jim_arc_get_aux_reg(Jim_Interp *interp, int argc, Jim_Obj * const *argv)
  264. {
  265. struct command_context *context;
  266. struct target *target;
  267. uint32_t regnum;
  268. uint32_t value;
  269. struct jim_getopt_info goi;
  270. JIM_CHECK_RETVAL(jim_getopt_setup(&goi, interp, argc-1, argv+1));
  271. if (goi.argc != 1) {
  272. Jim_SetResultFormatted(goi.interp,
  273. "usage: %s <aux_reg_num>", Jim_GetString(argv[0], NULL));
  274. return JIM_ERR;
  275. }
  276. context = current_command_context(interp);
  277. assert(context);
  278. target = get_current_target(context);
  279. if (!target) {
  280. Jim_SetResultFormatted(goi.interp, "No current target");
  281. return JIM_ERR;
  282. }
  283. /* Register number */
  284. JIM_CHECK_RETVAL(arc_cmd_jim_get_uint32(&goi, &regnum));
  285. struct arc_common *arc = target_to_arc(target);
  286. assert(arc);
  287. CHECK_RETVAL(arc_jtag_read_aux_reg_one(&arc->jtag_info, regnum, &value));
  288. Jim_SetResultInt(interp, value);
  289. return ERROR_OK;
  290. }
  291. static int jim_arc_get_core_reg(Jim_Interp *interp, int argc, Jim_Obj * const *argv)
  292. {
  293. struct command_context *context;
  294. struct target *target;
  295. uint32_t regnum;
  296. uint32_t value;
  297. struct jim_getopt_info goi;
  298. JIM_CHECK_RETVAL(jim_getopt_setup(&goi, interp, argc-1, argv+1));
  299. if (goi.argc != 1) {
  300. Jim_SetResultFormatted(goi.interp,
  301. "usage: %s <core_reg_num>", Jim_GetString(argv[0], NULL));
  302. return JIM_ERR;
  303. }
  304. context = current_command_context(interp);
  305. assert(context);
  306. target = get_current_target(context);
  307. if (!target) {
  308. Jim_SetResultFormatted(goi.interp, "No current target");
  309. return JIM_ERR;
  310. }
  311. /* Register number */
  312. JIM_CHECK_RETVAL(arc_cmd_jim_get_uint32(&goi, &regnum));
  313. if (regnum > CORE_REG_MAX_NUMBER || regnum == ARC_R61 || regnum == ARC_R62) {
  314. Jim_SetResultFormatted(goi.interp, "Core register number %i "
  315. "is invalid. Must less then 64 and not 61 and 62.", regnum);
  316. return JIM_ERR;
  317. }
  318. struct arc_common *arc = target_to_arc(target);
  319. assert(arc);
  320. /* Read value */
  321. CHECK_RETVAL(arc_jtag_read_core_reg_one(&arc->jtag_info, regnum, &value));
  322. Jim_SetResultInt(interp, value);
  323. return ERROR_OK;
  324. }
  325. static int jim_arc_set_core_reg(Jim_Interp *interp, int argc, Jim_Obj * const *argv)
  326. {
  327. struct command_context *context;
  328. struct target *target;
  329. uint32_t regnum;
  330. uint32_t value;
  331. struct jim_getopt_info goi;
  332. JIM_CHECK_RETVAL(jim_getopt_setup(&goi, interp, argc-1, argv+1));
  333. if (goi.argc != 2) {
  334. Jim_SetResultFormatted(goi.interp,
  335. "usage: %s <core_reg_num> <core_reg_value>", Jim_GetString(argv[0], NULL));
  336. return JIM_ERR;
  337. }
  338. context = current_command_context(interp);
  339. assert(context);
  340. target = get_current_target(context);
  341. if (!target) {
  342. Jim_SetResultFormatted(goi.interp, "No current target");
  343. return JIM_ERR;
  344. }
  345. /* Register number */
  346. JIM_CHECK_RETVAL(arc_cmd_jim_get_uint32(&goi, &regnum));
  347. if (regnum > CORE_REG_MAX_NUMBER || regnum == ARC_R61 || regnum == ARC_R62) {
  348. Jim_SetResultFormatted(goi.interp, "Core register number %i "
  349. "is invalid. Must less then 64 and not 61 and 62.", regnum);
  350. return JIM_ERR;
  351. }
  352. /* Register value */
  353. JIM_CHECK_RETVAL(arc_cmd_jim_get_uint32(&goi, &value));
  354. struct arc_common *arc = target_to_arc(target);
  355. assert(arc);
  356. CHECK_RETVAL(arc_jtag_write_core_reg_one(&arc->jtag_info, regnum, value));
  357. return ERROR_OK;
  358. }
  359. static const struct command_registration arc_jtag_command_group[] = {
  360. {
  361. .name = "get-aux-reg",
  362. .jim_handler = jim_arc_get_aux_reg,
  363. .mode = COMMAND_EXEC,
  364. .help = "Get AUX register by number. This command does a "
  365. "raw JTAG request that bypasses OpenOCD register cache "
  366. "and thus is unsafe and can have unexpected consequences. "
  367. "Use at your own risk.",
  368. .usage = "<regnum>"
  369. },
  370. {
  371. .name = "set-aux-reg",
  372. .jim_handler = jim_arc_set_aux_reg,
  373. .mode = COMMAND_EXEC,
  374. .help = "Set AUX register by number. This command does a "
  375. "raw JTAG request that bypasses OpenOCD register cache "
  376. "and thus is unsafe and can have unexpected consequences. "
  377. "Use at your own risk.",
  378. .usage = "<regnum> <value>"
  379. },
  380. {
  381. .name = "get-core-reg",
  382. .jim_handler = jim_arc_get_core_reg,
  383. .mode = COMMAND_EXEC,
  384. .help = "Get/Set core register by number. This command does a "
  385. "raw JTAG request that bypasses OpenOCD register cache "
  386. "and thus is unsafe and can have unexpected consequences. "
  387. "Use at your own risk.",
  388. .usage = "<regnum> [<value>]"
  389. },
  390. {
  391. .name = "set-core-reg",
  392. .jim_handler = jim_arc_set_core_reg,
  393. .mode = COMMAND_EXEC,
  394. .help = "Get/Set core register by number. This command does a "
  395. "raw JTAG request that bypasses OpenOCD register cache "
  396. "and thus is unsafe and can have unexpected consequences. "
  397. "Use at your own risk.",
  398. .usage = "<regnum> [<value>]"
  399. },
  400. COMMAND_REGISTRATION_DONE
  401. };
  402. /* This function supports only bitfields. */
  403. static int jim_arc_add_reg_type_struct(Jim_Interp *interp, int argc,
  404. Jim_Obj * const *argv)
  405. {
  406. struct jim_getopt_info goi;
  407. JIM_CHECK_RETVAL(jim_getopt_setup(&goi, interp, argc-1, argv+1));
  408. LOG_DEBUG("-");
  409. struct command_context *ctx;
  410. struct target *target;
  411. ctx = current_command_context(interp);
  412. assert(ctx);
  413. target = get_current_target(ctx);
  414. if (!target) {
  415. Jim_SetResultFormatted(goi.interp, "No current target");
  416. return JIM_ERR;
  417. }
  418. int e = JIM_OK;
  419. /* Check if the amount of arguments is not zero */
  420. if (goi.argc <= 0) {
  421. Jim_SetResultFormatted(goi.interp, "The command has no arguments");
  422. return JIM_ERR;
  423. }
  424. /* Estimate number of registers as (argc - 2)/4 as each -bitfield option has 3
  425. * arguments while -name is required. */
  426. unsigned int fields_sz = (goi.argc - 2) / 4;
  427. unsigned int cur_field = 0;
  428. /* The maximum amount of bitfields is 32 */
  429. if (fields_sz > 32) {
  430. Jim_SetResultFormatted(goi.interp, "The amount of bitfields exceed 32");
  431. return JIM_ERR;
  432. }
  433. struct arc_reg_data_type *type = calloc(1, sizeof(*type));
  434. struct reg_data_type_struct *struct_type = &type->data_type_struct;
  435. struct reg_data_type_struct_field *fields = calloc(fields_sz, sizeof(*fields));
  436. type->reg_type_struct_field = fields;
  437. struct arc_reg_bitfield *bitfields = calloc(fields_sz, sizeof(*bitfields));
  438. if (!(type && fields && bitfields)) {
  439. Jim_SetResultFormatted(goi.interp, "Failed to allocate memory.");
  440. goto fail;
  441. }
  442. /* Initialize type */
  443. type->data_type.id = type->data_type_id;
  444. type->bitfields = bitfields;
  445. type->data_type.type = REG_TYPE_ARCH_DEFINED;
  446. type->data_type.type_class = REG_TYPE_CLASS_STRUCT;
  447. type->data_type.reg_type_struct = struct_type;
  448. struct_type->size = 4; /* For now ARC has only 32-bit registers */
  449. while (goi.argc > 0 && e == JIM_OK) {
  450. struct jim_nvp *n;
  451. e = jim_getopt_nvp(&goi, nvp_add_reg_type_struct_opts, &n);
  452. if (e != JIM_OK) {
  453. jim_getopt_nvp_unknown(&goi, nvp_add_reg_type_struct_opts, 0);
  454. continue;
  455. }
  456. switch (n->value) {
  457. case CFG_ADD_REG_TYPE_STRUCT_NAME:
  458. {
  459. const char *name = NULL;
  460. int name_len = 0;
  461. e = jim_arc_read_reg_name_field(&goi, &name, &name_len);
  462. if (e != JIM_OK) {
  463. Jim_SetResultFormatted(goi.interp, "Unable to read reg name.");
  464. goto fail;
  465. }
  466. if (name_len > REG_TYPE_MAX_NAME_LENGTH) {
  467. Jim_SetResultFormatted(goi.interp, "Reg type name is too big.");
  468. goto fail;
  469. }
  470. strncpy((void *)type->data_type.id, name, name_len);
  471. if (!type->data_type.id) {
  472. Jim_SetResultFormatted(goi.interp, "Unable to setup reg type name.");
  473. goto fail;
  474. }
  475. break;
  476. }
  477. case CFG_ADD_REG_TYPE_STRUCT_BITFIELD:
  478. {
  479. const char *field_name = NULL;
  480. int field_name_len = 0;
  481. e = jim_arc_read_reg_type_field(&goi, &field_name, &field_name_len, bitfields,
  482. cur_field, CFG_ADD_REG_TYPE_STRUCT);
  483. if (e != JIM_OK) {
  484. Jim_SetResultFormatted(goi.interp, "Unable to add reg_type_struct field.");
  485. goto fail;
  486. }
  487. if (field_name_len > REG_TYPE_MAX_NAME_LENGTH) {
  488. Jim_SetResultFormatted(goi.interp, "Reg type field_name_len is too big.");
  489. goto fail;
  490. }
  491. fields[cur_field].name = bitfields[cur_field].name;
  492. strncpy(bitfields[cur_field].name, field_name, field_name_len);
  493. if (!fields[cur_field].name) {
  494. Jim_SetResultFormatted(goi.interp, "Unable to setup field name. ");
  495. goto fail;
  496. }
  497. fields[cur_field].bitfield = &(bitfields[cur_field].bitfield);
  498. fields[cur_field].use_bitfields = true;
  499. if (cur_field > 0)
  500. fields[cur_field - 1].next = &(fields[cur_field]);
  501. else
  502. struct_type->fields = fields;
  503. cur_field += 1;
  504. break;
  505. }
  506. }
  507. }
  508. if (!type->data_type.id) {
  509. Jim_SetResultFormatted(goi.interp, "-name is a required option");
  510. goto fail;
  511. }
  512. arc_reg_data_type_add(target, type);
  513. LOG_DEBUG("added struct type {name=%s}", type->data_type.id);
  514. return JIM_OK;
  515. fail:
  516. free(type);
  517. free(fields);
  518. free(bitfields);
  519. return JIM_ERR;
  520. }
  521. /* Add register */
  522. enum opts_add_reg {
  523. CFG_ADD_REG_NAME,
  524. CFG_ADD_REG_ARCH_NUM,
  525. CFG_ADD_REG_IS_CORE,
  526. CFG_ADD_REG_IS_BCR,
  527. CFG_ADD_REG_GDB_FEATURE,
  528. CFG_ADD_REG_TYPE,
  529. CFG_ADD_REG_GENERAL,
  530. };
  531. static struct jim_nvp opts_nvp_add_reg[] = {
  532. { .name = "-name", .value = CFG_ADD_REG_NAME },
  533. { .name = "-num", .value = CFG_ADD_REG_ARCH_NUM },
  534. { .name = "-core", .value = CFG_ADD_REG_IS_CORE },
  535. { .name = "-bcr", .value = CFG_ADD_REG_IS_BCR },
  536. { .name = "-feature", .value = CFG_ADD_REG_GDB_FEATURE },
  537. { .name = "-type", .value = CFG_ADD_REG_TYPE },
  538. { .name = "-g", .value = CFG_ADD_REG_GENERAL },
  539. { .name = NULL, .value = -1 }
  540. };
  541. void free_reg_desc(struct arc_reg_desc *r)
  542. {
  543. free(r->name);
  544. free(r->gdb_xml_feature);
  545. free(r);
  546. }
  547. static int jim_arc_add_reg(Jim_Interp *interp, int argc, Jim_Obj * const *argv)
  548. {
  549. struct jim_getopt_info goi;
  550. JIM_CHECK_RETVAL(jim_getopt_setup(&goi, interp, argc-1, argv+1));
  551. struct arc_reg_desc *reg = calloc(1, sizeof(*reg));
  552. if (!reg) {
  553. Jim_SetResultFormatted(goi.interp, "Failed to allocate memory.");
  554. return JIM_ERR;
  555. }
  556. /* There is no architecture number that we could treat as invalid, so
  557. * separate variable required to ensure that arch num has been set. */
  558. bool arch_num_set = false;
  559. const char *type_name = "int"; /* Default type */
  560. int type_name_len = strlen(type_name);
  561. int e = ERROR_OK;
  562. /* At least we need to specify 4 parameters: name, number and gdb_feature,
  563. * which means there should be 6 arguments. Also there can be additional parameters
  564. * "-type <type>", "-g" and "-core" or "-bcr" which makes maximum 10 parameters. */
  565. if (goi.argc < 6 || goi.argc > 10) {
  566. free_reg_desc(reg);
  567. Jim_SetResultFormatted(goi.interp,
  568. "Should be at least 6 arguments and not greater than 10: "
  569. " -name <name> -num <num> -feature <gdb_feature> "
  570. " [-type <type_name>] [-core|-bcr] [-g].");
  571. return JIM_ERR;
  572. }
  573. /* Parse options. */
  574. while (goi.argc > 0) {
  575. struct jim_nvp *n;
  576. e = jim_getopt_nvp(&goi, opts_nvp_add_reg, &n);
  577. if (e != JIM_OK) {
  578. jim_getopt_nvp_unknown(&goi, opts_nvp_add_reg, 0);
  579. free_reg_desc(reg);
  580. return e;
  581. }
  582. switch (n->value) {
  583. case CFG_ADD_REG_NAME:
  584. {
  585. const char *reg_name = NULL;
  586. int reg_name_len = 0;
  587. e = jim_arc_read_reg_name_field(&goi, &reg_name, &reg_name_len);
  588. if (e != JIM_OK) {
  589. Jim_SetResultFormatted(goi.interp, "Unable to read register name.");
  590. free_reg_desc(reg);
  591. return e;
  592. }
  593. reg->name = strndup(reg_name, reg_name_len);
  594. break;
  595. }
  596. case CFG_ADD_REG_IS_CORE:
  597. reg->is_core = true;
  598. break;
  599. case CFG_ADD_REG_IS_BCR:
  600. reg->is_bcr = true;
  601. break;
  602. case CFG_ADD_REG_ARCH_NUM:
  603. {
  604. jim_wide archnum;
  605. if (!goi.argc) {
  606. free_reg_desc(reg);
  607. Jim_WrongNumArgs(interp, goi.argc, goi.argv, "-num <int> ...");
  608. return JIM_ERR;
  609. }
  610. e = jim_getopt_wide(&goi, &archnum);
  611. if (e != JIM_OK) {
  612. free_reg_desc(reg);
  613. return e;
  614. }
  615. reg->arch_num = archnum;
  616. arch_num_set = true;
  617. break;
  618. }
  619. case CFG_ADD_REG_GDB_FEATURE:
  620. {
  621. const char *feature = NULL;
  622. int feature_len = 0;
  623. e = jim_arc_read_reg_name_field(&goi, &feature, &feature_len);
  624. if (e != JIM_OK) {
  625. Jim_SetResultFormatted(goi.interp, "Unable to read gdb_feature.");
  626. free_reg_desc(reg);
  627. return e;
  628. }
  629. reg->gdb_xml_feature = strndup(feature, feature_len);
  630. break;
  631. }
  632. case CFG_ADD_REG_TYPE:
  633. e = jim_arc_read_reg_name_field(&goi, &type_name, &type_name_len);
  634. if (e != JIM_OK) {
  635. Jim_SetResultFormatted(goi.interp, "Unable to read register type.");
  636. free_reg_desc(reg);
  637. return e;
  638. }
  639. break;
  640. case CFG_ADD_REG_GENERAL:
  641. reg->is_general = true;
  642. break;
  643. default:
  644. LOG_DEBUG("Error: Unknown parameter");
  645. free_reg_desc(reg);
  646. return JIM_ERR;
  647. }
  648. }
  649. /* Check that required fields are set */
  650. const char * const errmsg = validate_register(reg, arch_num_set);
  651. if (errmsg) {
  652. Jim_SetResultFormatted(goi.interp, errmsg);
  653. free_reg_desc(reg);
  654. return JIM_ERR;
  655. }
  656. /* Add new register */
  657. struct command_context *ctx;
  658. struct target *target;
  659. ctx = current_command_context(interp);
  660. assert(ctx);
  661. target = get_current_target(ctx);
  662. if (!target) {
  663. Jim_SetResultFormatted(goi.interp, "No current target");
  664. free_reg_desc(reg);
  665. return JIM_ERR;
  666. }
  667. reg->target = target;
  668. e = arc_reg_add(target, reg, type_name, type_name_len);
  669. if (e == ERROR_ARC_REGTYPE_NOT_FOUND) {
  670. Jim_SetResultFormatted(goi.interp,
  671. "Cannot find type `%s' for register `%s'.",
  672. type_name, reg->name);
  673. free_reg_desc(reg);
  674. return JIM_ERR;
  675. }
  676. return e;
  677. }
  678. /* arc set-reg-exists ($reg_name)+
  679. * Accepts any amount of register names - will set them as existing in a loop.*/
  680. COMMAND_HANDLER(arc_set_reg_exists)
  681. {
  682. struct target * const target = get_current_target(CMD_CTX);
  683. if (!target) {
  684. command_print(CMD, "Unable to get current target.");
  685. return JIM_ERR;
  686. }
  687. if (!CMD_ARGC) {
  688. command_print(CMD, "At least one register name must be specified.");
  689. return ERROR_COMMAND_SYNTAX_ERROR;
  690. }
  691. for (unsigned int i = 0; i < CMD_ARGC; i++) {
  692. const char * const reg_name = CMD_ARGV[i];
  693. struct reg * const r = arc_reg_get_by_name(target->reg_cache, reg_name, true);
  694. if (!r) {
  695. command_print(CMD, "Register `%s' is not found.", reg_name);
  696. return ERROR_COMMAND_ARGUMENT_INVALID;
  697. }
  698. r->exist = true;
  699. }
  700. return JIM_OK;
  701. }
  702. /* arc reg-field ($reg_name) ($reg_field)
  703. * Reads struct type register field */
  704. static int jim_arc_get_reg_field(Jim_Interp *interp, int argc, Jim_Obj * const *argv)
  705. {
  706. struct jim_getopt_info goi;
  707. const char *reg_name, *field_name;
  708. uint32_t value;
  709. int retval;
  710. JIM_CHECK_RETVAL(jim_getopt_setup(&goi, interp, argc-1, argv+1));
  711. LOG_DEBUG("Reading register field");
  712. if (goi.argc != 2) {
  713. if (!goi.argc)
  714. Jim_WrongNumArgs(interp, goi.argc, goi.argv, "<regname> <fieldname>");
  715. else if (goi.argc == 1)
  716. Jim_WrongNumArgs(interp, goi.argc, goi.argv, "<fieldname>");
  717. else
  718. Jim_WrongNumArgs(interp, goi.argc, goi.argv, "<regname> <fieldname>");
  719. return ERROR_COMMAND_SYNTAX_ERROR;
  720. }
  721. JIM_CHECK_RETVAL(jim_getopt_string(&goi, &reg_name, NULL));
  722. JIM_CHECK_RETVAL(jim_getopt_string(&goi, &field_name, NULL));
  723. assert(reg_name);
  724. assert(field_name);
  725. struct command_context * const ctx = current_command_context(interp);
  726. assert(ctx);
  727. struct target * const target = get_current_target(ctx);
  728. if (!target) {
  729. Jim_SetResultFormatted(goi.interp, "No current target");
  730. return JIM_ERR;
  731. }
  732. retval = arc_reg_get_field(target, reg_name, field_name, &value);
  733. switch (retval) {
  734. case ERROR_OK:
  735. break;
  736. case ERROR_ARC_REGISTER_NOT_FOUND:
  737. Jim_SetResultFormatted(goi.interp,
  738. "Register `%s' has not been found.", reg_name);
  739. return ERROR_COMMAND_ARGUMENT_INVALID;
  740. case ERROR_ARC_REGISTER_IS_NOT_STRUCT:
  741. Jim_SetResultFormatted(goi.interp,
  742. "Register `%s' must have 'struct' type.", reg_name);
  743. return ERROR_COMMAND_ARGUMENT_INVALID;
  744. case ERROR_ARC_REGISTER_FIELD_NOT_FOUND:
  745. Jim_SetResultFormatted(goi.interp,
  746. "Field `%s' has not been found in register `%s'.",
  747. field_name, reg_name);
  748. return ERROR_COMMAND_ARGUMENT_INVALID;
  749. case ERROR_ARC_FIELD_IS_NOT_BITFIELD:
  750. Jim_SetResultFormatted(goi.interp,
  751. "Field `%s' is not a 'bitfield' field in a structure.",
  752. field_name);
  753. return ERROR_COMMAND_ARGUMENT_INVALID;
  754. default:
  755. /* Pass through other errors. */
  756. return retval;
  757. }
  758. Jim_SetResultInt(interp, value);
  759. return JIM_OK;
  760. }
  761. COMMAND_HANDLER(arc_l1_cache_disable_auto_cmd)
  762. {
  763. bool value;
  764. int retval = 0;
  765. struct arc_common *arc = target_to_arc(get_current_target(CMD_CTX));
  766. retval = CALL_COMMAND_HANDLER(handle_command_parse_bool,
  767. &value, "target has caches enabled");
  768. arc->has_l2cache = value;
  769. arc->has_dcache = value;
  770. arc->has_icache = value;
  771. return retval;
  772. }
  773. COMMAND_HANDLER(arc_l2_cache_disable_auto_cmd)
  774. {
  775. struct arc_common *arc = target_to_arc(get_current_target(CMD_CTX));
  776. return CALL_COMMAND_HANDLER(handle_command_parse_bool,
  777. &arc->has_l2cache, "target has l2 cache enabled");
  778. }
  779. static int jim_handle_actionpoints_num(Jim_Interp *interp, int argc,
  780. Jim_Obj * const *argv)
  781. {
  782. struct jim_getopt_info goi;
  783. jim_getopt_setup(&goi, interp, argc - 1, argv + 1);
  784. LOG_DEBUG("-");
  785. if (goi.argc >= 2) {
  786. Jim_WrongNumArgs(interp, goi.argc, goi.argv, "[<unsigned integer>]");
  787. return JIM_ERR;
  788. }
  789. struct command_context *context = current_command_context(interp);
  790. assert(context);
  791. struct target *target = get_current_target(context);
  792. if (!target) {
  793. Jim_SetResultFormatted(goi.interp, "No current target");
  794. return JIM_ERR;
  795. }
  796. struct arc_common *arc = target_to_arc(target);
  797. /* It is not possible to pass &arc->actionpoints_num directly to
  798. * handle_command_parse_uint, because this value should be valid during
  799. * "actionpoint reset, initiated by arc_set_actionpoints_num. */
  800. uint32_t ap_num = arc->actionpoints_num;
  801. if (goi.argc == 1) {
  802. JIM_CHECK_RETVAL(arc_cmd_jim_get_uint32(&goi, &ap_num));
  803. int e = arc_set_actionpoints_num(target, ap_num);
  804. if (e != ERROR_OK) {
  805. Jim_SetResultFormatted(goi.interp,
  806. "Failed to set number of actionpoints");
  807. return JIM_ERR;
  808. }
  809. }
  810. Jim_SetResultInt(interp, ap_num);
  811. return JIM_OK;
  812. }
  813. /* ----- Exported target commands ------------------------------------------ */
  814. const struct command_registration arc_l2_cache_group_handlers[] = {
  815. {
  816. .name = "auto",
  817. .handler = arc_l2_cache_disable_auto_cmd,
  818. .mode = COMMAND_ANY,
  819. .usage = "(1|0)",
  820. .help = "Disable or enable L2",
  821. },
  822. COMMAND_REGISTRATION_DONE
  823. };
  824. const struct command_registration arc_cache_group_handlers[] = {
  825. {
  826. .name = "auto",
  827. .handler = arc_l1_cache_disable_auto_cmd,
  828. .mode = COMMAND_ANY,
  829. .help = "Disable or enable L1",
  830. .usage = "(1|0)",
  831. },
  832. {
  833. .name = "l2",
  834. .mode = COMMAND_ANY,
  835. .help = "L2 cache command group",
  836. .usage = "",
  837. .chain = arc_l2_cache_group_handlers,
  838. },
  839. COMMAND_REGISTRATION_DONE
  840. };
  841. static const struct command_registration arc_core_command_handlers[] = {
  842. {
  843. .name = "add-reg-type-flags",
  844. .jim_handler = jim_arc_add_reg_type_flags,
  845. .mode = COMMAND_CONFIG,
  846. .usage = "-name <string> -flag <name> <position> "
  847. "[-flag <name> <position>]...",
  848. .help = "Add new 'flags' register data type. Only single bit flags "
  849. "are supported. Type name is global. Bitsize of register is fixed "
  850. "at 32 bits.",
  851. },
  852. {
  853. .name = "add-reg-type-struct",
  854. .jim_handler = jim_arc_add_reg_type_struct,
  855. .mode = COMMAND_CONFIG,
  856. .usage = "-name <string> -bitfield <name> <start> <end> "
  857. "[-bitfield <name> <start> <end>]...",
  858. .help = "Add new 'struct' register data type. Only bit-fields are "
  859. "supported so far, which means that for each bitfield start and end "
  860. "position bits must be specified. GDB also support type-fields, "
  861. "where common type can be used instead. Type name is global. Bitsize of "
  862. "register is fixed at 32 bits.",
  863. },
  864. {
  865. .name = "add-reg",
  866. .jim_handler = jim_arc_add_reg,
  867. .mode = COMMAND_CONFIG,
  868. .usage = "-name <string> -num <int> -feature <string> [-gdbnum <int>] "
  869. "[-core|-bcr] [-type <type_name>] [-g]",
  870. .help = "Add new register. Name, architectural number and feature name "
  871. "are required options. GDB regnum will default to previous register "
  872. "(gdbnum + 1) and shouldn't be specified in most cases. Type "
  873. "defaults to default GDB 'int'.",
  874. },
  875. {
  876. .name = "set-reg-exists",
  877. .handler = arc_set_reg_exists,
  878. .mode = COMMAND_ANY,
  879. .usage = "<register-name> [<register-name>]...",
  880. .help = "Set that register exists. Accepts multiple register names as "
  881. "arguments.",
  882. },
  883. {
  884. .name = "get-reg-field",
  885. .jim_handler = jim_arc_get_reg_field,
  886. .mode = COMMAND_ANY,
  887. .usage = "<regname> <field_name>",
  888. .help = "Returns value of field in a register with 'struct' type.",
  889. },
  890. {
  891. .name = "jtag",
  892. .mode = COMMAND_ANY,
  893. .help = "ARC JTAG specific commands",
  894. .usage = "",
  895. .chain = arc_jtag_command_group,
  896. },
  897. {
  898. .name = "cache",
  899. .mode = COMMAND_ANY,
  900. .help = "cache command group",
  901. .usage = "",
  902. .chain = arc_cache_group_handlers,
  903. },
  904. {
  905. .name = "num-actionpoints",
  906. .jim_handler = jim_handle_actionpoints_num,
  907. .mode = COMMAND_ANY,
  908. .usage = "[<unsigned integer>]",
  909. .help = "Prints or sets amount of actionpoints in the processor.",
  910. },
  911. COMMAND_REGISTRATION_DONE
  912. };
  913. const struct command_registration arc_monitor_command_handlers[] = {
  914. {
  915. .name = "arc",
  916. .mode = COMMAND_ANY,
  917. .help = "ARC monitor command group",
  918. .usage = "",
  919. .chain = arc_core_command_handlers,
  920. },
  921. COMMAND_REGISTRATION_DONE
  922. };