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

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)