Use parse_uint in handle_reg_command to ensure reg number parses properly.
[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 int ms = 5000;
1826
1827 if (argc > 0)
1828 {
1829 char *end;
1830
1831 ms = strtoul(args[0], &end, 0) * 1000;
1832 if (*end)
1833 {
1834 command_print(cmd_ctx, "usage: %s [seconds]", cmd);
1835 return ERROR_OK;
1836 }
1837 }
1838 target_t *target = get_current_target(cmd_ctx);
1839
1840 return target_wait_state(target, TARGET_HALTED, ms);
1841 }
1842
1843 /* wait for target state to change. The trick here is to have a low
1844 * latency for short waits and not to suck up all the CPU time
1845 * on longer waits.
1846 *
1847 * After 500ms, keep_alive() is invoked
1848 */
1849 int target_wait_state(target_t *target, enum target_state state, int ms)
1850 {
1851 int retval;
1852 long long then=0, cur;
1853 int once=1;
1854
1855 for (;;)
1856 {
1857 if ((retval=target_poll(target))!=ERROR_OK)
1858 return retval;
1859 if (target->state == state)
1860 {
1861 break;
1862 }
1863 cur = timeval_ms();
1864 if (once)
1865 {
1866 once=0;
1867 then = timeval_ms();
1868 LOG_DEBUG("waiting for target %s...",
1869 Jim_Nvp_value2name_simple(nvp_target_state,state)->name);
1870 }
1871
1872 if (cur-then>500)
1873 {
1874 keep_alive();
1875 }
1876
1877 if ((cur-then)>ms)
1878 {
1879 LOG_ERROR("timed out while waiting for target %s",
1880 Jim_Nvp_value2name_simple(nvp_target_state,state)->name);
1881 return ERROR_FAIL;
1882 }
1883 }
1884
1885 return ERROR_OK;
1886 }
1887
1888 static int handle_halt_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
1889 {
1890 int retval;
1891 target_t *target = get_current_target(cmd_ctx);
1892
1893 LOG_DEBUG("-");
1894
1895 if ((retval = target_halt(target)) != ERROR_OK)
1896 {
1897 return retval;
1898 }
1899
1900 if (argc == 1)
1901 {
1902 int wait;
1903 char *end;
1904
1905 wait = strtoul(args[0], &end, 0);
1906 if (!*end && !wait)
1907 return ERROR_OK;
1908 }
1909
1910 return handle_wait_halt_command(cmd_ctx, cmd, args, argc);
1911 }
1912
1913 static int handle_soft_reset_halt_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
1914 {
1915 target_t *target = get_current_target(cmd_ctx);
1916
1917 LOG_USER("requesting target halt and executing a soft reset");
1918
1919 target->type->soft_reset_halt(target);
1920
1921 return ERROR_OK;
1922 }
1923
1924 static int handle_reset_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
1925 {
1926 if (argc > 1)
1927 return ERROR_COMMAND_SYNTAX_ERROR;
1928
1929 enum target_reset_mode reset_mode = RESET_RUN;
1930 if (argc == 1)
1931 {
1932 const Jim_Nvp *n;
1933 n = Jim_Nvp_name2value_simple( nvp_reset_modes, args[0] );
1934 if( (n->name == NULL) || (n->value == RESET_UNKNOWN) ){
1935 return ERROR_COMMAND_SYNTAX_ERROR;
1936 }
1937 reset_mode = n->value;
1938 }
1939
1940 /* reset *all* targets */
1941 return target_process_reset(cmd_ctx, reset_mode);
1942 }
1943
1944
1945 static int handle_resume_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
1946 {
1947 if (argc > 1)
1948 return ERROR_COMMAND_SYNTAX_ERROR;
1949
1950 target_t *target = get_current_target(cmd_ctx);
1951 target_handle_event(target, TARGET_EVENT_OLD_pre_resume);
1952
1953 /* with no args, resume from current pc, addr = 0,
1954 * with one arguments, addr = args[0],
1955 * handle breakpoints, not debugging */
1956 u32 addr = 0;
1957 if (argc == 1)
1958 addr = strtoul(args[0], NULL, 0);
1959
1960 return target_resume(target, 0, addr, 1, 0);
1961 }
1962
1963 static int handle_step_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
1964 {
1965 if (argc > 1)
1966 return ERROR_COMMAND_SYNTAX_ERROR;
1967
1968 LOG_DEBUG("-");
1969
1970 /* with no args, step from current pc, addr = 0,
1971 * with one argument addr = args[0],
1972 * handle breakpoints, debugging */
1973 u32 addr = 0;
1974 if (argc == 1)
1975 addr = strtoul(args[0], NULL, 0);
1976
1977 target_t *target = get_current_target(cmd_ctx);
1978 return target->type->step(target, 0, addr, 1);
1979 }
1980
1981 static void handle_md_output(struct command_context_s *cmd_ctx,
1982 struct target_s *target, u32 address, unsigned size,
1983 unsigned count, const u8 *buffer)
1984 {
1985 const unsigned line_bytecnt = 32;
1986 unsigned line_modulo = line_bytecnt / size;
1987
1988 char output[line_bytecnt * 4 + 1];
1989 unsigned output_len = 0;
1990
1991 const char *value_fmt;
1992 switch (size) {
1993 case 4: value_fmt = "%8.8x "; break;
1994 case 2: value_fmt = "%4.2x "; break;
1995 case 1: value_fmt = "%2.2x "; break;
1996 default:
1997 LOG_ERROR("invalid memory read size: %u", size);
1998 exit(-1);
1999 }
2000
2001 for (unsigned i = 0; i < count; i++)
2002 {
2003 if (i % line_modulo == 0)
2004 {
2005 output_len += snprintf(output + output_len,
2006 sizeof(output) - output_len,
2007 "0x%8.8x: ", address + (i*size));
2008 }
2009
2010 u32 value=0;
2011 const u8 *value_ptr = buffer + i * size;
2012 switch (size) {
2013 case 4: value = target_buffer_get_u32(target, value_ptr); break;
2014 case 2: value = target_buffer_get_u16(target, value_ptr); break;
2015 case 1: value = *value_ptr;
2016 }
2017 output_len += snprintf(output + output_len,
2018 sizeof(output) - output_len,
2019 value_fmt, value);
2020
2021 if ((i % line_modulo == line_modulo - 1) || (i == count - 1))
2022 {
2023 command_print(cmd_ctx, "%s", output);
2024 output_len = 0;
2025 }
2026 }
2027 }
2028
2029 static int handle_md_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
2030 {
2031 if (argc < 1)
2032 return ERROR_COMMAND_SYNTAX_ERROR;
2033
2034 unsigned size = 0;
2035 switch (cmd[2]) {
2036 case 'w': size = 4; break;
2037 case 'h': size = 2; break;
2038 case 'b': size = 1; break;
2039 default: return ERROR_COMMAND_SYNTAX_ERROR;
2040 }
2041
2042 u32 address = strtoul(args[0], NULL, 0);
2043
2044 unsigned count = 1;
2045 if (argc == 2)
2046 count = strtoul(args[1], NULL, 0);
2047
2048 u8 *buffer = calloc(count, size);
2049
2050 target_t *target = get_current_target(cmd_ctx);
2051 int retval = target_read_memory(target,
2052 address, size, count, buffer);
2053 if (ERROR_OK == retval)
2054 handle_md_output(cmd_ctx, target, address, size, count, buffer);
2055
2056 free(buffer);
2057
2058 return retval;
2059 }
2060
2061 static int handle_mw_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
2062 {
2063 u32 address = 0;
2064 u32 value = 0;
2065 int count = 1;
2066 int i;
2067 int wordsize;
2068 target_t *target = get_current_target(cmd_ctx);
2069 u8 value_buf[4];
2070
2071 if ((argc < 2) || (argc > 3))
2072 return ERROR_COMMAND_SYNTAX_ERROR;
2073
2074 address = strtoul(args[0], NULL, 0);
2075 value = strtoul(args[1], NULL, 0);
2076 if (argc == 3)
2077 count = strtoul(args[2], NULL, 0);
2078
2079 switch (cmd[2])
2080 {
2081 case 'w':
2082 wordsize = 4;
2083 target_buffer_set_u32(target, value_buf, value);
2084 break;
2085 case 'h':
2086 wordsize = 2;
2087 target_buffer_set_u16(target, value_buf, value);
2088 break;
2089 case 'b':
2090 wordsize = 1;
2091 value_buf[0] = value;
2092 break;
2093 default:
2094 return ERROR_COMMAND_SYNTAX_ERROR;
2095 }
2096 for (i=0; i<count; i++)
2097 {
2098 int retval = target_write_memory(target,
2099 address + i * wordsize, wordsize, 1, value_buf);
2100 if (ERROR_OK != retval)
2101 return retval;
2102 keep_alive();
2103 }
2104
2105 return ERROR_OK;
2106
2107 }
2108
2109 static int handle_load_image_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
2110 {
2111 u8 *buffer;
2112 u32 buf_cnt;
2113 u32 image_size;
2114 u32 min_address=0;
2115 u32 max_address=0xffffffff;
2116 int i;
2117 int retval, retvaltemp;
2118
2119 image_t image;
2120
2121 duration_t duration;
2122 char *duration_text;
2123
2124 target_t *target = get_current_target(cmd_ctx);
2125
2126 if ((argc < 1)||(argc > 5))
2127 {
2128 return ERROR_COMMAND_SYNTAX_ERROR;
2129 }
2130
2131 /* a base address isn't always necessary, default to 0x0 (i.e. don't relocate) */
2132 if (argc >= 2)
2133 {
2134 image.base_address_set = 1;
2135 image.base_address = strtoul(args[1], NULL, 0);
2136 }
2137 else
2138 {
2139 image.base_address_set = 0;
2140 }
2141
2142
2143 image.start_address_set = 0;
2144
2145 if (argc>=4)
2146 {
2147 min_address=strtoul(args[3], NULL, 0);
2148 }
2149 if (argc>=5)
2150 {
2151 max_address=strtoul(args[4], NULL, 0)+min_address;
2152 }
2153
2154 if (min_address>max_address)
2155 {
2156 return ERROR_COMMAND_SYNTAX_ERROR;
2157 }
2158
2159 duration_start_measure(&duration);
2160
2161 if (image_open(&image, args[0], (argc >= 3) ? args[2] : NULL) != ERROR_OK)
2162 {
2163 return ERROR_OK;
2164 }
2165
2166 image_size = 0x0;
2167 retval = ERROR_OK;
2168 for (i = 0; i < image.num_sections; i++)
2169 {
2170 buffer = malloc(image.sections[i].size);
2171 if (buffer == NULL)
2172 {
2173 command_print(cmd_ctx, "error allocating buffer for section (%d bytes)", image.sections[i].size);
2174 break;
2175 }
2176
2177 if ((retval = image_read_section(&image, i, 0x0, image.sections[i].size, buffer, &buf_cnt)) != ERROR_OK)
2178 {
2179 free(buffer);
2180 break;
2181 }
2182
2183 u32 offset=0;
2184 u32 length=buf_cnt;
2185
2186 /* DANGER!!! beware of unsigned comparision here!!! */
2187
2188 if ((image.sections[i].base_address+buf_cnt>=min_address)&&
2189 (image.sections[i].base_address<max_address))
2190 {
2191 if (image.sections[i].base_address<min_address)
2192 {
2193 /* clip addresses below */
2194 offset+=min_address-image.sections[i].base_address;
2195 length-=offset;
2196 }
2197
2198 if (image.sections[i].base_address+buf_cnt>max_address)
2199 {
2200 length-=(image.sections[i].base_address+buf_cnt)-max_address;
2201 }
2202
2203 if ((retval = target_write_buffer(target, image.sections[i].base_address+offset, length, buffer+offset)) != ERROR_OK)
2204 {
2205 free(buffer);
2206 break;
2207 }
2208 image_size += length;
2209 command_print(cmd_ctx, "%u byte written at address 0x%8.8x", length, image.sections[i].base_address+offset);
2210 }
2211
2212 free(buffer);
2213 }
2214
2215 if((retvaltemp = duration_stop_measure(&duration, &duration_text)) != ERROR_OK)
2216 {
2217 image_close(&image);
2218 return retvaltemp;
2219 }
2220
2221 if (retval==ERROR_OK)
2222 {
2223 command_print(cmd_ctx, "downloaded %u byte in %s", image_size, duration_text);
2224 }
2225 free(duration_text);
2226
2227 image_close(&image);
2228
2229 return retval;
2230
2231 }
2232
2233 static int handle_dump_image_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
2234 {
2235 fileio_t fileio;
2236
2237 u32 address;
2238 u32 size;
2239 u8 buffer[560];
2240 int retval=ERROR_OK, retvaltemp;
2241
2242 duration_t duration;
2243 char *duration_text;
2244
2245 target_t *target = get_current_target(cmd_ctx);
2246
2247 if (argc != 3)
2248 {
2249 command_print(cmd_ctx, "usage: dump_image <filename> <address> <size>");
2250 return ERROR_OK;
2251 }
2252
2253 address = strtoul(args[1], NULL, 0);
2254 size = strtoul(args[2], NULL, 0);
2255
2256 if (fileio_open(&fileio, args[0], FILEIO_WRITE, FILEIO_BINARY) != ERROR_OK)
2257 {
2258 return ERROR_OK;
2259 }
2260
2261 duration_start_measure(&duration);
2262
2263 while (size > 0)
2264 {
2265 u32 size_written;
2266 u32 this_run_size = (size > 560) ? 560 : size;
2267
2268 retval = target_read_buffer(target, address, this_run_size, buffer);
2269 if (retval != ERROR_OK)
2270 {
2271 break;
2272 }
2273
2274 retval = fileio_write(&fileio, this_run_size, buffer, &size_written);
2275 if (retval != ERROR_OK)
2276 {
2277 break;
2278 }
2279
2280 size -= this_run_size;
2281 address += this_run_size;
2282 }
2283
2284 if((retvaltemp = fileio_close(&fileio)) != ERROR_OK)
2285 return retvaltemp;
2286
2287 if((retvaltemp = duration_stop_measure(&duration, &duration_text)) != ERROR_OK)
2288 return retvaltemp;
2289
2290 if (retval==ERROR_OK)
2291 {
2292 command_print(cmd_ctx, "dumped %lld byte in %s",
2293 fileio.size, duration_text);
2294 free(duration_text);
2295 }
2296
2297 return retval;
2298 }
2299
2300 static int handle_verify_image_command_internal(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc, int verify)
2301 {
2302 u8 *buffer;
2303 u32 buf_cnt;
2304 u32 image_size;
2305 int i;
2306 int retval, retvaltemp;
2307 u32 checksum = 0;
2308 u32 mem_checksum = 0;
2309
2310 image_t image;
2311
2312 duration_t duration;
2313 char *duration_text;
2314
2315 target_t *target = get_current_target(cmd_ctx);
2316
2317 if (argc < 1)
2318 {
2319 return ERROR_COMMAND_SYNTAX_ERROR;
2320 }
2321
2322 if (!target)
2323 {
2324 LOG_ERROR("no target selected");
2325 return ERROR_FAIL;
2326 }
2327
2328 duration_start_measure(&duration);
2329
2330 if (argc >= 2)
2331 {
2332 image.base_address_set = 1;
2333 image.base_address = strtoul(args[1], NULL, 0);
2334 }
2335 else
2336 {
2337 image.base_address_set = 0;
2338 image.base_address = 0x0;
2339 }
2340
2341 image.start_address_set = 0;
2342
2343 if ((retval=image_open(&image, args[0], (argc == 3) ? args[2] : NULL)) != ERROR_OK)
2344 {
2345 return retval;
2346 }
2347
2348 image_size = 0x0;
2349 retval=ERROR_OK;
2350 for (i = 0; i < image.num_sections; i++)
2351 {
2352 buffer = malloc(image.sections[i].size);
2353 if (buffer == NULL)
2354 {
2355 command_print(cmd_ctx, "error allocating buffer for section (%d bytes)", image.sections[i].size);
2356 break;
2357 }
2358 if ((retval = image_read_section(&image, i, 0x0, image.sections[i].size, buffer, &buf_cnt)) != ERROR_OK)
2359 {
2360 free(buffer);
2361 break;
2362 }
2363
2364 if (verify)
2365 {
2366 /* calculate checksum of image */
2367 image_calculate_checksum( buffer, buf_cnt, &checksum );
2368
2369 retval = target_checksum_memory(target, image.sections[i].base_address, buf_cnt, &mem_checksum);
2370 if( retval != ERROR_OK )
2371 {
2372 free(buffer);
2373 break;
2374 }
2375
2376 if( checksum != mem_checksum )
2377 {
2378 /* failed crc checksum, fall back to a binary compare */
2379 u8 *data;
2380
2381 command_print(cmd_ctx, "checksum mismatch - attempting binary compare");
2382
2383 data = (u8*)malloc(buf_cnt);
2384
2385 /* Can we use 32bit word accesses? */
2386 int size = 1;
2387 int count = buf_cnt;
2388 if ((count % 4) == 0)
2389 {
2390 size *= 4;
2391 count /= 4;
2392 }
2393 retval = target_read_memory(target, image.sections[i].base_address, size, count, data);
2394 if (retval == ERROR_OK)
2395 {
2396 u32 t;
2397 for (t = 0; t < buf_cnt; t++)
2398 {
2399 if (data[t] != buffer[t])
2400 {
2401 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]);
2402 free(data);
2403 free(buffer);
2404 retval=ERROR_FAIL;
2405 goto done;
2406 }
2407 if ((t%16384)==0)
2408 {
2409 keep_alive();
2410 }
2411 }
2412 }
2413
2414 free(data);
2415 }
2416 } else
2417 {
2418 command_print(cmd_ctx, "address 0x%08x length 0x%08x", image.sections[i].base_address, buf_cnt);
2419 }
2420
2421 free(buffer);
2422 image_size += buf_cnt;
2423 }
2424 done:
2425
2426 if((retvaltemp = duration_stop_measure(&duration, &duration_text)) != ERROR_OK)
2427 {
2428 image_close(&image);
2429 return retvaltemp;
2430 }
2431
2432 if (retval==ERROR_OK)
2433 {
2434 command_print(cmd_ctx, "verified %u bytes in %s", image_size, duration_text);
2435 }
2436 free(duration_text);
2437
2438 image_close(&image);
2439
2440 return retval;
2441 }
2442
2443 static int handle_verify_image_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
2444 {
2445 return handle_verify_image_command_internal(cmd_ctx, cmd, args, argc, 1);
2446 }
2447
2448 static int handle_test_image_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
2449 {
2450 return handle_verify_image_command_internal(cmd_ctx, cmd, args, argc, 0);
2451 }
2452
2453 static int handle_bp_command_list(struct command_context_s *cmd_ctx)
2454 {
2455 target_t *target = get_current_target(cmd_ctx);
2456 breakpoint_t *breakpoint = target->breakpoints;
2457 while (breakpoint)
2458 {
2459 if (breakpoint->type == BKPT_SOFT)
2460 {
2461 char* buf = buf_to_str(breakpoint->orig_instr,
2462 breakpoint->length, 16);
2463 command_print(cmd_ctx, "0x%8.8x, 0x%x, %i, 0x%s",
2464 breakpoint->address, breakpoint->length,
2465 breakpoint->set, buf);
2466 free(buf);
2467 }
2468 else
2469 {
2470 command_print(cmd_ctx, "0x%8.8x, 0x%x, %i",
2471 breakpoint->address, breakpoint->length, breakpoint->set);
2472 }
2473
2474 breakpoint = breakpoint->next;
2475 }
2476 return ERROR_OK;
2477 }
2478
2479 static int handle_bp_command_set(struct command_context_s *cmd_ctx,
2480 u32 addr, u32 length, int hw)
2481 {
2482 target_t *target = get_current_target(cmd_ctx);
2483 int retval = breakpoint_add(target, addr, length, hw);
2484 if (ERROR_OK == retval)
2485 command_print(cmd_ctx, "breakpoint set at 0x%8.8x", addr);
2486 else
2487 LOG_ERROR("Failure setting breakpoint");
2488 return retval;
2489 }
2490
2491 static int handle_bp_command(struct command_context_s *cmd_ctx,
2492 char *cmd, char **args, int argc)
2493 {
2494 if (argc == 0)
2495 return handle_bp_command_list(cmd_ctx);
2496
2497 if (argc < 2 || argc > 3)
2498 {
2499 command_print(cmd_ctx, "usage: bp <address> <length> ['hw']");
2500 return ERROR_COMMAND_SYNTAX_ERROR;
2501 }
2502
2503 u32 addr = strtoul(args[0], NULL, 0);
2504 u32 length = strtoul(args[1], NULL, 0);
2505
2506 int hw = BKPT_SOFT;
2507 if (argc == 3)
2508 {
2509 if (strcmp(args[2], "hw") == 0)
2510 hw = BKPT_HARD;
2511 else
2512 return ERROR_COMMAND_SYNTAX_ERROR;
2513 }
2514
2515 return handle_bp_command_set(cmd_ctx, addr, length, hw);
2516 }
2517
2518 static int handle_rbp_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
2519 {
2520 target_t *target = get_current_target(cmd_ctx);
2521
2522 if (argc > 0)
2523 breakpoint_remove(target, strtoul(args[0], NULL, 0));
2524
2525 return ERROR_OK;
2526 }
2527
2528 static int handle_wp_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
2529 {
2530 target_t *target = get_current_target(cmd_ctx);
2531 int retval;
2532
2533 if (argc == 0)
2534 {
2535 watchpoint_t *watchpoint = target->watchpoints;
2536
2537 while (watchpoint)
2538 {
2539 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);
2540 watchpoint = watchpoint->next;
2541 }
2542 }
2543 else if (argc >= 2)
2544 {
2545 enum watchpoint_rw type = WPT_ACCESS;
2546 u32 data_value = 0x0;
2547 u32 data_mask = 0xffffffff;
2548
2549 if (argc >= 3)
2550 {
2551 switch(args[2][0])
2552 {
2553 case 'r':
2554 type = WPT_READ;
2555 break;
2556 case 'w':
2557 type = WPT_WRITE;
2558 break;
2559 case 'a':
2560 type = WPT_ACCESS;
2561 break;
2562 default:
2563 command_print(cmd_ctx, "usage: wp <address> <length> [r/w/a] [value] [mask]");
2564 return ERROR_OK;
2565 }
2566 }
2567 if (argc >= 4)
2568 {
2569 data_value = strtoul(args[3], NULL, 0);
2570 }
2571 if (argc >= 5)
2572 {
2573 data_mask = strtoul(args[4], NULL, 0);
2574 }
2575
2576 if ((retval = watchpoint_add(target, strtoul(args[0], NULL, 0),
2577 strtoul(args[1], NULL, 0), type, data_value, data_mask)) != ERROR_OK)
2578 {
2579 LOG_ERROR("Failure setting breakpoints");
2580 }
2581 }
2582 else
2583 {
2584 command_print(cmd_ctx, "usage: wp <address> <length> [r/w/a] [value] [mask]");
2585 }
2586
2587 return ERROR_OK;
2588 }
2589
2590 static int handle_rwp_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
2591 {
2592 if (argc != 1)
2593 return ERROR_COMMAND_SYNTAX_ERROR;
2594
2595 target_t *target = get_current_target(cmd_ctx);
2596 watchpoint_remove(target, strtoul(args[0], NULL, 0));
2597
2598 return ERROR_OK;
2599 }
2600
2601
2602 /**
2603 * Translate a virtual address to a physical address.
2604 *
2605 * The low-level target implementation must have logged a detailed error
2606 * which is forwarded to telnet/GDB session.
2607 */
2608 static int handle_virt2phys_command(command_context_t *cmd_ctx,
2609 char *cmd, char **args, int argc)
2610 {
2611 if (argc != 1)
2612 return ERROR_COMMAND_SYNTAX_ERROR;
2613
2614 target_t *target = get_current_target(cmd_ctx);
2615 u32 va = strtoul(args[0], NULL, 0);
2616 u32 pa;
2617
2618 int retval = target->type->virt2phys(target, va, &pa);
2619 if (retval == ERROR_OK)
2620 command_print(cmd_ctx, "Physical address 0x%08x", pa);
2621
2622 return retval;
2623 }
2624
2625 static void writeData(FILE *f, const void *data, size_t len)
2626 {
2627 size_t written = fwrite(data, 1, len, f);
2628 if (written != len)
2629 LOG_ERROR("failed to write %zu bytes: %s", len, strerror(errno));
2630 }
2631
2632 static void writeLong(FILE *f, int l)
2633 {
2634 int i;
2635 for (i=0; i<4; i++)
2636 {
2637 char c=(l>>(i*8))&0xff;
2638 writeData(f, &c, 1);
2639 }
2640
2641 }
2642
2643 static void writeString(FILE *f, char *s)
2644 {
2645 writeData(f, s, strlen(s));
2646 }
2647
2648 /* Dump a gmon.out histogram file. */
2649 static void writeGmon(u32 *samples, u32 sampleNum, char *filename)
2650 {
2651 u32 i;
2652 FILE *f=fopen(filename, "w");
2653 if (f==NULL)
2654 return;
2655 writeString(f, "gmon");
2656 writeLong(f, 0x00000001); /* Version */
2657 writeLong(f, 0); /* padding */
2658 writeLong(f, 0); /* padding */
2659 writeLong(f, 0); /* padding */
2660
2661 u8 zero = 0; /* GMON_TAG_TIME_HIST */
2662 writeData(f, &zero, 1);
2663
2664 /* figure out bucket size */
2665 u32 min=samples[0];
2666 u32 max=samples[0];
2667 for (i=0; i<sampleNum; i++)
2668 {
2669 if (min>samples[i])
2670 {
2671 min=samples[i];
2672 }
2673 if (max<samples[i])
2674 {
2675 max=samples[i];
2676 }
2677 }
2678
2679 int addressSpace=(max-min+1);
2680
2681 static const u32 maxBuckets = 256 * 1024; /* maximum buckets. */
2682 u32 length = addressSpace;
2683 if (length > maxBuckets)
2684 {
2685 length=maxBuckets;
2686 }
2687 int *buckets=malloc(sizeof(int)*length);
2688 if (buckets==NULL)
2689 {
2690 fclose(f);
2691 return;
2692 }
2693 memset(buckets, 0, sizeof(int)*length);
2694 for (i=0; i<sampleNum;i++)
2695 {
2696 u32 address=samples[i];
2697 long long a=address-min;
2698 long long b=length-1;
2699 long long c=addressSpace-1;
2700 int index=(a*b)/c; /* danger!!!! int32 overflows */
2701 buckets[index]++;
2702 }
2703
2704 /* append binary memory gmon.out &profile_hist_hdr ((char*)&profile_hist_hdr + sizeof(struct gmon_hist_hdr)) */
2705 writeLong(f, min); /* low_pc */
2706 writeLong(f, max); /* high_pc */
2707 writeLong(f, length); /* # of samples */
2708 writeLong(f, 64000000); /* 64MHz */
2709 writeString(f, "seconds");
2710 for (i=0; i<(15-strlen("seconds")); i++)
2711 writeData(f, &zero, 1);
2712 writeString(f, "s");
2713
2714 /*append binary memory gmon.out profile_hist_data (profile_hist_data + profile_hist_hdr.hist_size) */
2715
2716 char *data=malloc(2*length);
2717 if (data!=NULL)
2718 {
2719 for (i=0; i<length;i++)
2720 {
2721 int val;
2722 val=buckets[i];
2723 if (val>65535)
2724 {
2725 val=65535;
2726 }
2727 data[i*2]=val&0xff;
2728 data[i*2+1]=(val>>8)&0xff;
2729 }
2730 free(buckets);
2731 writeData(f, data, length * 2);
2732 free(data);
2733 } else
2734 {
2735 free(buckets);
2736 }
2737
2738 fclose(f);
2739 }
2740
2741 /* profiling samples the CPU PC as quickly as OpenOCD is able, which will be used as a random sampling of PC */
2742 static int handle_profile_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
2743 {
2744 target_t *target = get_current_target(cmd_ctx);
2745 struct timeval timeout, now;
2746
2747 gettimeofday(&timeout, NULL);
2748 if (argc!=2)
2749 {
2750 return ERROR_COMMAND_SYNTAX_ERROR;
2751 }
2752 char *end;
2753 timeval_add_time(&timeout, strtoul(args[0], &end, 0), 0);
2754 if (*end)
2755 {
2756 return ERROR_OK;
2757 }
2758
2759 command_print(cmd_ctx, "Starting profiling. Halting and resuming the target as often as we can...");
2760
2761 static const int maxSample=10000;
2762 u32 *samples=malloc(sizeof(u32)*maxSample);
2763 if (samples==NULL)
2764 return ERROR_OK;
2765
2766 int numSamples=0;
2767 int retval=ERROR_OK;
2768 /* hopefully it is safe to cache! We want to stop/restart as quickly as possible. */
2769 reg_t *reg = register_get_by_name(target->reg_cache, "pc", 1);
2770
2771 for (;;)
2772 {
2773 target_poll(target);
2774 if (target->state == TARGET_HALTED)
2775 {
2776 u32 t=*((u32 *)reg->value);
2777 samples[numSamples++]=t;
2778 retval = target_resume(target, 1, 0, 0, 0); /* current pc, addr = 0, do not handle breakpoints, not debugging */
2779 target_poll(target);
2780 alive_sleep(10); /* sleep 10ms, i.e. <100 samples/second. */
2781 } else if (target->state == TARGET_RUNNING)
2782 {
2783 /* We want to quickly sample the PC. */
2784 if((retval = target_halt(target)) != ERROR_OK)
2785 {
2786 free(samples);
2787 return retval;
2788 }
2789 } else
2790 {
2791 command_print(cmd_ctx, "Target not halted or running");
2792 retval=ERROR_OK;
2793 break;
2794 }
2795 if (retval!=ERROR_OK)
2796 {
2797 break;
2798 }
2799
2800 gettimeofday(&now, NULL);
2801 if ((numSamples>=maxSample) || ((now.tv_sec >= timeout.tv_sec) && (now.tv_usec >= timeout.tv_usec)))
2802 {
2803 command_print(cmd_ctx, "Profiling completed. %d samples.", numSamples);
2804 if((retval = target_poll(target)) != ERROR_OK)
2805 {
2806 free(samples);
2807 return retval;
2808 }
2809 if (target->state == TARGET_HALTED)
2810 {
2811 target_resume(target, 1, 0, 0, 0); /* current pc, addr = 0, do not handle breakpoints, not debugging */
2812 }
2813 if((retval = target_poll(target)) != ERROR_OK)
2814 {
2815 free(samples);
2816 return retval;
2817 }
2818 writeGmon(samples, numSamples, args[1]);
2819 command_print(cmd_ctx, "Wrote %s", args[1]);
2820 break;
2821 }
2822 }
2823 free(samples);
2824
2825 return ERROR_OK;
2826 }
2827
2828 static int new_int_array_element(Jim_Interp * interp, const char *varname, int idx, u32 val)
2829 {
2830 char *namebuf;
2831 Jim_Obj *nameObjPtr, *valObjPtr;
2832 int result;
2833
2834 namebuf = alloc_printf("%s(%d)", varname, idx);
2835 if (!namebuf)
2836 return JIM_ERR;
2837
2838 nameObjPtr = Jim_NewStringObj(interp, namebuf, -1);
2839 valObjPtr = Jim_NewIntObj(interp, val);
2840 if (!nameObjPtr || !valObjPtr)
2841 {
2842 free(namebuf);
2843 return JIM_ERR;
2844 }
2845
2846 Jim_IncrRefCount(nameObjPtr);
2847 Jim_IncrRefCount(valObjPtr);
2848 result = Jim_SetVariable(interp, nameObjPtr, valObjPtr);
2849 Jim_DecrRefCount(interp, nameObjPtr);
2850 Jim_DecrRefCount(interp, valObjPtr);
2851 free(namebuf);
2852 /* printf("%s(%d) <= 0%08x\n", varname, idx, val); */
2853 return result;
2854 }
2855
2856 static int jim_mem2array(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
2857 {
2858 command_context_t *context;
2859 target_t *target;
2860
2861 context = Jim_GetAssocData(interp, "context");
2862 if (context == NULL)
2863 {
2864 LOG_ERROR("mem2array: no command context");
2865 return JIM_ERR;
2866 }
2867 target = get_current_target(context);
2868 if (target == NULL)
2869 {
2870 LOG_ERROR("mem2array: no current target");
2871 return JIM_ERR;
2872 }
2873
2874 return target_mem2array(interp, target, argc-1, argv+1);
2875 }
2876
2877 static int target_mem2array(Jim_Interp *interp, target_t *target, int argc, Jim_Obj *const *argv)
2878 {
2879 long l;
2880 u32 width;
2881 int len;
2882 u32 addr;
2883 u32 count;
2884 u32 v;
2885 const char *varname;
2886 u8 buffer[4096];
2887 int n, e, retval;
2888 u32 i;
2889
2890 /* argv[1] = name of array to receive the data
2891 * argv[2] = desired width
2892 * argv[3] = memory address
2893 * argv[4] = count of times to read
2894 */
2895 if (argc != 4) {
2896 Jim_WrongNumArgs(interp, 1, argv, "varname width addr nelems");
2897 return JIM_ERR;
2898 }
2899 varname = Jim_GetString(argv[0], &len);
2900 /* given "foo" get space for worse case "foo(%d)" .. add 20 */
2901
2902 e = Jim_GetLong(interp, argv[1], &l);
2903 width = l;
2904 if (e != JIM_OK) {
2905 return e;
2906 }
2907
2908 e = Jim_GetLong(interp, argv[2], &l);
2909 addr = l;
2910 if (e != JIM_OK) {
2911 return e;
2912 }
2913 e = Jim_GetLong(interp, argv[3], &l);
2914 len = l;
2915 if (e != JIM_OK) {
2916 return e;
2917 }
2918 switch (width) {
2919 case 8:
2920 width = 1;
2921 break;
2922 case 16:
2923 width = 2;
2924 break;
2925 case 32:
2926 width = 4;
2927 break;
2928 default:
2929 Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
2930 Jim_AppendStrings( interp, Jim_GetResult(interp), "Invalid width param, must be 8/16/32", NULL );
2931 return JIM_ERR;
2932 }
2933 if (len == 0) {
2934 Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
2935 Jim_AppendStrings(interp, Jim_GetResult(interp), "mem2array: zero width read?", NULL);
2936 return JIM_ERR;
2937 }
2938 if ((addr + (len * width)) < addr) {
2939 Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
2940 Jim_AppendStrings(interp, Jim_GetResult(interp), "mem2array: addr + len - wraps to zero?", NULL);
2941 return JIM_ERR;
2942 }
2943 /* absurd transfer size? */
2944 if (len > 65536) {
2945 Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
2946 Jim_AppendStrings(interp, Jim_GetResult(interp), "mem2array: absurd > 64K item request", NULL);
2947 return JIM_ERR;
2948 }
2949
2950 if ((width == 1) ||
2951 ((width == 2) && ((addr & 1) == 0)) ||
2952 ((width == 4) && ((addr & 3) == 0))) {
2953 /* all is well */
2954 } else {
2955 char buf[100];
2956 Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
2957 sprintf(buf, "mem2array address: 0x%08x is not aligned for %d byte reads", addr, width);
2958 Jim_AppendStrings(interp, Jim_GetResult(interp), buf , NULL);
2959 return JIM_ERR;
2960 }
2961
2962 /* Transfer loop */
2963
2964 /* index counter */
2965 n = 0;
2966 /* assume ok */
2967 e = JIM_OK;
2968 while (len) {
2969 /* Slurp... in buffer size chunks */
2970
2971 count = len; /* in objects.. */
2972 if (count > (sizeof(buffer)/width)) {
2973 count = (sizeof(buffer)/width);
2974 }
2975
2976 retval = target_read_memory( target, addr, width, count, buffer );
2977 if (retval != ERROR_OK) {
2978 /* BOO !*/
2979 LOG_ERROR("mem2array: Read @ 0x%08x, w=%d, cnt=%d, failed", addr, width, count);
2980 Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
2981 Jim_AppendStrings(interp, Jim_GetResult(interp), "mem2array: cannot read memory", NULL);
2982 e = JIM_ERR;
2983 len = 0;
2984 } else {
2985 v = 0; /* shut up gcc */
2986 for (i = 0 ;i < count ;i++, n++) {
2987 switch (width) {
2988 case 4:
2989 v = target_buffer_get_u32(target, &buffer[i*width]);
2990 break;
2991 case 2:
2992 v = target_buffer_get_u16(target, &buffer[i*width]);
2993 break;
2994 case 1:
2995 v = buffer[i] & 0x0ff;
2996 break;
2997 }
2998 new_int_array_element(interp, varname, n, v);
2999 }
3000 len -= count;
3001 }
3002 }
3003
3004 Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
3005
3006 return JIM_OK;
3007 }
3008
3009 static int get_int_array_element(Jim_Interp * interp, const char *varname, int idx, u32 *val)
3010 {
3011 char *namebuf;
3012 Jim_Obj *nameObjPtr, *valObjPtr;
3013 int result;
3014 long l;
3015
3016 namebuf = alloc_printf("%s(%d)", varname, idx);
3017 if (!namebuf)
3018 return JIM_ERR;
3019
3020 nameObjPtr = Jim_NewStringObj(interp, namebuf, -1);
3021 if (!nameObjPtr)
3022 {
3023 free(namebuf);
3024 return JIM_ERR;
3025 }
3026
3027 Jim_IncrRefCount(nameObjPtr);
3028 valObjPtr = Jim_GetVariable(interp, nameObjPtr, JIM_ERRMSG);
3029 Jim_DecrRefCount(interp, nameObjPtr);
3030 free(namebuf);
3031 if (valObjPtr == NULL)
3032 return JIM_ERR;
3033
3034 result = Jim_GetLong(interp, valObjPtr, &l);
3035 /* printf("%s(%d) => 0%08x\n", varname, idx, val); */
3036 *val = l;
3037 return result;
3038 }
3039
3040 static int jim_array2mem(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
3041 {
3042 command_context_t *context;
3043 target_t *target;
3044
3045 context = Jim_GetAssocData(interp, "context");
3046 if (context == NULL){
3047 LOG_ERROR("array2mem: no command context");
3048 return JIM_ERR;
3049 }
3050 target = get_current_target(context);
3051 if (target == NULL){
3052 LOG_ERROR("array2mem: no current target");
3053 return JIM_ERR;
3054 }
3055
3056 return target_array2mem( interp,target, argc-1, argv+1 );
3057 }
3058
3059 static int target_array2mem(Jim_Interp *interp, target_t *target, int argc, Jim_Obj *const *argv)
3060 {
3061 long l;
3062 u32 width;
3063 int len;
3064 u32 addr;
3065 u32 count;
3066 u32 v;
3067 const char *varname;
3068 u8 buffer[4096];
3069 int n, e, retval;
3070 u32 i;
3071
3072 /* argv[1] = name of array to get the data
3073 * argv[2] = desired width
3074 * argv[3] = memory address
3075 * argv[4] = count to write
3076 */
3077 if (argc != 4) {
3078 Jim_WrongNumArgs(interp, 1, argv, "varname width addr nelems");
3079 return JIM_ERR;
3080 }
3081 varname = Jim_GetString(argv[0], &len);
3082 /* given "foo" get space for worse case "foo(%d)" .. add 20 */
3083
3084 e = Jim_GetLong(interp, argv[1], &l);
3085 width = l;
3086 if (e != JIM_OK) {
3087 return e;
3088 }
3089
3090 e = Jim_GetLong(interp, argv[2], &l);
3091 addr = l;
3092 if (e != JIM_OK) {
3093 return e;
3094 }
3095 e = Jim_GetLong(interp, argv[3], &l);
3096 len = l;
3097 if (e != JIM_OK) {
3098 return e;
3099 }
3100 switch (width) {
3101 case 8:
3102 width = 1;
3103 break;
3104 case 16:
3105 width = 2;
3106 break;
3107 case 32:
3108 width = 4;
3109 break;
3110 default:
3111 Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
3112 Jim_AppendStrings( interp, Jim_GetResult(interp), "Invalid width param, must be 8/16/32", NULL );
3113 return JIM_ERR;
3114 }
3115 if (len == 0) {
3116 Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
3117 Jim_AppendStrings(interp, Jim_GetResult(interp), "array2mem: zero width read?", NULL);
3118 return JIM_ERR;
3119 }
3120 if ((addr + (len * width)) < addr) {
3121 Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
3122 Jim_AppendStrings(interp, Jim_GetResult(interp), "array2mem: addr + len - wraps to zero?", NULL);
3123 return JIM_ERR;
3124 }
3125 /* absurd transfer size? */
3126 if (len > 65536) {
3127 Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
3128 Jim_AppendStrings(interp, Jim_GetResult(interp), "array2mem: absurd > 64K item request", NULL);
3129 return JIM_ERR;
3130 }
3131
3132 if ((width == 1) ||
3133 ((width == 2) && ((addr & 1) == 0)) ||
3134 ((width == 4) && ((addr & 3) == 0))) {
3135 /* all is well */
3136 } else {
3137 char buf[100];
3138 Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
3139 sprintf(buf, "array2mem address: 0x%08x is not aligned for %d byte reads", addr, width);
3140 Jim_AppendStrings(interp, Jim_GetResult(interp), buf , NULL);
3141 return JIM_ERR;
3142 }
3143
3144 /* Transfer loop */
3145
3146 /* index counter */
3147 n = 0;
3148 /* assume ok */
3149 e = JIM_OK;
3150 while (len) {
3151 /* Slurp... in buffer size chunks */
3152
3153 count = len; /* in objects.. */
3154 if (count > (sizeof(buffer)/width)) {
3155 count = (sizeof(buffer)/width);
3156 }
3157
3158 v = 0; /* shut up gcc */
3159 for (i = 0 ;i < count ;i++, n++) {
3160 get_int_array_element(interp, varname, n, &v);
3161 switch (width) {
3162 case 4:
3163 target_buffer_set_u32(target, &buffer[i*width], v);
3164 break;
3165 case 2:
3166 target_buffer_set_u16(target, &buffer[i*width], v);
3167 break;
3168 case 1:
3169 buffer[i] = v & 0x0ff;
3170 break;
3171 }
3172 }
3173 len -= count;
3174
3175 retval = target_write_memory(target, addr, width, count, buffer);
3176 if (retval != ERROR_OK) {
3177 /* BOO !*/
3178 LOG_ERROR("array2mem: Write @ 0x%08x, w=%d, cnt=%d, failed", addr, width, count);
3179 Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
3180 Jim_AppendStrings(interp, Jim_GetResult(interp), "array2mem: cannot read memory", NULL);
3181 e = JIM_ERR;
3182 len = 0;
3183 }
3184 }
3185
3186 Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
3187
3188 return JIM_OK;
3189 }
3190
3191 void target_all_handle_event( enum target_event e )
3192 {
3193 target_t *target;
3194
3195 LOG_DEBUG( "**all*targets: event: %d, %s",
3196 e,
3197 Jim_Nvp_value2name_simple( nvp_target_event, e )->name );
3198
3199 target = all_targets;
3200 while (target){
3201 target_handle_event( target, e );
3202 target = target->next;
3203 }
3204 }
3205
3206 void target_handle_event( target_t *target, enum target_event e )
3207 {
3208 target_event_action_t *teap;
3209 int done;
3210
3211 teap = target->event_action;
3212
3213 done = 0;
3214 while( teap ){
3215 if( teap->event == e ){
3216 done = 1;
3217 LOG_DEBUG( "target: (%d) %s (%s) event: %d (%s) action: %s\n",
3218 target->target_number,
3219 target->cmd_name,
3220 target_get_name(target),
3221 e,
3222 Jim_Nvp_value2name_simple( nvp_target_event, e )->name,
3223 Jim_GetString( teap->body, NULL ) );
3224 if (Jim_EvalObj( interp, teap->body )!=JIM_OK)
3225 {
3226 Jim_PrintErrorMessage(interp);
3227 }
3228 }
3229 teap = teap->next;
3230 }
3231 if( !done ){
3232 LOG_DEBUG( "event: %d %s - no action",
3233 e,
3234 Jim_Nvp_value2name_simple( nvp_target_event, e )->name );
3235 }
3236 }
3237
3238 enum target_cfg_param {
3239 TCFG_TYPE,
3240 TCFG_EVENT,
3241 TCFG_WORK_AREA_VIRT,
3242 TCFG_WORK_AREA_PHYS,
3243 TCFG_WORK_AREA_SIZE,
3244 TCFG_WORK_AREA_BACKUP,
3245 TCFG_ENDIAN,
3246 TCFG_VARIANT,
3247 TCFG_CHAIN_POSITION,
3248 };
3249
3250 static Jim_Nvp nvp_config_opts[] = {
3251 { .name = "-type", .value = TCFG_TYPE },
3252 { .name = "-event", .value = TCFG_EVENT },
3253 { .name = "-work-area-virt", .value = TCFG_WORK_AREA_VIRT },
3254 { .name = "-work-area-phys", .value = TCFG_WORK_AREA_PHYS },
3255 { .name = "-work-area-size", .value = TCFG_WORK_AREA_SIZE },
3256 { .name = "-work-area-backup", .value = TCFG_WORK_AREA_BACKUP },
3257 { .name = "-endian" , .value = TCFG_ENDIAN },
3258 { .name = "-variant", .value = TCFG_VARIANT },
3259 { .name = "-chain-position", .value = TCFG_CHAIN_POSITION },
3260
3261 { .name = NULL, .value = -1 }
3262 };
3263
3264 static int target_configure( Jim_GetOptInfo *goi, target_t *target )
3265 {
3266 Jim_Nvp *n;
3267 Jim_Obj *o;
3268 jim_wide w;
3269 char *cp;
3270 int e;
3271
3272 /* parse config or cget options ... */
3273 while( goi->argc > 0 ){
3274 Jim_SetEmptyResult( goi->interp );
3275 /* Jim_GetOpt_Debug( goi ); */
3276
3277 if( target->type->target_jim_configure ){
3278 /* target defines a configure function */
3279 /* target gets first dibs on parameters */
3280 e = (*(target->type->target_jim_configure))( target, goi );
3281 if( e == JIM_OK ){
3282 /* more? */
3283 continue;
3284 }
3285 if( e == JIM_ERR ){
3286 /* An error */
3287 return e;
3288 }
3289 /* otherwise we 'continue' below */
3290 }
3291 e = Jim_GetOpt_Nvp( goi, nvp_config_opts, &n );
3292 if( e != JIM_OK ){
3293 Jim_GetOpt_NvpUnknown( goi, nvp_config_opts, 0 );
3294 return e;
3295 }
3296 switch( n->value ){
3297 case TCFG_TYPE:
3298 /* not setable */
3299 if( goi->isconfigure ){
3300 Jim_SetResult_sprintf( goi->interp, "not setable: %s", n->name );
3301 return JIM_ERR;
3302 } else {
3303 no_params:
3304 if( goi->argc != 0 ){
3305 Jim_WrongNumArgs( goi->interp, goi->argc, goi->argv, "NO PARAMS");
3306 return JIM_ERR;
3307 }
3308 }
3309 Jim_SetResultString( goi->interp, target_get_name(target), -1 );
3310 /* loop for more */
3311 break;
3312 case TCFG_EVENT:
3313 if( goi->argc == 0 ){
3314 Jim_WrongNumArgs( goi->interp, goi->argc, goi->argv, "-event ?event-name? ...");
3315 return JIM_ERR;
3316 }
3317
3318 e = Jim_GetOpt_Nvp( goi, nvp_target_event, &n );
3319 if( e != JIM_OK ){
3320 Jim_GetOpt_NvpUnknown( goi, nvp_target_event, 1 );
3321 return e;
3322 }
3323
3324 if( goi->isconfigure ){
3325 if( goi->argc != 1 ){
3326 Jim_WrongNumArgs( goi->interp, goi->argc, goi->argv, "-event ?event-name? ?EVENT-BODY?");
3327 return JIM_ERR;
3328 }
3329 } else {
3330 if( goi->argc != 0 ){
3331 Jim_WrongNumArgs(goi->interp, goi->argc, goi->argv, "-event ?event-name?");
3332 return JIM_ERR;
3333 }
3334 }
3335
3336 {
3337 target_event_action_t *teap;
3338
3339 teap = target->event_action;
3340 /* replace existing? */
3341 while( teap ){
3342 if( teap->event == (enum target_event)n->value ){
3343 break;
3344 }
3345 teap = teap->next;
3346 }
3347
3348 if( goi->isconfigure ){
3349 if( teap == NULL ){
3350 /* create new */
3351 teap = calloc( 1, sizeof(*teap) );
3352 }
3353 teap->event = n->value;
3354 Jim_GetOpt_Obj( goi, &o );
3355 if( teap->body ){
3356 Jim_DecrRefCount( interp, teap->body );
3357 }
3358 teap->body = Jim_DuplicateObj( goi->interp, o );
3359 /*
3360 * FIXME:
3361 * Tcl/TK - "tk events" have a nice feature.
3362 * See the "BIND" command.
3363 * We should support that here.
3364 * You can specify %X and %Y in the event code.
3365 * The idea is: %T - target name.
3366 * The idea is: %N - target number
3367 * The idea is: %E - event name.
3368 */
3369 Jim_IncrRefCount( teap->body );
3370
3371 /* add to head of event list */
3372 teap->next = target->event_action;
3373 target->event_action = teap;
3374 Jim_SetEmptyResult(goi->interp);
3375 } else {
3376 /* get */
3377 if( teap == NULL ){
3378 Jim_SetEmptyResult( goi->interp );
3379 } else {
3380 Jim_SetResult( goi->interp, Jim_DuplicateObj( goi->interp, teap->body ) );
3381 }
3382 }
3383 }
3384 /* loop for more */
3385 break;
3386
3387 case TCFG_WORK_AREA_VIRT:
3388 if( goi->isconfigure ){
3389 target_free_all_working_areas(target);
3390 e = Jim_GetOpt_Wide( goi, &w );
3391 if( e != JIM_OK ){
3392 return e;
3393 }
3394 target->working_area_virt = w;
3395 } else {
3396 if( goi->argc != 0 ){
3397 goto no_params;
3398 }
3399 }
3400 Jim_SetResult( interp, Jim_NewIntObj( goi->interp, target->working_area_virt ) );
3401 /* loop for more */
3402 break;
3403
3404 case TCFG_WORK_AREA_PHYS:
3405 if( goi->isconfigure ){
3406 target_free_all_working_areas(target);
3407 e = Jim_GetOpt_Wide( goi, &w );
3408 if( e != JIM_OK ){
3409 return e;
3410 }
3411 target->working_area_phys = w;
3412 } else {
3413 if( goi->argc != 0 ){
3414 goto no_params;
3415 }
3416 }
3417 Jim_SetResult( interp, Jim_NewIntObj( goi->interp, target->working_area_phys ) );
3418 /* loop for more */
3419 break;
3420
3421 case TCFG_WORK_AREA_SIZE:
3422 if( goi->isconfigure ){
3423 target_free_all_working_areas(target);
3424 e = Jim_GetOpt_Wide( goi, &w );
3425 if( e != JIM_OK ){
3426 return e;
3427 }
3428 target->working_area_size = w;
3429 } else {
3430 if( goi->argc != 0 ){
3431 goto no_params;
3432 }
3433 }
3434 Jim_SetResult( interp, Jim_NewIntObj( goi->interp, target->working_area_size ) );
3435 /* loop for more */
3436 break;
3437
3438 case TCFG_WORK_AREA_BACKUP:
3439 if( goi->isconfigure ){
3440 target_free_all_working_areas(target);
3441 e = Jim_GetOpt_Wide( goi, &w );
3442 if( e != JIM_OK ){
3443 return e;
3444 }
3445 /* make this exactly 1 or 0 */
3446 target->backup_working_area = (!!w);
3447 } else {
3448 if( goi->argc != 0 ){
3449 goto no_params;
3450 }
3451 }
3452 Jim_SetResult(interp, Jim_NewIntObj(goi->interp, target->backup_working_area));
3453 /* loop for more e*/
3454 break;
3455
3456 case TCFG_ENDIAN:
3457 if( goi->isconfigure ){
3458 e = Jim_GetOpt_Nvp( goi, nvp_target_endian, &n );
3459 if( e != JIM_OK ){
3460 Jim_GetOpt_NvpUnknown( goi, nvp_target_endian, 1 );
3461 return e;
3462 }
3463 target->endianness = n->value;
3464 } else {
3465 if( goi->argc != 0 ){
3466 goto no_params;
3467 }
3468 }
3469 n = Jim_Nvp_value2name_simple( nvp_target_endian, target->endianness );
3470 if( n->name == NULL ){
3471 target->endianness = TARGET_LITTLE_ENDIAN;
3472 n = Jim_Nvp_value2name_simple( nvp_target_endian, target->endianness );
3473 }
3474 Jim_SetResultString( goi->interp, n->name, -1 );
3475 /* loop for more */
3476 break;
3477
3478 case TCFG_VARIANT:
3479 if( goi->isconfigure ){
3480 if( goi->argc < 1 ){
3481 Jim_SetResult_sprintf( goi->interp,
3482 "%s ?STRING?",
3483 n->name );
3484 return JIM_ERR;
3485 }
3486 if( target->variant ){
3487 free((void *)(target->variant));
3488 }
3489 e = Jim_GetOpt_String( goi, &cp, NULL );
3490 target->variant = strdup(cp);
3491 } else {
3492 if( goi->argc != 0 ){
3493 goto no_params;
3494 }
3495 }
3496 Jim_SetResultString( goi->interp, target->variant,-1 );
3497 /* loop for more */
3498 break;
3499 case TCFG_CHAIN_POSITION:
3500 if( goi->isconfigure ){
3501 Jim_Obj *o;
3502 jtag_tap_t *tap;
3503 target_free_all_working_areas(target);
3504 e = Jim_GetOpt_Obj( goi, &o );
3505 if( e != JIM_OK ){
3506 return e;
3507 }
3508 tap = jtag_tap_by_jim_obj( goi->interp, o );
3509 if( tap == NULL ){
3510 return JIM_ERR;
3511 }
3512 /* make this exactly 1 or 0 */
3513 target->tap = tap;
3514 } else {
3515 if( goi->argc != 0 ){
3516 goto no_params;
3517 }
3518 }
3519 Jim_SetResultString( interp, target->tap->dotted_name, -1 );
3520 /* loop for more e*/
3521 break;
3522 }
3523 } /* while( goi->argc ) */
3524
3525
3526 /* done - we return */
3527 return JIM_OK;
3528 }
3529
3530 /** this is the 'tcl' handler for the target specific command */
3531 static int tcl_target_func( Jim_Interp *interp, int argc, Jim_Obj *const *argv )
3532 {
3533 Jim_GetOptInfo goi;
3534 jim_wide a,b,c;
3535 int x,y,z;
3536 u8 target_buf[32];
3537 Jim_Nvp *n;
3538 target_t *target;
3539 struct command_context_s *cmd_ctx;
3540 int e;
3541
3542 enum {
3543 TS_CMD_CONFIGURE,
3544 TS_CMD_CGET,
3545
3546 TS_CMD_MWW, TS_CMD_MWH, TS_CMD_MWB,
3547 TS_CMD_MDW, TS_CMD_MDH, TS_CMD_MDB,
3548 TS_CMD_MRW, TS_CMD_MRH, TS_CMD_MRB,
3549 TS_CMD_MEM2ARRAY, TS_CMD_ARRAY2MEM,
3550 TS_CMD_EXAMINE,
3551 TS_CMD_POLL,
3552 TS_CMD_RESET,
3553 TS_CMD_HALT,
3554 TS_CMD_WAITSTATE,
3555 TS_CMD_EVENTLIST,
3556 TS_CMD_CURSTATE,
3557 TS_CMD_INVOKE_EVENT,
3558 };
3559
3560 static const Jim_Nvp target_options[] = {
3561 { .name = "configure", .value = TS_CMD_CONFIGURE },
3562 { .name = "cget", .value = TS_CMD_CGET },
3563 { .name = "mww", .value = TS_CMD_MWW },
3564 { .name = "mwh", .value = TS_CMD_MWH },
3565 { .name = "mwb", .value = TS_CMD_MWB },
3566 { .name = "mdw", .value = TS_CMD_MDW },
3567 { .name = "mdh", .value = TS_CMD_MDH },
3568 { .name = "mdb", .value = TS_CMD_MDB },
3569 { .name = "mem2array", .value = TS_CMD_MEM2ARRAY },
3570 { .name = "array2mem", .value = TS_CMD_ARRAY2MEM },
3571 { .name = "eventlist", .value = TS_CMD_EVENTLIST },
3572 { .name = "curstate", .value = TS_CMD_CURSTATE },
3573
3574 { .name = "arp_examine", .value = TS_CMD_EXAMINE },
3575 { .name = "arp_poll", .value = TS_CMD_POLL },
3576 { .name = "arp_reset", .value = TS_CMD_RESET },
3577 { .name = "arp_halt", .value = TS_CMD_HALT },
3578 { .name = "arp_waitstate", .value = TS_CMD_WAITSTATE },
3579 { .name = "invoke-event", .value = TS_CMD_INVOKE_EVENT },
3580
3581 { .name = NULL, .value = -1 },
3582 };
3583
3584 /* go past the "command" */
3585 Jim_GetOpt_Setup( &goi, interp, argc-1, argv+1 );
3586
3587 target = Jim_CmdPrivData( goi.interp );
3588 cmd_ctx = Jim_GetAssocData(goi.interp, "context");
3589
3590 /* commands here are in an NVP table */
3591 e = Jim_GetOpt_Nvp( &goi, target_options, &n );
3592 if( e != JIM_OK ){
3593 Jim_GetOpt_NvpUnknown( &goi, target_options, 0 );
3594 return e;
3595 }
3596 /* Assume blank result */
3597 Jim_SetEmptyResult( goi.interp );
3598
3599 switch( n->value ){
3600 case TS_CMD_CONFIGURE:
3601 if( goi.argc < 2 ){
3602 Jim_WrongNumArgs( goi.interp, goi.argc, goi.argv, "missing: -option VALUE ...");
3603 return JIM_ERR;
3604 }
3605 goi.isconfigure = 1;
3606 return target_configure( &goi, target );
3607 case TS_CMD_CGET:
3608 // some things take params
3609 if( goi.argc < 1 ){
3610 Jim_WrongNumArgs( goi.interp, 0, goi.argv, "missing: ?-option?");
3611 return JIM_ERR;
3612 }
3613 goi.isconfigure = 0;
3614 return target_configure( &goi, target );
3615 break;
3616 case TS_CMD_MWW:
3617 case TS_CMD_MWH:
3618 case TS_CMD_MWB:
3619 /* argv[0] = cmd
3620 * argv[1] = address
3621 * argv[2] = data
3622 * argv[3] = optional count.
3623 */
3624
3625 if( (goi.argc == 3) || (goi.argc == 4) ){
3626 /* all is well */
3627 } else {
3628 mwx_error:
3629 Jim_SetResult_sprintf( goi.interp, "expected: %s ADDR DATA [COUNT]", n->name );
3630 return JIM_ERR;
3631 }
3632
3633 e = Jim_GetOpt_Wide( &goi, &a );
3634 if( e != JIM_OK ){
3635 goto mwx_error;
3636 }
3637
3638 e = Jim_GetOpt_Wide( &goi, &b );
3639 if( e != JIM_OK ){
3640 goto mwx_error;
3641 }
3642 if( goi.argc ){
3643 e = Jim_GetOpt_Wide( &goi, &c );
3644 if( e != JIM_OK ){
3645 goto mwx_error;
3646 }
3647 } else {
3648 c = 1;
3649 }
3650
3651 switch( n->value ){
3652 case TS_CMD_MWW:
3653 target_buffer_set_u32( target, target_buf, b );
3654 b = 4;
3655 break;
3656 case TS_CMD_MWH:
3657 target_buffer_set_u16( target, target_buf, b );
3658 b = 2;
3659 break;
3660 case TS_CMD_MWB:
3661 target_buffer_set_u8( target, target_buf, b );
3662 b = 1;
3663 break;
3664 }
3665 for( x = 0 ; x < c ; x++ ){
3666 e = target_write_memory( target, a, b, 1, target_buf );
3667 if( e != ERROR_OK ){
3668 Jim_SetResult_sprintf( interp, "Error writing @ 0x%08x: %d\n", (int)(a), e );
3669 return JIM_ERR;
3670 }
3671 /* b = width */
3672 a = a + b;
3673 }
3674 return JIM_OK;
3675 break;
3676
3677 /* display */
3678 case TS_CMD_MDW:
3679 case TS_CMD_MDH:
3680 case TS_CMD_MDB:
3681 /* argv[0] = command
3682 * argv[1] = address
3683 * argv[2] = optional count
3684 */
3685 if( (goi.argc == 2) || (goi.argc == 3) ){
3686 Jim_SetResult_sprintf( goi.interp, "expected: %s ADDR [COUNT]", n->name );
3687 return JIM_ERR;
3688 }
3689 e = Jim_GetOpt_Wide( &goi, &a );
3690 if( e != JIM_OK ){
3691 return JIM_ERR;
3692 }
3693 if( goi.argc ){
3694 e = Jim_GetOpt_Wide( &goi, &c );
3695 if( e != JIM_OK ){
3696 return JIM_ERR;
3697 }
3698 } else {
3699 c = 1;
3700 }
3701 b = 1; /* shut up gcc */
3702 switch( n->value ){
3703 case TS_CMD_MDW:
3704 b = 4;
3705 break;
3706 case TS_CMD_MDH:
3707 b = 2;
3708 break;
3709 case TS_CMD_MDB:
3710 b = 1;
3711 break;
3712 }
3713
3714 /* convert to "bytes" */
3715 c = c * b;
3716 /* count is now in 'BYTES' */
3717 while( c > 0 ){
3718 y = c;
3719 if( y > 16 ){
3720 y = 16;
3721 }
3722 e = target_read_memory( target, a, b, y / b, target_buf );
3723 if( e != ERROR_OK ){
3724 Jim_SetResult_sprintf( interp, "error reading target @ 0x%08lx", (int)(a) );
3725 return JIM_ERR;
3726 }
3727
3728 Jim_fprintf( interp, interp->cookie_stdout, "0x%08x ", (int)(a) );
3729 switch( b ){
3730 case 4:
3731 for( x = 0 ; (x < 16) && (x < y) ; x += 4 ){
3732 z = target_buffer_get_u32( target, &(target_buf[ x * 4 ]) );
3733 Jim_fprintf( interp, interp->cookie_stdout, "%08x ", (int)(z) );
3734 }
3735 for( ; (x < 16) ; x += 4 ){
3736 Jim_fprintf( interp, interp->cookie_stdout, " " );
3737 }
3738 break;
3739 case 2:
3740 for( x = 0 ; (x < 16) && (x < y) ; x += 2 ){
3741 z = target_buffer_get_u16( target, &(target_buf[ x * 2 ]) );
3742 Jim_fprintf( interp, interp->cookie_stdout, "%04x ", (int)(z) );
3743 }
3744 for( ; (x < 16) ; x += 2 ){
3745 Jim_fprintf( interp, interp->cookie_stdout, " " );
3746 }
3747 break;
3748 case 1:
3749 default:
3750 for( x = 0 ; (x < 16) && (x < y) ; x += 1 ){
3751 z = target_buffer_get_u8( target, &(target_buf[ x * 4 ]) );
3752 Jim_fprintf( interp, interp->cookie_stdout, "%02x ", (int)(z) );
3753 }
3754 for( ; (x < 16) ; x += 1 ){
3755 Jim_fprintf( interp, interp->cookie_stdout, " " );
3756 }
3757 break;
3758 }
3759 /* ascii-ify the bytes */
3760 for( x = 0 ; x < y ; x++ ){
3761 if( (target_buf[x] >= 0x20) &&
3762 (target_buf[x] <= 0x7e) ){
3763 /* good */
3764 } else {
3765 /* smack it */
3766 target_buf[x] = '.';
3767 }
3768 }
3769 /* space pad */
3770 while( x < 16 ){
3771 target_buf[x] = ' ';
3772 x++;
3773 }
3774 /* terminate */
3775 target_buf[16] = 0;
3776 /* print - with a newline */
3777 Jim_fprintf( interp, interp->cookie_stdout, "%s\n", target_buf );
3778 /* NEXT... */
3779 c -= 16;
3780 a += 16;
3781 }
3782 return JIM_OK;
3783 case TS_CMD_MEM2ARRAY:
3784 return target_mem2array( goi.interp, target, goi.argc, goi.argv );
3785 break;
3786 case TS_CMD_ARRAY2MEM:
3787 return target_array2mem( goi.interp, target, goi.argc, goi.argv );
3788 break;
3789 case TS_CMD_EXAMINE:
3790 if( goi.argc ){
3791 Jim_WrongNumArgs( goi.interp, 2, argv, "[no parameters]");
3792 return JIM_ERR;
3793 }
3794 if (!target->tap->enabled)
3795 goto err_tap_disabled;
3796 e = target->type->examine( target );
3797 if( e != ERROR_OK ){
3798 Jim_SetResult_sprintf( interp, "examine-fails: %d", e );
3799 return JIM_ERR;
3800 }
3801 return JIM_OK;
3802 case TS_CMD_POLL:
3803 if( goi.argc ){
3804 Jim_WrongNumArgs( goi.interp, 2, argv, "[no parameters]");
3805 return JIM_ERR;
3806 }
3807 if (!target->tap->enabled)
3808 goto err_tap_disabled;
3809 if( !(target_was_examined(target)) ){
3810 e = ERROR_TARGET_NOT_EXAMINED;
3811 } else {
3812 e = target->type->poll( target );
3813 }
3814 if( e != ERROR_OK ){
3815 Jim_SetResult_sprintf( interp, "poll-fails: %d", e );
3816 return JIM_ERR;
3817 } else {
3818 return JIM_OK;
3819 }
3820 break;
3821 case TS_CMD_RESET:
3822 if( goi.argc != 2 ){
3823 Jim_WrongNumArgs( interp, 2, argv, "t|f|assert|deassert BOOL");
3824 return JIM_ERR;
3825 }
3826 e = Jim_GetOpt_Nvp( &goi, nvp_assert, &n );
3827 if( e != JIM_OK ){
3828 Jim_GetOpt_NvpUnknown( &goi, nvp_assert, 1 );
3829 return e;
3830 }
3831 /* the halt or not param */
3832 e = Jim_GetOpt_Wide( &goi, &a);
3833 if( e != JIM_OK ){
3834 return e;
3835 }
3836 if (!target->tap->enabled)
3837 goto err_tap_disabled;
3838 /* determine if we should halt or not. */
3839 target->reset_halt = !!a;
3840 /* When this happens - all workareas are invalid. */
3841 target_free_all_working_areas_restore(target, 0);
3842
3843 /* do the assert */
3844 if( n->value == NVP_ASSERT ){
3845 target->type->assert_reset( target );
3846 } else {
3847 target->type->deassert_reset( target );
3848 }
3849 return JIM_OK;
3850 case TS_CMD_HALT:
3851 if( goi.argc ){
3852 Jim_WrongNumArgs( goi.interp, 0, argv, "halt [no parameters]");
3853 return JIM_ERR;
3854 }
3855 if (!target->tap->enabled)
3856 goto err_tap_disabled;
3857 target->type->halt( target );
3858 return JIM_OK;
3859 case TS_CMD_WAITSTATE:
3860 /* params: <name> statename timeoutmsecs */
3861 if( goi.argc != 2 ){
3862 Jim_SetResult_sprintf( goi.interp, "%s STATENAME TIMEOUTMSECS", n->name );
3863 return JIM_ERR;
3864 }
3865 e = Jim_GetOpt_Nvp( &goi, nvp_target_state, &n );
3866 if( e != JIM_OK ){
3867 Jim_GetOpt_NvpUnknown( &goi, nvp_target_state,1 );
3868 return e;
3869 }
3870 e = Jim_GetOpt_Wide( &goi, &a );
3871 if( e != JIM_OK ){
3872 return e;
3873 }
3874 if (!target->tap->enabled)
3875 goto err_tap_disabled;
3876 e = target_wait_state( target, n->value, a );
3877 if( e != ERROR_OK ){
3878 Jim_SetResult_sprintf( goi.interp,
3879 "target: %s wait %s fails (%d) %s",
3880 target->cmd_name,
3881 n->name,
3882 e, target_strerror_safe(e) );
3883 return JIM_ERR;
3884 } else {
3885 return JIM_OK;
3886 }
3887 case TS_CMD_EVENTLIST:
3888 /* List for human, Events defined for this target.
3889 * scripts/programs should use 'name cget -event NAME'
3890 */
3891 {
3892 target_event_action_t *teap;
3893 teap = target->event_action;
3894 command_print( cmd_ctx, "Event actions for target (%d) %s\n",
3895 target->target_number,
3896 target->cmd_name );
3897 command_print( cmd_ctx, "%-25s | Body", "Event");
3898 command_print( cmd_ctx, "------------------------- | ----------------------------------------");
3899 while( teap ){
3900 command_print( cmd_ctx,
3901 "%-25s | %s",
3902 Jim_Nvp_value2name_simple( nvp_target_event, teap->event )->name,
3903 Jim_GetString( teap->body, NULL ) );
3904 teap = teap->next;
3905 }
3906 command_print( cmd_ctx, "***END***");
3907 return JIM_OK;
3908 }
3909 case TS_CMD_CURSTATE:
3910 if( goi.argc != 0 ){
3911 Jim_WrongNumArgs( goi.interp, 0, argv, "[no parameters]");
3912 return JIM_ERR;
3913 }
3914 Jim_SetResultString( goi.interp,
3915 Jim_Nvp_value2name_simple(nvp_target_state,target->state)->name,-1);
3916 return JIM_OK;
3917 case TS_CMD_INVOKE_EVENT:
3918 if( goi.argc != 1 ){
3919 Jim_SetResult_sprintf( goi.interp, "%s ?EVENTNAME?",n->name);
3920 return JIM_ERR;
3921 }
3922 e = Jim_GetOpt_Nvp( &goi, nvp_target_event, &n );
3923 if( e != JIM_OK ){
3924 Jim_GetOpt_NvpUnknown( &goi, nvp_target_event, 1 );
3925 return e;
3926 }
3927 target_handle_event( target, n->value );
3928 return JIM_OK;
3929 }
3930 return JIM_ERR;
3931
3932 err_tap_disabled:
3933 Jim_SetResult_sprintf(interp, "[TAP is disabled]");
3934 return JIM_ERR;
3935 }
3936
3937 static int target_create( Jim_GetOptInfo *goi )
3938 {
3939 Jim_Obj *new_cmd;
3940 Jim_Cmd *cmd;
3941 const char *cp;
3942 char *cp2;
3943 int e;
3944 int x;
3945 target_t *target;
3946 struct command_context_s *cmd_ctx;
3947
3948 cmd_ctx = Jim_GetAssocData(goi->interp, "context");
3949 if( goi->argc < 3 ){
3950 Jim_WrongNumArgs( goi->interp, 1, goi->argv, "?name? ?type? ..options...");
3951 return JIM_ERR;
3952 }
3953
3954 /* COMMAND */
3955 Jim_GetOpt_Obj( goi, &new_cmd );
3956 /* does this command exist? */
3957 cmd = Jim_GetCommand( goi->interp, new_cmd, JIM_ERRMSG );
3958 if( cmd ){
3959 cp = Jim_GetString( new_cmd, NULL );
3960 Jim_SetResult_sprintf(goi->interp, "Command/target: %s Exists", cp);
3961 return JIM_ERR;
3962 }
3963
3964 /* TYPE */
3965 e = Jim_GetOpt_String( goi, &cp2, NULL );
3966 cp = cp2;
3967 /* now does target type exist */
3968 for( x = 0 ; target_types[x] ; x++ ){
3969 if( 0 == strcmp( cp, target_types[x]->name ) ){
3970 /* found */
3971 break;
3972 }
3973 }
3974 if( target_types[x] == NULL ){
3975 Jim_SetResult_sprintf( goi->interp, "Unknown target type %s, try one of ", cp );
3976 for( x = 0 ; target_types[x] ; x++ ){
3977 if( target_types[x+1] ){
3978 Jim_AppendStrings( goi->interp,
3979 Jim_GetResult(goi->interp),
3980 target_types[x]->name,
3981 ", ", NULL);
3982 } else {
3983 Jim_AppendStrings( goi->interp,
3984 Jim_GetResult(goi->interp),
3985 " or ",
3986 target_types[x]->name,NULL );
3987 }
3988 }
3989 return JIM_ERR;
3990 }
3991
3992 /* Create it */
3993 target = calloc(1,sizeof(target_t));
3994 /* set target number */
3995 target->target_number = new_target_number();
3996
3997 /* allocate memory for each unique target type */
3998 target->type = (target_type_t*)calloc(1,sizeof(target_type_t));
3999
4000 memcpy( target->type, target_types[x], sizeof(target_type_t));
4001
4002 /* will be set by "-endian" */
4003 target->endianness = TARGET_ENDIAN_UNKNOWN;
4004
4005 target->working_area = 0x0;
4006 target->working_area_size = 0x0;
4007 target->working_areas = NULL;
4008 target->backup_working_area = 0;
4009
4010 target->state = TARGET_UNKNOWN;
4011 target->debug_reason = DBG_REASON_UNDEFINED;
4012 target->reg_cache = NULL;
4013 target->breakpoints = NULL;
4014 target->watchpoints = NULL;
4015 target->next = NULL;
4016 target->arch_info = NULL;
4017
4018 target->display = 1;
4019
4020 /* initialize trace information */
4021 target->trace_info = malloc(sizeof(trace_t));
4022 target->trace_info->num_trace_points = 0;
4023 target->trace_info->trace_points_size = 0;
4024 target->trace_info->trace_points = NULL;
4025 target->trace_info->trace_history_size = 0;
4026 target->trace_info->trace_history = NULL;
4027 target->trace_info->trace_history_pos = 0;
4028 target->trace_info->trace_history_overflowed = 0;
4029
4030 target->dbgmsg = NULL;
4031 target->dbg_msg_enabled = 0;
4032
4033 target->endianness = TARGET_ENDIAN_UNKNOWN;
4034
4035 /* Do the rest as "configure" options */
4036 goi->isconfigure = 1;
4037 e = target_configure( goi, target);
4038
4039 if (target->tap == NULL)
4040 {
4041 Jim_SetResultString( interp, "-chain-position required when creating target", -1);
4042 e=JIM_ERR;
4043 }
4044
4045 if( e != JIM_OK ){
4046 free( target->type );
4047 free( target );
4048 return e;
4049 }
4050
4051 if( target->endianness == TARGET_ENDIAN_UNKNOWN ){
4052 /* default endian to little if not specified */
4053 target->endianness = TARGET_LITTLE_ENDIAN;
4054 }
4055
4056 /* incase variant is not set */
4057 if (!target->variant)
4058 target->variant = strdup("");
4059
4060 /* create the target specific commands */
4061 if( target->type->register_commands ){
4062 (*(target->type->register_commands))( cmd_ctx );
4063 }
4064 if( target->type->target_create ){
4065 (*(target->type->target_create))( target, goi->interp );
4066 }
4067
4068 /* append to end of list */
4069 {
4070 target_t **tpp;
4071 tpp = &(all_targets);
4072 while( *tpp ){
4073 tpp = &( (*tpp)->next );
4074 }
4075 *tpp = target;
4076 }
4077
4078 cp = Jim_GetString( new_cmd, NULL );
4079 target->cmd_name = strdup(cp);
4080
4081 /* now - create the new target name command */
4082 e = Jim_CreateCommand( goi->interp,
4083 /* name */
4084 cp,
4085 tcl_target_func, /* C function */
4086 target, /* private data */
4087 NULL ); /* no del proc */
4088
4089 return e;
4090 }
4091
4092 static int jim_target( Jim_Interp *interp, int argc, Jim_Obj *const *argv )
4093 {
4094 int x,r,e;
4095 jim_wide w;
4096 struct command_context_s *cmd_ctx;
4097 target_t *target;
4098 Jim_GetOptInfo goi;
4099 enum tcmd {
4100 /* TG = target generic */
4101 TG_CMD_CREATE,
4102 TG_CMD_TYPES,
4103 TG_CMD_NAMES,
4104 TG_CMD_CURRENT,
4105 TG_CMD_NUMBER,
4106 TG_CMD_COUNT,
4107 };
4108 const char *target_cmds[] = {
4109 "create", "types", "names", "current", "number",
4110 "count",
4111 NULL /* terminate */
4112 };
4113
4114 LOG_DEBUG("Target command params:");
4115 LOG_DEBUG("%s", Jim_Debug_ArgvString(interp, argc, argv));
4116
4117 cmd_ctx = Jim_GetAssocData( interp, "context" );
4118
4119 Jim_GetOpt_Setup( &goi, interp, argc-1, argv+1 );
4120
4121 if( goi.argc == 0 ){
4122 Jim_WrongNumArgs(interp, 1, argv, "missing: command ...");
4123 return JIM_ERR;
4124 }
4125
4126 /* Jim_GetOpt_Debug( &goi ); */
4127 r = Jim_GetOpt_Enum( &goi, target_cmds, &x );
4128 if( r != JIM_OK ){
4129 return r;
4130 }
4131
4132 switch(x){
4133 default:
4134 Jim_Panic(goi.interp,"Why am I here?");
4135 return JIM_ERR;
4136 case TG_CMD_CURRENT:
4137 if( goi.argc != 0 ){
4138 Jim_WrongNumArgs( goi.interp, 1, goi.argv, "Too many parameters");
4139 return JIM_ERR;
4140 }
4141 Jim_SetResultString( goi.interp, get_current_target( cmd_ctx )->cmd_name, -1 );
4142 return JIM_OK;
4143 case TG_CMD_TYPES:
4144 if( goi.argc != 0 ){
4145 Jim_WrongNumArgs( goi.interp, 1, goi.argv, "Too many parameters" );
4146 return JIM_ERR;
4147 }
4148 Jim_SetResult( goi.interp, Jim_NewListObj( goi.interp, NULL, 0 ) );
4149 for( x = 0 ; target_types[x] ; x++ ){
4150 Jim_ListAppendElement( goi.interp,
4151 Jim_GetResult(goi.interp),
4152 Jim_NewStringObj( goi.interp, target_types[x]->name, -1 ) );
4153 }
4154 return JIM_OK;
4155 case TG_CMD_NAMES:
4156 if( goi.argc != 0 ){
4157 Jim_WrongNumArgs( goi.interp, 1, goi.argv, "Too many parameters" );
4158 return JIM_ERR;
4159 }
4160 Jim_SetResult( goi.interp, Jim_NewListObj( goi.interp, NULL, 0 ) );
4161 target = all_targets;
4162 while( target ){
4163 Jim_ListAppendElement( goi.interp,
4164 Jim_GetResult(goi.interp),
4165 Jim_NewStringObj( goi.interp, target->cmd_name, -1 ) );
4166 target = target->next;
4167 }
4168 return JIM_OK;
4169 case TG_CMD_CREATE:
4170 if( goi.argc < 3 ){
4171 Jim_WrongNumArgs( goi.interp, goi.argc, goi.argv, "?name ... config options ...");
4172 return JIM_ERR;
4173 }
4174 return target_create( &goi );
4175 break;
4176 case TG_CMD_NUMBER:
4177 if( goi.argc != 1 ){
4178 Jim_SetResult_sprintf( goi.interp, "expected: target number ?NUMBER?");
4179 return JIM_ERR;
4180 }
4181 e = Jim_GetOpt_Wide( &goi, &w );
4182 if( e != JIM_OK ){
4183 return JIM_ERR;
4184 }
4185 {
4186 target_t *t;
4187 t = get_target_by_num(w);
4188 if( t == NULL ){
4189 Jim_SetResult_sprintf( goi.interp,"Target: number %d does not exist", (int)(w));
4190 return JIM_ERR;
4191 }
4192 Jim_SetResultString( goi.interp, t->cmd_name, -1 );
4193 return JIM_OK;
4194 }
4195 case TG_CMD_COUNT:
4196 if( goi.argc != 0 ){
4197 Jim_WrongNumArgs( goi.interp, 0, goi.argv, "<no parameters>");
4198 return JIM_ERR;
4199 }
4200 Jim_SetResult( goi.interp,
4201 Jim_NewIntObj( goi.interp, max_target_number()));
4202 return JIM_OK;
4203 }
4204
4205 return JIM_ERR;
4206 }
4207
4208
4209 struct FastLoad
4210 {
4211 u32 address;
4212 u8 *data;
4213 int length;
4214
4215 };
4216
4217 static int fastload_num;
4218 static struct FastLoad *fastload;
4219
4220 static void free_fastload(void)
4221 {
4222 if (fastload!=NULL)
4223 {
4224 int i;
4225 for (i=0; i<fastload_num; i++)
4226 {
4227 if (fastload[i].data)
4228 free(fastload[i].data);
4229 }
4230 free(fastload);
4231 fastload=NULL;
4232 }
4233 }
4234
4235
4236
4237
4238 static int handle_fast_load_image_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
4239 {
4240 u8 *buffer;
4241 u32 buf_cnt;
4242 u32 image_size;
4243 u32 min_address=0;
4244 u32 max_address=0xffffffff;
4245 int i;
4246 int retval;
4247
4248 image_t image;
4249
4250 duration_t duration;
4251 char *duration_text;
4252
4253 if ((argc < 1)||(argc > 5))
4254 {
4255 return ERROR_COMMAND_SYNTAX_ERROR;
4256 }
4257
4258 /* a base address isn't always necessary, default to 0x0 (i.e. don't relocate) */
4259 if (argc >= 2)
4260 {
4261 image.base_address_set = 1;
4262 image.base_address = strtoul(args[1], NULL, 0);
4263 }
4264 else
4265 {
4266 image.base_address_set = 0;
4267 }
4268
4269
4270 image.start_address_set = 0;
4271
4272 if (argc>=4)
4273 {
4274 min_address=strtoul(args[3], NULL, 0);
4275 }
4276 if (argc>=5)
4277 {
4278 max_address=strtoul(args[4], NULL, 0)+min_address;
4279 }
4280
4281 if (min_address>max_address)
4282 {
4283 return ERROR_COMMAND_SYNTAX_ERROR;
4284 }
4285
4286 duration_start_measure(&duration);
4287
4288 if (image_open(&image, args[0], (argc >= 3) ? args[2] : NULL) != ERROR_OK)
4289 {
4290 return ERROR_OK;
4291 }
4292
4293 image_size = 0x0;
4294 retval = ERROR_OK;
4295 fastload_num=image.num_sections;
4296 fastload=(struct FastLoad *)malloc(sizeof(struct FastLoad)*image.num_sections);
4297 if (fastload==NULL)
4298 {
4299 image_close(&image);
4300 return ERROR_FAIL;
4301 }
4302 memset(fastload, 0, sizeof(struct FastLoad)*image.num_sections);
4303 for (i = 0; i < image.num_sections; i++)
4304 {
4305 buffer = malloc(image.sections[i].size);
4306 if (buffer == NULL)
4307 {
4308 command_print(cmd_ctx, "error allocating buffer for section (%d bytes)", image.sections[i].size);
4309 break;
4310 }
4311
4312 if ((retval = image_read_section(&image, i, 0x0, image.sections[i].size, buffer, &buf_cnt)) != ERROR_OK)
4313 {
4314 free(buffer);
4315 break;
4316 }
4317
4318 u32 offset=0;
4319 u32 length=buf_cnt;
4320
4321
4322 /* DANGER!!! beware of unsigned comparision here!!! */
4323
4324 if ((image.sections[i].base_address+buf_cnt>=min_address)&&
4325 (image.sections[i].base_address<max_address))
4326 {
4327 if (image.sections[i].base_address<min_address)
4328 {
4329 /* clip addresses below */
4330 offset+=min_address-image.sections[i].base_address;
4331 length-=offset;
4332 }
4333
4334 if (image.sections[i].base_address+buf_cnt>max_address)
4335 {
4336 length-=(image.sections[i].base_address+buf_cnt)-max_address;
4337 }
4338
4339 fastload[i].address=image.sections[i].base_address+offset;
4340 fastload[i].data=malloc(length);
4341 if (fastload[i].data==NULL)
4342 {
4343 free(buffer);
4344 break;
4345 }
4346 memcpy(fastload[i].data, buffer+offset, length);
4347 fastload[i].length=length;
4348
4349 image_size += length;
4350 command_print(cmd_ctx, "%u byte written at address 0x%8.8x", length, image.sections[i].base_address+offset);
4351 }
4352
4353 free(buffer);
4354 }
4355
4356 duration_stop_measure(&duration, &duration_text);
4357 if (retval==ERROR_OK)
4358 {
4359 command_print(cmd_ctx, "Loaded %u bytes in %s", image_size, duration_text);
4360 command_print(cmd_ctx, "NB!!! image has not been loaded to target, issue a subsequent 'fast_load' to do so.");
4361 }
4362 free(duration_text);
4363
4364 image_close(&image);
4365
4366 if (retval!=ERROR_OK)
4367 {
4368 free_fastload();
4369 }
4370
4371 return retval;
4372 }
4373
4374 static int handle_fast_load_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
4375 {
4376 if (argc>0)
4377 return ERROR_COMMAND_SYNTAX_ERROR;
4378 if (fastload==NULL)
4379 {
4380 LOG_ERROR("No image in memory");
4381 return ERROR_FAIL;
4382 }
4383 int i;
4384 int ms=timeval_ms();
4385 int size=0;
4386 int retval=ERROR_OK;
4387 for (i=0; i<fastload_num;i++)
4388 {
4389 target_t *target = get_current_target(cmd_ctx);
4390 command_print(cmd_ctx, "Write to 0x%08x, length 0x%08x", fastload[i].address, fastload[i].length);
4391 if (retval==ERROR_OK)
4392 {
4393 retval = target_write_buffer(target, fastload[i].address, fastload[i].length, fastload[i].data);
4394 }
4395 size+=fastload[i].length;
4396 }
4397 int after=timeval_ms();
4398 command_print(cmd_ctx, "Loaded image %f kBytes/s", (float)(size/1024.0)/((float)(after-ms)/1000.0));
4399 return retval;
4400 }

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)