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

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)