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

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)