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

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)