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

Linking to existing account procedure

If you already have an account and want to add another login method you MUST first sign in with your existing account and then change URL to read https://review.openocd.org/login/?link to get to this page again but this time it'll work for linking. Thank you.

SSH host keys fingerprints

1024 SHA256:YKx8b7u5ZWdcbp7/4AeXNaqElP49m6QrwfXaqQGJAOk gerrit-code-review@openocd.zylin.com (DSA)
384 SHA256:jHIbSQa4REvwCFG4cq5LBlBLxmxSqelQPem/EXIrxjk gerrit-code-review@openocd.org (ECDSA)
521 SHA256:UAOPYkU9Fjtcao0Ul/Rrlnj/OsQvt+pgdYSZ4jOYdgs gerrit-code-review@openocd.org (ECDSA)
256 SHA256:A13M5QlnozFOvTllybRZH6vm7iSt0XLxbA48yfc2yfY gerrit-code-review@openocd.org (ECDSA)
256 SHA256:spYMBqEYoAOtK7yZBrcwE8ZpYt6b68Cfh9yEVetvbXg gerrit-code-review@openocd.org (ED25519)
+--[ED25519 256]--+
|=..              |
|+o..   .         |
|*.o   . .        |
|+B . . .         |
|Bo. = o S        |
|Oo.+ + =         |
|oB=.* = . o      |
| =+=.+   + E     |
|. .=o   . o      |
+----[SHA256]-----+
2048 SHA256:0Onrb7/PHjpo6iVZ7xQX2riKN83FJ3KGU0TvI0TaFG4 gerrit-code-review@openocd.zylin.com (RSA)