Factor target_timer_callbacks_check_time 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(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
2453 {
2454 int retval;
2455 target_t *target = get_current_target(cmd_ctx);
2456
2457 if (argc == 0)
2458 {
2459 breakpoint_t *breakpoint = target->breakpoints;
2460
2461 while (breakpoint)
2462 {
2463 if (breakpoint->type == BKPT_SOFT)
2464 {
2465 char* buf = buf_to_str(breakpoint->orig_instr, breakpoint->length, 16);
2466 command_print(cmd_ctx, "0x%8.8x, 0x%x, %i, 0x%s", breakpoint->address, breakpoint->length, breakpoint->set, buf);
2467 free(buf);
2468 }
2469 else
2470 {
2471 command_print(cmd_ctx, "0x%8.8x, 0x%x, %i", breakpoint->address, breakpoint->length, breakpoint->set);
2472 }
2473 breakpoint = breakpoint->next;
2474 }
2475 }
2476 else if (argc >= 2)
2477 {
2478 int hw = BKPT_SOFT;
2479 u32 length = 0;
2480
2481 length = strtoul(args[1], NULL, 0);
2482
2483 if (argc >= 3)
2484 if (strcmp(args[2], "hw") == 0)
2485 hw = BKPT_HARD;
2486
2487 if ((retval = breakpoint_add(target, strtoul(args[0], NULL, 0), length, hw)) != ERROR_OK)
2488 {
2489 LOG_ERROR("Failure setting breakpoints");
2490 }
2491 else
2492 {
2493 command_print(cmd_ctx, "breakpoint added at address 0x%8.8lx",
2494 strtoul(args[0], NULL, 0));
2495 }
2496 }
2497 else
2498 {
2499 command_print(cmd_ctx, "usage: bp <address> <length> ['hw']");
2500 }
2501
2502 return ERROR_OK;
2503 }
2504
2505 static int handle_rbp_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
2506 {
2507 target_t *target = get_current_target(cmd_ctx);
2508
2509 if (argc > 0)
2510 breakpoint_remove(target, strtoul(args[0], NULL, 0));
2511
2512 return ERROR_OK;
2513 }
2514
2515 static int handle_wp_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
2516 {
2517 target_t *target = get_current_target(cmd_ctx);
2518 int retval;
2519
2520 if (argc == 0)
2521 {
2522 watchpoint_t *watchpoint = target->watchpoints;
2523
2524 while (watchpoint)
2525 {
2526 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);
2527 watchpoint = watchpoint->next;
2528 }
2529 }
2530 else if (argc >= 2)
2531 {
2532 enum watchpoint_rw type = WPT_ACCESS;
2533 u32 data_value = 0x0;
2534 u32 data_mask = 0xffffffff;
2535
2536 if (argc >= 3)
2537 {
2538 switch(args[2][0])
2539 {
2540 case 'r':
2541 type = WPT_READ;
2542 break;
2543 case 'w':
2544 type = WPT_WRITE;
2545 break;
2546 case 'a':
2547 type = WPT_ACCESS;
2548 break;
2549 default:
2550 command_print(cmd_ctx, "usage: wp <address> <length> [r/w/a] [value] [mask]");
2551 return ERROR_OK;
2552 }
2553 }
2554 if (argc >= 4)
2555 {
2556 data_value = strtoul(args[3], NULL, 0);
2557 }
2558 if (argc >= 5)
2559 {
2560 data_mask = strtoul(args[4], NULL, 0);
2561 }
2562
2563 if ((retval = watchpoint_add(target, strtoul(args[0], NULL, 0),
2564 strtoul(args[1], NULL, 0), type, data_value, data_mask)) != ERROR_OK)
2565 {
2566 LOG_ERROR("Failure setting breakpoints");
2567 }
2568 }
2569 else
2570 {
2571 command_print(cmd_ctx, "usage: wp <address> <length> [r/w/a] [value] [mask]");
2572 }
2573
2574 return ERROR_OK;
2575 }
2576
2577 static int handle_rwp_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
2578 {
2579 if (argc != 1)
2580 return ERROR_COMMAND_SYNTAX_ERROR;
2581
2582 target_t *target = get_current_target(cmd_ctx);
2583 watchpoint_remove(target, strtoul(args[0], NULL, 0));
2584
2585 return ERROR_OK;
2586 }
2587
2588
2589 /**
2590 * Translate a virtual address to a physical address.
2591 *
2592 * The low-level target implementation must have logged a detailed error
2593 * which is forwarded to telnet/GDB session.
2594 */
2595 static int handle_virt2phys_command(command_context_t *cmd_ctx,
2596 char *cmd, char **args, int argc)
2597 {
2598 if (argc != 1)
2599 return ERROR_COMMAND_SYNTAX_ERROR;
2600
2601 target_t *target = get_current_target(cmd_ctx);
2602 u32 va = strtoul(args[0], NULL, 0);
2603 u32 pa;
2604
2605 int retval = target->type->virt2phys(target, va, &pa);
2606 if (retval == ERROR_OK)
2607 command_print(cmd_ctx, "Physical address 0x%08x", pa);
2608
2609 return retval;
2610 }
2611
2612 static void writeData(FILE *f, const void *data, size_t len)
2613 {
2614 size_t written = fwrite(data, len, 1, f);
2615 if (written != len)
2616 LOG_ERROR("failed to write %zu bytes: %s", len, strerror(errno));
2617 }
2618
2619 static void writeLong(FILE *f, int l)
2620 {
2621 int i;
2622 for (i=0; i<4; i++)
2623 {
2624 char c=(l>>(i*8))&0xff;
2625 writeData(f, &c, 1);
2626 }
2627
2628 }
2629
2630 static void writeString(FILE *f, char *s)
2631 {
2632 writeData(f, s, strlen(s));
2633 }
2634
2635 /* Dump a gmon.out histogram file. */
2636 static void writeGmon(u32 *samples, u32 sampleNum, char *filename)
2637 {
2638 u32 i;
2639 FILE *f=fopen(filename, "w");
2640 if (f==NULL)
2641 return;
2642 writeString(f, "gmon");
2643 writeLong(f, 0x00000001); /* Version */
2644 writeLong(f, 0); /* padding */
2645 writeLong(f, 0); /* padding */
2646 writeLong(f, 0); /* padding */
2647
2648 u8 zero = 0; /* GMON_TAG_TIME_HIST */
2649 writeData(f, &zero, 1);
2650
2651 /* figure out bucket size */
2652 u32 min=samples[0];
2653 u32 max=samples[0];
2654 for (i=0; i<sampleNum; i++)
2655 {
2656 if (min>samples[i])
2657 {
2658 min=samples[i];
2659 }
2660 if (max<samples[i])
2661 {
2662 max=samples[i];
2663 }
2664 }
2665
2666 int addressSpace=(max-min+1);
2667
2668 static const u32 maxBuckets = 256 * 1024; /* maximum buckets. */
2669 u32 length = addressSpace;
2670 if (length > maxBuckets)
2671 {
2672 length=maxBuckets;
2673 }
2674 int *buckets=malloc(sizeof(int)*length);
2675 if (buckets==NULL)
2676 {
2677 fclose(f);
2678 return;
2679 }
2680 memset(buckets, 0, sizeof(int)*length);
2681 for (i=0; i<sampleNum;i++)
2682 {
2683 u32 address=samples[i];
2684 long long a=address-min;
2685 long long b=length-1;
2686 long long c=addressSpace-1;
2687 int index=(a*b)/c; /* danger!!!! int32 overflows */
2688 buckets[index]++;
2689 }
2690
2691 /* append binary memory gmon.out &profile_hist_hdr ((char*)&profile_hist_hdr + sizeof(struct gmon_hist_hdr)) */
2692 writeLong(f, min); /* low_pc */
2693 writeLong(f, max); /* high_pc */
2694 writeLong(f, length); /* # of samples */
2695 writeLong(f, 64000000); /* 64MHz */
2696 writeString(f, "seconds");
2697 for (i=0; i<(15-strlen("seconds")); i++)
2698 writeData(f, &zero, 1);
2699 writeString(f, "s");
2700
2701 /*append binary memory gmon.out profile_hist_data (profile_hist_data + profile_hist_hdr.hist_size) */
2702
2703 char *data=malloc(2*length);
2704 if (data!=NULL)
2705 {
2706 for (i=0; i<length;i++)
2707 {
2708 int val;
2709 val=buckets[i];
2710 if (val>65535)
2711 {
2712 val=65535;
2713 }
2714 data[i*2]=val&0xff;
2715 data[i*2+1]=(val>>8)&0xff;
2716 }
2717 free(buckets);
2718 writeData(f, data, length * 2);
2719 free(data);
2720 } else
2721 {
2722 free(buckets);
2723 }
2724
2725 fclose(f);
2726 }
2727
2728 /* profiling samples the CPU PC as quickly as OpenOCD is able, which will be used as a random sampling of PC */
2729 static int handle_profile_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
2730 {
2731 target_t *target = get_current_target(cmd_ctx);
2732 struct timeval timeout, now;
2733
2734 gettimeofday(&timeout, NULL);
2735 if (argc!=2)
2736 {
2737 return ERROR_COMMAND_SYNTAX_ERROR;
2738 }
2739 char *end;
2740 timeval_add_time(&timeout, strtoul(args[0], &end, 0), 0);
2741 if (*end)
2742 {
2743 return ERROR_OK;
2744 }
2745
2746 command_print(cmd_ctx, "Starting profiling. Halting and resuming the target as often as we can...");
2747
2748 static const int maxSample=10000;
2749 u32 *samples=malloc(sizeof(u32)*maxSample);
2750 if (samples==NULL)
2751 return ERROR_OK;
2752
2753 int numSamples=0;
2754 int retval=ERROR_OK;
2755 /* hopefully it is safe to cache! We want to stop/restart as quickly as possible. */
2756 reg_t *reg = register_get_by_name(target->reg_cache, "pc", 1);
2757
2758 for (;;)
2759 {
2760 target_poll(target);
2761 if (target->state == TARGET_HALTED)
2762 {
2763 u32 t=*((u32 *)reg->value);
2764 samples[numSamples++]=t;
2765 retval = target_resume(target, 1, 0, 0, 0); /* current pc, addr = 0, do not handle breakpoints, not debugging */
2766 target_poll(target);
2767 alive_sleep(10); /* sleep 10ms, i.e. <100 samples/second. */
2768 } else if (target->state == TARGET_RUNNING)
2769 {
2770 /* We want to quickly sample the PC. */
2771 if((retval = target_halt(target)) != ERROR_OK)
2772 {
2773 free(samples);
2774 return retval;
2775 }
2776 } else
2777 {
2778 command_print(cmd_ctx, "Target not halted or running");
2779 retval=ERROR_OK;
2780 break;
2781 }
2782 if (retval!=ERROR_OK)
2783 {
2784 break;
2785 }
2786
2787 gettimeofday(&now, NULL);
2788 if ((numSamples>=maxSample) || ((now.tv_sec >= timeout.tv_sec) && (now.tv_usec >= timeout.tv_usec)))
2789 {
2790 command_print(cmd_ctx, "Profiling completed. %d samples.", numSamples);
2791 if((retval = target_poll(target)) != ERROR_OK)
2792 {
2793 free(samples);
2794 return retval;
2795 }
2796 if (target->state == TARGET_HALTED)
2797 {
2798 target_resume(target, 1, 0, 0, 0); /* current pc, addr = 0, do not handle breakpoints, not debugging */
2799 }
2800 if((retval = target_poll(target)) != ERROR_OK)
2801 {
2802 free(samples);
2803 return retval;
2804 }
2805 writeGmon(samples, numSamples, args[1]);
2806 command_print(cmd_ctx, "Wrote %s", args[1]);
2807 break;
2808 }
2809 }
2810 free(samples);
2811
2812 return ERROR_OK;
2813 }
2814
2815 static int new_int_array_element(Jim_Interp * interp, const char *varname, int idx, u32 val)
2816 {
2817 char *namebuf;
2818 Jim_Obj *nameObjPtr, *valObjPtr;
2819 int result;
2820
2821 namebuf = alloc_printf("%s(%d)", varname, idx);
2822 if (!namebuf)
2823 return JIM_ERR;
2824
2825 nameObjPtr = Jim_NewStringObj(interp, namebuf, -1);
2826 valObjPtr = Jim_NewIntObj(interp, val);
2827 if (!nameObjPtr || !valObjPtr)
2828 {
2829 free(namebuf);
2830 return JIM_ERR;
2831 }
2832
2833 Jim_IncrRefCount(nameObjPtr);
2834 Jim_IncrRefCount(valObjPtr);
2835 result = Jim_SetVariable(interp, nameObjPtr, valObjPtr);
2836 Jim_DecrRefCount(interp, nameObjPtr);
2837 Jim_DecrRefCount(interp, valObjPtr);
2838 free(namebuf);
2839 /* printf("%s(%d) <= 0%08x\n", varname, idx, val); */
2840 return result;
2841 }
2842
2843 static int jim_mem2array(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
2844 {
2845 command_context_t *context;
2846 target_t *target;
2847
2848 context = Jim_GetAssocData(interp, "context");
2849 if (context == NULL)
2850 {
2851 LOG_ERROR("mem2array: no command context");
2852 return JIM_ERR;
2853 }
2854 target = get_current_target(context);
2855 if (target == NULL)
2856 {
2857 LOG_ERROR("mem2array: no current target");
2858 return JIM_ERR;
2859 }
2860
2861 return target_mem2array(interp, target, argc-1, argv+1);
2862 }
2863
2864 static int target_mem2array(Jim_Interp *interp, target_t *target, int argc, Jim_Obj *const *argv)
2865 {
2866 long l;
2867 u32 width;
2868 int len;
2869 u32 addr;
2870 u32 count;
2871 u32 v;
2872 const char *varname;
2873 u8 buffer[4096];
2874 int n, e, retval;
2875 u32 i;
2876
2877 /* argv[1] = name of array to receive the data
2878 * argv[2] = desired width
2879 * argv[3] = memory address
2880 * argv[4] = count of times to read
2881 */
2882 if (argc != 4) {
2883 Jim_WrongNumArgs(interp, 1, argv, "varname width addr nelems");
2884 return JIM_ERR;
2885 }
2886 varname = Jim_GetString(argv[0], &len);
2887 /* given "foo" get space for worse case "foo(%d)" .. add 20 */
2888
2889 e = Jim_GetLong(interp, argv[1], &l);
2890 width = l;
2891 if (e != JIM_OK) {
2892 return e;
2893 }
2894
2895 e = Jim_GetLong(interp, argv[2], &l);
2896 addr = l;
2897 if (e != JIM_OK) {
2898 return e;
2899 }
2900 e = Jim_GetLong(interp, argv[3], &l);
2901 len = l;
2902 if (e != JIM_OK) {
2903 return e;
2904 }
2905 switch (width) {
2906 case 8:
2907 width = 1;
2908 break;
2909 case 16:
2910 width = 2;
2911 break;
2912 case 32:
2913 width = 4;
2914 break;
2915 default:
2916 Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
2917 Jim_AppendStrings( interp, Jim_GetResult(interp), "Invalid width param, must be 8/16/32", NULL );
2918 return JIM_ERR;
2919 }
2920 if (len == 0) {
2921 Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
2922 Jim_AppendStrings(interp, Jim_GetResult(interp), "mem2array: zero width read?", NULL);
2923 return JIM_ERR;
2924 }
2925 if ((addr + (len * width)) < addr) {
2926 Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
2927 Jim_AppendStrings(interp, Jim_GetResult(interp), "mem2array: addr + len - wraps to zero?", NULL);
2928 return JIM_ERR;
2929 }
2930 /* absurd transfer size? */
2931 if (len > 65536) {
2932 Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
2933 Jim_AppendStrings(interp, Jim_GetResult(interp), "mem2array: absurd > 64K item request", NULL);
2934 return JIM_ERR;
2935 }
2936
2937 if ((width == 1) ||
2938 ((width == 2) && ((addr & 1) == 0)) ||
2939 ((width == 4) && ((addr & 3) == 0))) {
2940 /* all is well */
2941 } else {
2942 char buf[100];
2943 Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
2944 sprintf(buf, "mem2array address: 0x%08x is not aligned for %d byte reads", addr, width);
2945 Jim_AppendStrings(interp, Jim_GetResult(interp), buf , NULL);
2946 return JIM_ERR;
2947 }
2948
2949 /* Transfer loop */
2950
2951 /* index counter */
2952 n = 0;
2953 /* assume ok */
2954 e = JIM_OK;
2955 while (len) {
2956 /* Slurp... in buffer size chunks */
2957
2958 count = len; /* in objects.. */
2959 if (count > (sizeof(buffer)/width)) {
2960 count = (sizeof(buffer)/width);
2961 }
2962
2963 retval = target_read_memory( target, addr, width, count, buffer );
2964 if (retval != ERROR_OK) {
2965 /* BOO !*/
2966 LOG_ERROR("mem2array: Read @ 0x%08x, w=%d, cnt=%d, failed", addr, width, count);
2967 Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
2968 Jim_AppendStrings(interp, Jim_GetResult(interp), "mem2array: cannot read memory", NULL);
2969 e = JIM_ERR;
2970 len = 0;
2971 } else {
2972 v = 0; /* shut up gcc */
2973 for (i = 0 ;i < count ;i++, n++) {
2974 switch (width) {
2975 case 4:
2976 v = target_buffer_get_u32(target, &buffer[i*width]);
2977 break;
2978 case 2:
2979 v = target_buffer_get_u16(target, &buffer[i*width]);
2980 break;
2981 case 1:
2982 v = buffer[i] & 0x0ff;
2983 break;
2984 }
2985 new_int_array_element(interp, varname, n, v);
2986 }
2987 len -= count;
2988 }
2989 }
2990
2991 Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
2992
2993 return JIM_OK;
2994 }
2995
2996 static int get_int_array_element(Jim_Interp * interp, const char *varname, int idx, u32 *val)
2997 {
2998 char *namebuf;
2999 Jim_Obj *nameObjPtr, *valObjPtr;
3000 int result;
3001 long l;
3002
3003 namebuf = alloc_printf("%s(%d)", varname, idx);
3004 if (!namebuf)
3005 return JIM_ERR;
3006
3007 nameObjPtr = Jim_NewStringObj(interp, namebuf, -1);
3008 if (!nameObjPtr)
3009 {
3010 free(namebuf);
3011 return JIM_ERR;
3012 }
3013
3014 Jim_IncrRefCount(nameObjPtr);
3015 valObjPtr = Jim_GetVariable(interp, nameObjPtr, JIM_ERRMSG);
3016 Jim_DecrRefCount(interp, nameObjPtr);
3017 free(namebuf);
3018 if (valObjPtr == NULL)
3019 return JIM_ERR;
3020
3021 result = Jim_GetLong(interp, valObjPtr, &l);
3022 /* printf("%s(%d) => 0%08x\n", varname, idx, val); */
3023 *val = l;
3024 return result;
3025 }
3026
3027 static int jim_array2mem(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
3028 {
3029 command_context_t *context;
3030 target_t *target;
3031
3032 context = Jim_GetAssocData(interp, "context");
3033 if (context == NULL){
3034 LOG_ERROR("array2mem: no command context");
3035 return JIM_ERR;
3036 }
3037 target = get_current_target(context);
3038 if (target == NULL){
3039 LOG_ERROR("array2mem: no current target");
3040 return JIM_ERR;
3041 }
3042
3043 return target_array2mem( interp,target, argc-1, argv+1 );
3044 }
3045
3046 static int target_array2mem(Jim_Interp *interp, target_t *target, int argc, Jim_Obj *const *argv)
3047 {
3048 long l;
3049 u32 width;
3050 int len;
3051 u32 addr;
3052 u32 count;
3053 u32 v;
3054 const char *varname;
3055 u8 buffer[4096];
3056 int n, e, retval;
3057 u32 i;
3058
3059 /* argv[1] = name of array to get the data
3060 * argv[2] = desired width
3061 * argv[3] = memory address
3062 * argv[4] = count to write
3063 */
3064 if (argc != 4) {
3065 Jim_WrongNumArgs(interp, 1, argv, "varname width addr nelems");
3066 return JIM_ERR;
3067 }
3068 varname = Jim_GetString(argv[0], &len);
3069 /* given "foo" get space for worse case "foo(%d)" .. add 20 */
3070
3071 e = Jim_GetLong(interp, argv[1], &l);
3072 width = l;
3073 if (e != JIM_OK) {
3074 return e;
3075 }
3076
3077 e = Jim_GetLong(interp, argv[2], &l);
3078 addr = l;
3079 if (e != JIM_OK) {
3080 return e;
3081 }
3082 e = Jim_GetLong(interp, argv[3], &l);
3083 len = l;
3084 if (e != JIM_OK) {
3085 return e;
3086 }
3087 switch (width) {
3088 case 8:
3089 width = 1;
3090 break;
3091 case 16:
3092 width = 2;
3093 break;
3094 case 32:
3095 width = 4;
3096 break;
3097 default:
3098 Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
3099 Jim_AppendStrings( interp, Jim_GetResult(interp), "Invalid width param, must be 8/16/32", NULL );
3100 return JIM_ERR;
3101 }
3102 if (len == 0) {
3103 Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
3104 Jim_AppendStrings(interp, Jim_GetResult(interp), "array2mem: zero width read?", NULL);
3105 return JIM_ERR;
3106 }
3107 if ((addr + (len * width)) < addr) {
3108 Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
3109 Jim_AppendStrings(interp, Jim_GetResult(interp), "array2mem: addr + len - wraps to zero?", NULL);
3110 return JIM_ERR;
3111 }
3112 /* absurd transfer size? */
3113 if (len > 65536) {
3114 Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
3115 Jim_AppendStrings(interp, Jim_GetResult(interp), "array2mem: absurd > 64K item request", NULL);
3116 return JIM_ERR;
3117 }
3118
3119 if ((width == 1) ||
3120 ((width == 2) && ((addr & 1) == 0)) ||
3121 ((width == 4) && ((addr & 3) == 0))) {
3122 /* all is well */
3123 } else {
3124 char buf[100];
3125 Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
3126 sprintf(buf, "array2mem address: 0x%08x is not aligned for %d byte reads", addr, width);
3127 Jim_AppendStrings(interp, Jim_GetResult(interp), buf , NULL);
3128 return JIM_ERR;
3129 }
3130
3131 /* Transfer loop */
3132
3133 /* index counter */
3134 n = 0;
3135 /* assume ok */
3136 e = JIM_OK;
3137 while (len) {
3138 /* Slurp... in buffer size chunks */
3139
3140 count = len; /* in objects.. */
3141 if (count > (sizeof(buffer)/width)) {
3142 count = (sizeof(buffer)/width);
3143 }
3144
3145 v = 0; /* shut up gcc */
3146 for (i = 0 ;i < count ;i++, n++) {
3147 get_int_array_element(interp, varname, n, &v);
3148 switch (width) {
3149 case 4:
3150 target_buffer_set_u32(target, &buffer[i*width], v);
3151 break;
3152 case 2:
3153 target_buffer_set_u16(target, &buffer[i*width], v);
3154 break;
3155 case 1:
3156 buffer[i] = v & 0x0ff;
3157 break;
3158 }
3159 }
3160 len -= count;
3161
3162 retval = target_write_memory(target, addr, width, count, buffer);
3163 if (retval != ERROR_OK) {
3164 /* BOO !*/
3165 LOG_ERROR("array2mem: Write @ 0x%08x, w=%d, cnt=%d, failed", addr, width, count);
3166 Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
3167 Jim_AppendStrings(interp, Jim_GetResult(interp), "array2mem: cannot read memory", NULL);
3168 e = JIM_ERR;
3169 len = 0;
3170 }
3171 }
3172
3173 Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
3174
3175 return JIM_OK;
3176 }
3177
3178 void target_all_handle_event( enum target_event e )
3179 {
3180 target_t *target;
3181
3182 LOG_DEBUG( "**all*targets: event: %d, %s",
3183 e,
3184 Jim_Nvp_value2name_simple( nvp_target_event, e )->name );
3185
3186 target = all_targets;
3187 while (target){
3188 target_handle_event( target, e );
3189 target = target->next;
3190 }
3191 }
3192
3193 void target_handle_event( target_t *target, enum target_event e )
3194 {
3195 target_event_action_t *teap;
3196 int done;
3197
3198 teap = target->event_action;
3199
3200 done = 0;
3201 while( teap ){
3202 if( teap->event == e ){
3203 done = 1;
3204 LOG_DEBUG( "target: (%d) %s (%s) event: %d (%s) action: %s\n",
3205 target->target_number,
3206 target->cmd_name,
3207 target_get_name(target),
3208 e,
3209 Jim_Nvp_value2name_simple( nvp_target_event, e )->name,
3210 Jim_GetString( teap->body, NULL ) );
3211 if (Jim_EvalObj( interp, teap->body )!=JIM_OK)
3212 {
3213 Jim_PrintErrorMessage(interp);
3214 }
3215 }
3216 teap = teap->next;
3217 }
3218 if( !done ){
3219 LOG_DEBUG( "event: %d %s - no action",
3220 e,
3221 Jim_Nvp_value2name_simple( nvp_target_event, e )->name );
3222 }
3223 }
3224
3225 enum target_cfg_param {
3226 TCFG_TYPE,
3227 TCFG_EVENT,
3228 TCFG_WORK_AREA_VIRT,
3229 TCFG_WORK_AREA_PHYS,
3230 TCFG_WORK_AREA_SIZE,
3231 TCFG_WORK_AREA_BACKUP,
3232 TCFG_ENDIAN,
3233 TCFG_VARIANT,
3234 TCFG_CHAIN_POSITION,
3235 };
3236
3237 static Jim_Nvp nvp_config_opts[] = {
3238 { .name = "-type", .value = TCFG_TYPE },
3239 { .name = "-event", .value = TCFG_EVENT },
3240 { .name = "-work-area-virt", .value = TCFG_WORK_AREA_VIRT },
3241 { .name = "-work-area-phys", .value = TCFG_WORK_AREA_PHYS },
3242 { .name = "-work-area-size", .value = TCFG_WORK_AREA_SIZE },
3243 { .name = "-work-area-backup", .value = TCFG_WORK_AREA_BACKUP },
3244 { .name = "-endian" , .value = TCFG_ENDIAN },
3245 { .name = "-variant", .value = TCFG_VARIANT },
3246 { .name = "-chain-position", .value = TCFG_CHAIN_POSITION },
3247
3248 { .name = NULL, .value = -1 }
3249 };
3250
3251 static int target_configure( Jim_GetOptInfo *goi, target_t *target )
3252 {
3253 Jim_Nvp *n;
3254 Jim_Obj *o;
3255 jim_wide w;
3256 char *cp;
3257 int e;
3258
3259 /* parse config or cget options ... */
3260 while( goi->argc > 0 ){
3261 Jim_SetEmptyResult( goi->interp );
3262 /* Jim_GetOpt_Debug( goi ); */
3263
3264 if( target->type->target_jim_configure ){
3265 /* target defines a configure function */
3266 /* target gets first dibs on parameters */
3267 e = (*(target->type->target_jim_configure))( target, goi );
3268 if( e == JIM_OK ){
3269 /* more? */
3270 continue;
3271 }
3272 if( e == JIM_ERR ){
3273 /* An error */
3274 return e;
3275 }
3276 /* otherwise we 'continue' below */
3277 }
3278 e = Jim_GetOpt_Nvp( goi, nvp_config_opts, &n );
3279 if( e != JIM_OK ){
3280 Jim_GetOpt_NvpUnknown( goi, nvp_config_opts, 0 );
3281 return e;
3282 }
3283 switch( n->value ){
3284 case TCFG_TYPE:
3285 /* not setable */
3286 if( goi->isconfigure ){
3287 Jim_SetResult_sprintf( goi->interp, "not setable: %s", n->name );
3288 return JIM_ERR;
3289 } else {
3290 no_params:
3291 if( goi->argc != 0 ){
3292 Jim_WrongNumArgs( goi->interp, goi->argc, goi->argv, "NO PARAMS");
3293 return JIM_ERR;
3294 }
3295 }
3296 Jim_SetResultString( goi->interp, target_get_name(target), -1 );
3297 /* loop for more */
3298 break;
3299 case TCFG_EVENT:
3300 if( goi->argc == 0 ){
3301 Jim_WrongNumArgs( goi->interp, goi->argc, goi->argv, "-event ?event-name? ...");
3302 return JIM_ERR;
3303 }
3304
3305 e = Jim_GetOpt_Nvp( goi, nvp_target_event, &n );
3306 if( e != JIM_OK ){
3307 Jim_GetOpt_NvpUnknown( goi, nvp_target_event, 1 );
3308 return e;
3309 }
3310
3311 if( goi->isconfigure ){
3312 if( goi->argc != 1 ){
3313 Jim_WrongNumArgs( goi->interp, goi->argc, goi->argv, "-event ?event-name? ?EVENT-BODY?");
3314 return JIM_ERR;
3315 }
3316 } else {
3317 if( goi->argc != 0 ){
3318 Jim_WrongNumArgs(goi->interp, goi->argc, goi->argv, "-event ?event-name?");
3319 return JIM_ERR;
3320 }
3321 }
3322
3323 {
3324 target_event_action_t *teap;
3325
3326 teap = target->event_action;
3327 /* replace existing? */
3328 while( teap ){
3329 if( teap->event == (enum target_event)n->value ){
3330 break;
3331 }
3332 teap = teap->next;
3333 }
3334
3335 if( goi->isconfigure ){
3336 if( teap == NULL ){
3337 /* create new */
3338 teap = calloc( 1, sizeof(*teap) );
3339 }
3340 teap->event = n->value;
3341 Jim_GetOpt_Obj( goi, &o );
3342 if( teap->body ){
3343 Jim_DecrRefCount( interp, teap->body );
3344 }
3345 teap->body = Jim_DuplicateObj( goi->interp, o );
3346 /*
3347 * FIXME:
3348 * Tcl/TK - "tk events" have a nice feature.
3349 * See the "BIND" command.
3350 * We should support that here.
3351 * You can specify %X and %Y in the event code.
3352 * The idea is: %T - target name.
3353 * The idea is: %N - target number
3354 * The idea is: %E - event name.
3355 */
3356 Jim_IncrRefCount( teap->body );
3357
3358 /* add to head of event list */
3359 teap->next = target->event_action;
3360 target->event_action = teap;
3361 Jim_SetEmptyResult(goi->interp);
3362 } else {
3363 /* get */
3364 if( teap == NULL ){
3365 Jim_SetEmptyResult( goi->interp );
3366 } else {
3367 Jim_SetResult( goi->interp, Jim_DuplicateObj( goi->interp, teap->body ) );
3368 }
3369 }
3370 }
3371 /* loop for more */
3372 break;
3373
3374 case TCFG_WORK_AREA_VIRT:
3375 if( goi->isconfigure ){
3376 target_free_all_working_areas(target);
3377 e = Jim_GetOpt_Wide( goi, &w );
3378 if( e != JIM_OK ){
3379 return e;
3380 }
3381 target->working_area_virt = w;
3382 } else {
3383 if( goi->argc != 0 ){
3384 goto no_params;
3385 }
3386 }
3387 Jim_SetResult( interp, Jim_NewIntObj( goi->interp, target->working_area_virt ) );
3388 /* loop for more */
3389 break;
3390
3391 case TCFG_WORK_AREA_PHYS:
3392 if( goi->isconfigure ){
3393 target_free_all_working_areas(target);
3394 e = Jim_GetOpt_Wide( goi, &w );
3395 if( e != JIM_OK ){
3396 return e;
3397 }
3398 target->working_area_phys = w;
3399 } else {
3400 if( goi->argc != 0 ){
3401 goto no_params;
3402 }
3403 }
3404 Jim_SetResult( interp, Jim_NewIntObj( goi->interp, target->working_area_phys ) );
3405 /* loop for more */
3406 break;
3407
3408 case TCFG_WORK_AREA_SIZE:
3409 if( goi->isconfigure ){
3410 target_free_all_working_areas(target);
3411 e = Jim_GetOpt_Wide( goi, &w );
3412 if( e != JIM_OK ){
3413 return e;
3414 }
3415 target->working_area_size = w;
3416 } else {
3417 if( goi->argc != 0 ){
3418 goto no_params;
3419 }
3420 }
3421 Jim_SetResult( interp, Jim_NewIntObj( goi->interp, target->working_area_size ) );
3422 /* loop for more */
3423 break;
3424
3425 case TCFG_WORK_AREA_BACKUP:
3426 if( goi->isconfigure ){
3427 target_free_all_working_areas(target);
3428 e = Jim_GetOpt_Wide( goi, &w );
3429 if( e != JIM_OK ){
3430 return e;
3431 }
3432 /* make this exactly 1 or 0 */
3433 target->backup_working_area = (!!w);
3434 } else {
3435 if( goi->argc != 0 ){
3436 goto no_params;
3437 }
3438 }
3439 Jim_SetResult(interp, Jim_NewIntObj(goi->interp, target->backup_working_area));
3440 /* loop for more e*/
3441 break;
3442
3443 case TCFG_ENDIAN:
3444 if( goi->isconfigure ){
3445 e = Jim_GetOpt_Nvp( goi, nvp_target_endian, &n );
3446 if( e != JIM_OK ){
3447 Jim_GetOpt_NvpUnknown( goi, nvp_target_endian, 1 );
3448 return e;
3449 }
3450 target->endianness = n->value;
3451 } else {
3452 if( goi->argc != 0 ){
3453 goto no_params;
3454 }
3455 }
3456 n = Jim_Nvp_value2name_simple( nvp_target_endian, target->endianness );
3457 if( n->name == NULL ){
3458 target->endianness = TARGET_LITTLE_ENDIAN;
3459 n = Jim_Nvp_value2name_simple( nvp_target_endian, target->endianness );
3460 }
3461 Jim_SetResultString( goi->interp, n->name, -1 );
3462 /* loop for more */
3463 break;
3464
3465 case TCFG_VARIANT:
3466 if( goi->isconfigure ){
3467 if( goi->argc < 1 ){
3468 Jim_SetResult_sprintf( goi->interp,
3469 "%s ?STRING?",
3470 n->name );
3471 return JIM_ERR;
3472 }
3473 if( target->variant ){
3474 free((void *)(target->variant));
3475 }
3476 e = Jim_GetOpt_String( goi, &cp, NULL );
3477 target->variant = strdup(cp);
3478 } else {
3479 if( goi->argc != 0 ){
3480 goto no_params;
3481 }
3482 }
3483 Jim_SetResultString( goi->interp, target->variant,-1 );
3484 /* loop for more */
3485 break;
3486 case TCFG_CHAIN_POSITION:
3487 if( goi->isconfigure ){
3488 Jim_Obj *o;
3489 jtag_tap_t *tap;
3490 target_free_all_working_areas(target);
3491 e = Jim_GetOpt_Obj( goi, &o );
3492 if( e != JIM_OK ){
3493 return e;
3494 }
3495 tap = jtag_tap_by_jim_obj( goi->interp, o );
3496 if( tap == NULL ){
3497 return JIM_ERR;
3498 }
3499 /* make this exactly 1 or 0 */
3500 target->tap = tap;
3501 } else {
3502 if( goi->argc != 0 ){
3503 goto no_params;
3504 }
3505 }
3506 Jim_SetResultString( interp, target->tap->dotted_name, -1 );
3507 /* loop for more e*/
3508 break;
3509 }
3510 } /* while( goi->argc ) */
3511
3512
3513 /* done - we return */
3514 return JIM_OK;
3515 }
3516
3517 /** this is the 'tcl' handler for the target specific command */
3518 static int tcl_target_func( Jim_Interp *interp, int argc, Jim_Obj *const *argv )
3519 {
3520 Jim_GetOptInfo goi;
3521 jim_wide a,b,c;
3522 int x,y,z;
3523 u8 target_buf[32];
3524 Jim_Nvp *n;
3525 target_t *target;
3526 struct command_context_s *cmd_ctx;
3527 int e;
3528
3529 enum {
3530 TS_CMD_CONFIGURE,
3531 TS_CMD_CGET,
3532
3533 TS_CMD_MWW, TS_CMD_MWH, TS_CMD_MWB,
3534 TS_CMD_MDW, TS_CMD_MDH, TS_CMD_MDB,
3535 TS_CMD_MRW, TS_CMD_MRH, TS_CMD_MRB,
3536 TS_CMD_MEM2ARRAY, TS_CMD_ARRAY2MEM,
3537 TS_CMD_EXAMINE,
3538 TS_CMD_POLL,
3539 TS_CMD_RESET,
3540 TS_CMD_HALT,
3541 TS_CMD_WAITSTATE,
3542 TS_CMD_EVENTLIST,
3543 TS_CMD_CURSTATE,
3544 TS_CMD_INVOKE_EVENT,
3545 };
3546
3547 static const Jim_Nvp target_options[] = {
3548 { .name = "configure", .value = TS_CMD_CONFIGURE },
3549 { .name = "cget", .value = TS_CMD_CGET },
3550 { .name = "mww", .value = TS_CMD_MWW },
3551 { .name = "mwh", .value = TS_CMD_MWH },
3552 { .name = "mwb", .value = TS_CMD_MWB },
3553 { .name = "mdw", .value = TS_CMD_MDW },
3554 { .name = "mdh", .value = TS_CMD_MDH },
3555 { .name = "mdb", .value = TS_CMD_MDB },
3556 { .name = "mem2array", .value = TS_CMD_MEM2ARRAY },
3557 { .name = "array2mem", .value = TS_CMD_ARRAY2MEM },
3558 { .name = "eventlist", .value = TS_CMD_EVENTLIST },
3559 { .name = "curstate", .value = TS_CMD_CURSTATE },
3560
3561 { .name = "arp_examine", .value = TS_CMD_EXAMINE },
3562 { .name = "arp_poll", .value = TS_CMD_POLL },
3563 { .name = "arp_reset", .value = TS_CMD_RESET },
3564 { .name = "arp_halt", .value = TS_CMD_HALT },
3565 { .name = "arp_waitstate", .value = TS_CMD_WAITSTATE },
3566 { .name = "invoke-event", .value = TS_CMD_INVOKE_EVENT },
3567
3568 { .name = NULL, .value = -1 },
3569 };
3570
3571 /* go past the "command" */
3572 Jim_GetOpt_Setup( &goi, interp, argc-1, argv+1 );
3573
3574 target = Jim_CmdPrivData( goi.interp );
3575 cmd_ctx = Jim_GetAssocData(goi.interp, "context");
3576
3577 /* commands here are in an NVP table */
3578 e = Jim_GetOpt_Nvp( &goi, target_options, &n );
3579 if( e != JIM_OK ){
3580 Jim_GetOpt_NvpUnknown( &goi, target_options, 0 );
3581 return e;
3582 }
3583 /* Assume blank result */
3584 Jim_SetEmptyResult( goi.interp );
3585
3586 switch( n->value ){
3587 case TS_CMD_CONFIGURE:
3588 if( goi.argc < 2 ){
3589 Jim_WrongNumArgs( goi.interp, goi.argc, goi.argv, "missing: -option VALUE ...");
3590 return JIM_ERR;
3591 }
3592 goi.isconfigure = 1;
3593 return target_configure( &goi, target );
3594 case TS_CMD_CGET:
3595 // some things take params
3596 if( goi.argc < 1 ){
3597 Jim_WrongNumArgs( goi.interp, 0, goi.argv, "missing: ?-option?");
3598 return JIM_ERR;
3599 }
3600 goi.isconfigure = 0;
3601 return target_configure( &goi, target );
3602 break;
3603 case TS_CMD_MWW:
3604 case TS_CMD_MWH:
3605 case TS_CMD_MWB:
3606 /* argv[0] = cmd
3607 * argv[1] = address
3608 * argv[2] = data
3609 * argv[3] = optional count.
3610 */
3611
3612 if( (goi.argc == 3) || (goi.argc == 4) ){
3613 /* all is well */
3614 } else {
3615 mwx_error:
3616 Jim_SetResult_sprintf( goi.interp, "expected: %s ADDR DATA [COUNT]", n->name );
3617 return JIM_ERR;
3618 }
3619
3620 e = Jim_GetOpt_Wide( &goi, &a );
3621 if( e != JIM_OK ){
3622 goto mwx_error;
3623 }
3624
3625 e = Jim_GetOpt_Wide( &goi, &b );
3626 if( e != JIM_OK ){
3627 goto mwx_error;
3628 }
3629 if( goi.argc ){
3630 e = Jim_GetOpt_Wide( &goi, &c );
3631 if( e != JIM_OK ){
3632 goto mwx_error;
3633 }
3634 } else {
3635 c = 1;
3636 }
3637
3638 switch( n->value ){
3639 case TS_CMD_MWW:
3640 target_buffer_set_u32( target, target_buf, b );
3641 b = 4;
3642 break;
3643 case TS_CMD_MWH:
3644 target_buffer_set_u16( target, target_buf, b );
3645 b = 2;
3646 break;
3647 case TS_CMD_MWB:
3648 target_buffer_set_u8( target, target_buf, b );
3649 b = 1;
3650 break;
3651 }
3652 for( x = 0 ; x < c ; x++ ){
3653 e = target_write_memory( target, a, b, 1, target_buf );
3654 if( e != ERROR_OK ){
3655 Jim_SetResult_sprintf( interp, "Error writing @ 0x%08x: %d\n", (int)(a), e );
3656 return JIM_ERR;
3657 }
3658 /* b = width */
3659 a = a + b;
3660 }
3661 return JIM_OK;
3662 break;
3663
3664 /* display */
3665 case TS_CMD_MDW:
3666 case TS_CMD_MDH:
3667 case TS_CMD_MDB:
3668 /* argv[0] = command
3669 * argv[1] = address
3670 * argv[2] = optional count
3671 */
3672 if( (goi.argc == 2) || (goi.argc == 3) ){
3673 Jim_SetResult_sprintf( goi.interp, "expected: %s ADDR [COUNT]", n->name );
3674 return JIM_ERR;
3675 }
3676 e = Jim_GetOpt_Wide( &goi, &a );
3677 if( e != JIM_OK ){
3678 return JIM_ERR;
3679 }
3680 if( goi.argc ){
3681 e = Jim_GetOpt_Wide( &goi, &c );
3682 if( e != JIM_OK ){
3683 return JIM_ERR;
3684 }
3685 } else {
3686 c = 1;
3687 }
3688 b = 1; /* shut up gcc */
3689 switch( n->value ){
3690 case TS_CMD_MDW:
3691 b = 4;
3692 break;
3693 case TS_CMD_MDH:
3694 b = 2;
3695 break;
3696 case TS_CMD_MDB:
3697 b = 1;
3698 break;
3699 }
3700
3701 /* convert to "bytes" */
3702 c = c * b;
3703 /* count is now in 'BYTES' */
3704 while( c > 0 ){
3705 y = c;
3706 if( y > 16 ){
3707 y = 16;
3708 }
3709 e = target_read_memory( target, a, b, y / b, target_buf );
3710 if( e != ERROR_OK ){
3711 Jim_SetResult_sprintf( interp, "error reading target @ 0x%08lx", (int)(a) );
3712 return JIM_ERR;
3713 }
3714
3715 Jim_fprintf( interp, interp->cookie_stdout, "0x%08x ", (int)(a) );
3716 switch( b ){
3717 case 4:
3718 for( x = 0 ; (x < 16) && (x < y) ; x += 4 ){
3719 z = target_buffer_get_u32( target, &(target_buf[ x * 4 ]) );
3720 Jim_fprintf( interp, interp->cookie_stdout, "%08x ", (int)(z) );
3721 }
3722 for( ; (x < 16) ; x += 4 ){
3723 Jim_fprintf( interp, interp->cookie_stdout, " " );
3724 }
3725 break;
3726 case 2:
3727 for( x = 0 ; (x < 16) && (x < y) ; x += 2 ){
3728 z = target_buffer_get_u16( target, &(target_buf[ x * 2 ]) );
3729 Jim_fprintf( interp, interp->cookie_stdout, "%04x ", (int)(z) );
3730 }
3731 for( ; (x < 16) ; x += 2 ){
3732 Jim_fprintf( interp, interp->cookie_stdout, " " );
3733 }
3734 break;
3735 case 1:
3736 default:
3737 for( x = 0 ; (x < 16) && (x < y) ; x += 1 ){
3738 z = target_buffer_get_u8( target, &(target_buf[ x * 4 ]) );
3739 Jim_fprintf( interp, interp->cookie_stdout, "%02x ", (int)(z) );
3740 }
3741 for( ; (x < 16) ; x += 1 ){
3742 Jim_fprintf( interp, interp->cookie_stdout, " " );
3743 }
3744 break;
3745 }
3746 /* ascii-ify the bytes */
3747 for( x = 0 ; x < y ; x++ ){
3748 if( (target_buf[x] >= 0x20) &&
3749 (target_buf[x] <= 0x7e) ){
3750 /* good */
3751 } else {
3752 /* smack it */
3753 target_buf[x] = '.';
3754 }
3755 }
3756 /* space pad */
3757 while( x < 16 ){
3758 target_buf[x] = ' ';
3759 x++;
3760 }
3761 /* terminate */
3762 target_buf[16] = 0;
3763 /* print - with a newline */
3764 Jim_fprintf( interp, interp->cookie_stdout, "%s\n", target_buf );
3765 /* NEXT... */
3766 c -= 16;
3767 a += 16;
3768 }
3769 return JIM_OK;
3770 case TS_CMD_MEM2ARRAY:
3771 return target_mem2array( goi.interp, target, goi.argc, goi.argv );
3772 break;
3773 case TS_CMD_ARRAY2MEM:
3774 return target_array2mem( goi.interp, target, goi.argc, goi.argv );
3775 break;
3776 case TS_CMD_EXAMINE:
3777 if( goi.argc ){
3778 Jim_WrongNumArgs( goi.interp, 2, argv, "[no parameters]");
3779 return JIM_ERR;
3780 }
3781 if (!target->tap->enabled)
3782 goto err_tap_disabled;
3783 e = target->type->examine( target );
3784 if( e != ERROR_OK ){
3785 Jim_SetResult_sprintf( interp, "examine-fails: %d", e );
3786 return JIM_ERR;
3787 }
3788 return JIM_OK;
3789 case TS_CMD_POLL:
3790 if( goi.argc ){
3791 Jim_WrongNumArgs( goi.interp, 2, argv, "[no parameters]");
3792 return JIM_ERR;
3793 }
3794 if (!target->tap->enabled)
3795 goto err_tap_disabled;
3796 if( !(target_was_examined(target)) ){
3797 e = ERROR_TARGET_NOT_EXAMINED;
3798 } else {
3799 e = target->type->poll( target );
3800 }
3801 if( e != ERROR_OK ){
3802 Jim_SetResult_sprintf( interp, "poll-fails: %d", e );
3803 return JIM_ERR;
3804 } else {
3805 return JIM_OK;
3806 }
3807 break;
3808 case TS_CMD_RESET:
3809 if( goi.argc != 2 ){
3810 Jim_WrongNumArgs( interp, 2, argv, "t|f|assert|deassert BOOL");
3811 return JIM_ERR;
3812 }
3813 e = Jim_GetOpt_Nvp( &goi, nvp_assert, &n );
3814 if( e != JIM_OK ){
3815 Jim_GetOpt_NvpUnknown( &goi, nvp_assert, 1 );
3816 return e;
3817 }
3818 /* the halt or not param */
3819 e = Jim_GetOpt_Wide( &goi, &a);
3820 if( e != JIM_OK ){
3821 return e;
3822 }
3823 if (!target->tap->enabled)
3824 goto err_tap_disabled;
3825 /* determine if we should halt or not. */
3826 target->reset_halt = !!a;
3827 /* When this happens - all workareas are invalid. */
3828 target_free_all_working_areas_restore(target, 0);
3829
3830 /* do the assert */
3831 if( n->value == NVP_ASSERT ){
3832 target->type->assert_reset( target );
3833 } else {
3834 target->type->deassert_reset( target );
3835 }
3836 return JIM_OK;
3837 case TS_CMD_HALT:
3838 if( goi.argc ){
3839 Jim_WrongNumArgs( goi.interp, 0, argv, "halt [no parameters]");
3840 return JIM_ERR;
3841 }
3842 if (!target->tap->enabled)
3843 goto err_tap_disabled;
3844 target->type->halt( target );
3845 return JIM_OK;
3846 case TS_CMD_WAITSTATE:
3847 /* params: <name> statename timeoutmsecs */
3848 if( goi.argc != 2 ){
3849 Jim_SetResult_sprintf( goi.interp, "%s STATENAME TIMEOUTMSECS", n->name );
3850 return JIM_ERR;
3851 }
3852 e = Jim_GetOpt_Nvp( &goi, nvp_target_state, &n );
3853 if( e != JIM_OK ){
3854 Jim_GetOpt_NvpUnknown( &goi, nvp_target_state,1 );
3855 return e;
3856 }
3857 e = Jim_GetOpt_Wide( &goi, &a );
3858 if( e != JIM_OK ){
3859 return e;
3860 }
3861 if (!target->tap->enabled)
3862 goto err_tap_disabled;
3863 e = target_wait_state( target, n->value, a );
3864 if( e != ERROR_OK ){
3865 Jim_SetResult_sprintf( goi.interp,
3866 "target: %s wait %s fails (%d) %s",
3867 target->cmd_name,
3868 n->name,
3869 e, target_strerror_safe(e) );
3870 return JIM_ERR;
3871 } else {
3872 return JIM_OK;
3873 }
3874 case TS_CMD_EVENTLIST:
3875 /* List for human, Events defined for this target.
3876 * scripts/programs should use 'name cget -event NAME'
3877 */
3878 {
3879 target_event_action_t *teap;
3880 teap = target->event_action;
3881 command_print( cmd_ctx, "Event actions for target (%d) %s\n",
3882 target->target_number,
3883 target->cmd_name );
3884 command_print( cmd_ctx, "%-25s | Body", "Event");
3885 command_print( cmd_ctx, "------------------------- | ----------------------------------------");
3886 while( teap ){
3887 command_print( cmd_ctx,
3888 "%-25s | %s",
3889 Jim_Nvp_value2name_simple( nvp_target_event, teap->event )->name,
3890 Jim_GetString( teap->body, NULL ) );
3891 teap = teap->next;
3892 }
3893 command_print( cmd_ctx, "***END***");
3894 return JIM_OK;
3895 }
3896 case TS_CMD_CURSTATE:
3897 if( goi.argc != 0 ){
3898 Jim_WrongNumArgs( goi.interp, 0, argv, "[no parameters]");
3899 return JIM_ERR;
3900 }
3901 Jim_SetResultString( goi.interp,
3902 Jim_Nvp_value2name_simple(nvp_target_state,target->state)->name,-1);
3903 return JIM_OK;
3904 case TS_CMD_INVOKE_EVENT:
3905 if( goi.argc != 1 ){
3906 Jim_SetResult_sprintf( goi.interp, "%s ?EVENTNAME?",n->name);
3907 return JIM_ERR;
3908 }
3909 e = Jim_GetOpt_Nvp( &goi, nvp_target_event, &n );
3910 if( e != JIM_OK ){
3911 Jim_GetOpt_NvpUnknown( &goi, nvp_target_event, 1 );
3912 return e;
3913 }
3914 target_handle_event( target, n->value );
3915 return JIM_OK;
3916 }
3917 return JIM_ERR;
3918
3919 err_tap_disabled:
3920 Jim_SetResult_sprintf(interp, "[TAP is disabled]");
3921 return JIM_ERR;
3922 }
3923
3924 static int target_create( Jim_GetOptInfo *goi )
3925 {
3926 Jim_Obj *new_cmd;
3927 Jim_Cmd *cmd;
3928 const char *cp;
3929 char *cp2;
3930 int e;
3931 int x;
3932 target_t *target;
3933 struct command_context_s *cmd_ctx;
3934
3935 cmd_ctx = Jim_GetAssocData(goi->interp, "context");
3936 if( goi->argc < 3 ){
3937 Jim_WrongNumArgs( goi->interp, 1, goi->argv, "?name? ?type? ..options...");
3938 return JIM_ERR;
3939 }
3940
3941 /* COMMAND */
3942 Jim_GetOpt_Obj( goi, &new_cmd );
3943 /* does this command exist? */
3944 cmd = Jim_GetCommand( goi->interp, new_cmd, JIM_ERRMSG );
3945 if( cmd ){
3946 cp = Jim_GetString( new_cmd, NULL );
3947 Jim_SetResult_sprintf(goi->interp, "Command/target: %s Exists", cp);
3948 return JIM_ERR;
3949 }
3950
3951 /* TYPE */
3952 e = Jim_GetOpt_String( goi, &cp2, NULL );
3953 cp = cp2;
3954 /* now does target type exist */
3955 for( x = 0 ; target_types[x] ; x++ ){
3956 if( 0 == strcmp( cp, target_types[x]->name ) ){
3957 /* found */
3958 break;
3959 }
3960 }
3961 if( target_types[x] == NULL ){
3962 Jim_SetResult_sprintf( goi->interp, "Unknown target type %s, try one of ", cp );
3963 for( x = 0 ; target_types[x] ; x++ ){
3964 if( target_types[x+1] ){
3965 Jim_AppendStrings( goi->interp,
3966 Jim_GetResult(goi->interp),
3967 target_types[x]->name,
3968 ", ", NULL);
3969 } else {
3970 Jim_AppendStrings( goi->interp,
3971 Jim_GetResult(goi->interp),
3972 " or ",
3973 target_types[x]->name,NULL );
3974 }
3975 }
3976 return JIM_ERR;
3977 }
3978
3979 /* Create it */
3980 target = calloc(1,sizeof(target_t));
3981 /* set target number */
3982 target->target_number = new_target_number();
3983
3984 /* allocate memory for each unique target type */
3985 target->type = (target_type_t*)calloc(1,sizeof(target_type_t));
3986
3987 memcpy( target->type, target_types[x], sizeof(target_type_t));
3988
3989 /* will be set by "-endian" */
3990 target->endianness = TARGET_ENDIAN_UNKNOWN;
3991
3992 target->working_area = 0x0;
3993 target->working_area_size = 0x0;
3994 target->working_areas = NULL;
3995 target->backup_working_area = 0;
3996
3997 target->state = TARGET_UNKNOWN;
3998 target->debug_reason = DBG_REASON_UNDEFINED;
3999 target->reg_cache = NULL;
4000 target->breakpoints = NULL;
4001 target->watchpoints = NULL;
4002 target->next = NULL;
4003 target->arch_info = NULL;
4004
4005 target->display = 1;
4006
4007 /* initialize trace information */
4008 target->trace_info = malloc(sizeof(trace_t));
4009 target->trace_info->num_trace_points = 0;
4010 target->trace_info->trace_points_size = 0;
4011 target->trace_info->trace_points = NULL;
4012 target->trace_info->trace_history_size = 0;
4013 target->trace_info->trace_history = NULL;
4014 target->trace_info->trace_history_pos = 0;
4015 target->trace_info->trace_history_overflowed = 0;
4016
4017 target->dbgmsg = NULL;
4018 target->dbg_msg_enabled = 0;
4019
4020 target->endianness = TARGET_ENDIAN_UNKNOWN;
4021
4022 /* Do the rest as "configure" options */
4023 goi->isconfigure = 1;
4024 e = target_configure( goi, target);
4025
4026 if (target->tap == NULL)
4027 {
4028 Jim_SetResultString( interp, "-chain-position required when creating target", -1);
4029 e=JIM_ERR;
4030 }
4031
4032 if( e != JIM_OK ){
4033 free( target->type );
4034 free( target );
4035 return e;
4036 }
4037
4038 if( target->endianness == TARGET_ENDIAN_UNKNOWN ){
4039 /* default endian to little if not specified */
4040 target->endianness = TARGET_LITTLE_ENDIAN;
4041 }
4042
4043 /* incase variant is not set */
4044 if (!target->variant)
4045 target->variant = strdup("");
4046
4047 /* create the target specific commands */
4048 if( target->type->register_commands ){
4049 (*(target->type->register_commands))( cmd_ctx );
4050 }
4051 if( target->type->target_create ){
4052 (*(target->type->target_create))( target, goi->interp );
4053 }
4054
4055 /* append to end of list */
4056 {
4057 target_t **tpp;
4058 tpp = &(all_targets);
4059 while( *tpp ){
4060 tpp = &( (*tpp)->next );
4061 }
4062 *tpp = target;
4063 }
4064
4065 cp = Jim_GetString( new_cmd, NULL );
4066 target->cmd_name = strdup(cp);
4067
4068 /* now - create the new target name command */
4069 e = Jim_CreateCommand( goi->interp,
4070 /* name */
4071 cp,
4072 tcl_target_func, /* C function */
4073 target, /* private data */
4074 NULL ); /* no del proc */
4075
4076 return e;
4077 }
4078
4079 static int jim_target( Jim_Interp *interp, int argc, Jim_Obj *const *argv )
4080 {
4081 int x,r,e;
4082 jim_wide w;
4083 struct command_context_s *cmd_ctx;
4084 target_t *target;
4085 Jim_GetOptInfo goi;
4086 enum tcmd {
4087 /* TG = target generic */
4088 TG_CMD_CREATE,
4089 TG_CMD_TYPES,
4090 TG_CMD_NAMES,
4091 TG_CMD_CURRENT,
4092 TG_CMD_NUMBER,
4093 TG_CMD_COUNT,
4094 };
4095 const char *target_cmds[] = {
4096 "create", "types", "names", "current", "number",
4097 "count",
4098 NULL /* terminate */
4099 };
4100
4101 LOG_DEBUG("Target command params:");
4102 LOG_DEBUG("%s", Jim_Debug_ArgvString(interp, argc, argv));
4103
4104 cmd_ctx = Jim_GetAssocData( interp, "context" );
4105
4106 Jim_GetOpt_Setup( &goi, interp, argc-1, argv+1 );
4107
4108 if( goi.argc == 0 ){
4109 Jim_WrongNumArgs(interp, 1, argv, "missing: command ...");
4110 return JIM_ERR;
4111 }
4112
4113 /* Jim_GetOpt_Debug( &goi ); */
4114 r = Jim_GetOpt_Enum( &goi, target_cmds, &x );
4115 if( r != JIM_OK ){
4116 return r;
4117 }
4118
4119 switch(x){
4120 default:
4121 Jim_Panic(goi.interp,"Why am I here?");
4122 return JIM_ERR;
4123 case TG_CMD_CURRENT:
4124 if( goi.argc != 0 ){
4125 Jim_WrongNumArgs( goi.interp, 1, goi.argv, "Too many parameters");
4126 return JIM_ERR;
4127 }
4128 Jim_SetResultString( goi.interp, get_current_target( cmd_ctx )->cmd_name, -1 );
4129 return JIM_OK;
4130 case TG_CMD_TYPES:
4131 if( goi.argc != 0 ){
4132 Jim_WrongNumArgs( goi.interp, 1, goi.argv, "Too many parameters" );
4133 return JIM_ERR;
4134 }
4135 Jim_SetResult( goi.interp, Jim_NewListObj( goi.interp, NULL, 0 ) );
4136 for( x = 0 ; target_types[x] ; x++ ){
4137 Jim_ListAppendElement( goi.interp,
4138 Jim_GetResult(goi.interp),
4139 Jim_NewStringObj( goi.interp, target_types[x]->name, -1 ) );
4140 }
4141 return JIM_OK;
4142 case TG_CMD_NAMES:
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 target = all_targets;
4149 while( target ){
4150 Jim_ListAppendElement( goi.interp,
4151 Jim_GetResult(goi.interp),
4152 Jim_NewStringObj( goi.interp, target->cmd_name, -1 ) );
4153 target = target->next;
4154 }
4155 return JIM_OK;
4156 case TG_CMD_CREATE:
4157 if( goi.argc < 3 ){
4158 Jim_WrongNumArgs( goi.interp, goi.argc, goi.argv, "?name ... config options ...");
4159 return JIM_ERR;
4160 }
4161 return target_create( &goi );
4162 break;
4163 case TG_CMD_NUMBER:
4164 if( goi.argc != 1 ){
4165 Jim_SetResult_sprintf( goi.interp, "expected: target number ?NUMBER?");
4166 return JIM_ERR;
4167 }
4168 e = Jim_GetOpt_Wide( &goi, &w );
4169 if( e != JIM_OK ){
4170 return JIM_ERR;
4171 }
4172 {
4173 target_t *t;
4174 t = get_target_by_num(w);
4175 if( t == NULL ){
4176 Jim_SetResult_sprintf( goi.interp,"Target: number %d does not exist", (int)(w));
4177 return JIM_ERR;
4178 }
4179 Jim_SetResultString( goi.interp, t->cmd_name, -1 );
4180 return JIM_OK;
4181 }
4182 case TG_CMD_COUNT:
4183 if( goi.argc != 0 ){
4184 Jim_WrongNumArgs( goi.interp, 0, goi.argv, "<no parameters>");
4185 return JIM_ERR;
4186 }
4187 Jim_SetResult( goi.interp,
4188 Jim_NewIntObj( goi.interp, max_target_number()));
4189 return JIM_OK;
4190 }
4191
4192 return JIM_ERR;
4193 }
4194
4195
4196 struct FastLoad
4197 {
4198 u32 address;
4199 u8 *data;
4200 int length;
4201
4202 };
4203
4204 static int fastload_num;
4205 static struct FastLoad *fastload;
4206
4207 static void free_fastload(void)
4208 {
4209 if (fastload!=NULL)
4210 {
4211 int i;
4212 for (i=0; i<fastload_num; i++)
4213 {
4214 if (fastload[i].data)
4215 free(fastload[i].data);
4216 }
4217 free(fastload);
4218 fastload=NULL;
4219 }
4220 }
4221
4222
4223
4224
4225 static int handle_fast_load_image_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
4226 {
4227 u8 *buffer;
4228 u32 buf_cnt;
4229 u32 image_size;
4230 u32 min_address=0;
4231 u32 max_address=0xffffffff;
4232 int i;
4233 int retval;
4234
4235 image_t image;
4236
4237 duration_t duration;
4238 char *duration_text;
4239
4240 if ((argc < 1)||(argc > 5))
4241 {
4242 return ERROR_COMMAND_SYNTAX_ERROR;
4243 }
4244
4245 /* a base address isn't always necessary, default to 0x0 (i.e. don't relocate) */
4246 if (argc >= 2)
4247 {
4248 image.base_address_set = 1;
4249 image.base_address = strtoul(args[1], NULL, 0);
4250 }
4251 else
4252 {
4253 image.base_address_set = 0;
4254 }
4255
4256
4257 image.start_address_set = 0;
4258
4259 if (argc>=4)
4260 {
4261 min_address=strtoul(args[3], NULL, 0);
4262 }
4263 if (argc>=5)
4264 {
4265 max_address=strtoul(args[4], NULL, 0)+min_address;
4266 }
4267
4268 if (min_address>max_address)
4269 {
4270 return ERROR_COMMAND_SYNTAX_ERROR;
4271 }
4272
4273 duration_start_measure(&duration);
4274
4275 if (image_open(&image, args[0], (argc >= 3) ? args[2] : NULL) != ERROR_OK)
4276 {
4277 return ERROR_OK;
4278 }
4279
4280 image_size = 0x0;
4281 retval = ERROR_OK;
4282 fastload_num=image.num_sections;
4283 fastload=(struct FastLoad *)malloc(sizeof(struct FastLoad)*image.num_sections);
4284 if (fastload==NULL)
4285 {
4286 image_close(&image);
4287 return ERROR_FAIL;
4288 }
4289 memset(fastload, 0, sizeof(struct FastLoad)*image.num_sections);
4290 for (i = 0; i < image.num_sections; i++)
4291 {
4292 buffer = malloc(image.sections[i].size);
4293 if (buffer == NULL)
4294 {
4295 command_print(cmd_ctx, "error allocating buffer for section (%d bytes)", image.sections[i].size);
4296 break;
4297 }
4298
4299 if ((retval = image_read_section(&image, i, 0x0, image.sections[i].size, buffer, &buf_cnt)) != ERROR_OK)
4300 {
4301 free(buffer);
4302 break;
4303 }
4304
4305 u32 offset=0;
4306 u32 length=buf_cnt;
4307
4308
4309 /* DANGER!!! beware of unsigned comparision here!!! */
4310
4311 if ((image.sections[i].base_address+buf_cnt>=min_address)&&
4312 (image.sections[i].base_address<max_address))
4313 {
4314 if (image.sections[i].base_address<min_address)
4315 {
4316 /* clip addresses below */
4317 offset+=min_address-image.sections[i].base_address;
4318 length-=offset;
4319 }
4320
4321 if (image.sections[i].base_address+buf_cnt>max_address)
4322 {
4323 length-=(image.sections[i].base_address+buf_cnt)-max_address;
4324 }
4325
4326 fastload[i].address=image.sections[i].base_address+offset;
4327 fastload[i].data=malloc(length);
4328 if (fastload[i].data==NULL)
4329 {
4330 free(buffer);
4331 break;
4332 }
4333 memcpy(fastload[i].data, buffer+offset, length);
4334 fastload[i].length=length;
4335
4336 image_size += length;
4337 command_print(cmd_ctx, "%u byte written at address 0x%8.8x", length, image.sections[i].base_address+offset);
4338 }
4339
4340 free(buffer);
4341 }
4342
4343 duration_stop_measure(&duration, &duration_text);
4344 if (retval==ERROR_OK)
4345 {
4346 command_print(cmd_ctx, "Loaded %u bytes in %s", image_size, duration_text);
4347 command_print(cmd_ctx, "NB!!! image has not been loaded to target, issue a subsequent 'fast_load' to do so.");
4348 }
4349 free(duration_text);
4350
4351 image_close(&image);
4352
4353 if (retval!=ERROR_OK)
4354 {
4355 free_fastload();
4356 }
4357
4358 return retval;
4359 }
4360
4361 static int handle_fast_load_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
4362 {
4363 if (argc>0)
4364 return ERROR_COMMAND_SYNTAX_ERROR;
4365 if (fastload==NULL)
4366 {
4367 LOG_ERROR("No image in memory");
4368 return ERROR_FAIL;
4369 }
4370 int i;
4371 int ms=timeval_ms();
4372 int size=0;
4373 int retval=ERROR_OK;
4374 for (i=0; i<fastload_num;i++)
4375 {
4376 target_t *target = get_current_target(cmd_ctx);
4377 command_print(cmd_ctx, "Write to 0x%08x, length 0x%08x", fastload[i].address, fastload[i].length);
4378 if (retval==ERROR_OK)
4379 {
4380 retval = target_write_buffer(target, fastload[i].address, fastload[i].length, fastload[i].data);
4381 }
4382 size+=fastload[i].length;
4383 }
4384 int after=timeval_ms();
4385 command_print(cmd_ctx, "Loaded image %f kBytes/s", (float)(size/1024.0)/((float)(after-ms)/1000.0));
4386 return retval;
4387 }

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)