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.
 
 
 
 
 
 

4332 lines
107 KiB

  1. /***************************************************************************
  2. * Copyright (C) 2005 by Dominic Rath *
  3. * Dominic.Rath@gmx.de *
  4. * *
  5. * Copyright (C) 2007,2008 Øyvind Harboe *
  6. * oyvind.harboe@zylin.com *
  7. * *
  8. * Copyright (C) 2008, Duane Ellis *
  9. * openocd@duaneeellis.com *
  10. * *
  11. * Copyright (C) 2008 by Spencer Oliver *
  12. * spen@spen-soft.co.uk *
  13. * *
  14. * Copyright (C) 2008 by Rick Altherr *
  15. * kc8apf@kc8apf.net> *
  16. * *
  17. * This program is free software; you can redistribute it and/or modify *
  18. * it under the terms of the GNU General Public License as published by *
  19. * the Free Software Foundation; either version 2 of the License, or *
  20. * (at your option) any later version. *
  21. * *
  22. * This program is distributed in the hope that it will be useful, *
  23. * but WITHOUT ANY WARRANTY; without even the implied warranty of *
  24. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
  25. * GNU General Public License for more details. *
  26. * *
  27. * You should have received a copy of the GNU General Public License *
  28. * along with this program; if not, write to the *
  29. * Free Software Foundation, Inc., *
  30. * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
  31. ***************************************************************************/
  32. #ifdef HAVE_CONFIG_H
  33. #include "config.h"
  34. #endif
  35. #include "target.h"
  36. #include "target_type.h"
  37. #include "target_request.h"
  38. #include "time_support.h"
  39. #include "register.h"
  40. #include "trace.h"
  41. #include "image.h"
  42. #include "jtag.h"
  43. #include <inttypes.h>
  44. static int handle_targets_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
  45. static int handle_reg_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
  46. static int handle_poll_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
  47. static int handle_halt_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
  48. static int handle_wait_halt_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
  49. static int handle_reset_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
  50. static int handle_soft_reset_halt_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
  51. static int handle_resume_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
  52. static int handle_step_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
  53. static int handle_md_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
  54. static int handle_mw_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
  55. static int handle_load_image_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
  56. static int handle_dump_image_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
  57. static int handle_verify_image_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
  58. static int handle_test_image_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
  59. static int handle_bp_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
  60. static int handle_rbp_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
  61. static int handle_wp_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
  62. static int handle_rwp_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
  63. static int handle_virt2phys_command(command_context_t *cmd_ctx, char *cmd, char **args, int argc);
  64. static int handle_profile_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
  65. static int handle_fast_load_image_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
  66. static int handle_fast_load_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
  67. static int jim_array2mem(Jim_Interp *interp, int argc, Jim_Obj *const *argv);
  68. static int jim_mem2array(Jim_Interp *interp, int argc, Jim_Obj *const *argv);
  69. static int jim_target( Jim_Interp *interp, int argc, Jim_Obj *const *argv);
  70. static int target_array2mem(Jim_Interp *interp, target_t *target, int argc, Jim_Obj *const *argv);
  71. static int target_mem2array(Jim_Interp *interp, target_t *target, int argc, Jim_Obj *const *argv);
  72. /* targets */
  73. extern target_type_t arm7tdmi_target;
  74. extern target_type_t arm720t_target;
  75. extern target_type_t arm9tdmi_target;
  76. extern target_type_t arm920t_target;
  77. extern target_type_t arm966e_target;
  78. extern target_type_t arm926ejs_target;
  79. extern target_type_t feroceon_target;
  80. extern target_type_t xscale_target;
  81. extern target_type_t cortexm3_target;
  82. extern target_type_t cortexa8_target;
  83. extern target_type_t arm11_target;
  84. extern target_type_t mips_m4k_target;
  85. extern target_type_t avr_target;
  86. target_type_t *target_types[] =
  87. {
  88. &arm7tdmi_target,
  89. &arm9tdmi_target,
  90. &arm920t_target,
  91. &arm720t_target,
  92. &arm966e_target,
  93. &arm926ejs_target,
  94. &feroceon_target,
  95. &xscale_target,
  96. &cortexm3_target,
  97. &cortexa8_target,
  98. &arm11_target,
  99. &mips_m4k_target,
  100. &avr_target,
  101. NULL,
  102. };
  103. target_t *all_targets = NULL;
  104. target_event_callback_t *target_event_callbacks = NULL;
  105. target_timer_callback_t *target_timer_callbacks = NULL;
  106. const Jim_Nvp nvp_assert[] = {
  107. { .name = "assert", NVP_ASSERT },
  108. { .name = "deassert", NVP_DEASSERT },
  109. { .name = "T", NVP_ASSERT },
  110. { .name = "F", NVP_DEASSERT },
  111. { .name = "t", NVP_ASSERT },
  112. { .name = "f", NVP_DEASSERT },
  113. { .name = NULL, .value = -1 }
  114. };
  115. const Jim_Nvp nvp_error_target[] = {
  116. { .value = ERROR_TARGET_INVALID, .name = "err-invalid" },
  117. { .value = ERROR_TARGET_INIT_FAILED, .name = "err-init-failed" },
  118. { .value = ERROR_TARGET_TIMEOUT, .name = "err-timeout" },
  119. { .value = ERROR_TARGET_NOT_HALTED, .name = "err-not-halted" },
  120. { .value = ERROR_TARGET_FAILURE, .name = "err-failure" },
  121. { .value = ERROR_TARGET_UNALIGNED_ACCESS , .name = "err-unaligned-access" },
  122. { .value = ERROR_TARGET_DATA_ABORT , .name = "err-data-abort" },
  123. { .value = ERROR_TARGET_RESOURCE_NOT_AVAILABLE , .name = "err-resource-not-available" },
  124. { .value = ERROR_TARGET_TRANSLATION_FAULT , .name = "err-translation-fault" },
  125. { .value = ERROR_TARGET_NOT_RUNNING, .name = "err-not-running" },
  126. { .value = ERROR_TARGET_NOT_EXAMINED, .name = "err-not-examined" },
  127. { .value = -1, .name = NULL }
  128. };
  129. const char *target_strerror_safe( int err )
  130. {
  131. const Jim_Nvp *n;
  132. n = Jim_Nvp_value2name_simple( nvp_error_target, err );
  133. if( n->name == NULL ){
  134. return "unknown";
  135. } else {
  136. return n->name;
  137. }
  138. }
  139. static const Jim_Nvp nvp_target_event[] = {
  140. { .value = TARGET_EVENT_OLD_gdb_program_config , .name = "old-gdb_program_config" },
  141. { .value = TARGET_EVENT_OLD_pre_resume , .name = "old-pre_resume" },
  142. { .value = TARGET_EVENT_EARLY_HALTED, .name = "early-halted" },
  143. { .value = TARGET_EVENT_HALTED, .name = "halted" },
  144. { .value = TARGET_EVENT_RESUMED, .name = "resumed" },
  145. { .value = TARGET_EVENT_RESUME_START, .name = "resume-start" },
  146. { .value = TARGET_EVENT_RESUME_END, .name = "resume-end" },
  147. { .name = "gdb-start", .value = TARGET_EVENT_GDB_START },
  148. { .name = "gdb-end", .value = TARGET_EVENT_GDB_END },
  149. /* historical name */
  150. { .value = TARGET_EVENT_RESET_START, .name = "reset-start" },
  151. { .value = TARGET_EVENT_RESET_ASSERT_PRE, .name = "reset-assert-pre" },
  152. { .value = TARGET_EVENT_RESET_ASSERT_POST, .name = "reset-assert-post" },
  153. { .value = TARGET_EVENT_RESET_DEASSERT_PRE, .name = "reset-deassert-pre" },
  154. { .value = TARGET_EVENT_RESET_DEASSERT_POST, .name = "reset-deassert-post" },
  155. { .value = TARGET_EVENT_RESET_HALT_PRE, .name = "reset-halt-pre" },
  156. { .value = TARGET_EVENT_RESET_HALT_POST, .name = "reset-halt-post" },
  157. { .value = TARGET_EVENT_RESET_WAIT_PRE, .name = "reset-wait-pre" },
  158. { .value = TARGET_EVENT_RESET_WAIT_POST, .name = "reset-wait-post" },
  159. { .value = TARGET_EVENT_RESET_INIT , .name = "reset-init" },
  160. { .value = TARGET_EVENT_RESET_END, .name = "reset-end" },
  161. { .value = TARGET_EVENT_EXAMINE_START, .name = "examine-start" },
  162. { .value = TARGET_EVENT_EXAMINE_END, .name = "examine-end" },
  163. { .value = TARGET_EVENT_DEBUG_HALTED, .name = "debug-halted" },
  164. { .value = TARGET_EVENT_DEBUG_RESUMED, .name = "debug-resumed" },
  165. { .value = TARGET_EVENT_GDB_ATTACH, .name = "gdb-attach" },
  166. { .value = TARGET_EVENT_GDB_DETACH, .name = "gdb-detach" },
  167. { .value = TARGET_EVENT_GDB_FLASH_WRITE_START, .name = "gdb-flash-write-start" },
  168. { .value = TARGET_EVENT_GDB_FLASH_WRITE_END , .name = "gdb-flash-write-end" },
  169. { .value = TARGET_EVENT_GDB_FLASH_ERASE_START, .name = "gdb-flash-erase-start" },
  170. { .value = TARGET_EVENT_GDB_FLASH_ERASE_END , .name = "gdb-flash-erase-end" },
  171. { .value = TARGET_EVENT_RESUME_START, .name = "resume-start" },
  172. { .value = TARGET_EVENT_RESUMED , .name = "resume-ok" },
  173. { .value = TARGET_EVENT_RESUME_END , .name = "resume-end" },
  174. { .name = NULL, .value = -1 }
  175. };
  176. const Jim_Nvp nvp_target_state[] = {
  177. { .name = "unknown", .value = TARGET_UNKNOWN },
  178. { .name = "running", .value = TARGET_RUNNING },
  179. { .name = "halted", .value = TARGET_HALTED },
  180. { .name = "reset", .value = TARGET_RESET },
  181. { .name = "debug-running", .value = TARGET_DEBUG_RUNNING },
  182. { .name = NULL, .value = -1 },
  183. };
  184. const Jim_Nvp nvp_target_debug_reason [] = {
  185. { .name = "debug-request" , .value = DBG_REASON_DBGRQ },
  186. { .name = "breakpoint" , .value = DBG_REASON_BREAKPOINT },
  187. { .name = "watchpoint" , .value = DBG_REASON_WATCHPOINT },
  188. { .name = "watchpoint-and-breakpoint", .value = DBG_REASON_WPTANDBKPT },
  189. { .name = "single-step" , .value = DBG_REASON_SINGLESTEP },
  190. { .name = "target-not-halted" , .value = DBG_REASON_NOTHALTED },
  191. { .name = "undefined" , .value = DBG_REASON_UNDEFINED },
  192. { .name = NULL, .value = -1 },
  193. };
  194. const Jim_Nvp nvp_target_endian[] = {
  195. { .name = "big", .value = TARGET_BIG_ENDIAN },
  196. { .name = "little", .value = TARGET_LITTLE_ENDIAN },
  197. { .name = "be", .value = TARGET_BIG_ENDIAN },
  198. { .name = "le", .value = TARGET_LITTLE_ENDIAN },
  199. { .name = NULL, .value = -1 },
  200. };
  201. const Jim_Nvp nvp_reset_modes[] = {
  202. { .name = "unknown", .value = RESET_UNKNOWN },
  203. { .name = "run" , .value = RESET_RUN },
  204. { .name = "halt" , .value = RESET_HALT },
  205. { .name = "init" , .value = RESET_INIT },
  206. { .name = NULL , .value = -1 },
  207. };
  208. static int max_target_number(void)
  209. {
  210. target_t *t;
  211. int x;
  212. x = -1;
  213. t = all_targets;
  214. while( t ){
  215. if( x < t->target_number ){
  216. x = (t->target_number)+1;
  217. }
  218. t = t->next;
  219. }
  220. return x;
  221. }
  222. /* determine the number of the new target */
  223. static int new_target_number(void)
  224. {
  225. target_t *t;
  226. int x;
  227. /* number is 0 based */
  228. x = -1;
  229. t = all_targets;
  230. while(t){
  231. if( x < t->target_number ){
  232. x = t->target_number;
  233. }
  234. t = t->next;
  235. }
  236. return x+1;
  237. }
  238. static int target_continous_poll = 1;
  239. /* read a u32 from a buffer in target memory endianness */
  240. u32 target_buffer_get_u32(target_t *target, const u8 *buffer)
  241. {
  242. if (target->endianness == TARGET_LITTLE_ENDIAN)
  243. return le_to_h_u32(buffer);
  244. else
  245. return be_to_h_u32(buffer);
  246. }
  247. /* read a u16 from a buffer in target memory endianness */
  248. u16 target_buffer_get_u16(target_t *target, const u8 *buffer)
  249. {
  250. if (target->endianness == TARGET_LITTLE_ENDIAN)
  251. return le_to_h_u16(buffer);
  252. else
  253. return be_to_h_u16(buffer);
  254. }
  255. /* read a u8 from a buffer in target memory endianness */
  256. u8 target_buffer_get_u8(target_t *target, const u8 *buffer)
  257. {
  258. return *buffer & 0x0ff;
  259. }
  260. /* write a u32 to a buffer in target memory endianness */
  261. void target_buffer_set_u32(target_t *target, u8 *buffer, u32 value)
  262. {
  263. if (target->endianness == TARGET_LITTLE_ENDIAN)
  264. h_u32_to_le(buffer, value);
  265. else
  266. h_u32_to_be(buffer, value);
  267. }
  268. /* write a u16 to a buffer in target memory endianness */
  269. void target_buffer_set_u16(target_t *target, u8 *buffer, u16 value)
  270. {
  271. if (target->endianness == TARGET_LITTLE_ENDIAN)
  272. h_u16_to_le(buffer, value);
  273. else
  274. h_u16_to_be(buffer, value);
  275. }
  276. /* write a u8 to a buffer in target memory endianness */
  277. void target_buffer_set_u8(target_t *target, u8 *buffer, u8 value)
  278. {
  279. *buffer = value;
  280. }
  281. /* return a pointer to a configured target; id is name or number */
  282. target_t *get_target(const char *id)
  283. {
  284. target_t *target;
  285. char *endptr;
  286. int num;
  287. /* try as tcltarget name */
  288. for (target = all_targets; target; target = target->next) {
  289. if (target->cmd_name == NULL)
  290. continue;
  291. if (strcmp(id, target->cmd_name) == 0)
  292. return target;
  293. }
  294. /* no match, try as number */
  295. num = strtoul(id, &endptr, 0);
  296. if (*endptr != 0)
  297. return NULL;
  298. for (target = all_targets; target; target = target->next) {
  299. if (target->target_number == num)
  300. return target;
  301. }
  302. return NULL;
  303. }
  304. /* returns a pointer to the n-th configured target */
  305. static target_t *get_target_by_num(int num)
  306. {
  307. target_t *target = all_targets;
  308. while (target){
  309. if( target->target_number == num ){
  310. return target;
  311. }
  312. target = target->next;
  313. }
  314. return NULL;
  315. }
  316. int get_num_by_target(target_t *query_target)
  317. {
  318. return query_target->target_number;
  319. }
  320. target_t* get_current_target(command_context_t *cmd_ctx)
  321. {
  322. target_t *target = get_target_by_num(cmd_ctx->current_target);
  323. if (target == NULL)
  324. {
  325. LOG_ERROR("BUG: current_target out of bounds");
  326. exit(-1);
  327. }
  328. return target;
  329. }
  330. int target_poll(struct target_s *target)
  331. {
  332. /* We can't poll until after examine */
  333. if (!target_was_examined(target))
  334. {
  335. /* Fail silently lest we pollute the log */
  336. return ERROR_FAIL;
  337. }
  338. return target->type->poll(target);
  339. }
  340. int target_halt(struct target_s *target)
  341. {
  342. /* We can't poll until after examine */
  343. if (!target_was_examined(target))
  344. {
  345. LOG_ERROR("Target not examined yet");
  346. return ERROR_FAIL;
  347. }
  348. return target->type->halt(target);
  349. }
  350. int target_resume(struct target_s *target, int current, u32 address, int handle_breakpoints, int debug_execution)
  351. {
  352. int retval;
  353. /* We can't poll until after examine */
  354. if (!target_was_examined(target))
  355. {
  356. LOG_ERROR("Target not examined yet");
  357. return ERROR_FAIL;
  358. }
  359. /* note that resume *must* be asynchronous. The CPU can halt before we poll. The CPU can
  360. * even halt at the current PC as a result of a software breakpoint being inserted by (a bug?)
  361. * the application.
  362. */
  363. if ((retval = target->type->resume(target, current, address, handle_breakpoints, debug_execution)) != ERROR_OK)
  364. return retval;
  365. return retval;
  366. }
  367. int target_process_reset(struct command_context_s *cmd_ctx, enum target_reset_mode reset_mode)
  368. {
  369. char buf[100];
  370. int retval;
  371. Jim_Nvp *n;
  372. n = Jim_Nvp_value2name_simple( nvp_reset_modes, reset_mode );
  373. if( n->name == NULL ){
  374. LOG_ERROR("invalid reset mode");
  375. return ERROR_FAIL;
  376. }
  377. sprintf( buf, "ocd_process_reset %s", n->name );
  378. retval = Jim_Eval( interp, buf );
  379. if(retval != JIM_OK) {
  380. Jim_PrintErrorMessage(interp);
  381. return ERROR_FAIL;
  382. }
  383. /* We want any events to be processed before the prompt */
  384. retval = target_call_timer_callbacks_now();
  385. return retval;
  386. }
  387. static int default_virt2phys(struct target_s *target, u32 virtual, u32 *physical)
  388. {
  389. *physical = virtual;
  390. return ERROR_OK;
  391. }
  392. static int default_mmu(struct target_s *target, int *enabled)
  393. {
  394. *enabled = 0;
  395. return ERROR_OK;
  396. }
  397. static int default_examine(struct target_s *target)
  398. {
  399. target_set_examined(target);
  400. return ERROR_OK;
  401. }
  402. int target_examine_one(struct target_s *target)
  403. {
  404. return target->type->examine(target);
  405. }
  406. /* Targets that correctly implement init+examine, i.e.
  407. * no communication with target during init:
  408. *
  409. * XScale
  410. */
  411. int target_examine(void)
  412. {
  413. int retval = ERROR_OK;
  414. target_t *target = all_targets;
  415. while (target)
  416. {
  417. if ((retval = target_examine_one(target)) != ERROR_OK)
  418. return retval;
  419. target = target->next;
  420. }
  421. return retval;
  422. }
  423. const char *target_get_name(struct target_s *target)
  424. {
  425. return target->type->name;
  426. }
  427. static int target_write_memory_imp(struct target_s *target, u32 address, u32 size, u32 count, u8 *buffer)
  428. {
  429. if (!target_was_examined(target))
  430. {
  431. LOG_ERROR("Target not examined yet");
  432. return ERROR_FAIL;
  433. }
  434. return target->type->write_memory_imp(target, address, size, count, buffer);
  435. }
  436. static int target_read_memory_imp(struct target_s *target, u32 address, u32 size, u32 count, u8 *buffer)
  437. {
  438. if (!target_was_examined(target))
  439. {
  440. LOG_ERROR("Target not examined yet");
  441. return ERROR_FAIL;
  442. }
  443. return target->type->read_memory_imp(target, address, size, count, buffer);
  444. }
  445. static int target_soft_reset_halt_imp(struct target_s *target)
  446. {
  447. if (!target_was_examined(target))
  448. {
  449. LOG_ERROR("Target not examined yet");
  450. return ERROR_FAIL;
  451. }
  452. return target->type->soft_reset_halt_imp(target);
  453. }
  454. static int target_run_algorithm_imp(struct target_s *target, int num_mem_params, mem_param_t *mem_params, int num_reg_params, reg_param_t *reg_param, u32 entry_point, u32 exit_point, int timeout_ms, void *arch_info)
  455. {
  456. if (!target_was_examined(target))
  457. {
  458. LOG_ERROR("Target not examined yet");
  459. return ERROR_FAIL;
  460. }
  461. return target->type->run_algorithm_imp(target, num_mem_params, mem_params, num_reg_params, reg_param, entry_point, exit_point, timeout_ms, arch_info);
  462. }
  463. int target_read_memory(struct target_s *target,
  464. u32 address, u32 size, u32 count, u8 *buffer)
  465. {
  466. return target->type->read_memory(target, address, size, count, buffer);
  467. }
  468. int target_write_memory(struct target_s *target,
  469. u32 address, u32 size, u32 count, u8 *buffer)
  470. {
  471. return target->type->write_memory(target, address, size, count, buffer);
  472. }
  473. int target_bulk_write_memory(struct target_s *target,
  474. u32 address, u32 count, u8 *buffer)
  475. {
  476. return target->type->bulk_write_memory(target, address, count, buffer);
  477. }
  478. int target_add_breakpoint(struct target_s *target,
  479. struct breakpoint_s *breakpoint)
  480. {
  481. return target->type->add_breakpoint(target, breakpoint);
  482. }
  483. int target_remove_breakpoint(struct target_s *target,
  484. struct breakpoint_s *breakpoint)
  485. {
  486. return target->type->remove_breakpoint(target, breakpoint);
  487. }
  488. int target_add_watchpoint(struct target_s *target,
  489. struct watchpoint_s *watchpoint)
  490. {
  491. return target->type->add_watchpoint(target, watchpoint);
  492. }
  493. int target_remove_watchpoint(struct target_s *target,
  494. struct watchpoint_s *watchpoint)
  495. {
  496. return target->type->remove_watchpoint(target, watchpoint);
  497. }
  498. int target_get_gdb_reg_list(struct target_s *target,
  499. struct reg_s **reg_list[], int *reg_list_size)
  500. {
  501. return target->type->get_gdb_reg_list(target, reg_list, reg_list_size);
  502. }
  503. int target_step(struct target_s *target,
  504. int current, u32 address, int handle_breakpoints)
  505. {
  506. return target->type->step(target, current, address, handle_breakpoints);
  507. }
  508. int target_run_algorithm(struct target_s *target,
  509. int num_mem_params, mem_param_t *mem_params,
  510. int num_reg_params, reg_param_t *reg_param,
  511. u32 entry_point, u32 exit_point,
  512. int timeout_ms, void *arch_info)
  513. {
  514. return target->type->run_algorithm(target,
  515. num_mem_params, mem_params, num_reg_params, reg_param,
  516. entry_point, exit_point, timeout_ms, arch_info);
  517. }
  518. /// @returns @c true if the target has been examined.
  519. bool target_was_examined(struct target_s *target)
  520. {
  521. return target->type->examined;
  522. }
  523. /// Sets the @c examined flag for the given target.
  524. void target_set_examined(struct target_s *target)
  525. {
  526. target->type->examined = true;
  527. }
  528. // Reset the @c examined flag for the given target.
  529. void target_reset_examined(struct target_s *target)
  530. {
  531. target->type->examined = false;
  532. }
  533. int target_init(struct command_context_s *cmd_ctx)
  534. {
  535. target_t *target = all_targets;
  536. int retval;
  537. while (target)
  538. {
  539. target_reset_examined(target);
  540. if (target->type->examine == NULL)
  541. {
  542. target->type->examine = default_examine;
  543. }
  544. if ((retval = target->type->init_target(cmd_ctx, target)) != ERROR_OK)
  545. {
  546. LOG_ERROR("target '%s' init failed", target_get_name(target));
  547. return retval;
  548. }
  549. /* Set up default functions if none are provided by target */
  550. if (target->type->virt2phys == NULL)
  551. {
  552. target->type->virt2phys = default_virt2phys;
  553. }
  554. target->type->virt2phys = default_virt2phys;
  555. /* a non-invasive way(in terms of patches) to add some code that
  556. * runs before the type->write/read_memory implementation
  557. */
  558. target->type->write_memory_imp = target->type->write_memory;
  559. target->type->write_memory = target_write_memory_imp;
  560. target->type->read_memory_imp = target->type->read_memory;
  561. target->type->read_memory = target_read_memory_imp;
  562. target->type->soft_reset_halt_imp = target->type->soft_reset_halt;
  563. target->type->soft_reset_halt = target_soft_reset_halt_imp;
  564. target->type->run_algorithm_imp = target->type->run_algorithm;
  565. target->type->run_algorithm = target_run_algorithm_imp;
  566. if (target->type->mmu == NULL)
  567. {
  568. target->type->mmu = default_mmu;
  569. }
  570. target = target->next;
  571. }
  572. if (all_targets)
  573. {
  574. if((retval = target_register_user_commands(cmd_ctx)) != ERROR_OK)
  575. return retval;
  576. if((retval = target_register_timer_callback(handle_target, 100, 1, NULL)) != ERROR_OK)
  577. return retval;
  578. }
  579. return ERROR_OK;
  580. }
  581. int target_register_event_callback(int (*callback)(struct target_s *target, enum target_event event, void *priv), void *priv)
  582. {
  583. target_event_callback_t **callbacks_p = &target_event_callbacks;
  584. if (callback == NULL)
  585. {
  586. return ERROR_INVALID_ARGUMENTS;
  587. }
  588. if (*callbacks_p)
  589. {
  590. while ((*callbacks_p)->next)
  591. callbacks_p = &((*callbacks_p)->next);
  592. callbacks_p = &((*callbacks_p)->next);
  593. }
  594. (*callbacks_p) = malloc(sizeof(target_event_callback_t));
  595. (*callbacks_p)->callback = callback;
  596. (*callbacks_p)->priv = priv;
  597. (*callbacks_p)->next = NULL;
  598. return ERROR_OK;
  599. }
  600. int target_register_timer_callback(int (*callback)(void *priv), int time_ms, int periodic, void *priv)
  601. {
  602. target_timer_callback_t **callbacks_p = &target_timer_callbacks;
  603. struct timeval now;
  604. if (callback == NULL)
  605. {
  606. return ERROR_INVALID_ARGUMENTS;
  607. }
  608. if (*callbacks_p)
  609. {
  610. while ((*callbacks_p)->next)
  611. callbacks_p = &((*callbacks_p)->next);
  612. callbacks_p = &((*callbacks_p)->next);
  613. }
  614. (*callbacks_p) = malloc(sizeof(target_timer_callback_t));
  615. (*callbacks_p)->callback = callback;
  616. (*callbacks_p)->periodic = periodic;
  617. (*callbacks_p)->time_ms = time_ms;
  618. gettimeofday(&now, NULL);
  619. (*callbacks_p)->when.tv_usec = now.tv_usec + (time_ms % 1000) * 1000;
  620. time_ms -= (time_ms % 1000);
  621. (*callbacks_p)->when.tv_sec = now.tv_sec + (time_ms / 1000);
  622. if ((*callbacks_p)->when.tv_usec > 1000000)
  623. {
  624. (*callbacks_p)->when.tv_usec = (*callbacks_p)->when.tv_usec - 1000000;
  625. (*callbacks_p)->when.tv_sec += 1;
  626. }
  627. (*callbacks_p)->priv = priv;
  628. (*callbacks_p)->next = NULL;
  629. return ERROR_OK;
  630. }
  631. int target_unregister_event_callback(int (*callback)(struct target_s *target, enum target_event event, void *priv), void *priv)
  632. {
  633. target_event_callback_t **p = &target_event_callbacks;
  634. target_event_callback_t *c = target_event_callbacks;
  635. if (callback == NULL)
  636. {
  637. return ERROR_INVALID_ARGUMENTS;
  638. }
  639. while (c)
  640. {
  641. target_event_callback_t *next = c->next;
  642. if ((c->callback == callback) && (c->priv == priv))
  643. {
  644. *p = next;
  645. free(c);
  646. return ERROR_OK;
  647. }
  648. else
  649. p = &(c->next);
  650. c = next;
  651. }
  652. return ERROR_OK;
  653. }
  654. int target_unregister_timer_callback(int (*callback)(void *priv), void *priv)
  655. {
  656. target_timer_callback_t **p = &target_timer_callbacks;
  657. target_timer_callback_t *c = target_timer_callbacks;
  658. if (callback == NULL)
  659. {
  660. return ERROR_INVALID_ARGUMENTS;
  661. }
  662. while (c)
  663. {
  664. target_timer_callback_t *next = c->next;
  665. if ((c->callback == callback) && (c->priv == priv))
  666. {
  667. *p = next;
  668. free(c);
  669. return ERROR_OK;
  670. }
  671. else
  672. p = &(c->next);
  673. c = next;
  674. }
  675. return ERROR_OK;
  676. }
  677. int target_call_event_callbacks(target_t *target, enum target_event event)
  678. {
  679. target_event_callback_t *callback = target_event_callbacks;
  680. target_event_callback_t *next_callback;
  681. if (event == TARGET_EVENT_HALTED)
  682. {
  683. /* execute early halted first */
  684. target_call_event_callbacks(target, TARGET_EVENT_EARLY_HALTED);
  685. }
  686. LOG_DEBUG("target event %i (%s)",
  687. event,
  688. Jim_Nvp_value2name_simple( nvp_target_event, event )->name );
  689. target_handle_event( target, event );
  690. while (callback)
  691. {
  692. next_callback = callback->next;
  693. callback->callback(target, event, callback->priv);
  694. callback = next_callback;
  695. }
  696. return ERROR_OK;
  697. }
  698. static int target_call_timer_callbacks_check_time(int checktime)
  699. {
  700. target_timer_callback_t *callback = target_timer_callbacks;
  701. target_timer_callback_t *next_callback;
  702. struct timeval now;
  703. keep_alive();
  704. gettimeofday(&now, NULL);
  705. while (callback)
  706. {
  707. next_callback = callback->next;
  708. if ((!checktime&&callback->periodic)||
  709. (((now.tv_sec >= callback->when.tv_sec) && (now.tv_usec >= callback->when.tv_usec))
  710. || (now.tv_sec > callback->when.tv_sec)))
  711. {
  712. if(callback->callback != NULL)
  713. {
  714. callback->callback(callback->priv);
  715. if (callback->periodic)
  716. {
  717. int time_ms = callback->time_ms;
  718. callback->when.tv_usec = now.tv_usec + (time_ms % 1000) * 1000;
  719. time_ms -= (time_ms % 1000);
  720. callback->when.tv_sec = now.tv_sec + time_ms / 1000;
  721. if (callback->when.tv_usec > 1000000)
  722. {
  723. callback->when.tv_usec = callback->when.tv_usec - 1000000;
  724. callback->when.tv_sec += 1;
  725. }
  726. }
  727. else
  728. {
  729. int retval;
  730. if((retval = target_unregister_timer_callback(callback->callback, callback->priv)) != ERROR_OK)
  731. return retval;
  732. }
  733. }
  734. }
  735. callback = next_callback;
  736. }
  737. return ERROR_OK;
  738. }
  739. int target_call_timer_callbacks(void)
  740. {
  741. return target_call_timer_callbacks_check_time(1);
  742. }
  743. /* invoke periodic callbacks immediately */
  744. int target_call_timer_callbacks_now(void)
  745. {
  746. return target_call_timer_callbacks_check_time(0);
  747. }
  748. int target_alloc_working_area(struct target_s *target, u32 size, working_area_t **area)
  749. {
  750. working_area_t *c = target->working_areas;
  751. working_area_t *new_wa = NULL;
  752. /* Reevaluate working area address based on MMU state*/
  753. if (target->working_areas == NULL)
  754. {
  755. int retval;
  756. int enabled;
  757. retval = target->type->mmu(target, &enabled);
  758. if (retval != ERROR_OK)
  759. {
  760. return retval;
  761. }
  762. if (enabled)
  763. {
  764. target->working_area = target->working_area_virt;
  765. }
  766. else
  767. {
  768. target->working_area = target->working_area_phys;
  769. }
  770. }
  771. /* only allocate multiples of 4 byte */
  772. if (size % 4)
  773. {
  774. LOG_ERROR("BUG: code tried to allocate unaligned number of bytes, padding");
  775. size = CEIL(size, 4);
  776. }
  777. /* see if there's already a matching working area */
  778. while (c)
  779. {
  780. if ((c->free) && (c->size == size))
  781. {
  782. new_wa = c;
  783. break;
  784. }
  785. c = c->next;
  786. }
  787. /* if not, allocate a new one */
  788. if (!new_wa)
  789. {
  790. working_area_t **p = &target->working_areas;
  791. u32 first_free = target->working_area;
  792. u32 free_size = target->working_area_size;
  793. LOG_DEBUG("allocating new working area");
  794. c = target->working_areas;
  795. while (c)
  796. {
  797. first_free += c->size;
  798. free_size -= c->size;
  799. p = &c->next;
  800. c = c->next;
  801. }
  802. if (free_size < size)
  803. {
  804. LOG_WARNING("not enough working area available(requested %d, free %d)", size, free_size);
  805. return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
  806. }
  807. new_wa = malloc(sizeof(working_area_t));
  808. new_wa->next = NULL;
  809. new_wa->size = size;
  810. new_wa->address = first_free;
  811. if (target->backup_working_area)
  812. {
  813. int retval;
  814. new_wa->backup = malloc(new_wa->size);
  815. if((retval = target_read_memory(target, new_wa->address, 4, new_wa->size / 4, new_wa->backup)) != ERROR_OK)
  816. {
  817. free(new_wa->backup);
  818. free(new_wa);
  819. return retval;
  820. }
  821. }
  822. else
  823. {
  824. new_wa->backup = NULL;
  825. }
  826. /* put new entry in list */
  827. *p = new_wa;
  828. }
  829. /* mark as used, and return the new (reused) area */
  830. new_wa->free = 0;
  831. *area = new_wa;
  832. /* user pointer */
  833. new_wa->user = area;
  834. return ERROR_OK;
  835. }
  836. int target_free_working_area_restore(struct target_s *target, working_area_t *area, int restore)
  837. {
  838. if (area->free)
  839. return ERROR_OK;
  840. if (restore&&target->backup_working_area)
  841. {
  842. int retval;
  843. if((retval = target_write_memory(target, area->address, 4, area->size / 4, area->backup)) != ERROR_OK)
  844. return retval;
  845. }
  846. area->free = 1;
  847. /* mark user pointer invalid */
  848. *area->user = NULL;
  849. area->user = NULL;
  850. return ERROR_OK;
  851. }
  852. int target_free_working_area(struct target_s *target, working_area_t *area)
  853. {
  854. return target_free_working_area_restore(target, area, 1);
  855. }
  856. /* free resources and restore memory, if restoring memory fails,
  857. * free up resources anyway
  858. */
  859. void target_free_all_working_areas_restore(struct target_s *target, int restore)
  860. {
  861. working_area_t *c = target->working_areas;
  862. while (c)
  863. {
  864. working_area_t *next = c->next;
  865. target_free_working_area_restore(target, c, restore);
  866. if (c->backup)
  867. free(c->backup);
  868. free(c);
  869. c = next;
  870. }
  871. target->working_areas = NULL;
  872. }
  873. void target_free_all_working_areas(struct target_s *target)
  874. {
  875. target_free_all_working_areas_restore(target, 1);
  876. }
  877. int target_register_commands(struct command_context_s *cmd_ctx)
  878. {
  879. register_command(cmd_ctx, NULL, "targets", handle_targets_command, COMMAND_EXEC, "change the current command line target (one parameter) or lists targets (with no parameter)");
  880. register_jim(cmd_ctx, "target", jim_target, "configure target" );
  881. return ERROR_OK;
  882. }
  883. int target_arch_state(struct target_s *target)
  884. {
  885. int retval;
  886. if (target==NULL)
  887. {
  888. LOG_USER("No target has been configured");
  889. return ERROR_OK;
  890. }
  891. LOG_USER("target state: %s",
  892. Jim_Nvp_value2name_simple(nvp_target_state,target->state)->name);
  893. if (target->state!=TARGET_HALTED)
  894. return ERROR_OK;
  895. retval=target->type->arch_state(target);
  896. return retval;
  897. }
  898. /* Single aligned words are guaranteed to use 16 or 32 bit access
  899. * mode respectively, otherwise data is handled as quickly as
  900. * possible
  901. */
  902. int target_write_buffer(struct target_s *target, u32 address, u32 size, u8 *buffer)
  903. {
  904. int retval;
  905. LOG_DEBUG("writing buffer of %i byte at 0x%8.8x", size, address);
  906. if (!target_was_examined(target))
  907. {
  908. LOG_ERROR("Target not examined yet");
  909. return ERROR_FAIL;
  910. }
  911. if (size == 0) {
  912. return ERROR_OK;
  913. }
  914. if ((address + size - 1) < address)
  915. {
  916. /* GDB can request this when e.g. PC is 0xfffffffc*/
  917. LOG_ERROR("address+size wrapped(0x%08x, 0x%08x)", address, size);
  918. return ERROR_FAIL;
  919. }
  920. if (((address % 2) == 0) && (size == 2))
  921. {
  922. return target_write_memory(target, address, 2, 1, buffer);
  923. }
  924. /* handle unaligned head bytes */
  925. if (address % 4)
  926. {
  927. u32 unaligned = 4 - (address % 4);
  928. if (unaligned > size)
  929. unaligned = size;
  930. if ((retval = target_write_memory(target, address, 1, unaligned, buffer)) != ERROR_OK)
  931. return retval;
  932. buffer += unaligned;
  933. address += unaligned;
  934. size -= unaligned;
  935. }
  936. /* handle aligned words */
  937. if (size >= 4)
  938. {
  939. int aligned = size - (size % 4);
  940. /* use bulk writes above a certain limit. This may have to be changed */
  941. if (aligned > 128)
  942. {
  943. if ((retval = target->type->bulk_write_memory(target, address, aligned / 4, buffer)) != ERROR_OK)
  944. return retval;
  945. }
  946. else
  947. {
  948. if ((retval = target_write_memory(target, address, 4, aligned / 4, buffer)) != ERROR_OK)
  949. return retval;
  950. }
  951. buffer += aligned;
  952. address += aligned;
  953. size -= aligned;
  954. }
  955. /* handle tail writes of less than 4 bytes */
  956. if (size > 0)
  957. {
  958. if ((retval = target_write_memory(target, address, 1, size, buffer)) != ERROR_OK)
  959. return retval;
  960. }
  961. return ERROR_OK;
  962. }
  963. /* Single aligned words are guaranteed to use 16 or 32 bit access
  964. * mode respectively, otherwise data is handled as quickly as
  965. * possible
  966. */
  967. int target_read_buffer(struct target_s *target, u32 address, u32 size, u8 *buffer)
  968. {
  969. int retval;
  970. LOG_DEBUG("reading buffer of %i byte at 0x%8.8x", size, address);
  971. if (!target_was_examined(target))
  972. {
  973. LOG_ERROR("Target not examined yet");
  974. return ERROR_FAIL;
  975. }
  976. if (size == 0) {
  977. return ERROR_OK;
  978. }
  979. if ((address + size - 1) < address)
  980. {
  981. /* GDB can request this when e.g. PC is 0xfffffffc*/
  982. LOG_ERROR("address+size wrapped(0x%08x, 0x%08x)", address, size);
  983. return ERROR_FAIL;
  984. }
  985. if (((address % 2) == 0) && (size == 2))
  986. {
  987. return target_read_memory(target, address, 2, 1, buffer);
  988. }
  989. /* handle unaligned head bytes */
  990. if (address % 4)
  991. {
  992. u32 unaligned = 4 - (address % 4);
  993. if (unaligned > size)
  994. unaligned = size;
  995. if ((retval = target_read_memory(target, address, 1, unaligned, buffer)) != ERROR_OK)
  996. return retval;
  997. buffer += unaligned;
  998. address += unaligned;
  999. size -= unaligned;
  1000. }
  1001. /* handle aligned words */
  1002. if (size >= 4)
  1003. {
  1004. int aligned = size - (size % 4);
  1005. if ((retval = target_read_memory(target, address, 4, aligned / 4, buffer)) != ERROR_OK)
  1006. return retval;
  1007. buffer += aligned;
  1008. address += aligned;
  1009. size -= aligned;
  1010. }
  1011. /* handle tail writes of less than 4 bytes */
  1012. if (size > 0)
  1013. {
  1014. if ((retval = target_read_memory(target, address, 1, size, buffer)) != ERROR_OK)
  1015. return retval;
  1016. }
  1017. return ERROR_OK;
  1018. }
  1019. int target_checksum_memory(struct target_s *target, u32 address, u32 size, u32* crc)
  1020. {
  1021. u8 *buffer;
  1022. int retval;
  1023. u32 i;
  1024. u32 checksum = 0;
  1025. if (!target_was_examined(target))
  1026. {
  1027. LOG_ERROR("Target not examined yet");
  1028. return ERROR_FAIL;
  1029. }
  1030. if ((retval = target->type->checksum_memory(target, address,
  1031. size, &checksum)) != ERROR_OK)
  1032. {
  1033. buffer = malloc(size);
  1034. if (buffer == NULL)
  1035. {
  1036. LOG_ERROR("error allocating buffer for section (%d bytes)", size);
  1037. return ERROR_INVALID_ARGUMENTS;
  1038. }
  1039. retval = target_read_buffer(target, address, size, buffer);
  1040. if (retval != ERROR_OK)
  1041. {
  1042. free(buffer);
  1043. return retval;
  1044. }
  1045. /* convert to target endianess */
  1046. for (i = 0; i < (size/sizeof(u32)); i++)
  1047. {
  1048. u32 target_data;
  1049. target_data = target_buffer_get_u32(target, &buffer[i*sizeof(u32)]);
  1050. target_buffer_set_u32(target, &buffer[i*sizeof(u32)], target_data);
  1051. }
  1052. retval = image_calculate_checksum( buffer, size, &checksum );
  1053. free(buffer);
  1054. }
  1055. *crc = checksum;
  1056. return retval;
  1057. }
  1058. int target_blank_check_memory(struct target_s *target, u32 address, u32 size, u32* blank)
  1059. {
  1060. int retval;
  1061. if (!target_was_examined(target))
  1062. {
  1063. LOG_ERROR("Target not examined yet");
  1064. return ERROR_FAIL;
  1065. }
  1066. if (target->type->blank_check_memory == 0)
  1067. return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
  1068. retval = target->type->blank_check_memory(target, address, size, blank);
  1069. return retval;
  1070. }
  1071. int target_read_u32(struct target_s *target, u32 address, u32 *value)
  1072. {
  1073. u8 value_buf[4];
  1074. if (!target_was_examined(target))
  1075. {
  1076. LOG_ERROR("Target not examined yet");
  1077. return ERROR_FAIL;
  1078. }
  1079. int retval = target_read_memory(target, address, 4, 1, value_buf);
  1080. if (retval == ERROR_OK)
  1081. {
  1082. *value = target_buffer_get_u32(target, value_buf);
  1083. LOG_DEBUG("address: 0x%8.8x, value: 0x%8.8x", address, *value);
  1084. }
  1085. else
  1086. {
  1087. *value = 0x0;
  1088. LOG_DEBUG("address: 0x%8.8x failed", address);
  1089. }
  1090. return retval;
  1091. }
  1092. int target_read_u16(struct target_s *target, u32 address, u16 *value)
  1093. {
  1094. u8 value_buf[2];
  1095. if (!target_was_examined(target))
  1096. {
  1097. LOG_ERROR("Target not examined yet");
  1098. return ERROR_FAIL;
  1099. }
  1100. int retval = target_read_memory(target, address, 2, 1, value_buf);
  1101. if (retval == ERROR_OK)
  1102. {
  1103. *value = target_buffer_get_u16(target, value_buf);
  1104. LOG_DEBUG("address: 0x%8.8x, value: 0x%4.4x", address, *value);
  1105. }
  1106. else
  1107. {
  1108. *value = 0x0;
  1109. LOG_DEBUG("address: 0x%8.8x failed", address);
  1110. }
  1111. return retval;
  1112. }
  1113. int target_read_u8(struct target_s *target, u32 address, u8 *value)
  1114. {
  1115. int retval = target_read_memory(target, address, 1, 1, value);
  1116. if (!target_was_examined(target))
  1117. {
  1118. LOG_ERROR("Target not examined yet");
  1119. return ERROR_FAIL;
  1120. }
  1121. if (retval == ERROR_OK)
  1122. {
  1123. LOG_DEBUG("address: 0x%8.8x, value: 0x%2.2x", address, *value);
  1124. }
  1125. else
  1126. {
  1127. *value = 0x0;
  1128. LOG_DEBUG("address: 0x%8.8x failed", address);
  1129. }
  1130. return retval;
  1131. }
  1132. int target_write_u32(struct target_s *target, u32 address, u32 value)
  1133. {
  1134. int retval;
  1135. u8 value_buf[4];
  1136. if (!target_was_examined(target))
  1137. {
  1138. LOG_ERROR("Target not examined yet");
  1139. return ERROR_FAIL;
  1140. }
  1141. LOG_DEBUG("address: 0x%8.8x, value: 0x%8.8x", address, value);
  1142. target_buffer_set_u32(target, value_buf, value);
  1143. if ((retval = target_write_memory(target, address, 4, 1, value_buf)) != ERROR_OK)
  1144. {
  1145. LOG_DEBUG("failed: %i", retval);
  1146. }
  1147. return retval;
  1148. }
  1149. int target_write_u16(struct target_s *target, u32 address, u16 value)
  1150. {
  1151. int retval;
  1152. u8 value_buf[2];
  1153. if (!target_was_examined(target))
  1154. {
  1155. LOG_ERROR("Target not examined yet");
  1156. return ERROR_FAIL;
  1157. }
  1158. LOG_DEBUG("address: 0x%8.8x, value: 0x%8.8x", address, value);
  1159. target_buffer_set_u16(target, value_buf, value);
  1160. if ((retval = target_write_memory(target, address, 2, 1, value_buf)) != ERROR_OK)
  1161. {
  1162. LOG_DEBUG("failed: %i", retval);
  1163. }
  1164. return retval;
  1165. }
  1166. int target_write_u8(struct target_s *target, u32 address, u8 value)
  1167. {
  1168. int retval;
  1169. if (!target_was_examined(target))
  1170. {
  1171. LOG_ERROR("Target not examined yet");
  1172. return ERROR_FAIL;
  1173. }
  1174. LOG_DEBUG("address: 0x%8.8x, value: 0x%2.2x", address, value);
  1175. if ((retval = target_write_memory(target, address, 1, 1, &value)) != ERROR_OK)
  1176. {
  1177. LOG_DEBUG("failed: %i", retval);
  1178. }
  1179. return retval;
  1180. }
  1181. int target_register_user_commands(struct command_context_s *cmd_ctx)
  1182. {
  1183. int retval = ERROR_OK;
  1184. /* script procedures */
  1185. register_command(cmd_ctx, NULL, "profile", handle_profile_command, COMMAND_EXEC, "profiling samples the CPU PC");
  1186. register_jim(cmd_ctx, "ocd_mem2array", jim_mem2array, "read memory and return as a TCL array for script processing <ARRAYNAME> <WIDTH=32/16/8> <ADDRESS> <COUNT>");
  1187. register_jim(cmd_ctx, "ocd_array2mem", jim_array2mem, "convert a TCL array to memory locations and write the values <ARRAYNAME> <WIDTH=32/16/8> <ADDRESS> <COUNT>");
  1188. register_command(cmd_ctx, NULL, "fast_load_image", handle_fast_load_image_command, COMMAND_ANY,
  1189. "same args as load_image, image stored in memory - mainly for profiling purposes");
  1190. register_command(cmd_ctx, NULL, "fast_load", handle_fast_load_command, COMMAND_ANY,
  1191. "loads active fast load image to current target - mainly for profiling purposes");
  1192. register_command(cmd_ctx, NULL, "virt2phys", handle_virt2phys_command, COMMAND_ANY, "translate a virtual address into a physical address");
  1193. register_command(cmd_ctx, NULL, "reg", handle_reg_command, COMMAND_EXEC, "display or set a register");
  1194. register_command(cmd_ctx, NULL, "poll", handle_poll_command, COMMAND_EXEC, "poll target state");
  1195. register_command(cmd_ctx, NULL, "wait_halt", handle_wait_halt_command, COMMAND_EXEC, "wait for target halt [time (s)]");
  1196. register_command(cmd_ctx, NULL, "halt", handle_halt_command, COMMAND_EXEC, "halt target");
  1197. register_command(cmd_ctx, NULL, "resume", handle_resume_command, COMMAND_EXEC, "resume target [addr]");
  1198. register_command(cmd_ctx, NULL, "step", handle_step_command, COMMAND_EXEC, "step one instruction from current PC or [addr]");
  1199. register_command(cmd_ctx, NULL, "reset", handle_reset_command, COMMAND_EXEC, "reset target [run|halt|init] - default is run");
  1200. register_command(cmd_ctx, NULL, "soft_reset_halt", handle_soft_reset_halt_command, COMMAND_EXEC, "halt the target and do a soft reset");
  1201. register_command(cmd_ctx, NULL, "mdw", handle_md_command, COMMAND_EXEC, "display memory words <addr> [count]");
  1202. register_command(cmd_ctx, NULL, "mdh", handle_md_command, COMMAND_EXEC, "display memory half-words <addr> [count]");
  1203. register_command(cmd_ctx, NULL, "mdb", handle_md_command, COMMAND_EXEC, "display memory bytes <addr> [count]");
  1204. register_command(cmd_ctx, NULL, "mww", handle_mw_command, COMMAND_EXEC, "write memory word <addr> <value> [count]");
  1205. register_command(cmd_ctx, NULL, "mwh", handle_mw_command, COMMAND_EXEC, "write memory half-word <addr> <value> [count]");
  1206. register_command(cmd_ctx, NULL, "mwb", handle_mw_command, COMMAND_EXEC, "write memory byte <addr> <value> [count]");
  1207. register_command(cmd_ctx, NULL, "bp", handle_bp_command, COMMAND_EXEC, "set breakpoint <address> <length> [hw]");
  1208. register_command(cmd_ctx, NULL, "rbp", handle_rbp_command, COMMAND_EXEC, "remove breakpoint <adress>");
  1209. register_command(cmd_ctx, NULL, "wp", handle_wp_command, COMMAND_EXEC, "set watchpoint <address> <length> <r/w/a> [value] [mask]");
  1210. register_command(cmd_ctx, NULL, "rwp", handle_rwp_command, COMMAND_EXEC, "remove watchpoint <adress>");
  1211. register_command(cmd_ctx, NULL, "load_image", handle_load_image_command, COMMAND_EXEC, "load_image <file> <address> ['bin'|'ihex'|'elf'|'s19'] [min_address] [max_length]");
  1212. register_command(cmd_ctx, NULL, "dump_image", handle_dump_image_command, COMMAND_EXEC, "dump_image <file> <address> <size>");
  1213. register_command(cmd_ctx, NULL, "verify_image", handle_verify_image_command, COMMAND_EXEC, "verify_image <file> [offset] [type]");
  1214. register_command(cmd_ctx, NULL, "test_image", handle_test_image_command, COMMAND_EXEC, "test_image <file> [offset] [type]");
  1215. if((retval = target_request_register_commands(cmd_ctx)) != ERROR_OK)
  1216. return retval;
  1217. if((retval = trace_register_commands(cmd_ctx)) != ERROR_OK)
  1218. return retval;
  1219. return retval;
  1220. }
  1221. static int handle_targets_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
  1222. {
  1223. target_t *target = all_targets;
  1224. if (argc == 1)
  1225. {
  1226. target = get_target(args[0]);
  1227. if (target == NULL) {
  1228. command_print(cmd_ctx,"Target: %s is unknown, try one of:\n", args[0] );
  1229. goto DumpTargets;
  1230. }
  1231. cmd_ctx->current_target = target->target_number;
  1232. return ERROR_OK;
  1233. }
  1234. DumpTargets:
  1235. target = all_targets;
  1236. command_print(cmd_ctx, " CmdName Type Endian AbsChainPos Name State ");
  1237. command_print(cmd_ctx, "-- ---------- ---------- ---------- ----------- ------------- ----------");
  1238. while (target)
  1239. {
  1240. /* XX: abcdefghij abcdefghij abcdefghij abcdefghij */
  1241. command_print(cmd_ctx, "%2d: %-10s %-10s %-10s %10d %14s %s",
  1242. target->target_number,
  1243. target->cmd_name,
  1244. target_get_name(target),
  1245. Jim_Nvp_value2name_simple( nvp_target_endian, target->endianness )->name,
  1246. target->tap->abs_chain_position,
  1247. target->tap->dotted_name,
  1248. Jim_Nvp_value2name_simple( nvp_target_state, target->state )->name );
  1249. target = target->next;
  1250. }
  1251. return ERROR_OK;
  1252. }
  1253. /* every 300ms we check for reset & powerdropout and issue a "reset halt" if so. */
  1254. static int powerDropout;
  1255. static int srstAsserted;
  1256. static int runPowerRestore;
  1257. static int runPowerDropout;
  1258. static int runSrstAsserted;
  1259. static int runSrstDeasserted;
  1260. static int sense_handler(void)
  1261. {
  1262. static int prevSrstAsserted = 0;
  1263. static int prevPowerdropout = 0;
  1264. int retval;
  1265. if ((retval=jtag_power_dropout(&powerDropout))!=ERROR_OK)
  1266. return retval;
  1267. int powerRestored;
  1268. powerRestored = prevPowerdropout && !powerDropout;
  1269. if (powerRestored)
  1270. {
  1271. runPowerRestore = 1;
  1272. }
  1273. long long current = timeval_ms();
  1274. static long long lastPower = 0;
  1275. int waitMore = lastPower + 2000 > current;
  1276. if (powerDropout && !waitMore)
  1277. {
  1278. runPowerDropout = 1;
  1279. lastPower = current;
  1280. }
  1281. if ((retval=jtag_srst_asserted(&srstAsserted))!=ERROR_OK)
  1282. return retval;
  1283. int srstDeasserted;
  1284. srstDeasserted = prevSrstAsserted && !srstAsserted;
  1285. static long long lastSrst = 0;
  1286. waitMore = lastSrst + 2000 > current;
  1287. if (srstDeasserted && !waitMore)
  1288. {
  1289. runSrstDeasserted = 1;
  1290. lastSrst = current;
  1291. }
  1292. if (!prevSrstAsserted && srstAsserted)
  1293. {
  1294. runSrstAsserted = 1;
  1295. }
  1296. prevSrstAsserted = srstAsserted;
  1297. prevPowerdropout = powerDropout;
  1298. if (srstDeasserted || powerRestored)
  1299. {
  1300. /* Other than logging the event we can't do anything here.
  1301. * Issuing a reset is a particularly bad idea as we might
  1302. * be inside a reset already.
  1303. */
  1304. }
  1305. return ERROR_OK;
  1306. }
  1307. /* process target state changes */
  1308. int handle_target(void *priv)
  1309. {
  1310. int retval = ERROR_OK;
  1311. /* we do not want to recurse here... */
  1312. static int recursive = 0;
  1313. if (! recursive)
  1314. {
  1315. recursive = 1;
  1316. sense_handler();
  1317. /* danger! running these procedures can trigger srst assertions and power dropouts.
  1318. * We need to avoid an infinite loop/recursion here and we do that by
  1319. * clearing the flags after running these events.
  1320. */
  1321. int did_something = 0;
  1322. if (runSrstAsserted)
  1323. {
  1324. Jim_Eval( interp, "srst_asserted");
  1325. did_something = 1;
  1326. }
  1327. if (runSrstDeasserted)
  1328. {
  1329. Jim_Eval( interp, "srst_deasserted");
  1330. did_something = 1;
  1331. }
  1332. if (runPowerDropout)
  1333. {
  1334. Jim_Eval( interp, "power_dropout");
  1335. did_something = 1;
  1336. }
  1337. if (runPowerRestore)
  1338. {
  1339. Jim_Eval( interp, "power_restore");
  1340. did_something = 1;
  1341. }
  1342. if (did_something)
  1343. {
  1344. /* clear detect flags */
  1345. sense_handler();
  1346. }
  1347. /* clear action flags */
  1348. runSrstAsserted=0;
  1349. runSrstDeasserted=0;
  1350. runPowerRestore=0;
  1351. runPowerDropout=0;
  1352. recursive = 0;
  1353. }
  1354. target_t *target = all_targets;
  1355. while (target)
  1356. {
  1357. /* only poll target if we've got power and srst isn't asserted */
  1358. if (target_continous_poll&&!powerDropout&&!srstAsserted)
  1359. {
  1360. /* polling may fail silently until the target has been examined */
  1361. if((retval = target_poll(target)) != ERROR_OK)
  1362. return retval;
  1363. }
  1364. target = target->next;
  1365. }
  1366. return retval;
  1367. }
  1368. static int handle_reg_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
  1369. {
  1370. target_t *target;
  1371. reg_t *reg = NULL;
  1372. int count = 0;
  1373. char *value;
  1374. LOG_DEBUG("-");
  1375. target = get_current_target(cmd_ctx);
  1376. /* list all available registers for the current target */
  1377. if (argc == 0)
  1378. {
  1379. reg_cache_t *cache = target->reg_cache;
  1380. count = 0;
  1381. while(cache)
  1382. {
  1383. int i;
  1384. for (i = 0; i < cache->num_regs; i++)
  1385. {
  1386. value = buf_to_str(cache->reg_list[i].value, cache->reg_list[i].size, 16);
  1387. command_print(cmd_ctx, "(%i) %s (/%i): 0x%s (dirty: %i, valid: %i)", count++, cache->reg_list[i].name, cache->reg_list[i].size, value, cache->reg_list[i].dirty, cache->reg_list[i].valid);
  1388. free(value);
  1389. }
  1390. cache = cache->next;
  1391. }
  1392. return ERROR_OK;
  1393. }
  1394. /* access a single register by its ordinal number */
  1395. if ((args[0][0] >= '0') && (args[0][0] <= '9'))
  1396. {
  1397. int num = strtoul(args[0], NULL, 0);
  1398. reg_cache_t *cache = target->reg_cache;
  1399. count = 0;
  1400. while(cache)
  1401. {
  1402. int i;
  1403. for (i = 0; i < cache->num_regs; i++)
  1404. {
  1405. if (count++ == num)
  1406. {
  1407. reg = &cache->reg_list[i];
  1408. break;
  1409. }
  1410. }
  1411. if (reg)
  1412. break;
  1413. cache = cache->next;
  1414. }
  1415. if (!reg)
  1416. {
  1417. command_print(cmd_ctx, "%i is out of bounds, the current target has only %i registers (0 - %i)", num, count, count - 1);
  1418. return ERROR_OK;
  1419. }
  1420. } else /* access a single register by its name */
  1421. {
  1422. reg = register_get_by_name(target->reg_cache, args[0], 1);
  1423. if (!reg)
  1424. {
  1425. command_print(cmd_ctx, "register %s not found in current target", args[0]);
  1426. return ERROR_OK;
  1427. }
  1428. }
  1429. /* display a register */
  1430. if ((argc == 1) || ((argc == 2) && !((args[1][0] >= '0') && (args[1][0] <= '9'))))
  1431. {
  1432. if ((argc == 2) && (strcmp(args[1], "force") == 0))
  1433. reg->valid = 0;
  1434. if (reg->valid == 0)
  1435. {
  1436. reg_arch_type_t *arch_type = register_get_arch_type(reg->arch_type);
  1437. arch_type->get(reg);
  1438. }
  1439. value = buf_to_str(reg->value, reg->size, 16);
  1440. command_print(cmd_ctx, "%s (/%i): 0x%s", reg->name, reg->size, value);
  1441. free(value);
  1442. return ERROR_OK;
  1443. }
  1444. /* set register value */
  1445. if (argc == 2)
  1446. {
  1447. u8 *buf = malloc(CEIL(reg->size, 8));
  1448. str_to_buf(args[1], strlen(args[1]), buf, reg->size, 0);
  1449. reg_arch_type_t *arch_type = register_get_arch_type(reg->arch_type);
  1450. arch_type->set(reg, buf);
  1451. value = buf_to_str(reg->value, reg->size, 16);
  1452. command_print(cmd_ctx, "%s (/%i): 0x%s", reg->name, reg->size, value);
  1453. free(value);
  1454. free(buf);
  1455. return ERROR_OK;
  1456. }
  1457. command_print(cmd_ctx, "usage: reg <#|name> [value]");
  1458. return ERROR_OK;
  1459. }
  1460. static int handle_poll_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
  1461. {
  1462. int retval = ERROR_OK;
  1463. target_t *target = get_current_target(cmd_ctx);
  1464. if (argc == 0)
  1465. {
  1466. if((retval = target_poll(target)) != ERROR_OK)
  1467. return retval;
  1468. if((retval = target_arch_state(target)) != ERROR_OK)
  1469. return retval;
  1470. }
  1471. else if (argc==1)
  1472. {
  1473. if (strcmp(args[0], "on") == 0)
  1474. {
  1475. target_continous_poll = 1;
  1476. }
  1477. else if (strcmp(args[0], "off") == 0)
  1478. {
  1479. target_continous_poll = 0;
  1480. }
  1481. else
  1482. {
  1483. command_print(cmd_ctx, "arg is \"on\" or \"off\"");
  1484. }
  1485. } else
  1486. {
  1487. return ERROR_COMMAND_SYNTAX_ERROR;
  1488. }
  1489. return retval;
  1490. }
  1491. static int handle_wait_halt_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
  1492. {
  1493. int ms = 5000;
  1494. if (argc > 0)
  1495. {
  1496. char *end;
  1497. ms = strtoul(args[0], &end, 0) * 1000;
  1498. if (*end)
  1499. {
  1500. command_print(cmd_ctx, "usage: %s [seconds]", cmd);
  1501. return ERROR_OK;
  1502. }
  1503. }
  1504. target_t *target = get_current_target(cmd_ctx);
  1505. return target_wait_state(target, TARGET_HALTED, ms);
  1506. }
  1507. /* wait for target state to change. The trick here is to have a low
  1508. * latency for short waits and not to suck up all the CPU time
  1509. * on longer waits.
  1510. *
  1511. * After 500ms, keep_alive() is invoked
  1512. */
  1513. int target_wait_state(target_t *target, enum target_state state, int ms)
  1514. {
  1515. int retval;
  1516. long long then=0, cur;
  1517. int once=1;
  1518. for (;;)
  1519. {
  1520. if ((retval=target_poll(target))!=ERROR_OK)
  1521. return retval;
  1522. if (target->state == state)
  1523. {
  1524. break;
  1525. }
  1526. cur = timeval_ms();
  1527. if (once)
  1528. {
  1529. once=0;
  1530. then = timeval_ms();
  1531. LOG_DEBUG("waiting for target %s...",
  1532. Jim_Nvp_value2name_simple(nvp_target_state,state)->name);
  1533. }
  1534. if (cur-then>500)
  1535. {
  1536. keep_alive();
  1537. }
  1538. if ((cur-then)>ms)
  1539. {
  1540. LOG_ERROR("timed out while waiting for target %s",
  1541. Jim_Nvp_value2name_simple(nvp_target_state,state)->name);
  1542. return ERROR_FAIL;
  1543. }
  1544. }
  1545. return ERROR_OK;
  1546. }
  1547. static int handle_halt_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
  1548. {
  1549. int retval;
  1550. target_t *target = get_current_target(cmd_ctx);
  1551. LOG_DEBUG("-");
  1552. if ((retval = target_halt(target)) != ERROR_OK)
  1553. {
  1554. return retval;
  1555. }
  1556. if (argc == 1)
  1557. {
  1558. int wait;
  1559. char *end;
  1560. wait = strtoul(args[0], &end, 0);
  1561. if (!*end && !wait)
  1562. return ERROR_OK;
  1563. }
  1564. return handle_wait_halt_command(cmd_ctx, cmd, args, argc);
  1565. }
  1566. static int handle_soft_reset_halt_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
  1567. {
  1568. target_t *target = get_current_target(cmd_ctx);
  1569. LOG_USER("requesting target halt and executing a soft reset");
  1570. target->type->soft_reset_halt(target);
  1571. return ERROR_OK;
  1572. }
  1573. static int handle_reset_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
  1574. {
  1575. const Jim_Nvp *n;
  1576. enum target_reset_mode reset_mode = RESET_RUN;
  1577. if (argc >= 1)
  1578. {
  1579. n = Jim_Nvp_name2value_simple( nvp_reset_modes, args[0] );
  1580. if( (n->name == NULL) || (n->value == RESET_UNKNOWN) ){
  1581. return ERROR_COMMAND_SYNTAX_ERROR;
  1582. }
  1583. reset_mode = n->value;
  1584. }
  1585. /* reset *all* targets */
  1586. return target_process_reset(cmd_ctx, reset_mode);
  1587. }
  1588. static int handle_resume_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
  1589. {
  1590. int retval;
  1591. target_t *target = get_current_target(cmd_ctx);
  1592. target_handle_event( target, TARGET_EVENT_OLD_pre_resume );
  1593. if (argc == 0)
  1594. retval = target_resume(target, 1, 0, 1, 0); /* current pc, addr = 0, handle breakpoints, not debugging */
  1595. else if (argc == 1)
  1596. retval = target_resume(target, 0, strtoul(args[0], NULL, 0), 1, 0); /* addr = args[0], handle breakpoints, not debugging */
  1597. else
  1598. {
  1599. retval = ERROR_COMMAND_SYNTAX_ERROR;
  1600. }
  1601. return retval;
  1602. }
  1603. static int handle_step_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
  1604. {
  1605. target_t *target = get_current_target(cmd_ctx);
  1606. LOG_DEBUG("-");
  1607. if (argc == 0)
  1608. return target->type->step(target, 1, 0, 1); /* current pc, addr = 0, handle breakpoints */
  1609. if (argc == 1)
  1610. return target->type->step(target, 0, strtoul(args[0], NULL, 0), 1); /* addr = args[0], handle breakpoints */
  1611. return ERROR_OK;
  1612. }
  1613. static void handle_md_output(struct command_context_s *cmd_ctx,
  1614. struct target_s *target, u32 address, unsigned size,
  1615. unsigned count, const u8 *buffer)
  1616. {
  1617. const unsigned line_bytecnt = 32;
  1618. unsigned line_modulo = line_bytecnt / size;
  1619. char output[line_bytecnt * 4 + 1];
  1620. unsigned output_len = 0;
  1621. const char *value_fmt;
  1622. switch (size) {
  1623. case 4: value_fmt = "%8.8x"; break;
  1624. case 2: value_fmt = "%4.2x"; break;
  1625. case 1: value_fmt = "%2.2x"; break;
  1626. default:
  1627. LOG_ERROR("invalid memory read size: %u", size);
  1628. exit(-1);
  1629. }
  1630. for (unsigned i = 0; i < count; i++)
  1631. {
  1632. if (i % line_modulo == 0)
  1633. {
  1634. output_len += snprintf(output + output_len,
  1635. sizeof(output) - output_len,
  1636. "0x%8.8x: ", address + (i*size));
  1637. }
  1638. u32 value=0;
  1639. const u8 *value_ptr = buffer + i * size;
  1640. switch (size) {
  1641. case 4: value = target_buffer_get_u32(target, value_ptr); break;
  1642. case 2: value = target_buffer_get_u16(target, value_ptr); break;
  1643. case 1: value = *value_ptr;
  1644. }
  1645. output_len += snprintf(output + output_len,
  1646. sizeof(output) - output_len,
  1647. value_fmt, value);
  1648. if ((i % line_modulo == line_modulo - 1) || (i == count - 1))
  1649. {
  1650. command_print(cmd_ctx, "%s", output);
  1651. output_len = 0;
  1652. }
  1653. }
  1654. }
  1655. static int handle_md_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
  1656. {
  1657. if (argc < 1)
  1658. return ERROR_COMMAND_SYNTAX_ERROR;
  1659. unsigned size = 0;
  1660. switch (cmd[2]) {
  1661. case 'w': size = 4; break;
  1662. case 'h': size = 2; break;
  1663. case 'b': size = 1; break;
  1664. default: return ERROR_COMMAND_SYNTAX_ERROR;
  1665. }
  1666. u32 address = strtoul(args[0], NULL, 0);
  1667. unsigned count = 1;
  1668. if (argc == 2)
  1669. count = strtoul(args[1], NULL, 0);
  1670. u8 *buffer = calloc(count, size);
  1671. target_t *target = get_current_target(cmd_ctx);
  1672. int retval = target_read_memory(target,
  1673. address, size, count, buffer);
  1674. if (ERROR_OK == retval)
  1675. handle_md_output(cmd_ctx, target, address, size, count, buffer);
  1676. free(buffer);
  1677. return retval;
  1678. }
  1679. static int handle_mw_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
  1680. {
  1681. u32 address = 0;
  1682. u32 value = 0;
  1683. int count = 1;
  1684. int i;
  1685. int wordsize;
  1686. target_t *target = get_current_target(cmd_ctx);
  1687. u8 value_buf[4];
  1688. if ((argc < 2) || (argc > 3))
  1689. return ERROR_COMMAND_SYNTAX_ERROR;
  1690. address = strtoul(args[0], NULL, 0);
  1691. value = strtoul(args[1], NULL, 0);
  1692. if (argc == 3)
  1693. count = strtoul(args[2], NULL, 0);
  1694. switch (cmd[2])
  1695. {
  1696. case 'w':
  1697. wordsize = 4;
  1698. target_buffer_set_u32(target, value_buf, value);
  1699. break;
  1700. case 'h':
  1701. wordsize = 2;
  1702. target_buffer_set_u16(target, value_buf, value);
  1703. break;
  1704. case 'b':
  1705. wordsize = 1;
  1706. value_buf[0] = value;
  1707. break;
  1708. default:
  1709. return ERROR_COMMAND_SYNTAX_ERROR;
  1710. }
  1711. for (i=0; i<count; i++)
  1712. {
  1713. int retval = target_write_memory(target,
  1714. address + i * wordsize, wordsize, 1, value_buf);
  1715. if (ERROR_OK != retval)
  1716. return retval;
  1717. keep_alive();
  1718. }
  1719. return ERROR_OK;
  1720. }
  1721. static int handle_load_image_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
  1722. {
  1723. u8 *buffer;
  1724. u32 buf_cnt;
  1725. u32 image_size;
  1726. u32 min_address=0;
  1727. u32 max_address=0xffffffff;
  1728. int i;
  1729. int retval, retvaltemp;
  1730. image_t image;
  1731. duration_t duration;
  1732. char *duration_text;
  1733. target_t *target = get_current_target(cmd_ctx);
  1734. if ((argc < 1)||(argc > 5))
  1735. {
  1736. return ERROR_COMMAND_SYNTAX_ERROR;
  1737. }
  1738. /* a base address isn't always necessary, default to 0x0 (i.e. don't relocate) */
  1739. if (argc >= 2)
  1740. {
  1741. image.base_address_set = 1;
  1742. image.base_address = strtoul(args[1], NULL, 0);
  1743. }
  1744. else
  1745. {
  1746. image.base_address_set = 0;
  1747. }
  1748. image.start_address_set = 0;
  1749. if (argc>=4)
  1750. {
  1751. min_address=strtoul(args[3], NULL, 0);
  1752. }
  1753. if (argc>=5)
  1754. {
  1755. max_address=strtoul(args[4], NULL, 0)+min_address;
  1756. }
  1757. if (min_address>max_address)
  1758. {
  1759. return ERROR_COMMAND_SYNTAX_ERROR;
  1760. }
  1761. duration_start_measure(&duration);
  1762. if (image_open(&image, args[0], (argc >= 3) ? args[2] : NULL) != ERROR_OK)
  1763. {
  1764. return ERROR_OK;
  1765. }
  1766. image_size = 0x0;
  1767. retval = ERROR_OK;
  1768. for (i = 0; i < image.num_sections; i++)
  1769. {
  1770. buffer = malloc(image.sections[i].size);
  1771. if (buffer == NULL)
  1772. {
  1773. command_print(cmd_ctx, "error allocating buffer for section (%d bytes)", image.sections[i].size);
  1774. break;
  1775. }
  1776. if ((retval = image_read_section(&image, i, 0x0, image.sections[i].size, buffer, &buf_cnt)) != ERROR_OK)
  1777. {
  1778. free(buffer);
  1779. break;
  1780. }
  1781. u32 offset=0;
  1782. u32 length=buf_cnt;
  1783. /* DANGER!!! beware of unsigned comparision here!!! */
  1784. if ((image.sections[i].base_address+buf_cnt>=min_address)&&
  1785. (image.sections[i].base_address<max_address))
  1786. {
  1787. if (image.sections[i].base_address<min_address)
  1788. {
  1789. /* clip addresses below */
  1790. offset+=min_address-image.sections[i].base_address;
  1791. length-=offset;
  1792. }
  1793. if (image.sections[i].base_address+buf_cnt>max_address)
  1794. {
  1795. length-=(image.sections[i].base_address+buf_cnt)-max_address;
  1796. }
  1797. if ((retval = target_write_buffer(target, image.sections[i].base_address+offset, length, buffer+offset)) != ERROR_OK)
  1798. {
  1799. free(buffer);
  1800. break;
  1801. }
  1802. image_size += length;
  1803. command_print(cmd_ctx, "%u byte written at address 0x%8.8x", length, image.sections[i].base_address+offset);
  1804. }
  1805. free(buffer);
  1806. }
  1807. if((retvaltemp = duration_stop_measure(&duration, &duration_text)) != ERROR_OK)
  1808. {
  1809. image_close(&image);
  1810. return retvaltemp;
  1811. }
  1812. if (retval==ERROR_OK)
  1813. {
  1814. command_print(cmd_ctx, "downloaded %u byte in %s", image_size, duration_text);
  1815. }
  1816. free(duration_text);
  1817. image_close(&image);
  1818. return retval;
  1819. }
  1820. static int handle_dump_image_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
  1821. {
  1822. fileio_t fileio;
  1823. u32 address;
  1824. u32 size;
  1825. u8 buffer[560];
  1826. int retval=ERROR_OK, retvaltemp;
  1827. duration_t duration;
  1828. char *duration_text;
  1829. target_t *target = get_current_target(cmd_ctx);
  1830. if (argc != 3)
  1831. {
  1832. command_print(cmd_ctx, "usage: dump_image <filename> <address> <size>");
  1833. return ERROR_OK;
  1834. }
  1835. address = strtoul(args[1], NULL, 0);
  1836. size = strtoul(args[2], NULL, 0);
  1837. if (fileio_open(&fileio, args[0], FILEIO_WRITE, FILEIO_BINARY) != ERROR_OK)
  1838. {
  1839. return ERROR_OK;
  1840. }
  1841. duration_start_measure(&duration);
  1842. while (size > 0)
  1843. {
  1844. u32 size_written;
  1845. u32 this_run_size = (size > 560) ? 560 : size;
  1846. retval = target_read_buffer(target, address, this_run_size, buffer);
  1847. if (retval != ERROR_OK)
  1848. {
  1849. break;
  1850. }
  1851. retval = fileio_write(&fileio, this_run_size, buffer, &size_written);
  1852. if (retval != ERROR_OK)
  1853. {
  1854. break;
  1855. }
  1856. size -= this_run_size;
  1857. address += this_run_size;
  1858. }
  1859. if((retvaltemp = fileio_close(&fileio)) != ERROR_OK)
  1860. return retvaltemp;
  1861. if((retvaltemp = duration_stop_measure(&duration, &duration_text)) != ERROR_OK)
  1862. return retvaltemp;
  1863. if (retval==ERROR_OK)
  1864. {
  1865. command_print(cmd_ctx, "dumped %lld byte in %s",
  1866. fileio.size, duration_text);
  1867. free(duration_text);
  1868. }
  1869. return retval;
  1870. }
  1871. static int handle_verify_image_command_internal(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc, int verify)
  1872. {
  1873. u8 *buffer;
  1874. u32 buf_cnt;
  1875. u32 image_size;
  1876. int i;
  1877. int retval, retvaltemp;
  1878. u32 checksum = 0;
  1879. u32 mem_checksum = 0;
  1880. image_t image;
  1881. duration_t duration;
  1882. char *duration_text;
  1883. target_t *target = get_current_target(cmd_ctx);
  1884. if (argc < 1)
  1885. {
  1886. return ERROR_COMMAND_SYNTAX_ERROR;
  1887. }
  1888. if (!target)
  1889. {
  1890. LOG_ERROR("no target selected");
  1891. return ERROR_FAIL;
  1892. }
  1893. duration_start_measure(&duration);
  1894. if (argc >= 2)
  1895. {
  1896. image.base_address_set = 1;
  1897. image.base_address = strtoul(args[1], NULL, 0);
  1898. }
  1899. else
  1900. {
  1901. image.base_address_set = 0;
  1902. image.base_address = 0x0;
  1903. }
  1904. image.start_address_set = 0;
  1905. if ((retval=image_open(&image, args[0], (argc == 3) ? args[2] : NULL)) != ERROR_OK)
  1906. {
  1907. return retval;
  1908. }
  1909. image_size = 0x0;
  1910. retval=ERROR_OK;
  1911. for (i = 0; i < image.num_sections; i++)
  1912. {
  1913. buffer = malloc(image.sections[i].size);
  1914. if (buffer == NULL)
  1915. {
  1916. command_print(cmd_ctx, "error allocating buffer for section (%d bytes)", image.sections[i].size);
  1917. break;
  1918. }
  1919. if ((retval = image_read_section(&image, i, 0x0, image.sections[i].size, buffer, &buf_cnt)) != ERROR_OK)
  1920. {
  1921. free(buffer);
  1922. break;
  1923. }
  1924. if (verify)
  1925. {
  1926. /* calculate checksum of image */
  1927. image_calculate_checksum( buffer, buf_cnt, &checksum );
  1928. retval = target_checksum_memory(target, image.sections[i].base_address, buf_cnt, &mem_checksum);
  1929. if( retval != ERROR_OK )
  1930. {
  1931. free(buffer);
  1932. break;
  1933. }
  1934. if( checksum != mem_checksum )
  1935. {
  1936. /* failed crc checksum, fall back to a binary compare */
  1937. u8 *data;
  1938. command_print(cmd_ctx, "checksum mismatch - attempting binary compare");
  1939. data = (u8*)malloc(buf_cnt);
  1940. /* Can we use 32bit word accesses? */
  1941. int size = 1;
  1942. int count = buf_cnt;
  1943. if ((count % 4) == 0)
  1944. {
  1945. size *= 4;
  1946. count /= 4;
  1947. }
  1948. retval = target_read_memory(target, image.sections[i].base_address, size, count, data);
  1949. if (retval == ERROR_OK)
  1950. {
  1951. u32 t;
  1952. for (t = 0; t < buf_cnt; t++)
  1953. {
  1954. if (data[t] != buffer[t])
  1955. {
  1956. command_print(cmd_ctx, "Verify operation failed address 0x%08x. Was 0x%02x instead of 0x%02x\n", t + image.sections[i].base_address, data[t], buffer[t]);
  1957. free(data);
  1958. free(buffer);
  1959. retval=ERROR_FAIL;
  1960. goto done;
  1961. }
  1962. if ((t%16384)==0)
  1963. {
  1964. keep_alive();
  1965. }
  1966. }
  1967. }
  1968. free(data);
  1969. }
  1970. } else
  1971. {
  1972. command_print(cmd_ctx, "address 0x%08x length 0x%08x", image.sections[i].base_address, buf_cnt);
  1973. }
  1974. free(buffer);
  1975. image_size += buf_cnt;
  1976. }
  1977. done:
  1978. if((retvaltemp = duration_stop_measure(&duration, &duration_text)) != ERROR_OK)
  1979. {
  1980. image_close(&image);
  1981. return retvaltemp;
  1982. }
  1983. if (retval==ERROR_OK)
  1984. {
  1985. command_print(cmd_ctx, "verified %u bytes in %s", image_size, duration_text);
  1986. }
  1987. free(duration_text);
  1988. image_close(&image);
  1989. return retval;
  1990. }
  1991. static int handle_verify_image_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
  1992. {
  1993. return handle_verify_image_command_internal(cmd_ctx, cmd, args, argc, 1);
  1994. }
  1995. static int handle_test_image_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
  1996. {
  1997. return handle_verify_image_command_internal(cmd_ctx, cmd, args, argc, 0);
  1998. }
  1999. static int handle_bp_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
  2000. {
  2001. int retval;
  2002. target_t *target = get_current_target(cmd_ctx);
  2003. if (argc == 0)
  2004. {
  2005. breakpoint_t *breakpoint = target->breakpoints;
  2006. while (breakpoint)
  2007. {
  2008. if (breakpoint->type == BKPT_SOFT)
  2009. {
  2010. char* buf = buf_to_str(breakpoint->orig_instr, breakpoint->length, 16);
  2011. command_print(cmd_ctx, "0x%8.8x, 0x%x, %i, 0x%s", breakpoint->address, breakpoint->length, breakpoint->set, buf);
  2012. free(buf);
  2013. }
  2014. else
  2015. {
  2016. command_print(cmd_ctx, "0x%8.8x, 0x%x, %i", breakpoint->address, breakpoint->length, breakpoint->set);
  2017. }
  2018. breakpoint = breakpoint->next;
  2019. }
  2020. }
  2021. else if (argc >= 2)
  2022. {
  2023. int hw = BKPT_SOFT;
  2024. u32 length = 0;
  2025. length = strtoul(args[1], NULL, 0);
  2026. if (argc >= 3)
  2027. if (strcmp(args[2], "hw") == 0)
  2028. hw = BKPT_HARD;
  2029. if ((retval = breakpoint_add(target, strtoul(args[0], NULL, 0), length, hw)) != ERROR_OK)
  2030. {
  2031. LOG_ERROR("Failure setting breakpoints");
  2032. }
  2033. else
  2034. {
  2035. command_print(cmd_ctx, "breakpoint added at address 0x%8.8lx",
  2036. strtoul(args[0], NULL, 0));
  2037. }
  2038. }
  2039. else
  2040. {
  2041. command_print(cmd_ctx, "usage: bp <address> <length> ['hw']");
  2042. }
  2043. return ERROR_OK;
  2044. }
  2045. static int handle_rbp_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
  2046. {
  2047. target_t *target = get_current_target(cmd_ctx);
  2048. if (argc > 0)
  2049. breakpoint_remove(target, strtoul(args[0], NULL, 0));
  2050. return ERROR_OK;
  2051. }
  2052. static int handle_wp_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
  2053. {
  2054. target_t *target = get_current_target(cmd_ctx);
  2055. int retval;
  2056. if (argc == 0)
  2057. {
  2058. watchpoint_t *watchpoint = target->watchpoints;
  2059. while (watchpoint)
  2060. {
  2061. command_print(cmd_ctx, "address: 0x%8.8x, len: 0x%8.8x, r/w/a: %i, value: 0x%8.8x, mask: 0x%8.8x", watchpoint->address, watchpoint->length, watchpoint->rw, watchpoint->value, watchpoint->mask);
  2062. watchpoint = watchpoint->next;
  2063. }
  2064. }
  2065. else if (argc >= 2)
  2066. {
  2067. enum watchpoint_rw type = WPT_ACCESS;
  2068. u32 data_value = 0x0;
  2069. u32 data_mask = 0xffffffff;
  2070. if (argc >= 3)
  2071. {
  2072. switch(args[2][0])
  2073. {
  2074. case 'r':
  2075. type = WPT_READ;
  2076. break;
  2077. case 'w':
  2078. type = WPT_WRITE;
  2079. break;
  2080. case 'a':
  2081. type = WPT_ACCESS;
  2082. break;
  2083. default:
  2084. command_print(cmd_ctx, "usage: wp <address> <length> [r/w/a] [value] [mask]");
  2085. return ERROR_OK;
  2086. }
  2087. }
  2088. if (argc >= 4)
  2089. {
  2090. data_value = strtoul(args[3], NULL, 0);
  2091. }
  2092. if (argc >= 5)
  2093. {
  2094. data_mask = strtoul(args[4], NULL, 0);
  2095. }
  2096. if ((retval = watchpoint_add(target, strtoul(args[0], NULL, 0),
  2097. strtoul(args[1], NULL, 0), type, data_value, data_mask)) != ERROR_OK)
  2098. {
  2099. LOG_ERROR("Failure setting breakpoints");
  2100. }
  2101. }
  2102. else
  2103. {
  2104. command_print(cmd_ctx, "usage: wp <address> <length> [r/w/a] [value] [mask]");
  2105. }
  2106. return ERROR_OK;
  2107. }
  2108. static int handle_rwp_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
  2109. {
  2110. target_t *target = get_current_target(cmd_ctx);
  2111. if (argc > 0)
  2112. watchpoint_remove(target, strtoul(args[0], NULL, 0));
  2113. return ERROR_OK;
  2114. }
  2115. static int handle_virt2phys_command(command_context_t *cmd_ctx, char *cmd, char **args, int argc)
  2116. {
  2117. int retval;
  2118. target_t *target = get_current_target(cmd_ctx);
  2119. u32 va;
  2120. u32 pa;
  2121. if (argc != 1)
  2122. {
  2123. return ERROR_COMMAND_SYNTAX_ERROR;
  2124. }
  2125. va = strtoul(args[0], NULL, 0);
  2126. retval = target->type->virt2phys(target, va, &pa);
  2127. if (retval == ERROR_OK)
  2128. {
  2129. command_print(cmd_ctx, "Physical address 0x%08x", pa);
  2130. }
  2131. else
  2132. {
  2133. /* lower levels will have logged a detailed error which is
  2134. * forwarded to telnet/GDB session.
  2135. */
  2136. }
  2137. return retval;
  2138. }
  2139. static void writeData(FILE *f, const void *data, size_t len)
  2140. {
  2141. size_t written = fwrite(data, len, 1, f);
  2142. if (written != len)
  2143. LOG_ERROR("failed to write %zu bytes: %s", len, strerror(errno));
  2144. }
  2145. static void writeLong(FILE *f, int l)
  2146. {
  2147. int i;
  2148. for (i=0; i<4; i++)
  2149. {
  2150. char c=(l>>(i*8))&0xff;
  2151. writeData(f, &c, 1);
  2152. }
  2153. }
  2154. static void writeString(FILE *f, char *s)
  2155. {
  2156. writeData(f, s, strlen(s));
  2157. }
  2158. /* Dump a gmon.out histogram file. */
  2159. static void writeGmon(u32 *samples, u32 sampleNum, char *filename)
  2160. {
  2161. u32 i;
  2162. FILE *f=fopen(filename, "w");
  2163. if (f==NULL)
  2164. return;
  2165. writeString(f, "gmon");
  2166. writeLong(f, 0x00000001); /* Version */
  2167. writeLong(f, 0); /* padding */
  2168. writeLong(f, 0); /* padding */
  2169. writeLong(f, 0); /* padding */
  2170. u8 zero = 0; /* GMON_TAG_TIME_HIST */
  2171. writeData(f, &zero, 1);
  2172. /* figure out bucket size */
  2173. u32 min=samples[0];
  2174. u32 max=samples[0];
  2175. for (i=0; i<sampleNum; i++)
  2176. {
  2177. if (min>samples[i])
  2178. {
  2179. min=samples[i];
  2180. }
  2181. if (max<samples[i])
  2182. {
  2183. max=samples[i];
  2184. }
  2185. }
  2186. int addressSpace=(max-min+1);
  2187. static const u32 maxBuckets = 256 * 1024; /* maximum buckets. */
  2188. u32 length = addressSpace;
  2189. if (length > maxBuckets)
  2190. {
  2191. length=maxBuckets;
  2192. }
  2193. int *buckets=malloc(sizeof(int)*length);
  2194. if (buckets==NULL)
  2195. {
  2196. fclose(f);
  2197. return;
  2198. }
  2199. memset(buckets, 0, sizeof(int)*length);
  2200. for (i=0; i<sampleNum;i++)
  2201. {
  2202. u32 address=samples[i];
  2203. long long a=address-min;
  2204. long long b=length-1;
  2205. long long c=addressSpace-1;
  2206. int index=(a*b)/c; /* danger!!!! int32 overflows */
  2207. buckets[index]++;
  2208. }
  2209. /* append binary memory gmon.out &profile_hist_hdr ((char*)&profile_hist_hdr + sizeof(struct gmon_hist_hdr)) */
  2210. writeLong(f, min); /* low_pc */
  2211. writeLong(f, max); /* high_pc */
  2212. writeLong(f, length); /* # of samples */
  2213. writeLong(f, 64000000); /* 64MHz */
  2214. writeString(f, "seconds");
  2215. for (i=0; i<(15-strlen("seconds")); i++)
  2216. writeData(f, &zero, 1);
  2217. writeString(f, "s");
  2218. /*append binary memory gmon.out profile_hist_data (profile_hist_data + profile_hist_hdr.hist_size) */
  2219. char *data=malloc(2*length);
  2220. if (data!=NULL)
  2221. {
  2222. for (i=0; i<length;i++)
  2223. {
  2224. int val;
  2225. val=buckets[i];
  2226. if (val>65535)
  2227. {
  2228. val=65535;
  2229. }
  2230. data[i*2]=val&0xff;
  2231. data[i*2+1]=(val>>8)&0xff;
  2232. }
  2233. free(buckets);
  2234. writeData(f, data, length * 2);
  2235. free(data);
  2236. } else
  2237. {
  2238. free(buckets);
  2239. }
  2240. fclose(f);
  2241. }
  2242. /* profiling samples the CPU PC as quickly as OpenOCD is able, which will be used as a random sampling of PC */
  2243. static int handle_profile_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
  2244. {
  2245. target_t *target = get_current_target(cmd_ctx);
  2246. struct timeval timeout, now;
  2247. gettimeofday(&timeout, NULL);
  2248. if (argc!=2)
  2249. {
  2250. return ERROR_COMMAND_SYNTAX_ERROR;
  2251. }
  2252. char *end;
  2253. timeval_add_time(&timeout, strtoul(args[0], &end, 0), 0);
  2254. if (*end)
  2255. {
  2256. return ERROR_OK;
  2257. }
  2258. command_print(cmd_ctx, "Starting profiling. Halting and resuming the target as often as we can...");
  2259. static const int maxSample=10000;
  2260. u32 *samples=malloc(sizeof(u32)*maxSample);
  2261. if (samples==NULL)
  2262. return ERROR_OK;
  2263. int numSamples=0;
  2264. int retval=ERROR_OK;
  2265. /* hopefully it is safe to cache! We want to stop/restart as quickly as possible. */
  2266. reg_t *reg = register_get_by_name(target->reg_cache, "pc", 1);
  2267. for (;;)
  2268. {
  2269. target_poll(target);
  2270. if (target->state == TARGET_HALTED)
  2271. {
  2272. u32 t=*((u32 *)reg->value);
  2273. samples[numSamples++]=t;
  2274. retval = target_resume(target, 1, 0, 0, 0); /* current pc, addr = 0, do not handle breakpoints, not debugging */
  2275. target_poll(target);
  2276. alive_sleep(10); /* sleep 10ms, i.e. <100 samples/second. */
  2277. } else if (target->state == TARGET_RUNNING)
  2278. {
  2279. /* We want to quickly sample the PC. */
  2280. if((retval = target_halt(target)) != ERROR_OK)
  2281. {
  2282. free(samples);
  2283. return retval;
  2284. }
  2285. } else
  2286. {
  2287. command_print(cmd_ctx, "Target not halted or running");
  2288. retval=ERROR_OK;
  2289. break;
  2290. }
  2291. if (retval!=ERROR_OK)
  2292. {
  2293. break;
  2294. }
  2295. gettimeofday(&now, NULL);
  2296. if ((numSamples>=maxSample) || ((now.tv_sec >= timeout.tv_sec) && (now.tv_usec >= timeout.tv_usec)))
  2297. {
  2298. command_print(cmd_ctx, "Profiling completed. %d samples.", numSamples);
  2299. if((retval = target_poll(target)) != ERROR_OK)
  2300. {
  2301. free(samples);
  2302. return retval;
  2303. }
  2304. if (target->state == TARGET_HALTED)
  2305. {
  2306. target_resume(target, 1, 0, 0, 0); /* current pc, addr = 0, do not handle breakpoints, not debugging */
  2307. }
  2308. if((retval = target_poll(target)) != ERROR_OK)
  2309. {
  2310. free(samples);
  2311. return retval;
  2312. }
  2313. writeGmon(samples, numSamples, args[1]);
  2314. command_print(cmd_ctx, "Wrote %s", args[1]);
  2315. break;
  2316. }
  2317. }
  2318. free(samples);
  2319. return ERROR_OK;
  2320. }
  2321. static int new_int_array_element(Jim_Interp * interp, const char *varname, int idx, u32 val)
  2322. {
  2323. char *namebuf;
  2324. Jim_Obj *nameObjPtr, *valObjPtr;
  2325. int result;
  2326. namebuf = alloc_printf("%s(%d)", varname, idx);
  2327. if (!namebuf)
  2328. return JIM_ERR;
  2329. nameObjPtr = Jim_NewStringObj(interp, namebuf, -1);
  2330. valObjPtr = Jim_NewIntObj(interp, val);
  2331. if (!nameObjPtr || !valObjPtr)
  2332. {
  2333. free(namebuf);
  2334. return JIM_ERR;
  2335. }
  2336. Jim_IncrRefCount(nameObjPtr);
  2337. Jim_IncrRefCount(valObjPtr);
  2338. result = Jim_SetVariable(interp, nameObjPtr, valObjPtr);
  2339. Jim_DecrRefCount(interp, nameObjPtr);
  2340. Jim_DecrRefCount(interp, valObjPtr);
  2341. free(namebuf);
  2342. /* printf("%s(%d) <= 0%08x\n", varname, idx, val); */
  2343. return result;
  2344. }
  2345. static int jim_mem2array(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
  2346. {
  2347. command_context_t *context;
  2348. target_t *target;
  2349. context = Jim_GetAssocData(interp, "context");
  2350. if (context == NULL)
  2351. {
  2352. LOG_ERROR("mem2array: no command context");
  2353. return JIM_ERR;
  2354. }
  2355. target = get_current_target(context);
  2356. if (target == NULL)
  2357. {
  2358. LOG_ERROR("mem2array: no current target");
  2359. return JIM_ERR;
  2360. }
  2361. return target_mem2array(interp, target, argc-1, argv+1);
  2362. }
  2363. static int target_mem2array(Jim_Interp *interp, target_t *target, int argc, Jim_Obj *const *argv)
  2364. {
  2365. long l;
  2366. u32 width;
  2367. int len;
  2368. u32 addr;
  2369. u32 count;
  2370. u32 v;
  2371. const char *varname;
  2372. u8 buffer[4096];
  2373. int n, e, retval;
  2374. u32 i;
  2375. /* argv[1] = name of array to receive the data
  2376. * argv[2] = desired width
  2377. * argv[3] = memory address
  2378. * argv[4] = count of times to read
  2379. */
  2380. if (argc != 4) {
  2381. Jim_WrongNumArgs(interp, 1, argv, "varname width addr nelems");
  2382. return JIM_ERR;
  2383. }
  2384. varname = Jim_GetString(argv[0], &len);
  2385. /* given "foo" get space for worse case "foo(%d)" .. add 20 */
  2386. e = Jim_GetLong(interp, argv[1], &l);
  2387. width = l;
  2388. if (e != JIM_OK) {
  2389. return e;
  2390. }
  2391. e = Jim_GetLong(interp, argv[2], &l);
  2392. addr = l;
  2393. if (e != JIM_OK) {
  2394. return e;
  2395. }
  2396. e = Jim_GetLong(interp, argv[3], &l);
  2397. len = l;
  2398. if (e != JIM_OK) {
  2399. return e;
  2400. }
  2401. switch (width) {
  2402. case 8:
  2403. width = 1;
  2404. break;
  2405. case 16:
  2406. width = 2;
  2407. break;
  2408. case 32:
  2409. width = 4;
  2410. break;
  2411. default:
  2412. Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
  2413. Jim_AppendStrings( interp, Jim_GetResult(interp), "Invalid width param, must be 8/16/32", NULL );
  2414. return JIM_ERR;
  2415. }
  2416. if (len == 0) {
  2417. Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
  2418. Jim_AppendStrings(interp, Jim_GetResult(interp), "mem2array: zero width read?", NULL);
  2419. return JIM_ERR;
  2420. }
  2421. if ((addr + (len * width)) < addr) {
  2422. Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
  2423. Jim_AppendStrings(interp, Jim_GetResult(interp), "mem2array: addr + len - wraps to zero?", NULL);
  2424. return JIM_ERR;
  2425. }
  2426. /* absurd transfer size? */
  2427. if (len > 65536) {
  2428. Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
  2429. Jim_AppendStrings(interp, Jim_GetResult(interp), "mem2array: absurd > 64K item request", NULL);
  2430. return JIM_ERR;
  2431. }
  2432. if ((width == 1) ||
  2433. ((width == 2) && ((addr & 1) == 0)) ||
  2434. ((width == 4) && ((addr & 3) == 0))) {
  2435. /* all is well */
  2436. } else {
  2437. char buf[100];
  2438. Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
  2439. sprintf(buf, "mem2array address: 0x%08x is not aligned for %d byte reads", addr, width);
  2440. Jim_AppendStrings(interp, Jim_GetResult(interp), buf , NULL);
  2441. return JIM_ERR;
  2442. }
  2443. /* Transfer loop */
  2444. /* index counter */
  2445. n = 0;
  2446. /* assume ok */
  2447. e = JIM_OK;
  2448. while (len) {
  2449. /* Slurp... in buffer size chunks */
  2450. count = len; /* in objects.. */
  2451. if (count > (sizeof(buffer)/width)) {
  2452. count = (sizeof(buffer)/width);
  2453. }
  2454. retval = target_read_memory( target, addr, width, count, buffer );
  2455. if (retval != ERROR_OK) {
  2456. /* BOO !*/
  2457. LOG_ERROR("mem2array: Read @ 0x%08x, w=%d, cnt=%d, failed", addr, width, count);
  2458. Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
  2459. Jim_AppendStrings(interp, Jim_GetResult(interp), "mem2array: cannot read memory", NULL);
  2460. e = JIM_ERR;
  2461. len = 0;
  2462. } else {
  2463. v = 0; /* shut up gcc */
  2464. for (i = 0 ;i < count ;i++, n++) {
  2465. switch (width) {
  2466. case 4:
  2467. v = target_buffer_get_u32(target, &buffer[i*width]);
  2468. break;
  2469. case 2:
  2470. v = target_buffer_get_u16(target, &buffer[i*width]);
  2471. break;
  2472. case 1:
  2473. v = buffer[i] & 0x0ff;
  2474. break;
  2475. }
  2476. new_int_array_element(interp, varname, n, v);
  2477. }
  2478. len -= count;
  2479. }
  2480. }
  2481. Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
  2482. return JIM_OK;
  2483. }
  2484. static int get_int_array_element(Jim_Interp * interp, const char *varname, int idx, u32 *val)
  2485. {
  2486. char *namebuf;
  2487. Jim_Obj *nameObjPtr, *valObjPtr;
  2488. int result;
  2489. long l;
  2490. namebuf = alloc_printf("%s(%d)", varname, idx);
  2491. if (!namebuf)
  2492. return JIM_ERR;
  2493. nameObjPtr = Jim_NewStringObj(interp, namebuf, -1);
  2494. if (!nameObjPtr)
  2495. {
  2496. free(namebuf);
  2497. return JIM_ERR;
  2498. }
  2499. Jim_IncrRefCount(nameObjPtr);
  2500. valObjPtr = Jim_GetVariable(interp, nameObjPtr, JIM_ERRMSG);
  2501. Jim_DecrRefCount(interp, nameObjPtr);
  2502. free(namebuf);
  2503. if (valObjPtr == NULL)
  2504. return JIM_ERR;
  2505. result = Jim_GetLong(interp, valObjPtr, &l);
  2506. /* printf("%s(%d) => 0%08x\n", varname, idx, val); */
  2507. *val = l;
  2508. return result;
  2509. }
  2510. static int jim_array2mem(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
  2511. {
  2512. command_context_t *context;
  2513. target_t *target;
  2514. context = Jim_GetAssocData(interp, "context");
  2515. if (context == NULL){
  2516. LOG_ERROR("array2mem: no command context");
  2517. return JIM_ERR;
  2518. }
  2519. target = get_current_target(context);
  2520. if (target == NULL){
  2521. LOG_ERROR("array2mem: no current target");
  2522. return JIM_ERR;
  2523. }
  2524. return target_array2mem( interp,target, argc-1, argv+1 );
  2525. }
  2526. static int target_array2mem(Jim_Interp *interp, target_t *target, int argc, Jim_Obj *const *argv)
  2527. {
  2528. long l;
  2529. u32 width;
  2530. int len;
  2531. u32 addr;
  2532. u32 count;
  2533. u32 v;
  2534. const char *varname;
  2535. u8 buffer[4096];
  2536. int n, e, retval;
  2537. u32 i;
  2538. /* argv[1] = name of array to get the data
  2539. * argv[2] = desired width
  2540. * argv[3] = memory address
  2541. * argv[4] = count to write
  2542. */
  2543. if (argc != 4) {
  2544. Jim_WrongNumArgs(interp, 1, argv, "varname width addr nelems");
  2545. return JIM_ERR;
  2546. }
  2547. varname = Jim_GetString(argv[0], &len);
  2548. /* given "foo" get space for worse case "foo(%d)" .. add 20 */
  2549. e = Jim_GetLong(interp, argv[1], &l);
  2550. width = l;
  2551. if (e != JIM_OK) {
  2552. return e;
  2553. }
  2554. e = Jim_GetLong(interp, argv[2], &l);
  2555. addr = l;
  2556. if (e != JIM_OK) {
  2557. return e;
  2558. }
  2559. e = Jim_GetLong(interp, argv[3], &l);
  2560. len = l;
  2561. if (e != JIM_OK) {
  2562. return e;
  2563. }
  2564. switch (width) {
  2565. case 8:
  2566. width = 1;
  2567. break;
  2568. case 16:
  2569. width = 2;
  2570. break;
  2571. case 32:
  2572. width = 4;
  2573. break;
  2574. default:
  2575. Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
  2576. Jim_AppendStrings( interp, Jim_GetResult(interp), "Invalid width param, must be 8/16/32", NULL );
  2577. return JIM_ERR;
  2578. }
  2579. if (len == 0) {
  2580. Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
  2581. Jim_AppendStrings(interp, Jim_GetResult(interp), "array2mem: zero width read?", NULL);
  2582. return JIM_ERR;
  2583. }
  2584. if ((addr + (len * width)) < addr) {
  2585. Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
  2586. Jim_AppendStrings(interp, Jim_GetResult(interp), "array2mem: addr + len - wraps to zero?", NULL);
  2587. return JIM_ERR;
  2588. }
  2589. /* absurd transfer size? */
  2590. if (len > 65536) {
  2591. Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
  2592. Jim_AppendStrings(interp, Jim_GetResult(interp), "array2mem: absurd > 64K item request", NULL);
  2593. return JIM_ERR;
  2594. }
  2595. if ((width == 1) ||
  2596. ((width == 2) && ((addr & 1) == 0)) ||
  2597. ((width == 4) && ((addr & 3) == 0))) {
  2598. /* all is well */
  2599. } else {
  2600. char buf[100];
  2601. Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
  2602. sprintf(buf, "array2mem address: 0x%08x is not aligned for %d byte reads", addr, width);
  2603. Jim_AppendStrings(interp, Jim_GetResult(interp), buf , NULL);
  2604. return JIM_ERR;
  2605. }
  2606. /* Transfer loop */
  2607. /* index counter */
  2608. n = 0;
  2609. /* assume ok */
  2610. e = JIM_OK;
  2611. while (len) {
  2612. /* Slurp... in buffer size chunks */
  2613. count = len; /* in objects.. */
  2614. if (count > (sizeof(buffer)/width)) {
  2615. count = (sizeof(buffer)/width);
  2616. }
  2617. v = 0; /* shut up gcc */
  2618. for (i = 0 ;i < count ;i++, n++) {
  2619. get_int_array_element(interp, varname, n, &v);
  2620. switch (width) {
  2621. case 4:
  2622. target_buffer_set_u32(target, &buffer[i*width], v);
  2623. break;
  2624. case 2:
  2625. target_buffer_set_u16(target, &buffer[i*width], v);
  2626. break;
  2627. case 1:
  2628. buffer[i] = v & 0x0ff;
  2629. break;
  2630. }
  2631. }
  2632. len -= count;
  2633. retval = target_write_memory(target, addr, width, count, buffer);
  2634. if (retval != ERROR_OK) {
  2635. /* BOO !*/
  2636. LOG_ERROR("array2mem: Write @ 0x%08x, w=%d, cnt=%d, failed", addr, width, count);
  2637. Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
  2638. Jim_AppendStrings(interp, Jim_GetResult(interp), "array2mem: cannot read memory", NULL);
  2639. e = JIM_ERR;
  2640. len = 0;
  2641. }
  2642. }
  2643. Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
  2644. return JIM_OK;
  2645. }
  2646. void target_all_handle_event( enum target_event e )
  2647. {
  2648. target_t *target;
  2649. LOG_DEBUG( "**all*targets: event: %d, %s",
  2650. e,
  2651. Jim_Nvp_value2name_simple( nvp_target_event, e )->name );
  2652. target = all_targets;
  2653. while (target){
  2654. target_handle_event( target, e );
  2655. target = target->next;
  2656. }
  2657. }
  2658. void target_handle_event( target_t *target, enum target_event e )
  2659. {
  2660. target_event_action_t *teap;
  2661. int done;
  2662. teap = target->event_action;
  2663. done = 0;
  2664. while( teap ){
  2665. if( teap->event == e ){
  2666. done = 1;
  2667. LOG_DEBUG( "target: (%d) %s (%s) event: %d (%s) action: %s\n",
  2668. target->target_number,
  2669. target->cmd_name,
  2670. target_get_name(target),
  2671. e,
  2672. Jim_Nvp_value2name_simple( nvp_target_event, e )->name,
  2673. Jim_GetString( teap->body, NULL ) );
  2674. if (Jim_EvalObj( interp, teap->body )!=JIM_OK)
  2675. {
  2676. Jim_PrintErrorMessage(interp);
  2677. }
  2678. }
  2679. teap = teap->next;
  2680. }
  2681. if( !done ){
  2682. LOG_DEBUG( "event: %d %s - no action",
  2683. e,
  2684. Jim_Nvp_value2name_simple( nvp_target_event, e )->name );
  2685. }
  2686. }
  2687. enum target_cfg_param {
  2688. TCFG_TYPE,
  2689. TCFG_EVENT,
  2690. TCFG_WORK_AREA_VIRT,
  2691. TCFG_WORK_AREA_PHYS,
  2692. TCFG_WORK_AREA_SIZE,
  2693. TCFG_WORK_AREA_BACKUP,
  2694. TCFG_ENDIAN,
  2695. TCFG_VARIANT,
  2696. TCFG_CHAIN_POSITION,
  2697. };
  2698. static Jim_Nvp nvp_config_opts[] = {
  2699. { .name = "-type", .value = TCFG_TYPE },
  2700. { .name = "-event", .value = TCFG_EVENT },
  2701. { .name = "-work-area-virt", .value = TCFG_WORK_AREA_VIRT },
  2702. { .name = "-work-area-phys", .value = TCFG_WORK_AREA_PHYS },
  2703. { .name = "-work-area-size", .value = TCFG_WORK_AREA_SIZE },
  2704. { .name = "-work-area-backup", .value = TCFG_WORK_AREA_BACKUP },
  2705. { .name = "-endian" , .value = TCFG_ENDIAN },
  2706. { .name = "-variant", .value = TCFG_VARIANT },
  2707. { .name = "-chain-position", .value = TCFG_CHAIN_POSITION },
  2708. { .name = NULL, .value = -1 }
  2709. };
  2710. static int target_configure( Jim_GetOptInfo *goi, target_t *target )
  2711. {
  2712. Jim_Nvp *n;
  2713. Jim_Obj *o;
  2714. jim_wide w;
  2715. char *cp;
  2716. int e;
  2717. /* parse config or cget options ... */
  2718. while( goi->argc > 0 ){
  2719. Jim_SetEmptyResult( goi->interp );
  2720. /* Jim_GetOpt_Debug( goi ); */
  2721. if( target->type->target_jim_configure ){
  2722. /* target defines a configure function */
  2723. /* target gets first dibs on parameters */
  2724. e = (*(target->type->target_jim_configure))( target, goi );
  2725. if( e == JIM_OK ){
  2726. /* more? */
  2727. continue;
  2728. }
  2729. if( e == JIM_ERR ){
  2730. /* An error */
  2731. return e;
  2732. }
  2733. /* otherwise we 'continue' below */
  2734. }
  2735. e = Jim_GetOpt_Nvp( goi, nvp_config_opts, &n );
  2736. if( e != JIM_OK ){
  2737. Jim_GetOpt_NvpUnknown( goi, nvp_config_opts, 0 );
  2738. return e;
  2739. }
  2740. switch( n->value ){
  2741. case TCFG_TYPE:
  2742. /* not setable */
  2743. if( goi->isconfigure ){
  2744. Jim_SetResult_sprintf( goi->interp, "not setable: %s", n->name );
  2745. return JIM_ERR;
  2746. } else {
  2747. no_params:
  2748. if( goi->argc != 0 ){
  2749. Jim_WrongNumArgs( goi->interp, goi->argc, goi->argv, "NO PARAMS");
  2750. return JIM_ERR;
  2751. }
  2752. }
  2753. Jim_SetResultString( goi->interp, target_get_name(target), -1 );
  2754. /* loop for more */
  2755. break;
  2756. case TCFG_EVENT:
  2757. if( goi->argc == 0 ){
  2758. Jim_WrongNumArgs( goi->interp, goi->argc, goi->argv, "-event ?event-name? ...");
  2759. return JIM_ERR;
  2760. }
  2761. e = Jim_GetOpt_Nvp( goi, nvp_target_event, &n );
  2762. if( e != JIM_OK ){
  2763. Jim_GetOpt_NvpUnknown( goi, nvp_target_event, 1 );
  2764. return e;
  2765. }
  2766. if( goi->isconfigure ){
  2767. if( goi->argc != 1 ){
  2768. Jim_WrongNumArgs( goi->interp, goi->argc, goi->argv, "-event ?event-name? ?EVENT-BODY?");
  2769. return JIM_ERR;
  2770. }
  2771. } else {
  2772. if( goi->argc != 0 ){
  2773. Jim_WrongNumArgs(goi->interp, goi->argc, goi->argv, "-event ?event-name?");
  2774. return JIM_ERR;
  2775. }
  2776. }
  2777. {
  2778. target_event_action_t *teap;
  2779. teap = target->event_action;
  2780. /* replace existing? */
  2781. while( teap ){
  2782. if( teap->event == (enum target_event)n->value ){
  2783. break;
  2784. }
  2785. teap = teap->next;
  2786. }
  2787. if( goi->isconfigure ){
  2788. if( teap == NULL ){
  2789. /* create new */
  2790. teap = calloc( 1, sizeof(*teap) );
  2791. }
  2792. teap->event = n->value;
  2793. Jim_GetOpt_Obj( goi, &o );
  2794. if( teap->body ){
  2795. Jim_DecrRefCount( interp, teap->body );
  2796. }
  2797. teap->body = Jim_DuplicateObj( goi->interp, o );
  2798. /*
  2799. * FIXME:
  2800. * Tcl/TK - "tk events" have a nice feature.
  2801. * See the "BIND" command.
  2802. * We should support that here.
  2803. * You can specify %X and %Y in the event code.
  2804. * The idea is: %T - target name.
  2805. * The idea is: %N - target number
  2806. * The idea is: %E - event name.
  2807. */
  2808. Jim_IncrRefCount( teap->body );
  2809. /* add to head of event list */
  2810. teap->next = target->event_action;
  2811. target->event_action = teap;
  2812. Jim_SetEmptyResult(goi->interp);
  2813. } else {
  2814. /* get */
  2815. if( teap == NULL ){
  2816. Jim_SetEmptyResult( goi->interp );
  2817. } else {
  2818. Jim_SetResult( goi->interp, Jim_DuplicateObj( goi->interp, teap->body ) );
  2819. }
  2820. }
  2821. }
  2822. /* loop for more */
  2823. break;
  2824. case TCFG_WORK_AREA_VIRT:
  2825. if( goi->isconfigure ){
  2826. target_free_all_working_areas(target);
  2827. e = Jim_GetOpt_Wide( goi, &w );
  2828. if( e != JIM_OK ){
  2829. return e;
  2830. }
  2831. target->working_area_virt = w;
  2832. } else {
  2833. if( goi->argc != 0 ){
  2834. goto no_params;
  2835. }
  2836. }
  2837. Jim_SetResult( interp, Jim_NewIntObj( goi->interp, target->working_area_virt ) );
  2838. /* loop for more */
  2839. break;
  2840. case TCFG_WORK_AREA_PHYS:
  2841. if( goi->isconfigure ){
  2842. target_free_all_working_areas(target);
  2843. e = Jim_GetOpt_Wide( goi, &w );
  2844. if( e != JIM_OK ){
  2845. return e;
  2846. }
  2847. target->working_area_phys = w;
  2848. } else {
  2849. if( goi->argc != 0 ){
  2850. goto no_params;
  2851. }
  2852. }
  2853. Jim_SetResult( interp, Jim_NewIntObj( goi->interp, target->working_area_phys ) );
  2854. /* loop for more */
  2855. break;
  2856. case TCFG_WORK_AREA_SIZE:
  2857. if( goi->isconfigure ){
  2858. target_free_all_working_areas(target);
  2859. e = Jim_GetOpt_Wide( goi, &w );
  2860. if( e != JIM_OK ){
  2861. return e;
  2862. }
  2863. target->working_area_size = w;
  2864. } else {
  2865. if( goi->argc != 0 ){
  2866. goto no_params;
  2867. }
  2868. }
  2869. Jim_SetResult( interp, Jim_NewIntObj( goi->interp, target->working_area_size ) );
  2870. /* loop for more */
  2871. break;
  2872. case TCFG_WORK_AREA_BACKUP:
  2873. if( goi->isconfigure ){
  2874. target_free_all_working_areas(target);
  2875. e = Jim_GetOpt_Wide( goi, &w );
  2876. if( e != JIM_OK ){
  2877. return e;
  2878. }
  2879. /* make this exactly 1 or 0 */
  2880. target->backup_working_area = (!!w);
  2881. } else {
  2882. if( goi->argc != 0 ){
  2883. goto no_params;
  2884. }
  2885. }
  2886. Jim_SetResult( interp, Jim_NewIntObj( goi->interp, target->working_area_size ) );
  2887. /* loop for more e*/
  2888. break;
  2889. case TCFG_ENDIAN:
  2890. if( goi->isconfigure ){
  2891. e = Jim_GetOpt_Nvp( goi, nvp_target_endian, &n );
  2892. if( e != JIM_OK ){
  2893. Jim_GetOpt_NvpUnknown( goi, nvp_target_endian, 1 );
  2894. return e;
  2895. }
  2896. target->endianness = n->value;
  2897. } else {
  2898. if( goi->argc != 0 ){
  2899. goto no_params;
  2900. }
  2901. }
  2902. n = Jim_Nvp_value2name_simple( nvp_target_endian, target->endianness );
  2903. if( n->name == NULL ){
  2904. target->endianness = TARGET_LITTLE_ENDIAN;
  2905. n = Jim_Nvp_value2name_simple( nvp_target_endian, target->endianness );
  2906. }
  2907. Jim_SetResultString( goi->interp, n->name, -1 );
  2908. /* loop for more */
  2909. break;
  2910. case TCFG_VARIANT:
  2911. if( goi->isconfigure ){
  2912. if( goi->argc < 1 ){
  2913. Jim_SetResult_sprintf( goi->interp,
  2914. "%s ?STRING?",
  2915. n->name );
  2916. return JIM_ERR;
  2917. }
  2918. if( target->variant ){
  2919. free((void *)(target->variant));
  2920. }
  2921. e = Jim_GetOpt_String( goi, &cp, NULL );
  2922. target->variant = strdup(cp);
  2923. } else {
  2924. if( goi->argc != 0 ){
  2925. goto no_params;
  2926. }
  2927. }
  2928. Jim_SetResultString( goi->interp, target->variant,-1 );
  2929. /* loop for more */
  2930. break;
  2931. case TCFG_CHAIN_POSITION:
  2932. if( goi->isconfigure ){
  2933. Jim_Obj *o;
  2934. jtag_tap_t *tap;
  2935. target_free_all_working_areas(target);
  2936. e = Jim_GetOpt_Obj( goi, &o );
  2937. if( e != JIM_OK ){
  2938. return e;
  2939. }
  2940. tap = jtag_TapByJimObj( goi->interp, o );
  2941. if( tap == NULL ){
  2942. return JIM_ERR;
  2943. }
  2944. /* make this exactly 1 or 0 */
  2945. target->tap = tap;
  2946. } else {
  2947. if( goi->argc != 0 ){
  2948. goto no_params;
  2949. }
  2950. }
  2951. Jim_SetResultString( interp, target->tap->dotted_name, -1 );
  2952. /* loop for more e*/
  2953. break;
  2954. }
  2955. } /* while( goi->argc ) */
  2956. /* done - we return */
  2957. return JIM_OK;
  2958. }
  2959. /** this is the 'tcl' handler for the target specific command */
  2960. static int tcl_target_func( Jim_Interp *interp, int argc, Jim_Obj *const *argv )
  2961. {
  2962. Jim_GetOptInfo goi;
  2963. jim_wide a,b,c;
  2964. int x,y,z;
  2965. u8 target_buf[32];
  2966. Jim_Nvp *n;
  2967. target_t *target;
  2968. struct command_context_s *cmd_ctx;
  2969. int e;
  2970. enum {
  2971. TS_CMD_CONFIGURE,
  2972. TS_CMD_CGET,
  2973. TS_CMD_MWW, TS_CMD_MWH, TS_CMD_MWB,
  2974. TS_CMD_MDW, TS_CMD_MDH, TS_CMD_MDB,
  2975. TS_CMD_MRW, TS_CMD_MRH, TS_CMD_MRB,
  2976. TS_CMD_MEM2ARRAY, TS_CMD_ARRAY2MEM,
  2977. TS_CMD_EXAMINE,
  2978. TS_CMD_POLL,
  2979. TS_CMD_RESET,
  2980. TS_CMD_HALT,
  2981. TS_CMD_WAITSTATE,
  2982. TS_CMD_EVENTLIST,
  2983. TS_CMD_CURSTATE,
  2984. TS_CMD_INVOKE_EVENT,
  2985. };
  2986. static const Jim_Nvp target_options[] = {
  2987. { .name = "configure", .value = TS_CMD_CONFIGURE },
  2988. { .name = "cget", .value = TS_CMD_CGET },
  2989. { .name = "mww", .value = TS_CMD_MWW },
  2990. { .name = "mwh", .value = TS_CMD_MWH },
  2991. { .name = "mwb", .value = TS_CMD_MWB },
  2992. { .name = "mdw", .value = TS_CMD_MDW },
  2993. { .name = "mdh", .value = TS_CMD_MDH },
  2994. { .name = "mdb", .value = TS_CMD_MDB },
  2995. { .name = "mem2array", .value = TS_CMD_MEM2ARRAY },
  2996. { .name = "array2mem", .value = TS_CMD_ARRAY2MEM },
  2997. { .name = "eventlist", .value = TS_CMD_EVENTLIST },
  2998. { .name = "curstate", .value = TS_CMD_CURSTATE },
  2999. { .name = "arp_examine", .value = TS_CMD_EXAMINE },
  3000. { .name = "arp_poll", .value = TS_CMD_POLL },
  3001. { .name = "arp_reset", .value = TS_CMD_RESET },
  3002. { .name = "arp_halt", .value = TS_CMD_HALT },
  3003. { .name = "arp_waitstate", .value = TS_CMD_WAITSTATE },
  3004. { .name = "invoke-event", .value = TS_CMD_INVOKE_EVENT },
  3005. { .name = NULL, .value = -1 },
  3006. };
  3007. /* go past the "command" */
  3008. Jim_GetOpt_Setup( &goi, interp, argc-1, argv+1 );
  3009. target = Jim_CmdPrivData( goi.interp );
  3010. cmd_ctx = Jim_GetAssocData(goi.interp, "context");
  3011. /* commands here are in an NVP table */
  3012. e = Jim_GetOpt_Nvp( &goi, target_options, &n );
  3013. if( e != JIM_OK ){
  3014. Jim_GetOpt_NvpUnknown( &goi, target_options, 0 );
  3015. return e;
  3016. }
  3017. /* Assume blank result */
  3018. Jim_SetEmptyResult( goi.interp );
  3019. switch( n->value ){
  3020. case TS_CMD_CONFIGURE:
  3021. if( goi.argc < 2 ){
  3022. Jim_WrongNumArgs( goi.interp, goi.argc, goi.argv, "missing: -option VALUE ...");
  3023. return JIM_ERR;
  3024. }
  3025. goi.isconfigure = 1;
  3026. return target_configure( &goi, target );
  3027. case TS_CMD_CGET:
  3028. // some things take params
  3029. if( goi.argc < 1 ){
  3030. Jim_WrongNumArgs( goi.interp, 0, goi.argv, "missing: ?-option?");
  3031. return JIM_ERR;
  3032. }
  3033. goi.isconfigure = 0;
  3034. return target_configure( &goi, target );
  3035. break;
  3036. case TS_CMD_MWW:
  3037. case TS_CMD_MWH:
  3038. case TS_CMD_MWB:
  3039. /* argv[0] = cmd
  3040. * argv[1] = address
  3041. * argv[2] = data
  3042. * argv[3] = optional count.
  3043. */
  3044. if( (goi.argc == 3) || (goi.argc == 4) ){
  3045. /* all is well */
  3046. } else {
  3047. mwx_error:
  3048. Jim_SetResult_sprintf( goi.interp, "expected: %s ADDR DATA [COUNT]", n->name );
  3049. return JIM_ERR;
  3050. }
  3051. e = Jim_GetOpt_Wide( &goi, &a );
  3052. if( e != JIM_OK ){
  3053. goto mwx_error;
  3054. }
  3055. e = Jim_GetOpt_Wide( &goi, &b );
  3056. if( e != JIM_OK ){
  3057. goto mwx_error;
  3058. }
  3059. if( goi.argc ){
  3060. e = Jim_GetOpt_Wide( &goi, &c );
  3061. if( e != JIM_OK ){
  3062. goto mwx_error;
  3063. }
  3064. } else {
  3065. c = 1;
  3066. }
  3067. switch( n->value ){
  3068. case TS_CMD_MWW:
  3069. target_buffer_set_u32( target, target_buf, b );
  3070. b = 4;
  3071. break;
  3072. case TS_CMD_MWH:
  3073. target_buffer_set_u16( target, target_buf, b );
  3074. b = 2;
  3075. break;
  3076. case TS_CMD_MWB:
  3077. target_buffer_set_u8( target, target_buf, b );
  3078. b = 1;
  3079. break;
  3080. }
  3081. for( x = 0 ; x < c ; x++ ){
  3082. e = target_write_memory( target, a, b, 1, target_buf );
  3083. if( e != ERROR_OK ){
  3084. Jim_SetResult_sprintf( interp, "Error writing @ 0x%08x: %d\n", (int)(a), e );
  3085. return JIM_ERR;
  3086. }
  3087. /* b = width */
  3088. a = a + b;
  3089. }
  3090. return JIM_OK;
  3091. break;
  3092. /* display */
  3093. case TS_CMD_MDW:
  3094. case TS_CMD_MDH:
  3095. case TS_CMD_MDB:
  3096. /* argv[0] = command
  3097. * argv[1] = address
  3098. * argv[2] = optional count
  3099. */
  3100. if( (goi.argc == 2) || (goi.argc == 3) ){
  3101. Jim_SetResult_sprintf( goi.interp, "expected: %s ADDR [COUNT]", n->name );
  3102. return JIM_ERR;
  3103. }
  3104. e = Jim_GetOpt_Wide( &goi, &a );
  3105. if( e != JIM_OK ){
  3106. return JIM_ERR;
  3107. }
  3108. if( goi.argc ){
  3109. e = Jim_GetOpt_Wide( &goi, &c );
  3110. if( e != JIM_OK ){
  3111. return JIM_ERR;
  3112. }
  3113. } else {
  3114. c = 1;
  3115. }
  3116. b = 1; /* shut up gcc */
  3117. switch( n->value ){
  3118. case TS_CMD_MDW:
  3119. b = 4;
  3120. break;
  3121. case TS_CMD_MDH:
  3122. b = 2;
  3123. break;
  3124. case TS_CMD_MDB:
  3125. b = 1;
  3126. break;
  3127. }
  3128. /* convert to "bytes" */
  3129. c = c * b;
  3130. /* count is now in 'BYTES' */
  3131. while( c > 0 ){
  3132. y = c;
  3133. if( y > 16 ){
  3134. y = 16;
  3135. }
  3136. e = target_read_memory( target, a, b, y / b, target_buf );
  3137. if( e != ERROR_OK ){
  3138. Jim_SetResult_sprintf( interp, "error reading target @ 0x%08lx", (int)(a) );
  3139. return JIM_ERR;
  3140. }
  3141. Jim_fprintf( interp, interp->cookie_stdout, "0x%08x ", (int)(a) );
  3142. switch( b ){
  3143. case 4:
  3144. for( x = 0 ; (x < 16) && (x < y) ; x += 4 ){
  3145. z = target_buffer_get_u32( target, &(target_buf[ x * 4 ]) );
  3146. Jim_fprintf( interp, interp->cookie_stdout, "%08x ", (int)(z) );
  3147. }
  3148. for( ; (x < 16) ; x += 4 ){
  3149. Jim_fprintf( interp, interp->cookie_stdout, " " );
  3150. }
  3151. break;
  3152. case 2:
  3153. for( x = 0 ; (x < 16) && (x < y) ; x += 2 ){
  3154. z = target_buffer_get_u16( target, &(target_buf[ x * 2 ]) );
  3155. Jim_fprintf( interp, interp->cookie_stdout, "%04x ", (int)(z) );
  3156. }
  3157. for( ; (x < 16) ; x += 2 ){
  3158. Jim_fprintf( interp, interp->cookie_stdout, " " );
  3159. }
  3160. break;
  3161. case 1:
  3162. default:
  3163. for( x = 0 ; (x < 16) && (x < y) ; x += 1 ){
  3164. z = target_buffer_get_u8( target, &(target_buf[ x * 4 ]) );
  3165. Jim_fprintf( interp, interp->cookie_stdout, "%02x ", (int)(z) );
  3166. }
  3167. for( ; (x < 16) ; x += 1 ){
  3168. Jim_fprintf( interp, interp->cookie_stdout, " " );
  3169. }
  3170. break;
  3171. }
  3172. /* ascii-ify the bytes */
  3173. for( x = 0 ; x < y ; x++ ){
  3174. if( (target_buf[x] >= 0x20) &&
  3175. (target_buf[x] <= 0x7e) ){
  3176. /* good */
  3177. } else {
  3178. /* smack it */
  3179. target_buf[x] = '.';
  3180. }
  3181. }
  3182. /* space pad */
  3183. while( x < 16 ){
  3184. target_buf[x] = ' ';
  3185. x++;
  3186. }
  3187. /* terminate */
  3188. target_buf[16] = 0;
  3189. /* print - with a newline */
  3190. Jim_fprintf( interp, interp->cookie_stdout, "%s\n", target_buf );
  3191. /* NEXT... */
  3192. c -= 16;
  3193. a += 16;
  3194. }
  3195. return JIM_OK;
  3196. case TS_CMD_MEM2ARRAY:
  3197. return target_mem2array( goi.interp, target, goi.argc, goi.argv );
  3198. break;
  3199. case TS_CMD_ARRAY2MEM:
  3200. return target_array2mem( goi.interp, target, goi.argc, goi.argv );
  3201. break;
  3202. case TS_CMD_EXAMINE:
  3203. if( goi.argc ){
  3204. Jim_WrongNumArgs( goi.interp, 2, argv, "[no parameters]");
  3205. return JIM_ERR;
  3206. }
  3207. e = target->type->examine( target );
  3208. if( e != ERROR_OK ){
  3209. Jim_SetResult_sprintf( interp, "examine-fails: %d", e );
  3210. return JIM_ERR;
  3211. }
  3212. return JIM_OK;
  3213. case TS_CMD_POLL:
  3214. if( goi.argc ){
  3215. Jim_WrongNumArgs( goi.interp, 2, argv, "[no parameters]");
  3216. return JIM_ERR;
  3217. }
  3218. if( !(target_was_examined(target)) ){
  3219. e = ERROR_TARGET_NOT_EXAMINED;
  3220. } else {
  3221. e = target->type->poll( target );
  3222. }
  3223. if( e != ERROR_OK ){
  3224. Jim_SetResult_sprintf( interp, "poll-fails: %d", e );
  3225. return JIM_ERR;
  3226. } else {
  3227. return JIM_OK;
  3228. }
  3229. break;
  3230. case TS_CMD_RESET:
  3231. if( goi.argc != 2 ){
  3232. Jim_WrongNumArgs( interp, 2, argv, "t|f|assert|deassert BOOL");
  3233. return JIM_ERR;
  3234. }
  3235. e = Jim_GetOpt_Nvp( &goi, nvp_assert, &n );
  3236. if( e != JIM_OK ){
  3237. Jim_GetOpt_NvpUnknown( &goi, nvp_assert, 1 );
  3238. return e;
  3239. }
  3240. /* the halt or not param */
  3241. e = Jim_GetOpt_Wide( &goi, &a);
  3242. if( e != JIM_OK ){
  3243. return e;
  3244. }
  3245. /* determine if we should halt or not. */
  3246. target->reset_halt = !!a;
  3247. /* When this happens - all workareas are invalid. */
  3248. target_free_all_working_areas_restore(target, 0);
  3249. /* do the assert */
  3250. if( n->value == NVP_ASSERT ){
  3251. target->type->assert_reset( target );
  3252. } else {
  3253. target->type->deassert_reset( target );
  3254. }
  3255. return JIM_OK;
  3256. case TS_CMD_HALT:
  3257. if( goi.argc ){
  3258. Jim_WrongNumArgs( goi.interp, 0, argv, "halt [no parameters]");
  3259. return JIM_ERR;
  3260. }
  3261. target->type->halt( target );
  3262. return JIM_OK;
  3263. case TS_CMD_WAITSTATE:
  3264. /* params: <name> statename timeoutmsecs */
  3265. if( goi.argc != 2 ){
  3266. Jim_SetResult_sprintf( goi.interp, "%s STATENAME TIMEOUTMSECS", n->name );
  3267. return JIM_ERR;
  3268. }
  3269. e = Jim_GetOpt_Nvp( &goi, nvp_target_state, &n );
  3270. if( e != JIM_OK ){
  3271. Jim_GetOpt_NvpUnknown( &goi, nvp_target_state,1 );
  3272. return e;
  3273. }
  3274. e = Jim_GetOpt_Wide( &goi, &a );
  3275. if( e != JIM_OK ){
  3276. return e;
  3277. }
  3278. e = target_wait_state( target, n->value, a );
  3279. if( e != ERROR_OK ){
  3280. Jim_SetResult_sprintf( goi.interp,
  3281. "target: %s wait %s fails (%d) %s",
  3282. target->cmd_name,
  3283. n->name,
  3284. e, target_strerror_safe(e) );
  3285. return JIM_ERR;
  3286. } else {
  3287. return JIM_OK;
  3288. }
  3289. case TS_CMD_EVENTLIST:
  3290. /* List for human, Events defined for this target.
  3291. * scripts/programs should use 'name cget -event NAME'
  3292. */
  3293. {
  3294. target_event_action_t *teap;
  3295. teap = target->event_action;
  3296. command_print( cmd_ctx, "Event actions for target (%d) %s\n",
  3297. target->target_number,
  3298. target->cmd_name );
  3299. command_print( cmd_ctx, "%-25s | Body", "Event");
  3300. command_print( cmd_ctx, "------------------------- | ----------------------------------------");
  3301. while( teap ){
  3302. command_print( cmd_ctx,
  3303. "%-25s | %s",
  3304. Jim_Nvp_value2name_simple( nvp_target_event, teap->event )->name,
  3305. Jim_GetString( teap->body, NULL ) );
  3306. teap = teap->next;
  3307. }
  3308. command_print( cmd_ctx, "***END***");
  3309. return JIM_OK;
  3310. }
  3311. case TS_CMD_CURSTATE:
  3312. if( goi.argc != 0 ){
  3313. Jim_WrongNumArgs( goi.interp, 0, argv, "[no parameters]");
  3314. return JIM_ERR;
  3315. }
  3316. Jim_SetResultString( goi.interp,
  3317. Jim_Nvp_value2name_simple(nvp_target_state,target->state)->name,-1);
  3318. return JIM_OK;
  3319. case TS_CMD_INVOKE_EVENT:
  3320. if( goi.argc != 1 ){
  3321. Jim_SetResult_sprintf( goi.interp, "%s ?EVENTNAME?",n->name);
  3322. return JIM_ERR;
  3323. }
  3324. e = Jim_GetOpt_Nvp( &goi, nvp_target_event, &n );
  3325. if( e != JIM_OK ){
  3326. Jim_GetOpt_NvpUnknown( &goi, nvp_target_event, 1 );
  3327. return e;
  3328. }
  3329. target_handle_event( target, n->value );
  3330. return JIM_OK;
  3331. }
  3332. return JIM_ERR;
  3333. }
  3334. static int target_create( Jim_GetOptInfo *goi )
  3335. {
  3336. Jim_Obj *new_cmd;
  3337. Jim_Cmd *cmd;
  3338. const char *cp;
  3339. char *cp2;
  3340. int e;
  3341. int x;
  3342. target_t *target;
  3343. struct command_context_s *cmd_ctx;
  3344. cmd_ctx = Jim_GetAssocData(goi->interp, "context");
  3345. if( goi->argc < 3 ){
  3346. Jim_WrongNumArgs( goi->interp, 1, goi->argv, "?name? ?type? ..options...");
  3347. return JIM_ERR;
  3348. }
  3349. /* COMMAND */
  3350. Jim_GetOpt_Obj( goi, &new_cmd );
  3351. /* does this command exist? */
  3352. cmd = Jim_GetCommand( goi->interp, new_cmd, JIM_ERRMSG );
  3353. if( cmd ){
  3354. cp = Jim_GetString( new_cmd, NULL );
  3355. Jim_SetResult_sprintf(goi->interp, "Command/target: %s Exists", cp);
  3356. return JIM_ERR;
  3357. }
  3358. /* TYPE */
  3359. e = Jim_GetOpt_String( goi, &cp2, NULL );
  3360. cp = cp2;
  3361. /* now does target type exist */
  3362. for( x = 0 ; target_types[x] ; x++ ){
  3363. if( 0 == strcmp( cp, target_types[x]->name ) ){
  3364. /* found */
  3365. break;
  3366. }
  3367. }
  3368. if( target_types[x] == NULL ){
  3369. Jim_SetResult_sprintf( goi->interp, "Unknown target type %s, try one of ", cp );
  3370. for( x = 0 ; target_types[x] ; x++ ){
  3371. if( target_types[x+1] ){
  3372. Jim_AppendStrings( goi->interp,
  3373. Jim_GetResult(goi->interp),
  3374. target_types[x]->name,
  3375. ", ", NULL);
  3376. } else {
  3377. Jim_AppendStrings( goi->interp,
  3378. Jim_GetResult(goi->interp),
  3379. " or ",
  3380. target_types[x]->name,NULL );
  3381. }
  3382. }
  3383. return JIM_ERR;
  3384. }
  3385. /* Create it */
  3386. target = calloc(1,sizeof(target_t));
  3387. /* set target number */
  3388. target->target_number = new_target_number();
  3389. /* allocate memory for each unique target type */
  3390. target->type = (target_type_t*)calloc(1,sizeof(target_type_t));
  3391. memcpy( target->type, target_types[x], sizeof(target_type_t));
  3392. /* will be set by "-endian" */
  3393. target->endianness = TARGET_ENDIAN_UNKNOWN;
  3394. target->working_area = 0x0;
  3395. target->working_area_size = 0x0;
  3396. target->working_areas = NULL;
  3397. target->backup_working_area = 0;
  3398. target->state = TARGET_UNKNOWN;
  3399. target->debug_reason = DBG_REASON_UNDEFINED;
  3400. target->reg_cache = NULL;
  3401. target->breakpoints = NULL;
  3402. target->watchpoints = NULL;
  3403. target->next = NULL;
  3404. target->arch_info = NULL;
  3405. target->display = 1;
  3406. /* initialize trace information */
  3407. target->trace_info = malloc(sizeof(trace_t));
  3408. target->trace_info->num_trace_points = 0;
  3409. target->trace_info->trace_points_size = 0;
  3410. target->trace_info->trace_points = NULL;
  3411. target->trace_info->trace_history_size = 0;
  3412. target->trace_info->trace_history = NULL;
  3413. target->trace_info->trace_history_pos = 0;
  3414. target->trace_info->trace_history_overflowed = 0;
  3415. target->dbgmsg = NULL;
  3416. target->dbg_msg_enabled = 0;
  3417. target->endianness = TARGET_ENDIAN_UNKNOWN;
  3418. /* Do the rest as "configure" options */
  3419. goi->isconfigure = 1;
  3420. e = target_configure( goi, target);
  3421. if (target->tap == NULL)
  3422. {
  3423. Jim_SetResultString( interp, "-chain-position required when creating target", -1);
  3424. e=JIM_ERR;
  3425. }
  3426. if( e != JIM_OK ){
  3427. free( target->type );
  3428. free( target );
  3429. return e;
  3430. }
  3431. if( target->endianness == TARGET_ENDIAN_UNKNOWN ){
  3432. /* default endian to little if not specified */
  3433. target->endianness = TARGET_LITTLE_ENDIAN;
  3434. }
  3435. /* incase variant is not set */
  3436. if (!target->variant)
  3437. target->variant = strdup("");
  3438. /* create the target specific commands */
  3439. if( target->type->register_commands ){
  3440. (*(target->type->register_commands))( cmd_ctx );
  3441. }
  3442. if( target->type->target_create ){
  3443. (*(target->type->target_create))( target, goi->interp );
  3444. }
  3445. /* append to end of list */
  3446. {
  3447. target_t **tpp;
  3448. tpp = &(all_targets);
  3449. while( *tpp ){
  3450. tpp = &( (*tpp)->next );
  3451. }
  3452. *tpp = target;
  3453. }
  3454. cp = Jim_GetString( new_cmd, NULL );
  3455. target->cmd_name = strdup(cp);
  3456. /* now - create the new target name command */
  3457. e = Jim_CreateCommand( goi->interp,
  3458. /* name */
  3459. cp,
  3460. tcl_target_func, /* C function */
  3461. target, /* private data */
  3462. NULL ); /* no del proc */
  3463. return e;
  3464. }
  3465. static int jim_target( Jim_Interp *interp, int argc, Jim_Obj *const *argv )
  3466. {
  3467. int x,r,e;
  3468. jim_wide w;
  3469. struct command_context_s *cmd_ctx;
  3470. target_t *target;
  3471. Jim_GetOptInfo goi;
  3472. enum tcmd {
  3473. /* TG = target generic */
  3474. TG_CMD_CREATE,
  3475. TG_CMD_TYPES,
  3476. TG_CMD_NAMES,
  3477. TG_CMD_CURRENT,
  3478. TG_CMD_NUMBER,
  3479. TG_CMD_COUNT,
  3480. };
  3481. const char *target_cmds[] = {
  3482. "create", "types", "names", "current", "number",
  3483. "count",
  3484. NULL /* terminate */
  3485. };
  3486. LOG_DEBUG("Target command params:");
  3487. LOG_DEBUG("%s", Jim_Debug_ArgvString(interp, argc, argv));
  3488. cmd_ctx = Jim_GetAssocData( interp, "context" );
  3489. Jim_GetOpt_Setup( &goi, interp, argc-1, argv+1 );
  3490. if( goi.argc == 0 ){
  3491. Jim_WrongNumArgs(interp, 1, argv, "missing: command ...");
  3492. return JIM_ERR;
  3493. }
  3494. /* Jim_GetOpt_Debug( &goi ); */
  3495. r = Jim_GetOpt_Enum( &goi, target_cmds, &x );
  3496. if( r != JIM_OK ){
  3497. return r;
  3498. }
  3499. switch(x){
  3500. default:
  3501. Jim_Panic(goi.interp,"Why am I here?");
  3502. return JIM_ERR;
  3503. case TG_CMD_CURRENT:
  3504. if( goi.argc != 0 ){
  3505. Jim_WrongNumArgs( goi.interp, 1, goi.argv, "Too many parameters");
  3506. return JIM_ERR;
  3507. }
  3508. Jim_SetResultString( goi.interp, get_current_target( cmd_ctx )->cmd_name, -1 );
  3509. return JIM_OK;
  3510. case TG_CMD_TYPES:
  3511. if( goi.argc != 0 ){
  3512. Jim_WrongNumArgs( goi.interp, 1, goi.argv, "Too many parameters" );
  3513. return JIM_ERR;
  3514. }
  3515. Jim_SetResult( goi.interp, Jim_NewListObj( goi.interp, NULL, 0 ) );
  3516. for( x = 0 ; target_types[x] ; x++ ){
  3517. Jim_ListAppendElement( goi.interp,
  3518. Jim_GetResult(goi.interp),
  3519. Jim_NewStringObj( goi.interp, target_types[x]->name, -1 ) );
  3520. }
  3521. return JIM_OK;
  3522. case TG_CMD_NAMES:
  3523. if( goi.argc != 0 ){
  3524. Jim_WrongNumArgs( goi.interp, 1, goi.argv, "Too many parameters" );
  3525. return JIM_ERR;
  3526. }
  3527. Jim_SetResult( goi.interp, Jim_NewListObj( goi.interp, NULL, 0 ) );
  3528. target = all_targets;
  3529. while( target ){
  3530. Jim_ListAppendElement( goi.interp,
  3531. Jim_GetResult(goi.interp),
  3532. Jim_NewStringObj( goi.interp, target->cmd_name, -1 ) );
  3533. target = target->next;
  3534. }
  3535. return JIM_OK;
  3536. case TG_CMD_CREATE:
  3537. if( goi.argc < 3 ){
  3538. Jim_WrongNumArgs( goi.interp, goi.argc, goi.argv, "?name ... config options ...");
  3539. return JIM_ERR;
  3540. }
  3541. return target_create( &goi );
  3542. break;
  3543. case TG_CMD_NUMBER:
  3544. if( goi.argc != 1 ){
  3545. Jim_SetResult_sprintf( goi.interp, "expected: target number ?NUMBER?");
  3546. return JIM_ERR;
  3547. }
  3548. e = Jim_GetOpt_Wide( &goi, &w );
  3549. if( e != JIM_OK ){
  3550. return JIM_ERR;
  3551. }
  3552. {
  3553. target_t *t;
  3554. t = get_target_by_num(w);
  3555. if( t == NULL ){
  3556. Jim_SetResult_sprintf( goi.interp,"Target: number %d does not exist", (int)(w));
  3557. return JIM_ERR;
  3558. }
  3559. Jim_SetResultString( goi.interp, t->cmd_name, -1 );
  3560. return JIM_OK;
  3561. }
  3562. case TG_CMD_COUNT:
  3563. if( goi.argc != 0 ){
  3564. Jim_WrongNumArgs( goi.interp, 0, goi.argv, "<no parameters>");
  3565. return JIM_ERR;
  3566. }
  3567. Jim_SetResult( goi.interp,
  3568. Jim_NewIntObj( goi.interp, max_target_number()));
  3569. return JIM_OK;
  3570. }
  3571. return JIM_ERR;
  3572. }
  3573. struct FastLoad
  3574. {
  3575. u32 address;
  3576. u8 *data;
  3577. int length;
  3578. };
  3579. static int fastload_num;
  3580. static struct FastLoad *fastload;
  3581. static void free_fastload(void)
  3582. {
  3583. if (fastload!=NULL)
  3584. {
  3585. int i;
  3586. for (i=0; i<fastload_num; i++)
  3587. {
  3588. if (fastload[i].data)
  3589. free(fastload[i].data);
  3590. }
  3591. free(fastload);
  3592. fastload=NULL;
  3593. }
  3594. }
  3595. static int handle_fast_load_image_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
  3596. {
  3597. u8 *buffer;
  3598. u32 buf_cnt;
  3599. u32 image_size;
  3600. u32 min_address=0;
  3601. u32 max_address=0xffffffff;
  3602. int i;
  3603. int retval;
  3604. image_t image;
  3605. duration_t duration;
  3606. char *duration_text;
  3607. if ((argc < 1)||(argc > 5))
  3608. {
  3609. return ERROR_COMMAND_SYNTAX_ERROR;
  3610. }
  3611. /* a base address isn't always necessary, default to 0x0 (i.e. don't relocate) */
  3612. if (argc >= 2)
  3613. {
  3614. image.base_address_set = 1;
  3615. image.base_address = strtoul(args[1], NULL, 0);
  3616. }
  3617. else
  3618. {
  3619. image.base_address_set = 0;
  3620. }
  3621. image.start_address_set = 0;
  3622. if (argc>=4)
  3623. {
  3624. min_address=strtoul(args[3], NULL, 0);
  3625. }
  3626. if (argc>=5)
  3627. {
  3628. max_address=strtoul(args[4], NULL, 0)+min_address;
  3629. }
  3630. if (min_address>max_address)
  3631. {
  3632. return ERROR_COMMAND_SYNTAX_ERROR;
  3633. }
  3634. duration_start_measure(&duration);
  3635. if (image_open(&image, args[0], (argc >= 3) ? args[2] : NULL) != ERROR_OK)
  3636. {
  3637. return ERROR_OK;
  3638. }
  3639. image_size = 0x0;
  3640. retval = ERROR_OK;
  3641. fastload_num=image.num_sections;
  3642. fastload=(struct FastLoad *)malloc(sizeof(struct FastLoad)*image.num_sections);
  3643. if (fastload==NULL)
  3644. {
  3645. image_close(&image);
  3646. return ERROR_FAIL;
  3647. }
  3648. memset(fastload, 0, sizeof(struct FastLoad)*image.num_sections);
  3649. for (i = 0; i < image.num_sections; i++)
  3650. {
  3651. buffer = malloc(image.sections[i].size);
  3652. if (buffer == NULL)
  3653. {
  3654. command_print(cmd_ctx, "error allocating buffer for section (%d bytes)", image.sections[i].size);
  3655. break;
  3656. }
  3657. if ((retval = image_read_section(&image, i, 0x0, image.sections[i].size, buffer, &buf_cnt)) != ERROR_OK)
  3658. {
  3659. free(buffer);
  3660. break;
  3661. }
  3662. u32 offset=0;
  3663. u32 length=buf_cnt;
  3664. /* DANGER!!! beware of unsigned comparision here!!! */
  3665. if ((image.sections[i].base_address+buf_cnt>=min_address)&&
  3666. (image.sections[i].base_address<max_address))
  3667. {
  3668. if (image.sections[i].base_address<min_address)
  3669. {
  3670. /* clip addresses below */
  3671. offset+=min_address-image.sections[i].base_address;
  3672. length-=offset;
  3673. }
  3674. if (image.sections[i].base_address+buf_cnt>max_address)
  3675. {
  3676. length-=(image.sections[i].base_address+buf_cnt)-max_address;
  3677. }
  3678. fastload[i].address=image.sections[i].base_address+offset;
  3679. fastload[i].data=malloc(length);
  3680. if (fastload[i].data==NULL)
  3681. {
  3682. free(buffer);
  3683. break;
  3684. }
  3685. memcpy(fastload[i].data, buffer+offset, length);
  3686. fastload[i].length=length;
  3687. image_size += length;
  3688. command_print(cmd_ctx, "%u byte written at address 0x%8.8x", length, image.sections[i].base_address+offset);
  3689. }
  3690. free(buffer);
  3691. }
  3692. duration_stop_measure(&duration, &duration_text);
  3693. if (retval==ERROR_OK)
  3694. {
  3695. command_print(cmd_ctx, "Loaded %u bytes in %s", image_size, duration_text);
  3696. command_print(cmd_ctx, "NB!!! image has not been loaded to target, issue a subsequent 'fast_load' to do so.");
  3697. }
  3698. free(duration_text);
  3699. image_close(&image);
  3700. if (retval!=ERROR_OK)
  3701. {
  3702. free_fastload();
  3703. }
  3704. return retval;
  3705. }
  3706. static int handle_fast_load_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
  3707. {
  3708. if (argc>0)
  3709. return ERROR_COMMAND_SYNTAX_ERROR;
  3710. if (fastload==NULL)
  3711. {
  3712. LOG_ERROR("No image in memory");
  3713. return ERROR_FAIL;
  3714. }
  3715. int i;
  3716. int ms=timeval_ms();
  3717. int size=0;
  3718. int retval=ERROR_OK;
  3719. for (i=0; i<fastload_num;i++)
  3720. {
  3721. target_t *target = get_current_target(cmd_ctx);
  3722. command_print(cmd_ctx, "Write to 0x%08x, length 0x%08x", fastload[i].address, fastload[i].length);
  3723. if (retval==ERROR_OK)
  3724. {
  3725. retval = target_write_buffer(target, fastload[i].address, fastload[i].length, fastload[i].data);
  3726. }
  3727. size+=fastload[i].length;
  3728. }
  3729. int after=timeval_ms();
  3730. command_print(cmd_ctx, "Loaded image %f kBytes/s", (float)(size/1024.0)/((float)(after-ms)/1000.0));
  3731. return retval;
  3732. }