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

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)