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

Linking to existing account procedure

If you already have an account and want to add another login method you MUST first sign in with your existing account and then change URL to read https://review.openocd.org/login/?link to get to this page again but this time it'll work for linking. Thank you.

SSH host keys fingerprints

1024 SHA256:YKx8b7u5ZWdcbp7/4AeXNaqElP49m6QrwfXaqQGJAOk gerrit-code-review@openocd.zylin.com (DSA)
384 SHA256:jHIbSQa4REvwCFG4cq5LBlBLxmxSqelQPem/EXIrxjk gerrit-code-review@openocd.org (ECDSA)
521 SHA256:UAOPYkU9Fjtcao0Ul/Rrlnj/OsQvt+pgdYSZ4jOYdgs gerrit-code-review@openocd.org (ECDSA)
256 SHA256:A13M5QlnozFOvTllybRZH6vm7iSt0XLxbA48yfc2yfY gerrit-code-review@openocd.org (ECDSA)
256 SHA256:spYMBqEYoAOtK7yZBrcwE8ZpYt6b68Cfh9yEVetvbXg gerrit-code-review@openocd.org (ED25519)
+--[ED25519 256]--+
|=..              |
|+o..   .         |
|*.o   . .        |
|+B . . .         |
|Bo. = o S        |
|Oo.+ + =         |
|oB=.* = . o      |
| =+=.+   + E     |
|. .=o   . o      |
+----[SHA256]-----+
2048 SHA256:0Onrb7/PHjpo6iVZ7xQX2riKN83FJ3KGU0TvI0TaFG4 gerrit-code-review@openocd.zylin.com (RSA)