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

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)