1 /***************************************************************************
2 * Copyright (C) 2005 by Dominic Rath *
3 * Dominic.Rath@gmx.de *
5 * Copyright (C) 2007,2008 Øyvind Harboe *
6 * oyvind.harboe@zylin.com *
8 * Copyright (C) 2008, Duane Ellis *
9 * openocd@duaneeellis.com *
11 * Copyright (C) 2008 by Spencer Oliver *
12 * spen@spen-soft.co.uk *
14 * Copyright (C) 2008 by Rick Altherr *
15 * kc8apf@kc8apf.net> *
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. *
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. *
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 ***************************************************************************/
36 #include "replacements.h"
38 #include "target_request.h"
41 #include "configuration.h"
42 #include "binarybuffer.h"
49 #include <sys/types.h>
57 #include <time_support.h>
62 int cli_target_callback_event_handler(struct target_s
*target
, enum target_event event
, void *priv
);
64 int handle_targets_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
66 int handle_reg_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
67 int handle_poll_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
68 int handle_halt_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
69 int handle_wait_halt_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
70 int handle_reset_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
71 int handle_soft_reset_halt_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
72 int handle_resume_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
73 int handle_step_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
74 int handle_md_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
75 int handle_mw_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
76 int handle_load_image_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
77 int handle_dump_image_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
78 int handle_verify_image_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
79 int handle_test_image_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
80 int handle_bp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
81 int handle_rbp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
82 int handle_wp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
83 int handle_rwp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
84 int handle_virt2phys_command(command_context_t
*cmd_ctx
, char *cmd
, char **args
, int argc
);
85 int handle_profile_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
86 int handle_fast_load_image_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
87 int handle_fast_load_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
89 static int jim_array2mem(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *argv
);
90 static int jim_mem2array(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *argv
);
91 static int jim_target( Jim_Interp
*interp
, int argc
, Jim_Obj
*const *argv
);
93 static int target_array2mem(Jim_Interp
*interp
, target_t
*target
, int argc
, Jim_Obj
*const *argv
);
94 static int target_mem2array(Jim_Interp
*interp
, target_t
*target
, int argc
, Jim_Obj
*const *argv
);
97 extern target_type_t arm7tdmi_target
;
98 extern target_type_t arm720t_target
;
99 extern target_type_t arm9tdmi_target
;
100 extern target_type_t arm920t_target
;
101 extern target_type_t arm966e_target
;
102 extern target_type_t arm926ejs_target
;
103 extern target_type_t feroceon_target
;
104 extern target_type_t xscale_target
;
105 extern target_type_t cortexm3_target
;
106 extern target_type_t arm11_target
;
107 extern target_type_t mips_m4k_target
;
109 target_type_t
*target_types
[] =
125 target_t
*all_targets
= NULL
;
126 target_event_callback_t
*target_event_callbacks
= NULL
;
127 target_timer_callback_t
*target_timer_callbacks
= NULL
;
129 const Jim_Nvp nvp_assert
[] = {
130 { .name
= "assert", NVP_ASSERT
},
131 { .name
= "deassert", NVP_DEASSERT
},
132 { .name
= "T", NVP_ASSERT
},
133 { .name
= "F", NVP_DEASSERT
},
134 { .name
= "t", NVP_ASSERT
},
135 { .name
= "f", NVP_DEASSERT
},
136 { .name
= NULL
, .value
= -1 }
139 const Jim_Nvp nvp_error_target
[] = {
140 { .value
= ERROR_TARGET_INVALID
, .name
= "err-invalid" },
141 { .value
= ERROR_TARGET_INIT_FAILED
, .name
= "err-init-failed" },
142 { .value
= ERROR_TARGET_TIMEOUT
, .name
= "err-timeout" },
143 { .value
= ERROR_TARGET_NOT_HALTED
, .name
= "err-not-halted" },
144 { .value
= ERROR_TARGET_FAILURE
, .name
= "err-failure" },
145 { .value
= ERROR_TARGET_UNALIGNED_ACCESS
, .name
= "err-unaligned-access" },
146 { .value
= ERROR_TARGET_DATA_ABORT
, .name
= "err-data-abort" },
147 { .value
= ERROR_TARGET_RESOURCE_NOT_AVAILABLE
, .name
= "err-resource-not-available" },
148 { .value
= ERROR_TARGET_TRANSLATION_FAULT
, .name
= "err-translation-fault" },
149 { .value
= ERROR_TARGET_NOT_RUNNING
, .name
= "err-not-running" },
150 { .value
= ERROR_TARGET_NOT_EXAMINED
, .name
= "err-not-examined" },
151 { .value
= -1, .name
= NULL
}
154 const char *target_strerror_safe( int err
)
158 n
= Jim_Nvp_value2name_simple( nvp_error_target
, err
);
159 if( n
->name
== NULL
){
166 const Jim_Nvp nvp_target_event
[] = {
167 { .value
= TARGET_EVENT_OLD_gdb_program_config
, .name
= "old-gdb_program_config" },
168 { .value
= TARGET_EVENT_OLD_pre_resume
, .name
= "old-pre_resume" },
170 { .value
= TARGET_EVENT_EARLY_HALTED
, .name
= "early-halted" },
171 { .value
= TARGET_EVENT_HALTED
, .name
= "halted" },
172 { .value
= TARGET_EVENT_RESUMED
, .name
= "resumed" },
173 { .value
= TARGET_EVENT_RESUME_START
, .name
= "resume-start" },
174 { .value
= TARGET_EVENT_RESUME_END
, .name
= "resume-end" },
176 { .name
= "gdb-start", .value
= TARGET_EVENT_GDB_START
},
177 { .name
= "gdb-end", .value
= TARGET_EVENT_GDB_END
},
179 /* historical name */
181 { .value
= TARGET_EVENT_RESET_START
, .name
= "reset-start" },
183 { .value
= TARGET_EVENT_RESET_ASSERT_PRE
, .name
= "reset-assert-pre" },
184 { .value
= TARGET_EVENT_RESET_ASSERT_POST
, .name
= "reset-assert-post" },
185 { .value
= TARGET_EVENT_RESET_DEASSERT_PRE
, .name
= "reset-deassert-pre" },
186 { .value
= TARGET_EVENT_RESET_DEASSERT_POST
, .name
= "reset-deassert-post" },
187 { .value
= TARGET_EVENT_RESET_HALT_PRE
, .name
= "reset-halt-pre" },
188 { .value
= TARGET_EVENT_RESET_HALT_POST
, .name
= "reset-halt-post" },
189 { .value
= TARGET_EVENT_RESET_WAIT_PRE
, .name
= "reset-wait-pre" },
190 { .value
= TARGET_EVENT_RESET_WAIT_POST
, .name
= "reset-wait-post" },
191 { .value
= TARGET_EVENT_RESET_INIT
, .name
= "reset-init" },
192 { .value
= TARGET_EVENT_RESET_END
, .name
= "reset-end" },
194 { .value
= TARGET_EVENT_EXAMINE_START
, .name
= "examine-start" },
195 { .value
= TARGET_EVENT_EXAMINE_END
, .name
= "examine-end" },
197 { .value
= TARGET_EVENT_DEBUG_HALTED
, .name
= "debug-halted" },
198 { .value
= TARGET_EVENT_DEBUG_RESUMED
, .name
= "debug-resumed" },
200 { .value
= TARGET_EVENT_GDB_ATTACH
, .name
= "gdb-attach" },
201 { .value
= TARGET_EVENT_GDB_DETACH
, .name
= "gdb-detach" },
203 { .value
= TARGET_EVENT_GDB_FLASH_WRITE_START
, .name
= "gdb-flash-write-start" },
204 { .value
= TARGET_EVENT_GDB_FLASH_WRITE_END
, .name
= "gdb-flash-write-end" },
206 { .value
= TARGET_EVENT_GDB_FLASH_ERASE_START
, .name
= "gdb-flash-erase-start" },
207 { .value
= TARGET_EVENT_GDB_FLASH_ERASE_END
, .name
= "gdb-flash-erase-end" },
209 { .value
= TARGET_EVENT_RESUME_START
, .name
= "resume-start" },
210 { .value
= TARGET_EVENT_RESUMED
, .name
= "resume-ok" },
211 { .value
= TARGET_EVENT_RESUME_END
, .name
= "resume-end" },
213 { .name
= NULL
, .value
= -1 }
216 const Jim_Nvp nvp_target_state
[] = {
217 { .name
= "unknown", .value
= TARGET_UNKNOWN
},
218 { .name
= "running", .value
= TARGET_RUNNING
},
219 { .name
= "halted", .value
= TARGET_HALTED
},
220 { .name
= "reset", .value
= TARGET_RESET
},
221 { .name
= "debug-running", .value
= TARGET_DEBUG_RUNNING
},
222 { .name
= NULL
, .value
= -1 },
225 const Jim_Nvp nvp_target_debug_reason
[] = {
226 { .name
= "debug-request" , .value
= DBG_REASON_DBGRQ
},
227 { .name
= "breakpoint" , .value
= DBG_REASON_BREAKPOINT
},
228 { .name
= "watchpoint" , .value
= DBG_REASON_WATCHPOINT
},
229 { .name
= "watchpoint-and-breakpoint", .value
= DBG_REASON_WPTANDBKPT
},
230 { .name
= "single-step" , .value
= DBG_REASON_SINGLESTEP
},
231 { .name
= "target-not-halted" , .value
= DBG_REASON_NOTHALTED
},
232 { .name
= "undefined" , .value
= DBG_REASON_UNDEFINED
},
233 { .name
= NULL
, .value
= -1 },
236 const Jim_Nvp nvp_target_endian
[] = {
237 { .name
= "big", .value
= TARGET_BIG_ENDIAN
},
238 { .name
= "little", .value
= TARGET_LITTLE_ENDIAN
},
239 { .name
= "be", .value
= TARGET_BIG_ENDIAN
},
240 { .name
= "le", .value
= TARGET_LITTLE_ENDIAN
},
241 { .name
= NULL
, .value
= -1 },
244 const Jim_Nvp nvp_reset_modes
[] = {
245 { .name
= "unknown", .value
= RESET_UNKNOWN
},
246 { .name
= "run" , .value
= RESET_RUN
},
247 { .name
= "halt" , .value
= RESET_HALT
},
248 { .name
= "init" , .value
= RESET_INIT
},
249 { .name
= NULL
, .value
= -1 },
252 static int max_target_number(void)
260 if( x
< t
->target_number
){
261 x
= (t
->target_number
)+1;
268 /* determine the number of the new target */
269 static int new_target_number(void)
274 /* number is 0 based */
278 if( x
< t
->target_number
){
279 x
= t
->target_number
;
286 static int target_continous_poll
= 1;
288 /* read a u32 from a buffer in target memory endianness */
289 u32
target_buffer_get_u32(target_t
*target
, u8
*buffer
)
291 if (target
->endianness
== TARGET_LITTLE_ENDIAN
)
292 return le_to_h_u32(buffer
);
294 return be_to_h_u32(buffer
);
297 /* read a u16 from a buffer in target memory endianness */
298 u16
target_buffer_get_u16(target_t
*target
, u8
*buffer
)
300 if (target
->endianness
== TARGET_LITTLE_ENDIAN
)
301 return le_to_h_u16(buffer
);
303 return be_to_h_u16(buffer
);
306 /* read a u8 from a buffer in target memory endianness */
307 u8
target_buffer_get_u8(target_t
*target
, u8
*buffer
)
309 return *buffer
& 0x0ff;
312 /* write a u32 to a buffer in target memory endianness */
313 void target_buffer_set_u32(target_t
*target
, u8
*buffer
, u32 value
)
315 if (target
->endianness
== TARGET_LITTLE_ENDIAN
)
316 h_u32_to_le(buffer
, value
);
318 h_u32_to_be(buffer
, value
);
321 /* write a u16 to a buffer in target memory endianness */
322 void target_buffer_set_u16(target_t
*target
, u8
*buffer
, u16 value
)
324 if (target
->endianness
== TARGET_LITTLE_ENDIAN
)
325 h_u16_to_le(buffer
, value
);
327 h_u16_to_be(buffer
, value
);
330 /* write a u8 to a buffer in target memory endianness */
331 void target_buffer_set_u8(target_t
*target
, u8
*buffer
, u8 value
)
336 /* returns a pointer to the n-th configured target */
337 target_t
* get_target_by_num(int num
)
339 target_t
*target
= all_targets
;
342 if( target
->target_number
== num
){
345 target
= target
->next
;
351 int get_num_by_target(target_t
*query_target
)
353 return query_target
->target_number
;
356 target_t
* get_current_target(command_context_t
*cmd_ctx
)
358 target_t
*target
= get_target_by_num(cmd_ctx
->current_target
);
362 LOG_ERROR("BUG: current_target out of bounds");
369 int target_poll(struct target_s
*target
)
371 /* We can't poll until after examine */
372 if (!target
->type
->examined
)
374 /* Fail silently lest we pollute the log */
377 return target
->type
->poll(target
);
380 int target_halt(struct target_s
*target
)
382 /* We can't poll until after examine */
383 if (!target
->type
->examined
)
385 LOG_ERROR("Target not examined yet");
388 return target
->type
->halt(target
);
391 int target_resume(struct target_s
*target
, int current
, u32 address
, int handle_breakpoints
, int debug_execution
)
395 /* We can't poll until after examine */
396 if (!target
->type
->examined
)
398 LOG_ERROR("Target not examined yet");
402 /* note that resume *must* be asynchronous. The CPU can halt before we poll. The CPU can
403 * even halt at the current PC as a result of a software breakpoint being inserted by (a bug?)
406 if ((retval
= target
->type
->resume(target
, current
, address
, handle_breakpoints
, debug_execution
)) != ERROR_OK
)
412 int target_process_reset(struct command_context_s
*cmd_ctx
, enum target_reset_mode reset_mode
)
417 n
= Jim_Nvp_value2name_simple( nvp_reset_modes
, reset_mode
);
418 if( n
->name
== NULL
){
419 LOG_ERROR("invalid reset mode");
423 sprintf( buf
, "ocd_process_reset %s", n
->name
);
424 retval
= Jim_Eval( interp
, buf
);
426 if(retval
!= JIM_OK
) {
427 Jim_PrintErrorMessage(interp
);
431 /* We want any events to be processed before the prompt */
432 retval
= target_call_timer_callbacks_now();
437 static int default_virt2phys(struct target_s
*target
, u32
virtual, u32
*physical
)
443 static int default_mmu(struct target_s
*target
, int *enabled
)
449 static int default_examine(struct target_s
*target
)
451 target
->type
->examined
= 1;
455 /* Targets that correctly implement init+examine, i.e.
456 * no communication with target during init:
460 int target_examine(void)
462 int retval
= ERROR_OK
;
463 target_t
*target
= all_targets
;
466 if ((retval
= target
->type
->examine(target
))!=ERROR_OK
)
468 target
= target
->next
;
473 static int target_write_memory_imp(struct target_s
*target
, u32 address
, u32 size
, u32 count
, u8
*buffer
)
475 if (!target
->type
->examined
)
477 LOG_ERROR("Target not examined yet");
480 return target
->type
->write_memory_imp(target
, address
, size
, count
, buffer
);
483 static int target_read_memory_imp(struct target_s
*target
, u32 address
, u32 size
, u32 count
, u8
*buffer
)
485 if (!target
->type
->examined
)
487 LOG_ERROR("Target not examined yet");
490 return target
->type
->read_memory_imp(target
, address
, size
, count
, buffer
);
493 static int target_soft_reset_halt_imp(struct target_s
*target
)
495 if (!target
->type
->examined
)
497 LOG_ERROR("Target not examined yet");
500 return target
->type
->soft_reset_halt_imp(target
);
503 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
)
505 if (!target
->type
->examined
)
507 LOG_ERROR("Target not examined yet");
510 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
);
513 int target_init(struct command_context_s
*cmd_ctx
)
515 target_t
*target
= all_targets
;
520 target
->type
->examined
= 0;
521 if (target
->type
->examine
== NULL
)
523 target
->type
->examine
= default_examine
;
526 if ((retval
= target
->type
->init_target(cmd_ctx
, target
)) != ERROR_OK
)
528 LOG_ERROR("target '%s' init failed", target
->type
->name
);
532 /* Set up default functions if none are provided by target */
533 if (target
->type
->virt2phys
== NULL
)
535 target
->type
->virt2phys
= default_virt2phys
;
537 target
->type
->virt2phys
= default_virt2phys
;
538 /* a non-invasive way(in terms of patches) to add some code that
539 * runs before the type->write/read_memory implementation
541 target
->type
->write_memory_imp
= target
->type
->write_memory
;
542 target
->type
->write_memory
= target_write_memory_imp
;
543 target
->type
->read_memory_imp
= target
->type
->read_memory
;
544 target
->type
->read_memory
= target_read_memory_imp
;
545 target
->type
->soft_reset_halt_imp
= target
->type
->soft_reset_halt
;
546 target
->type
->soft_reset_halt
= target_soft_reset_halt_imp
;
547 target
->type
->run_algorithm_imp
= target
->type
->run_algorithm
;
548 target
->type
->run_algorithm
= target_run_algorithm_imp
;
550 if (target
->type
->mmu
== NULL
)
552 target
->type
->mmu
= default_mmu
;
554 target
= target
->next
;
559 if((retval
= target_register_user_commands(cmd_ctx
)) != ERROR_OK
)
561 if((retval
= target_register_timer_callback(handle_target
, 100, 1, NULL
)) != ERROR_OK
)
568 int target_register_event_callback(int (*callback
)(struct target_s
*target
, enum target_event event
, void *priv
), void *priv
)
570 target_event_callback_t
**callbacks_p
= &target_event_callbacks
;
572 if (callback
== NULL
)
574 return ERROR_INVALID_ARGUMENTS
;
579 while ((*callbacks_p
)->next
)
580 callbacks_p
= &((*callbacks_p
)->next
);
581 callbacks_p
= &((*callbacks_p
)->next
);
584 (*callbacks_p
) = malloc(sizeof(target_event_callback_t
));
585 (*callbacks_p
)->callback
= callback
;
586 (*callbacks_p
)->priv
= priv
;
587 (*callbacks_p
)->next
= NULL
;
592 int target_register_timer_callback(int (*callback
)(void *priv
), int time_ms
, int periodic
, void *priv
)
594 target_timer_callback_t
**callbacks_p
= &target_timer_callbacks
;
597 if (callback
== NULL
)
599 return ERROR_INVALID_ARGUMENTS
;
604 while ((*callbacks_p
)->next
)
605 callbacks_p
= &((*callbacks_p
)->next
);
606 callbacks_p
= &((*callbacks_p
)->next
);
609 (*callbacks_p
) = malloc(sizeof(target_timer_callback_t
));
610 (*callbacks_p
)->callback
= callback
;
611 (*callbacks_p
)->periodic
= periodic
;
612 (*callbacks_p
)->time_ms
= time_ms
;
614 gettimeofday(&now
, NULL
);
615 (*callbacks_p
)->when
.tv_usec
= now
.tv_usec
+ (time_ms
% 1000) * 1000;
616 time_ms
-= (time_ms
% 1000);
617 (*callbacks_p
)->when
.tv_sec
= now
.tv_sec
+ (time_ms
/ 1000);
618 if ((*callbacks_p
)->when
.tv_usec
> 1000000)
620 (*callbacks_p
)->when
.tv_usec
= (*callbacks_p
)->when
.tv_usec
- 1000000;
621 (*callbacks_p
)->when
.tv_sec
+= 1;
624 (*callbacks_p
)->priv
= priv
;
625 (*callbacks_p
)->next
= NULL
;
630 int target_unregister_event_callback(int (*callback
)(struct target_s
*target
, enum target_event event
, void *priv
), void *priv
)
632 target_event_callback_t
**p
= &target_event_callbacks
;
633 target_event_callback_t
*c
= target_event_callbacks
;
635 if (callback
== NULL
)
637 return ERROR_INVALID_ARGUMENTS
;
642 target_event_callback_t
*next
= c
->next
;
643 if ((c
->callback
== callback
) && (c
->priv
== priv
))
657 int target_unregister_timer_callback(int (*callback
)(void *priv
), void *priv
)
659 target_timer_callback_t
**p
= &target_timer_callbacks
;
660 target_timer_callback_t
*c
= target_timer_callbacks
;
662 if (callback
== NULL
)
664 return ERROR_INVALID_ARGUMENTS
;
669 target_timer_callback_t
*next
= c
->next
;
670 if ((c
->callback
== callback
) && (c
->priv
== priv
))
684 int target_call_event_callbacks(target_t
*target
, enum target_event event
)
686 target_event_callback_t
*callback
= target_event_callbacks
;
687 target_event_callback_t
*next_callback
;
689 if (event
== TARGET_EVENT_HALTED
)
691 /* execute early halted first */
692 target_call_event_callbacks(target
, TARGET_EVENT_EARLY_HALTED
);
695 LOG_DEBUG("target event %i (%s)",
697 Jim_Nvp_value2name_simple( nvp_target_event
, event
)->name
);
699 target_handle_event( target
, event
);
703 next_callback
= callback
->next
;
704 callback
->callback(target
, event
, callback
->priv
);
705 callback
= next_callback
;
711 static int target_call_timer_callbacks_check_time(int checktime
)
713 target_timer_callback_t
*callback
= target_timer_callbacks
;
714 target_timer_callback_t
*next_callback
;
719 gettimeofday(&now
, NULL
);
723 next_callback
= callback
->next
;
725 if ((!checktime
&&callback
->periodic
)||
726 (((now
.tv_sec
>= callback
->when
.tv_sec
) && (now
.tv_usec
>= callback
->when
.tv_usec
))
727 || (now
.tv_sec
> callback
->when
.tv_sec
)))
729 if(callback
->callback
!= NULL
)
731 callback
->callback(callback
->priv
);
732 if (callback
->periodic
)
734 int time_ms
= callback
->time_ms
;
735 callback
->when
.tv_usec
= now
.tv_usec
+ (time_ms
% 1000) * 1000;
736 time_ms
-= (time_ms
% 1000);
737 callback
->when
.tv_sec
= now
.tv_sec
+ time_ms
/ 1000;
738 if (callback
->when
.tv_usec
> 1000000)
740 callback
->when
.tv_usec
= callback
->when
.tv_usec
- 1000000;
741 callback
->when
.tv_sec
+= 1;
747 if((retval
= target_unregister_timer_callback(callback
->callback
, callback
->priv
)) != ERROR_OK
)
753 callback
= next_callback
;
759 int target_call_timer_callbacks(void)
761 return target_call_timer_callbacks_check_time(1);
764 /* invoke periodic callbacks immediately */
765 int target_call_timer_callbacks_now(void)
767 return target_call_timer_callbacks_check_time(0);
770 int target_alloc_working_area(struct target_s
*target
, u32 size
, working_area_t
**area
)
772 working_area_t
*c
= target
->working_areas
;
773 working_area_t
*new_wa
= NULL
;
775 /* Reevaluate working area address based on MMU state*/
776 if (target
->working_areas
== NULL
)
780 retval
= target
->type
->mmu(target
, &enabled
);
781 if (retval
!= ERROR_OK
)
787 target
->working_area
= target
->working_area_virt
;
791 target
->working_area
= target
->working_area_phys
;
795 /* only allocate multiples of 4 byte */
798 LOG_ERROR("BUG: code tried to allocate unaligned number of bytes, padding");
799 size
= CEIL(size
, 4);
802 /* see if there's already a matching working area */
805 if ((c
->free
) && (c
->size
== size
))
813 /* if not, allocate a new one */
816 working_area_t
**p
= &target
->working_areas
;
817 u32 first_free
= target
->working_area
;
818 u32 free_size
= target
->working_area_size
;
820 LOG_DEBUG("allocating new working area");
822 c
= target
->working_areas
;
825 first_free
+= c
->size
;
826 free_size
-= c
->size
;
831 if (free_size
< size
)
833 LOG_WARNING("not enough working area available(requested %d, free %d)", size
, free_size
);
834 return ERROR_TARGET_RESOURCE_NOT_AVAILABLE
;
837 new_wa
= malloc(sizeof(working_area_t
));
840 new_wa
->address
= first_free
;
842 if (target
->backup_working_area
)
845 new_wa
->backup
= malloc(new_wa
->size
);
846 if((retval
= target
->type
->read_memory(target
, new_wa
->address
, 4, new_wa
->size
/ 4, new_wa
->backup
)) != ERROR_OK
)
848 free(new_wa
->backup
);
855 new_wa
->backup
= NULL
;
858 /* put new entry in list */
862 /* mark as used, and return the new (reused) area */
872 int target_free_working_area_restore(struct target_s
*target
, working_area_t
*area
, int restore
)
877 if (restore
&&target
->backup_working_area
)
880 if((retval
= target
->type
->write_memory(target
, area
->address
, 4, area
->size
/ 4, area
->backup
)) != ERROR_OK
)
886 /* mark user pointer invalid */
893 int target_free_working_area(struct target_s
*target
, working_area_t
*area
)
895 return target_free_working_area_restore(target
, area
, 1);
898 /* free resources and restore memory, if restoring memory fails,
899 * free up resources anyway
901 void target_free_all_working_areas_restore(struct target_s
*target
, int restore
)
903 working_area_t
*c
= target
->working_areas
;
907 working_area_t
*next
= c
->next
;
908 target_free_working_area_restore(target
, c
, restore
);
918 target
->working_areas
= NULL
;
921 void target_free_all_working_areas(struct target_s
*target
)
923 target_free_all_working_areas_restore(target
, 1);
926 int target_register_commands(struct command_context_s
*cmd_ctx
)
929 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)");
930 register_command(cmd_ctx
, NULL
, "virt2phys", handle_virt2phys_command
, COMMAND_ANY
, "translate a virtual address into a physical address");
931 register_command(cmd_ctx
, NULL
, "profile", handle_profile_command
, COMMAND_EXEC
, "profiling samples the CPU PC");
933 register_command(cmd_ctx
, NULL
, "fast_load_image", handle_fast_load_image_command
, COMMAND_ANY
,
934 "same args as load_image, image stored in memory - mainly for profiling purposes");
936 register_command(cmd_ctx
, NULL
, "fast_load", handle_fast_load_command
, COMMAND_ANY
,
937 "loads active fast load image to current target - mainly for profiling purposes");
941 register_jim(cmd_ctx
, "target", jim_target
, "configure target" );
944 /* script procedures */
945 register_jim(cmd_ctx
, "ocd_mem2array", jim_mem2array
, "read memory and return as a TCL array for script processing");
946 register_jim(cmd_ctx
, "ocd_array2mem", jim_array2mem
, "convert a TCL array to memory locations and write the values");
950 int target_arch_state(struct target_s
*target
)
955 LOG_USER("No target has been configured");
959 LOG_USER("target state: %s",
960 Jim_Nvp_value2name_simple(nvp_target_state
,target
->state
)->name
);
962 if (target
->state
!=TARGET_HALTED
)
965 retval
=target
->type
->arch_state(target
);
969 /* Single aligned words are guaranteed to use 16 or 32 bit access
970 * mode respectively, otherwise data is handled as quickly as
973 int target_write_buffer(struct target_s
*target
, u32 address
, u32 size
, u8
*buffer
)
976 LOG_DEBUG("writing buffer of %i byte at 0x%8.8x", size
, address
);
978 if (!target
->type
->examined
)
980 LOG_ERROR("Target not examined yet");
984 if ((address
+ size
- 1) < address
)
986 /* GDB can request this when e.g. PC is 0xfffffffc*/
987 LOG_ERROR("address+size wrapped(0x%08x, 0x%08x)", address
, size
);
991 if (((address
% 2) == 0) && (size
== 2))
993 return target
->type
->write_memory(target
, address
, 2, 1, buffer
);
996 /* handle unaligned head bytes */
999 int unaligned
= 4 - (address
% 4);
1001 if (unaligned
> size
)
1004 if ((retval
= target
->type
->write_memory(target
, address
, 1, unaligned
, buffer
)) != ERROR_OK
)
1007 buffer
+= unaligned
;
1008 address
+= unaligned
;
1012 /* handle aligned words */
1015 int aligned
= size
- (size
% 4);
1017 /* use bulk writes above a certain limit. This may have to be changed */
1020 if ((retval
= target
->type
->bulk_write_memory(target
, address
, aligned
/ 4, buffer
)) != ERROR_OK
)
1025 if ((retval
= target
->type
->write_memory(target
, address
, 4, aligned
/ 4, buffer
)) != ERROR_OK
)
1034 /* handle tail writes of less than 4 bytes */
1037 if ((retval
= target
->type
->write_memory(target
, address
, 1, size
, buffer
)) != ERROR_OK
)
1044 /* Single aligned words are guaranteed to use 16 or 32 bit access
1045 * mode respectively, otherwise data is handled as quickly as
1048 int target_read_buffer(struct target_s
*target
, u32 address
, u32 size
, u8
*buffer
)
1051 LOG_DEBUG("reading buffer of %i byte at 0x%8.8x", size
, address
);
1053 if (!target
->type
->examined
)
1055 LOG_ERROR("Target not examined yet");
1059 if ((address
+ size
- 1) < address
)
1061 /* GDB can request this when e.g. PC is 0xfffffffc*/
1062 LOG_ERROR("address+size wrapped(0x%08x, 0x%08x)", address
, size
);
1066 if (((address
% 2) == 0) && (size
== 2))
1068 return target
->type
->read_memory(target
, address
, 2, 1, buffer
);
1071 /* handle unaligned head bytes */
1074 int unaligned
= 4 - (address
% 4);
1076 if (unaligned
> size
)
1079 if ((retval
= target
->type
->read_memory(target
, address
, 1, unaligned
, buffer
)) != ERROR_OK
)
1082 buffer
+= unaligned
;
1083 address
+= unaligned
;
1087 /* handle aligned words */
1090 int aligned
= size
- (size
% 4);
1092 if ((retval
= target
->type
->read_memory(target
, address
, 4, aligned
/ 4, buffer
)) != ERROR_OK
)
1100 /* handle tail writes of less than 4 bytes */
1103 if ((retval
= target
->type
->read_memory(target
, address
, 1, size
, buffer
)) != ERROR_OK
)
1110 int target_checksum_memory(struct target_s
*target
, u32 address
, u32 size
, u32
* crc
)
1116 if (!target
->type
->examined
)
1118 LOG_ERROR("Target not examined yet");
1122 if ((retval
= target
->type
->checksum_memory(target
, address
,
1123 size
, &checksum
)) != ERROR_OK
)
1125 buffer
= malloc(size
);
1128 LOG_ERROR("error allocating buffer for section (%d bytes)", size
);
1129 return ERROR_INVALID_ARGUMENTS
;
1131 retval
= target_read_buffer(target
, address
, size
, buffer
);
1132 if (retval
!= ERROR_OK
)
1138 /* convert to target endianess */
1139 for (i
= 0; i
< (size
/sizeof(u32
)); i
++)
1142 target_data
= target_buffer_get_u32(target
, &buffer
[i
*sizeof(u32
)]);
1143 target_buffer_set_u32(target
, &buffer
[i
*sizeof(u32
)], target_data
);
1146 retval
= image_calculate_checksum( buffer
, size
, &checksum
);
1155 int target_blank_check_memory(struct target_s
*target
, u32 address
, u32 size
, u32
* blank
)
1158 if (!target
->type
->examined
)
1160 LOG_ERROR("Target not examined yet");
1164 if (target
->type
->blank_check_memory
== 0)
1165 return ERROR_TARGET_RESOURCE_NOT_AVAILABLE
;
1167 retval
= target
->type
->blank_check_memory(target
, address
, size
, blank
);
1172 int target_read_u32(struct target_s
*target
, u32 address
, u32
*value
)
1175 if (!target
->type
->examined
)
1177 LOG_ERROR("Target not examined yet");
1181 int retval
= target
->type
->read_memory(target
, address
, 4, 1, value_buf
);
1183 if (retval
== ERROR_OK
)
1185 *value
= target_buffer_get_u32(target
, value_buf
);
1186 LOG_DEBUG("address: 0x%8.8x, value: 0x%8.8x", address
, *value
);
1191 LOG_DEBUG("address: 0x%8.8x failed", address
);
1197 int target_read_u16(struct target_s
*target
, u32 address
, u16
*value
)
1200 if (!target
->type
->examined
)
1202 LOG_ERROR("Target not examined yet");
1206 int retval
= target
->type
->read_memory(target
, address
, 2, 1, value_buf
);
1208 if (retval
== ERROR_OK
)
1210 *value
= target_buffer_get_u16(target
, value_buf
);
1211 LOG_DEBUG("address: 0x%8.8x, value: 0x%4.4x", address
, *value
);
1216 LOG_DEBUG("address: 0x%8.8x failed", address
);
1222 int target_read_u8(struct target_s
*target
, u32 address
, u8
*value
)
1224 int retval
= target
->type
->read_memory(target
, address
, 1, 1, value
);
1225 if (!target
->type
->examined
)
1227 LOG_ERROR("Target not examined yet");
1231 if (retval
== ERROR_OK
)
1233 LOG_DEBUG("address: 0x%8.8x, value: 0x%2.2x", address
, *value
);
1238 LOG_DEBUG("address: 0x%8.8x failed", address
);
1244 int target_write_u32(struct target_s
*target
, u32 address
, u32 value
)
1248 if (!target
->type
->examined
)
1250 LOG_ERROR("Target not examined yet");
1254 LOG_DEBUG("address: 0x%8.8x, value: 0x%8.8x", address
, value
);
1256 target_buffer_set_u32(target
, value_buf
, value
);
1257 if ((retval
= target
->type
->write_memory(target
, address
, 4, 1, value_buf
)) != ERROR_OK
)
1259 LOG_DEBUG("failed: %i", retval
);
1265 int target_write_u16(struct target_s
*target
, u32 address
, u16 value
)
1269 if (!target
->type
->examined
)
1271 LOG_ERROR("Target not examined yet");
1275 LOG_DEBUG("address: 0x%8.8x, value: 0x%8.8x", address
, value
);
1277 target_buffer_set_u16(target
, value_buf
, value
);
1278 if ((retval
= target
->type
->write_memory(target
, address
, 2, 1, value_buf
)) != ERROR_OK
)
1280 LOG_DEBUG("failed: %i", retval
);
1286 int target_write_u8(struct target_s
*target
, u32 address
, u8 value
)
1289 if (!target
->type
->examined
)
1291 LOG_ERROR("Target not examined yet");
1295 LOG_DEBUG("address: 0x%8.8x, value: 0x%2.2x", address
, value
);
1297 if ((retval
= target
->type
->write_memory(target
, address
, 1, 1, &value
)) != ERROR_OK
)
1299 LOG_DEBUG("failed: %i", retval
);
1305 int target_register_user_commands(struct command_context_s
*cmd_ctx
)
1307 int retval
= ERROR_OK
;
1308 register_command(cmd_ctx
, NULL
, "reg", handle_reg_command
, COMMAND_EXEC
, "display or set a register");
1309 register_command(cmd_ctx
, NULL
, "poll", handle_poll_command
, COMMAND_EXEC
, "poll target state");
1310 register_command(cmd_ctx
, NULL
, "wait_halt", handle_wait_halt_command
, COMMAND_EXEC
, "wait for target halt [time (s)]");
1311 register_command(cmd_ctx
, NULL
, "halt", handle_halt_command
, COMMAND_EXEC
, "halt target");
1312 register_command(cmd_ctx
, NULL
, "resume", handle_resume_command
, COMMAND_EXEC
, "resume target [addr]");
1313 register_command(cmd_ctx
, NULL
, "step", handle_step_command
, COMMAND_EXEC
, "step one instruction from current PC or [addr]");
1314 register_command(cmd_ctx
, NULL
, "reset", handle_reset_command
, COMMAND_EXEC
, "reset target [run|halt|init] - default is run");
1315 register_command(cmd_ctx
, NULL
, "soft_reset_halt", handle_soft_reset_halt_command
, COMMAND_EXEC
, "halt the target and do a soft reset");
1317 register_command(cmd_ctx
, NULL
, "mdw", handle_md_command
, COMMAND_EXEC
, "display memory words <addr> [count]");
1318 register_command(cmd_ctx
, NULL
, "mdh", handle_md_command
, COMMAND_EXEC
, "display memory half-words <addr> [count]");
1319 register_command(cmd_ctx
, NULL
, "mdb", handle_md_command
, COMMAND_EXEC
, "display memory bytes <addr> [count]");
1321 register_command(cmd_ctx
, NULL
, "mww", handle_mw_command
, COMMAND_EXEC
, "write memory word <addr> <value> [count]");
1322 register_command(cmd_ctx
, NULL
, "mwh", handle_mw_command
, COMMAND_EXEC
, "write memory half-word <addr> <value> [count]");
1323 register_command(cmd_ctx
, NULL
, "mwb", handle_mw_command
, COMMAND_EXEC
, "write memory byte <addr> <value> [count]");
1325 register_command(cmd_ctx
, NULL
, "bp", handle_bp_command
, COMMAND_EXEC
, "set breakpoint <address> <length> [hw]");
1326 register_command(cmd_ctx
, NULL
, "rbp", handle_rbp_command
, COMMAND_EXEC
, "remove breakpoint <adress>");
1327 register_command(cmd_ctx
, NULL
, "wp", handle_wp_command
, COMMAND_EXEC
, "set watchpoint <address> <length> <r/w/a> [value] [mask]");
1328 register_command(cmd_ctx
, NULL
, "rwp", handle_rwp_command
, COMMAND_EXEC
, "remove watchpoint <adress>");
1330 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]");
1331 register_command(cmd_ctx
, NULL
, "dump_image", handle_dump_image_command
, COMMAND_EXEC
, "dump_image <file> <address> <size>");
1332 register_command(cmd_ctx
, NULL
, "verify_image", handle_verify_image_command
, COMMAND_EXEC
, "verify_image <file> [offset] [type]");
1333 register_command(cmd_ctx
, NULL
, "test_image", handle_test_image_command
, COMMAND_EXEC
, "test_image <file> [offset] [type]");
1335 if((retval
= target_request_register_commands(cmd_ctx
)) != ERROR_OK
)
1337 if((retval
= trace_register_commands(cmd_ctx
)) != ERROR_OK
)
1343 int handle_targets_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1346 target_t
*target
= all_targets
;
1350 /* try as tcltarget name */
1351 for( target
= all_targets
; target
; target
= target
->next
){
1352 if( target
->cmd_name
){
1353 if( 0 == strcmp( args
[0], target
->cmd_name
) ){
1359 /* no match, try as number */
1361 int num
= strtoul(args
[0], &cp
, 0 );
1363 /* then it was not a number */
1364 command_print( cmd_ctx
, "Target: %s unknown, try one of:\n", args
[0] );
1368 target
= get_target_by_num( num
);
1369 if( target
== NULL
){
1370 command_print(cmd_ctx
,"Target: %s is unknown, try one of:\n", args
[0] );
1374 cmd_ctx
->current_target
= target
->target_number
;
1379 target
= all_targets
;
1380 command_print(cmd_ctx
, " CmdName Type Endian AbsChainPos Name State ");
1381 command_print(cmd_ctx
, "-- ---------- ---------- ---------- ----------- ------------- ----------");
1384 /* XX: abcdefghij abcdefghij abcdefghij abcdefghij */
1385 command_print(cmd_ctx
, "%2d: %-10s %-10s %-10s %10d %14s %s",
1386 target
->target_number
,
1389 Jim_Nvp_value2name_simple( nvp_target_endian
, target
->endianness
)->name
,
1390 target
->tap
->abs_chain_position
,
1391 target
->tap
->dotted_name
,
1392 Jim_Nvp_value2name_simple( nvp_target_state
, target
->state
)->name
);
1393 target
= target
->next
;
1399 /* every 300ms we check for reset & powerdropout and issue a "reset halt" if so. */
1401 static int powerDropout
;
1402 static int srstAsserted
;
1404 static int runPowerRestore
;
1405 static int runPowerDropout
;
1406 static int runSrstAsserted
;
1407 static int runSrstDeasserted
;
1409 static int sense_handler(void)
1411 static int prevSrstAsserted
= 0;
1412 static int prevPowerdropout
= 0;
1415 if ((retval
=jtag_power_dropout(&powerDropout
))!=ERROR_OK
)
1419 powerRestored
= prevPowerdropout
&& !powerDropout
;
1422 runPowerRestore
= 1;
1425 long long current
= timeval_ms();
1426 static long long lastPower
= 0;
1427 int waitMore
= lastPower
+ 2000 > current
;
1428 if (powerDropout
&& !waitMore
)
1430 runPowerDropout
= 1;
1431 lastPower
= current
;
1434 if ((retval
=jtag_srst_asserted(&srstAsserted
))!=ERROR_OK
)
1438 srstDeasserted
= prevSrstAsserted
&& !srstAsserted
;
1440 static long long lastSrst
= 0;
1441 waitMore
= lastSrst
+ 2000 > current
;
1442 if (srstDeasserted
&& !waitMore
)
1444 runSrstDeasserted
= 1;
1448 if (!prevSrstAsserted
&& srstAsserted
)
1450 runSrstAsserted
= 1;
1453 prevSrstAsserted
= srstAsserted
;
1454 prevPowerdropout
= powerDropout
;
1456 if (srstDeasserted
|| powerRestored
)
1458 /* Other than logging the event we can't do anything here.
1459 * Issuing a reset is a particularly bad idea as we might
1460 * be inside a reset already.
1467 /* process target state changes */
1468 int handle_target(void *priv
)
1470 int retval
= ERROR_OK
;
1472 /* we do not want to recurse here... */
1473 static int recursive
= 0;
1478 /* danger! running these procedures can trigger srst assertions and power dropouts.
1479 * We need to avoid an infinite loop/recursion here and we do that by
1480 * clearing the flags after running these events.
1482 int did_something
= 0;
1483 if (runSrstAsserted
)
1485 Jim_Eval( interp
, "srst_asserted");
1488 if (runSrstDeasserted
)
1490 Jim_Eval( interp
, "srst_deasserted");
1493 if (runPowerDropout
)
1495 Jim_Eval( interp
, "power_dropout");
1498 if (runPowerRestore
)
1500 Jim_Eval( interp
, "power_restore");
1506 /* clear detect flags */
1510 /* clear action flags */
1513 runSrstDeasserted
=0;
1520 target_t
*target
= all_targets
;
1525 /* only poll target if we've got power and srst isn't asserted */
1526 if (target_continous_poll
&&!powerDropout
&&!srstAsserted
)
1528 /* polling may fail silently until the target has been examined */
1529 if((retval
= target_poll(target
)) != ERROR_OK
)
1533 target
= target
->next
;
1539 int handle_reg_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1548 target
= get_current_target(cmd_ctx
);
1550 /* list all available registers for the current target */
1553 reg_cache_t
*cache
= target
->reg_cache
;
1559 for (i
= 0; i
< cache
->num_regs
; i
++)
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
);
1565 cache
= cache
->next
;
1571 /* access a single register by its ordinal number */
1572 if ((args
[0][0] >= '0') && (args
[0][0] <= '9'))
1574 int num
= strtoul(args
[0], NULL
, 0);
1575 reg_cache_t
*cache
= target
->reg_cache
;
1581 for (i
= 0; i
< cache
->num_regs
; i
++)
1585 reg
= &cache
->reg_list
[i
];
1591 cache
= cache
->next
;
1596 command_print(cmd_ctx
, "%i is out of bounds, the current target has only %i registers (0 - %i)", num
, count
, count
- 1);
1599 } else /* access a single register by its name */
1601 reg
= register_get_by_name(target
->reg_cache
, args
[0], 1);
1605 command_print(cmd_ctx
, "register %s not found in current target", args
[0]);
1610 /* display a register */
1611 if ((argc
== 1) || ((argc
== 2) && !((args
[1][0] >= '0') && (args
[1][0] <= '9'))))
1613 if ((argc
== 2) && (strcmp(args
[1], "force") == 0))
1616 if (reg
->valid
== 0)
1618 reg_arch_type_t
*arch_type
= register_get_arch_type(reg
->arch_type
);
1619 arch_type
->get(reg
);
1621 value
= buf_to_str(reg
->value
, reg
->size
, 16);
1622 command_print(cmd_ctx
, "%s (/%i): 0x%s", reg
->name
, reg
->size
, value
);
1627 /* set register value */
1630 u8
*buf
= malloc(CEIL(reg
->size
, 8));
1631 str_to_buf(args
[1], strlen(args
[1]), buf
, reg
->size
, 0);
1633 reg_arch_type_t
*arch_type
= register_get_arch_type(reg
->arch_type
);
1634 arch_type
->set(reg
, buf
);
1636 value
= buf_to_str(reg
->value
, reg
->size
, 16);
1637 command_print(cmd_ctx
, "%s (/%i): 0x%s", reg
->name
, reg
->size
, value
);
1645 command_print(cmd_ctx
, "usage: reg <#|name> [value]");
1650 int handle_poll_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1652 int retval
= ERROR_OK
;
1653 target_t
*target
= get_current_target(cmd_ctx
);
1657 if((retval
= target_poll(target
)) != ERROR_OK
)
1659 if((retval
= target_arch_state(target
)) != ERROR_OK
)
1665 if (strcmp(args
[0], "on") == 0)
1667 target_continous_poll
= 1;
1669 else if (strcmp(args
[0], "off") == 0)
1671 target_continous_poll
= 0;
1675 command_print(cmd_ctx
, "arg is \"on\" or \"off\"");
1679 return ERROR_COMMAND_SYNTAX_ERROR
;
1685 int handle_wait_halt_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1693 ms
= strtoul(args
[0], &end
, 0) * 1000;
1696 command_print(cmd_ctx
, "usage: %s [seconds]", cmd
);
1700 target_t
*target
= get_current_target(cmd_ctx
);
1702 return target_wait_state(target
, TARGET_HALTED
, ms
);
1705 /* wait for target state to change. The trick here is to have a low
1706 * latency for short waits and not to suck up all the CPU time
1709 * After 500ms, keep_alive() is invoked
1711 int target_wait_state(target_t
*target
, enum target_state state
, int ms
)
1714 long long then
=0, cur
;
1719 if ((retval
=target_poll(target
))!=ERROR_OK
)
1721 if (target
->state
== state
)
1729 then
= timeval_ms();
1730 LOG_DEBUG("waiting for target %s...",
1731 Jim_Nvp_value2name_simple(nvp_target_state
,state
)->name
);
1741 LOG_ERROR("timed out while waiting for target %s",
1742 Jim_Nvp_value2name_simple(nvp_target_state
,state
)->name
);
1750 int handle_halt_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1753 target_t
*target
= get_current_target(cmd_ctx
);
1757 if ((retval
= target_halt(target
)) != ERROR_OK
)
1767 wait
= strtoul(args
[0], &end
, 0);
1772 return handle_wait_halt_command(cmd_ctx
, cmd
, args
, argc
);
1775 int handle_soft_reset_halt_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1777 target_t
*target
= get_current_target(cmd_ctx
);
1779 LOG_USER("requesting target halt and executing a soft reset");
1781 target
->type
->soft_reset_halt(target
);
1786 int handle_reset_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1789 enum target_reset_mode reset_mode
= RESET_RUN
;
1793 n
= Jim_Nvp_name2value_simple( nvp_reset_modes
, args
[0] );
1794 if( (n
->name
== NULL
) || (n
->value
== RESET_UNKNOWN
) ){
1795 return ERROR_COMMAND_SYNTAX_ERROR
;
1797 reset_mode
= n
->value
;
1800 /* reset *all* targets */
1801 return target_process_reset(cmd_ctx
, reset_mode
);
1805 int handle_resume_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1808 target_t
*target
= get_current_target(cmd_ctx
);
1810 target_handle_event( target
, TARGET_EVENT_OLD_pre_resume
);
1813 retval
= target_resume(target
, 1, 0, 1, 0); /* current pc, addr = 0, handle breakpoints, not debugging */
1815 retval
= target_resume(target
, 0, strtoul(args
[0], NULL
, 0), 1, 0); /* addr = args[0], handle breakpoints, not debugging */
1818 retval
= ERROR_COMMAND_SYNTAX_ERROR
;
1824 int handle_step_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1826 target_t
*target
= get_current_target(cmd_ctx
);
1831 return target
->type
->step(target
, 1, 0, 1); /* current pc, addr = 0, handle breakpoints */
1834 return target
->type
->step(target
, 0, strtoul(args
[0], NULL
, 0), 1); /* addr = args[0], handle breakpoints */
1839 int handle_md_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1841 const int line_bytecnt
= 32;
1854 target_t
*target
= get_current_target(cmd_ctx
);
1860 count
= strtoul(args
[1], NULL
, 0);
1862 address
= strtoul(args
[0], NULL
, 0);
1867 size
= 4; line_modulo
= line_bytecnt
/ 4;
1870 size
= 2; line_modulo
= line_bytecnt
/ 2;
1873 size
= 1; line_modulo
= line_bytecnt
/ 1;
1879 buffer
= calloc(count
, size
);
1880 retval
= target
->type
->read_memory(target
, address
, size
, count
, buffer
);
1881 if (retval
== ERROR_OK
)
1885 for (i
= 0; i
< count
; i
++)
1887 if (i
%line_modulo
== 0)
1888 output_len
+= snprintf(output
+ output_len
, 128 - output_len
, "0x%8.8x: ", address
+ (i
*size
));
1893 output_len
+= snprintf(output
+ output_len
, 128 - output_len
, "%8.8x ", target_buffer_get_u32(target
, &buffer
[i
*4]));
1896 output_len
+= snprintf(output
+ output_len
, 128 - output_len
, "%4.4x ", target_buffer_get_u16(target
, &buffer
[i
*2]));
1899 output_len
+= snprintf(output
+ output_len
, 128 - output_len
, "%2.2x ", buffer
[i
*1]);
1903 if ((i
%line_modulo
== line_modulo
-1) || (i
== count
- 1))
1905 command_print(cmd_ctx
, output
);
1916 int handle_mw_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1923 target_t
*target
= get_current_target(cmd_ctx
);
1926 if ((argc
< 2) || (argc
> 3))
1927 return ERROR_COMMAND_SYNTAX_ERROR
;
1929 address
= strtoul(args
[0], NULL
, 0);
1930 value
= strtoul(args
[1], NULL
, 0);
1932 count
= strtoul(args
[2], NULL
, 0);
1938 target_buffer_set_u32(target
, value_buf
, value
);
1942 target_buffer_set_u16(target
, value_buf
, value
);
1946 value_buf
[0] = value
;
1949 return ERROR_COMMAND_SYNTAX_ERROR
;
1951 for (i
=0; i
<count
; i
++)
1957 retval
= target
->type
->write_memory(target
, address
+ i
*wordsize
, 4, 1, value_buf
);
1960 retval
= target
->type
->write_memory(target
, address
+ i
*wordsize
, 2, 1, value_buf
);
1963 retval
= target
->type
->write_memory(target
, address
+ i
*wordsize
, 1, 1, value_buf
);
1970 if (retval
!=ERROR_OK
)
1980 int handle_load_image_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1986 u32 max_address
=0xffffffff;
1988 int retval
, retvaltemp
;
1992 duration_t duration
;
1993 char *duration_text
;
1995 target_t
*target
= get_current_target(cmd_ctx
);
1997 if ((argc
< 1)||(argc
> 5))
1999 return ERROR_COMMAND_SYNTAX_ERROR
;
2002 /* a base address isn't always necessary, default to 0x0 (i.e. don't relocate) */
2005 image
.base_address_set
= 1;
2006 image
.base_address
= strtoul(args
[1], NULL
, 0);
2010 image
.base_address_set
= 0;
2014 image
.start_address_set
= 0;
2018 min_address
=strtoul(args
[3], NULL
, 0);
2022 max_address
=strtoul(args
[4], NULL
, 0)+min_address
;
2025 if (min_address
>max_address
)
2027 return ERROR_COMMAND_SYNTAX_ERROR
;
2030 duration_start_measure(&duration
);
2032 if (image_open(&image
, args
[0], (argc
>= 3) ? args
[2] : NULL
) != ERROR_OK
)
2039 for (i
= 0; i
< image
.num_sections
; i
++)
2041 buffer
= malloc(image
.sections
[i
].size
);
2044 command_print(cmd_ctx
, "error allocating buffer for section (%d bytes)", image
.sections
[i
].size
);
2048 if ((retval
= image_read_section(&image
, i
, 0x0, image
.sections
[i
].size
, buffer
, &buf_cnt
)) != ERROR_OK
)
2057 /* DANGER!!! beware of unsigned comparision here!!! */
2059 if ((image
.sections
[i
].base_address
+buf_cnt
>=min_address
)&&
2060 (image
.sections
[i
].base_address
<max_address
))
2062 if (image
.sections
[i
].base_address
<min_address
)
2064 /* clip addresses below */
2065 offset
+=min_address
-image
.sections
[i
].base_address
;
2069 if (image
.sections
[i
].base_address
+buf_cnt
>max_address
)
2071 length
-=(image
.sections
[i
].base_address
+buf_cnt
)-max_address
;
2074 if ((retval
= target_write_buffer(target
, image
.sections
[i
].base_address
+offset
, length
, buffer
+offset
)) != ERROR_OK
)
2079 image_size
+= length
;
2080 command_print(cmd_ctx
, "%u byte written at address 0x%8.8x", length
, image
.sections
[i
].base_address
+offset
);
2086 if((retvaltemp
= duration_stop_measure(&duration
, &duration_text
)) != ERROR_OK
)
2088 image_close(&image
);
2092 if (retval
==ERROR_OK
)
2094 command_print(cmd_ctx
, "downloaded %u byte in %s", image_size
, duration_text
);
2096 free(duration_text
);
2098 image_close(&image
);
2104 int handle_dump_image_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2111 int retval
=ERROR_OK
, retvaltemp
;
2113 duration_t duration
;
2114 char *duration_text
;
2116 target_t
*target
= get_current_target(cmd_ctx
);
2120 command_print(cmd_ctx
, "usage: dump_image <filename> <address> <size>");
2124 address
= strtoul(args
[1], NULL
, 0);
2125 size
= strtoul(args
[2], NULL
, 0);
2127 if ((address
& 3) || (size
& 3))
2129 command_print(cmd_ctx
, "only 32-bit aligned address and size are supported");
2133 if (fileio_open(&fileio
, args
[0], FILEIO_WRITE
, FILEIO_BINARY
) != ERROR_OK
)
2138 duration_start_measure(&duration
);
2143 u32 this_run_size
= (size
> 560) ? 560 : size
;
2145 retval
= target
->type
->read_memory(target
, address
, 4, this_run_size
/ 4, buffer
);
2146 if (retval
!= ERROR_OK
)
2151 retval
= fileio_write(&fileio
, this_run_size
, buffer
, &size_written
);
2152 if (retval
!= ERROR_OK
)
2157 size
-= this_run_size
;
2158 address
+= this_run_size
;
2161 if((retvaltemp
= fileio_close(&fileio
)) != ERROR_OK
)
2164 if((retvaltemp
= duration_stop_measure(&duration
, &duration_text
)) != ERROR_OK
)
2167 if (retval
==ERROR_OK
)
2169 command_print(cmd_ctx
, "dumped %"PRIi64
" byte in %s", fileio
.size
, duration_text
);
2171 free(duration_text
);
2176 int handle_verify_image_command_internal(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
, int verify
)
2182 int retval
, retvaltemp
;
2184 u32 mem_checksum
= 0;
2188 duration_t duration
;
2189 char *duration_text
;
2191 target_t
*target
= get_current_target(cmd_ctx
);
2195 return ERROR_COMMAND_SYNTAX_ERROR
;
2200 LOG_ERROR("no target selected");
2204 duration_start_measure(&duration
);
2208 image
.base_address_set
= 1;
2209 image
.base_address
= strtoul(args
[1], NULL
, 0);
2213 image
.base_address_set
= 0;
2214 image
.base_address
= 0x0;
2217 image
.start_address_set
= 0;
2219 if ((retval
=image_open(&image
, args
[0], (argc
== 3) ? args
[2] : NULL
)) != ERROR_OK
)
2226 for (i
= 0; i
< image
.num_sections
; i
++)
2228 buffer
= malloc(image
.sections
[i
].size
);
2231 command_print(cmd_ctx
, "error allocating buffer for section (%d bytes)", image
.sections
[i
].size
);
2234 if ((retval
= image_read_section(&image
, i
, 0x0, image
.sections
[i
].size
, buffer
, &buf_cnt
)) != ERROR_OK
)
2242 /* calculate checksum of image */
2243 image_calculate_checksum( buffer
, buf_cnt
, &checksum
);
2245 retval
= target_checksum_memory(target
, image
.sections
[i
].base_address
, buf_cnt
, &mem_checksum
);
2246 if( retval
!= ERROR_OK
)
2252 if( checksum
!= mem_checksum
)
2254 /* failed crc checksum, fall back to a binary compare */
2257 command_print(cmd_ctx
, "checksum mismatch - attempting binary compare");
2259 data
= (u8
*)malloc(buf_cnt
);
2261 /* Can we use 32bit word accesses? */
2263 int count
= buf_cnt
;
2264 if ((count
% 4) == 0)
2269 retval
= target
->type
->read_memory(target
, image
.sections
[i
].base_address
, size
, count
, data
);
2270 if (retval
== ERROR_OK
)
2273 for (t
= 0; t
< buf_cnt
; t
++)
2275 if (data
[t
] != buffer
[t
])
2277 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
]);
2294 command_print(cmd_ctx
, "address 0x%08x length 0x%08x", image
.sections
[i
].base_address
, buf_cnt
);
2298 image_size
+= buf_cnt
;
2302 if((retvaltemp
= duration_stop_measure(&duration
, &duration_text
)) != ERROR_OK
)
2304 image_close(&image
);
2308 if (retval
==ERROR_OK
)
2310 command_print(cmd_ctx
, "verified %u bytes in %s", image_size
, duration_text
);
2312 free(duration_text
);
2314 image_close(&image
);
2319 int handle_verify_image_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2321 return handle_verify_image_command_internal(cmd_ctx
, cmd
, args
, argc
, 1);
2324 int handle_test_image_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2326 return handle_verify_image_command_internal(cmd_ctx
, cmd
, args
, argc
, 0);
2329 int handle_bp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2332 target_t
*target
= get_current_target(cmd_ctx
);
2336 breakpoint_t
*breakpoint
= target
->breakpoints
;
2340 if (breakpoint
->type
== BKPT_SOFT
)
2342 char* buf
= buf_to_str(breakpoint
->orig_instr
, breakpoint
->length
, 16);
2343 command_print(cmd_ctx
, "0x%8.8x, 0x%x, %i, 0x%s", breakpoint
->address
, breakpoint
->length
, breakpoint
->set
, buf
);
2348 command_print(cmd_ctx
, "0x%8.8x, 0x%x, %i", breakpoint
->address
, breakpoint
->length
, breakpoint
->set
);
2350 breakpoint
= breakpoint
->next
;
2358 length
= strtoul(args
[1], NULL
, 0);
2361 if (strcmp(args
[2], "hw") == 0)
2364 if ((retval
= breakpoint_add(target
, strtoul(args
[0], NULL
, 0), length
, hw
)) != ERROR_OK
)
2366 LOG_ERROR("Failure setting breakpoints");
2370 command_print(cmd_ctx
, "breakpoint added at address 0x%8.8x", strtoul(args
[0], NULL
, 0));
2375 command_print(cmd_ctx
, "usage: bp <address> <length> ['hw']");
2381 int handle_rbp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2383 target_t
*target
= get_current_target(cmd_ctx
);
2386 breakpoint_remove(target
, strtoul(args
[0], NULL
, 0));
2391 int handle_wp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2393 target_t
*target
= get_current_target(cmd_ctx
);
2398 watchpoint_t
*watchpoint
= target
->watchpoints
;
2402 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
);
2403 watchpoint
= watchpoint
->next
;
2408 enum watchpoint_rw type
= WPT_ACCESS
;
2409 u32 data_value
= 0x0;
2410 u32 data_mask
= 0xffffffff;
2426 command_print(cmd_ctx
, "usage: wp <address> <length> [r/w/a] [value] [mask]");
2432 data_value
= strtoul(args
[3], NULL
, 0);
2436 data_mask
= strtoul(args
[4], NULL
, 0);
2439 if ((retval
= watchpoint_add(target
, strtoul(args
[0], NULL
, 0),
2440 strtoul(args
[1], NULL
, 0), type
, data_value
, data_mask
)) != ERROR_OK
)
2442 LOG_ERROR("Failure setting breakpoints");
2447 command_print(cmd_ctx
, "usage: wp <address> <length> [r/w/a] [value] [mask]");
2453 int handle_rwp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2455 target_t
*target
= get_current_target(cmd_ctx
);
2458 watchpoint_remove(target
, strtoul(args
[0], NULL
, 0));
2463 int handle_virt2phys_command(command_context_t
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2466 target_t
*target
= get_current_target(cmd_ctx
);
2472 return ERROR_COMMAND_SYNTAX_ERROR
;
2474 va
= strtoul(args
[0], NULL
, 0);
2476 retval
= target
->type
->virt2phys(target
, va
, &pa
);
2477 if (retval
== ERROR_OK
)
2479 command_print(cmd_ctx
, "Physical address 0x%08x", pa
);
2483 /* lower levels will have logged a detailed error which is
2484 * forwarded to telnet/GDB session.
2490 static void writeLong(FILE *f
, int l
)
2495 char c
=(l
>>(i
*8))&0xff;
2496 fwrite(&c
, 1, 1, f
);
2501 static void writeString(FILE *f
, char *s
)
2503 fwrite(s
, 1, strlen(s
), f
);
2506 /* Dump a gmon.out histogram file. */
2507 static void writeGmon(u32
*samples
, int sampleNum
, char *filename
)
2510 FILE *f
=fopen(filename
, "w");
2513 fwrite("gmon", 1, 4, f
);
2514 writeLong(f
, 0x00000001); /* Version */
2515 writeLong(f
, 0); /* padding */
2516 writeLong(f
, 0); /* padding */
2517 writeLong(f
, 0); /* padding */
2519 fwrite("", 1, 1, f
); /* GMON_TAG_TIME_HIST */
2521 /* figure out bucket size */
2524 for (i
=0; i
<sampleNum
; i
++)
2536 int addressSpace
=(max
-min
+1);
2538 static int const maxBuckets
=256*1024; /* maximum buckets. */
2539 int length
=addressSpace
;
2540 if (length
> maxBuckets
)
2544 int *buckets
=malloc(sizeof(int)*length
);
2550 memset(buckets
, 0, sizeof(int)*length
);
2551 for (i
=0; i
<sampleNum
;i
++)
2553 u32 address
=samples
[i
];
2554 long long a
=address
-min
;
2555 long long b
=length
-1;
2556 long long c
=addressSpace
-1;
2557 int index
=(a
*b
)/c
; /* danger!!!! int32 overflows */
2561 /* append binary memory gmon.out &profile_hist_hdr ((char*)&profile_hist_hdr + sizeof(struct gmon_hist_hdr)) */
2562 writeLong(f
, min
); /* low_pc */
2563 writeLong(f
, max
); /* high_pc */
2564 writeLong(f
, length
); /* # of samples */
2565 writeLong(f
, 64000000); /* 64MHz */
2566 writeString(f
, "seconds");
2567 for (i
=0; i
<(15-strlen("seconds")); i
++)
2569 fwrite("", 1, 1, f
); /* padding */
2571 writeString(f
, "s");
2573 /*append binary memory gmon.out profile_hist_data (profile_hist_data + profile_hist_hdr.hist_size) */
2575 char *data
=malloc(2*length
);
2578 for (i
=0; i
<length
;i
++)
2587 data
[i
*2+1]=(val
>>8)&0xff;
2590 fwrite(data
, 1, length
*2, f
);
2600 /* profiling samples the CPU PC as quickly as OpenOCD is able, which will be used as a random sampling of PC */
2601 int handle_profile_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2603 target_t
*target
= get_current_target(cmd_ctx
);
2604 struct timeval timeout
, now
;
2606 gettimeofday(&timeout
, NULL
);
2609 return ERROR_COMMAND_SYNTAX_ERROR
;
2612 timeval_add_time(&timeout
, strtoul(args
[0], &end
, 0), 0);
2618 command_print(cmd_ctx
, "Starting profiling. Halting and resuming the target as often as we can...");
2620 static const int maxSample
=10000;
2621 u32
*samples
=malloc(sizeof(u32
)*maxSample
);
2626 int retval
=ERROR_OK
;
2627 /* hopefully it is safe to cache! We want to stop/restart as quickly as possible. */
2628 reg_t
*reg
= register_get_by_name(target
->reg_cache
, "pc", 1);
2632 target_poll(target
);
2633 if (target
->state
== TARGET_HALTED
)
2635 u32 t
=*((u32
*)reg
->value
);
2636 samples
[numSamples
++]=t
;
2637 retval
= target_resume(target
, 1, 0, 0, 0); /* current pc, addr = 0, do not handle breakpoints, not debugging */
2638 target_poll(target
);
2639 alive_sleep(10); /* sleep 10ms, i.e. <100 samples/second. */
2640 } else if (target
->state
== TARGET_RUNNING
)
2642 /* We want to quickly sample the PC. */
2643 if((retval
= target_halt(target
)) != ERROR_OK
)
2650 command_print(cmd_ctx
, "Target not halted or running");
2654 if (retval
!=ERROR_OK
)
2659 gettimeofday(&now
, NULL
);
2660 if ((numSamples
>=maxSample
) || ((now
.tv_sec
>= timeout
.tv_sec
) && (now
.tv_usec
>= timeout
.tv_usec
)))
2662 command_print(cmd_ctx
, "Profiling completed. %d samples.", numSamples
);
2663 if((retval
= target_poll(target
)) != ERROR_OK
)
2668 if (target
->state
== TARGET_HALTED
)
2670 target_resume(target
, 1, 0, 0, 0); /* current pc, addr = 0, do not handle breakpoints, not debugging */
2672 if((retval
= target_poll(target
)) != ERROR_OK
)
2677 writeGmon(samples
, numSamples
, args
[1]);
2678 command_print(cmd_ctx
, "Wrote %s", args
[1]);
2687 static int new_int_array_element(Jim_Interp
* interp
, const char *varname
, int idx
, u32 val
)
2690 Jim_Obj
*nameObjPtr
, *valObjPtr
;
2693 namebuf
= alloc_printf("%s(%d)", varname
, idx
);
2697 nameObjPtr
= Jim_NewStringObj(interp
, namebuf
, -1);
2698 valObjPtr
= Jim_NewIntObj(interp
, val
);
2699 if (!nameObjPtr
|| !valObjPtr
)
2705 Jim_IncrRefCount(nameObjPtr
);
2706 Jim_IncrRefCount(valObjPtr
);
2707 result
= Jim_SetVariable(interp
, nameObjPtr
, valObjPtr
);
2708 Jim_DecrRefCount(interp
, nameObjPtr
);
2709 Jim_DecrRefCount(interp
, valObjPtr
);
2711 /* printf("%s(%d) <= 0%08x\n", varname, idx, val); */
2715 static int jim_mem2array(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *argv
)
2717 command_context_t
*context
;
2720 context
= Jim_GetAssocData(interp
, "context");
2721 if (context
== NULL
)
2723 LOG_ERROR("mem2array: no command context");
2726 target
= get_current_target(context
);
2729 LOG_ERROR("mem2array: no current target");
2733 return target_mem2array(interp
, target
, argc
,argv
);
2736 static int target_mem2array(Jim_Interp
*interp
, target_t
*target
, int argc
, Jim_Obj
*const *argv
)
2744 const char *varname
;
2746 int i
, n
, e
, retval
;
2748 /* argv[1] = name of array to receive the data
2749 * argv[2] = desired width
2750 * argv[3] = memory address
2751 * argv[4] = count of times to read
2754 Jim_WrongNumArgs(interp
, 1, argv
, "varname width addr nelems");
2757 varname
= Jim_GetString(argv
[1], &len
);
2758 /* given "foo" get space for worse case "foo(%d)" .. add 20 */
2760 e
= Jim_GetLong(interp
, argv
[2], &l
);
2766 e
= Jim_GetLong(interp
, argv
[3], &l
);
2771 e
= Jim_GetLong(interp
, argv
[4], &l
);
2787 Jim_SetResult(interp
, Jim_NewEmptyStringObj(interp
));
2788 Jim_AppendStrings( interp
, Jim_GetResult(interp
), "Invalid width param, must be 8/16/32", NULL
);
2792 Jim_SetResult(interp
, Jim_NewEmptyStringObj(interp
));
2793 Jim_AppendStrings(interp
, Jim_GetResult(interp
), "mem2array: zero width read?", NULL
);
2796 if ((addr
+ (len
* width
)) < addr
) {
2797 Jim_SetResult(interp
, Jim_NewEmptyStringObj(interp
));
2798 Jim_AppendStrings(interp
, Jim_GetResult(interp
), "mem2array: addr + len - wraps to zero?", NULL
);
2801 /* absurd transfer size? */
2803 Jim_SetResult(interp
, Jim_NewEmptyStringObj(interp
));
2804 Jim_AppendStrings(interp
, Jim_GetResult(interp
), "mem2array: absurd > 64K item request", NULL
);
2809 ((width
== 2) && ((addr
& 1) == 0)) ||
2810 ((width
== 4) && ((addr
& 3) == 0))) {
2814 Jim_SetResult(interp
, Jim_NewEmptyStringObj(interp
));
2815 sprintf(buf
, "mem2array address: 0x%08x is not aligned for %d byte reads", addr
, width
);
2816 Jim_AppendStrings(interp
, Jim_GetResult(interp
), buf
, NULL
);
2827 /* Slurp... in buffer size chunks */
2829 count
= len
; /* in objects.. */
2830 if (count
> (sizeof(buffer
)/width
)) {
2831 count
= (sizeof(buffer
)/width
);
2834 retval
= target
->type
->read_memory( target
, addr
, width
, count
, buffer
);
2835 if (retval
!= ERROR_OK
) {
2837 LOG_ERROR("mem2array: Read @ 0x%08x, w=%d, cnt=%d, failed", addr
, width
, count
);
2838 Jim_SetResult(interp
, Jim_NewEmptyStringObj(interp
));
2839 Jim_AppendStrings(interp
, Jim_GetResult(interp
), "mem2array: cannot read memory", NULL
);
2843 v
= 0; /* shut up gcc */
2844 for (i
= 0 ;i
< count
;i
++, n
++) {
2847 v
= target_buffer_get_u32(target
, &buffer
[i
*width
]);
2850 v
= target_buffer_get_u16(target
, &buffer
[i
*width
]);
2853 v
= buffer
[i
] & 0x0ff;
2856 new_int_array_element(interp
, varname
, n
, v
);
2862 Jim_SetResult(interp
, Jim_NewEmptyStringObj(interp
));
2867 static int get_int_array_element(Jim_Interp
* interp
, const char *varname
, int idx
, u32
*val
)
2870 Jim_Obj
*nameObjPtr
, *valObjPtr
;
2874 namebuf
= alloc_printf("%s(%d)", varname
, idx
);
2878 nameObjPtr
= Jim_NewStringObj(interp
, namebuf
, -1);
2885 Jim_IncrRefCount(nameObjPtr
);
2886 valObjPtr
= Jim_GetVariable(interp
, nameObjPtr
, JIM_ERRMSG
);
2887 Jim_DecrRefCount(interp
, nameObjPtr
);
2889 if (valObjPtr
== NULL
)
2892 result
= Jim_GetLong(interp
, valObjPtr
, &l
);
2893 /* printf("%s(%d) => 0%08x\n", varname, idx, val); */
2898 static int jim_array2mem(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *argv
)
2900 command_context_t
*context
;
2903 context
= Jim_GetAssocData(interp
, "context");
2904 if (context
== NULL
){
2905 LOG_ERROR("array2mem: no command context");
2908 target
= get_current_target(context
);
2909 if (target
== NULL
){
2910 LOG_ERROR("array2mem: no current target");
2914 return target_array2mem( interp
,target
, argc
, argv
);
2917 static int target_array2mem(Jim_Interp
*interp
, target_t
*target
, int argc
, Jim_Obj
*const *argv
)
2925 const char *varname
;
2927 int i
, n
, e
, retval
;
2929 /* argv[1] = name of array to get the data
2930 * argv[2] = desired width
2931 * argv[3] = memory address
2932 * argv[4] = count to write
2935 Jim_WrongNumArgs(interp
, 1, argv
, "varname width addr nelems");
2938 varname
= Jim_GetString(argv
[1], &len
);
2939 /* given "foo" get space for worse case "foo(%d)" .. add 20 */
2941 e
= Jim_GetLong(interp
, argv
[2], &l
);
2947 e
= Jim_GetLong(interp
, argv
[3], &l
);
2952 e
= Jim_GetLong(interp
, argv
[4], &l
);
2968 Jim_SetResult(interp
, Jim_NewEmptyStringObj(interp
));
2969 Jim_AppendStrings( interp
, Jim_GetResult(interp
), "Invalid width param, must be 8/16/32", NULL
);
2973 Jim_SetResult(interp
, Jim_NewEmptyStringObj(interp
));
2974 Jim_AppendStrings(interp
, Jim_GetResult(interp
), "array2mem: zero width read?", NULL
);
2977 if ((addr
+ (len
* width
)) < addr
) {
2978 Jim_SetResult(interp
, Jim_NewEmptyStringObj(interp
));
2979 Jim_AppendStrings(interp
, Jim_GetResult(interp
), "array2mem: addr + len - wraps to zero?", NULL
);
2982 /* absurd transfer size? */
2984 Jim_SetResult(interp
, Jim_NewEmptyStringObj(interp
));
2985 Jim_AppendStrings(interp
, Jim_GetResult(interp
), "array2mem: absurd > 64K item request", NULL
);
2990 ((width
== 2) && ((addr
& 1) == 0)) ||
2991 ((width
== 4) && ((addr
& 3) == 0))) {
2995 Jim_SetResult(interp
, Jim_NewEmptyStringObj(interp
));
2996 sprintf(buf
, "array2mem address: 0x%08x is not aligned for %d byte reads", addr
, width
);
2997 Jim_AppendStrings(interp
, Jim_GetResult(interp
), buf
, NULL
);
3008 /* Slurp... in buffer size chunks */
3010 count
= len
; /* in objects.. */
3011 if (count
> (sizeof(buffer
)/width
)) {
3012 count
= (sizeof(buffer
)/width
);
3015 v
= 0; /* shut up gcc */
3016 for (i
= 0 ;i
< count
;i
++, n
++) {
3017 get_int_array_element(interp
, varname
, n
, &v
);
3020 target_buffer_set_u32(target
, &buffer
[i
*width
], v
);
3023 target_buffer_set_u16(target
, &buffer
[i
*width
], v
);
3026 buffer
[i
] = v
& 0x0ff;
3032 retval
= target
->type
->write_memory(target
, addr
, width
, count
, buffer
);
3033 if (retval
!= ERROR_OK
) {
3035 LOG_ERROR("array2mem: Write @ 0x%08x, w=%d, cnt=%d, failed", addr
, width
, count
);
3036 Jim_SetResult(interp
, Jim_NewEmptyStringObj(interp
));
3037 Jim_AppendStrings(interp
, Jim_GetResult(interp
), "array2mem: cannot read memory", NULL
);
3043 Jim_SetResult(interp
, Jim_NewEmptyStringObj(interp
));
3048 void target_all_handle_event( enum target_event e
)
3052 LOG_DEBUG( "**all*targets: event: %d, %s",
3054 Jim_Nvp_value2name_simple( nvp_target_event
, e
)->name
);
3056 target
= all_targets
;
3058 target_handle_event( target
, e
);
3059 target
= target
->next
;
3063 void target_handle_event( target_t
*target
, enum target_event e
)
3065 target_event_action_t
*teap
;
3068 teap
= target
->event_action
;
3072 if( teap
->event
== e
){
3074 LOG_DEBUG( "target: (%d) %s (%s) event: %d (%s) action: %s\n",
3075 target
->target_number
,
3079 Jim_Nvp_value2name_simple( nvp_target_event
, e
)->name
,
3080 Jim_GetString( teap
->body
, NULL
) );
3081 if (Jim_EvalObj( interp
, teap
->body
)!=JIM_OK
)
3083 Jim_PrintErrorMessage(interp
);
3089 LOG_DEBUG( "event: %d %s - no action",
3091 Jim_Nvp_value2name_simple( nvp_target_event
, e
)->name
);
3095 enum target_cfg_param
{
3098 TCFG_WORK_AREA_VIRT
,
3099 TCFG_WORK_AREA_PHYS
,
3100 TCFG_WORK_AREA_SIZE
,
3101 TCFG_WORK_AREA_BACKUP
,
3104 TCFG_CHAIN_POSITION
,
3107 static Jim_Nvp nvp_config_opts
[] = {
3108 { .name
= "-type", .value
= TCFG_TYPE
},
3109 { .name
= "-event", .value
= TCFG_EVENT
},
3110 { .name
= "-work-area-virt", .value
= TCFG_WORK_AREA_VIRT
},
3111 { .name
= "-work-area-phys", .value
= TCFG_WORK_AREA_PHYS
},
3112 { .name
= "-work-area-size", .value
= TCFG_WORK_AREA_SIZE
},
3113 { .name
= "-work-area-backup", .value
= TCFG_WORK_AREA_BACKUP
},
3114 { .name
= "-endian" , .value
= TCFG_ENDIAN
},
3115 { .name
= "-variant", .value
= TCFG_VARIANT
},
3116 { .name
= "-chain-position", .value
= TCFG_CHAIN_POSITION
},
3118 { .name
= NULL
, .value
= -1 }
3121 static int target_configure( Jim_GetOptInfo
*goi
, target_t
*target
)
3129 /* parse config or cget options ... */
3130 while( goi
->argc
> 0 ){
3131 Jim_SetEmptyResult( goi
->interp
);
3132 /* Jim_GetOpt_Debug( goi ); */
3134 if( target
->type
->target_jim_configure
){
3135 /* target defines a configure function */
3136 /* target gets first dibs on parameters */
3137 e
= (*(target
->type
->target_jim_configure
))( target
, goi
);
3146 /* otherwise we 'continue' below */
3148 e
= Jim_GetOpt_Nvp( goi
, nvp_config_opts
, &n
);
3150 Jim_GetOpt_NvpUnknown( goi
, nvp_config_opts
, 0 );
3156 if( goi
->isconfigure
){
3157 Jim_SetResult_sprintf( goi
->interp
, "not setable: %s", n
->name
);
3161 if( goi
->argc
!= 0 ){
3162 Jim_WrongNumArgs( goi
->interp
, goi
->argc
, goi
->argv
, "NO PARAMS");
3166 Jim_SetResultString( goi
->interp
, target
->type
->name
, -1 );
3170 if( goi
->argc
== 0 ){
3171 Jim_WrongNumArgs( goi
->interp
, goi
->argc
, goi
->argv
, "-event ?event-name? ...");
3175 e
= Jim_GetOpt_Nvp( goi
, nvp_target_event
, &n
);
3177 Jim_GetOpt_NvpUnknown( goi
, nvp_target_event
, 1 );
3181 if( goi
->isconfigure
){
3182 if( goi
->argc
!= 1 ){
3183 Jim_WrongNumArgs( goi
->interp
, goi
->argc
, goi
->argv
, "-event ?event-name? ?EVENT-BODY?");
3187 if( goi
->argc
!= 0 ){
3188 Jim_WrongNumArgs(goi
->interp
, goi
->argc
, goi
->argv
, "-event ?event-name?");
3194 target_event_action_t
*teap
;
3196 teap
= target
->event_action
;
3197 /* replace existing? */
3199 if( teap
->event
== n
->value
){
3205 if( goi
->isconfigure
){
3208 teap
= calloc( 1, sizeof(*teap
) );
3210 teap
->event
= n
->value
;
3211 Jim_GetOpt_Obj( goi
, &o
);
3213 Jim_DecrRefCount( interp
, teap
->body
);
3215 teap
->body
= Jim_DuplicateObj( goi
->interp
, o
);
3218 * Tcl/TK - "tk events" have a nice feature.
3219 * See the "BIND" command.
3220 * We should support that here.
3221 * You can specify %X and %Y in the event code.
3222 * The idea is: %T - target name.
3223 * The idea is: %N - target number
3224 * The idea is: %E - event name.
3226 Jim_IncrRefCount( teap
->body
);
3228 /* add to head of event list */
3229 teap
->next
= target
->event_action
;
3230 target
->event_action
= teap
;
3231 Jim_SetEmptyResult(goi
->interp
);
3235 Jim_SetEmptyResult( goi
->interp
);
3237 Jim_SetResult( goi
->interp
, Jim_DuplicateObj( goi
->interp
, teap
->body
) );
3244 case TCFG_WORK_AREA_VIRT
:
3245 if( goi
->isconfigure
){
3246 target_free_all_working_areas(target
);
3247 e
= Jim_GetOpt_Wide( goi
, &w
);
3251 target
->working_area_virt
= w
;
3253 if( goi
->argc
!= 0 ){
3257 Jim_SetResult( interp
, Jim_NewIntObj( goi
->interp
, target
->working_area_virt
) );
3261 case TCFG_WORK_AREA_PHYS
:
3262 if( goi
->isconfigure
){
3263 target_free_all_working_areas(target
);
3264 e
= Jim_GetOpt_Wide( goi
, &w
);
3268 target
->working_area_phys
= w
;
3270 if( goi
->argc
!= 0 ){
3274 Jim_SetResult( interp
, Jim_NewIntObj( goi
->interp
, target
->working_area_phys
) );
3278 case TCFG_WORK_AREA_SIZE
:
3279 if( goi
->isconfigure
){
3280 target_free_all_working_areas(target
);
3281 e
= Jim_GetOpt_Wide( goi
, &w
);
3285 target
->working_area_size
= w
;
3287 if( goi
->argc
!= 0 ){
3291 Jim_SetResult( interp
, Jim_NewIntObj( goi
->interp
, target
->working_area_size
) );
3295 case TCFG_WORK_AREA_BACKUP
:
3296 if( goi
->isconfigure
){
3297 target_free_all_working_areas(target
);
3298 e
= Jim_GetOpt_Wide( goi
, &w
);
3302 /* make this exactly 1 or 0 */
3303 target
->backup_working_area
= (!!w
);
3305 if( goi
->argc
!= 0 ){
3309 Jim_SetResult( interp
, Jim_NewIntObj( goi
->interp
, target
->working_area_size
) );
3310 /* loop for more e*/
3314 if( goi
->isconfigure
){
3315 e
= Jim_GetOpt_Nvp( goi
, nvp_target_endian
, &n
);
3317 Jim_GetOpt_NvpUnknown( goi
, nvp_target_endian
, 1 );
3320 target
->endianness
= n
->value
;
3322 if( goi
->argc
!= 0 ){
3326 n
= Jim_Nvp_value2name_simple( nvp_target_endian
, target
->endianness
);
3327 if( n
->name
== NULL
){
3328 target
->endianness
= TARGET_LITTLE_ENDIAN
;
3329 n
= Jim_Nvp_value2name_simple( nvp_target_endian
, target
->endianness
);
3331 Jim_SetResultString( goi
->interp
, n
->name
, -1 );
3336 if( goi
->isconfigure
){
3337 if( goi
->argc
< 1 ){
3338 Jim_SetResult_sprintf( goi
->interp
,
3343 if( target
->variant
){
3344 free((void *)(target
->variant
));
3346 e
= Jim_GetOpt_String( goi
, &cp
, NULL
);
3347 target
->variant
= strdup(cp
);
3349 if( goi
->argc
!= 0 ){
3353 Jim_SetResultString( goi
->interp
, target
->variant
,-1 );
3356 case TCFG_CHAIN_POSITION
:
3357 if( goi
->isconfigure
){
3360 target_free_all_working_areas(target
);
3361 e
= Jim_GetOpt_Obj( goi
, &o
);
3365 tap
= jtag_TapByJimObj( goi
->interp
, o
);
3369 /* make this exactly 1 or 0 */
3372 if( goi
->argc
!= 0 ){
3376 Jim_SetResultString( interp
, target
->tap
->dotted_name
, -1 );
3377 /* loop for more e*/
3380 } /* while( goi->argc ) */
3383 /* done - we return */
3387 /** this is the 'tcl' handler for the target specific command */
3388 static int tcl_target_func( Jim_Interp
*interp
, int argc
, Jim_Obj
*const *argv
)
3396 struct command_context_s
*cmd_ctx
;
3403 TS_CMD_MWW
, TS_CMD_MWH
, TS_CMD_MWB
,
3404 TS_CMD_MDW
, TS_CMD_MDH
, TS_CMD_MDB
,
3405 TS_CMD_MRW
, TS_CMD_MRH
, TS_CMD_MRB
,
3406 TS_CMD_MEM2ARRAY
, TS_CMD_ARRAY2MEM
,
3414 TS_CMD_INVOKE_EVENT
,
3417 static const Jim_Nvp target_options
[] = {
3418 { .name
= "configure", .value
= TS_CMD_CONFIGURE
},
3419 { .name
= "cget", .value
= TS_CMD_CGET
},
3420 { .name
= "mww", .value
= TS_CMD_MWW
},
3421 { .name
= "mwh", .value
= TS_CMD_MWH
},
3422 { .name
= "mwb", .value
= TS_CMD_MWB
},
3423 { .name
= "mdw", .value
= TS_CMD_MDW
},
3424 { .name
= "mdh", .value
= TS_CMD_MDH
},
3425 { .name
= "mdb", .value
= TS_CMD_MDB
},
3426 { .name
= "mem2array", .value
= TS_CMD_MEM2ARRAY
},
3427 { .name
= "array2mem", .value
= TS_CMD_ARRAY2MEM
},
3428 { .name
= "eventlist", .value
= TS_CMD_EVENTLIST
},
3429 { .name
= "curstate", .value
= TS_CMD_CURSTATE
},
3431 { .name
= "arp_examine", .value
= TS_CMD_EXAMINE
},
3432 { .name
= "arp_poll", .value
= TS_CMD_POLL
},
3433 { .name
= "arp_reset", .value
= TS_CMD_RESET
},
3434 { .name
= "arp_halt", .value
= TS_CMD_HALT
},
3435 { .name
= "arp_waitstate", .value
= TS_CMD_WAITSTATE
},
3436 { .name
= "invoke-event", .value
= TS_CMD_INVOKE_EVENT
},
3438 { .name
= NULL
, .value
= -1 },
3441 /* go past the "command" */
3442 Jim_GetOpt_Setup( &goi
, interp
, argc
-1, argv
+1 );
3444 target
= Jim_CmdPrivData( goi
.interp
);
3445 cmd_ctx
= Jim_GetAssocData(goi
.interp
, "context");
3447 /* commands here are in an NVP table */
3448 e
= Jim_GetOpt_Nvp( &goi
, target_options
, &n
);
3450 Jim_GetOpt_NvpUnknown( &goi
, target_options
, 0 );
3453 /* Assume blank result */
3454 Jim_SetEmptyResult( goi
.interp
);
3457 case TS_CMD_CONFIGURE
:
3459 Jim_WrongNumArgs( goi
.interp
, goi
.argc
, goi
.argv
, "missing: -option VALUE ...");
3462 goi
.isconfigure
= 1;
3463 return target_configure( &goi
, target
);
3465 // some things take params
3467 Jim_WrongNumArgs( goi
.interp
, 0, goi
.argv
, "missing: ?-option?");
3470 goi
.isconfigure
= 0;
3471 return target_configure( &goi
, target
);
3479 * argv[3] = optional count.
3482 if( (goi
.argc
== 3) || (goi
.argc
== 4) ){
3486 Jim_SetResult_sprintf( goi
.interp
, "expected: %s ADDR DATA [COUNT]", n
->name
);
3490 e
= Jim_GetOpt_Wide( &goi
, &a
);
3495 e
= Jim_GetOpt_Wide( &goi
, &b
);
3500 e
= Jim_GetOpt_Wide( &goi
, &c
);
3510 target_buffer_set_u32( target
, target_buf
, b
);
3514 target_buffer_set_u16( target
, target_buf
, b
);
3518 target_buffer_set_u8( target
, target_buf
, b
);
3522 for( x
= 0 ; x
< c
; x
++ ){
3523 e
= target
->type
->write_memory( target
, a
, b
, 1, target_buf
);
3524 if( e
!= ERROR_OK
){
3525 Jim_SetResult_sprintf( interp
, "Error writing @ 0x%08x: %d\n", (int)(a
), e
);
3538 /* argv[0] = command
3540 * argv[2] = optional count
3542 if( (goi
.argc
== 2) || (goi
.argc
== 3) ){
3543 Jim_SetResult_sprintf( goi
.interp
, "expected: %s ADDR [COUNT]", n
->name
);
3546 e
= Jim_GetOpt_Wide( &goi
, &a
);
3551 e
= Jim_GetOpt_Wide( &goi
, &c
);
3558 b
= 1; /* shut up gcc */
3571 /* convert to "bytes" */
3573 /* count is now in 'BYTES' */
3579 e
= target
->type
->read_memory( target
, a
, b
, y
/ b
, target_buf
);
3580 if( e
!= ERROR_OK
){
3581 Jim_SetResult_sprintf( interp
, "error reading target @ 0x%08lx", (int)(a
) );
3585 Jim_fprintf( interp
, interp
->cookie_stdout
, "0x%08x ", (int)(a
) );
3588 for( x
= 0 ; (x
< 16) && (x
< y
) ; x
+= 4 ){
3589 z
= target_buffer_get_u32( target
, &(target_buf
[ x
* 4 ]) );
3590 Jim_fprintf( interp
, interp
->cookie_stdout
, "%08x ", (int)(z
) );
3592 for( ; (x
< 16) ; x
+= 4 ){
3593 Jim_fprintf( interp
, interp
->cookie_stdout
, " " );
3597 for( x
= 0 ; (x
< 16) && (x
< y
) ; x
+= 2 ){
3598 z
= target_buffer_get_u16( target
, &(target_buf
[ x
* 2 ]) );
3599 Jim_fprintf( interp
, interp
->cookie_stdout
, "%04x ", (int)(z
) );
3601 for( ; (x
< 16) ; x
+= 2 ){
3602 Jim_fprintf( interp
, interp
->cookie_stdout
, " " );
3607 for( x
= 0 ; (x
< 16) && (x
< y
) ; x
+= 1 ){
3608 z
= target_buffer_get_u8( target
, &(target_buf
[ x
* 4 ]) );
3609 Jim_fprintf( interp
, interp
->cookie_stdout
, "%02x ", (int)(z
) );
3611 for( ; (x
< 16) ; x
+= 1 ){
3612 Jim_fprintf( interp
, interp
->cookie_stdout
, " " );
3616 /* ascii-ify the bytes */
3617 for( x
= 0 ; x
< y
; x
++ ){
3618 if( (target_buf
[x
] >= 0x20) &&
3619 (target_buf
[x
] <= 0x7e) ){
3623 target_buf
[x
] = '.';
3628 target_buf
[x
] = ' ';
3633 /* print - with a newline */
3634 Jim_fprintf( interp
, interp
->cookie_stdout
, "%s\n", target_buf
);
3640 case TS_CMD_MEM2ARRAY
:
3641 return target_mem2array( goi
.interp
, target
, goi
.argc
, goi
.argv
);
3643 case TS_CMD_ARRAY2MEM
:
3644 return target_array2mem( goi
.interp
, target
, goi
.argc
, goi
.argv
);
3646 case TS_CMD_EXAMINE
:
3648 Jim_WrongNumArgs( goi
.interp
, 2, argv
, "[no parameters]");
3651 e
= target
->type
->examine( target
);
3652 if( e
!= ERROR_OK
){
3653 Jim_SetResult_sprintf( interp
, "examine-fails: %d", e
);
3659 Jim_WrongNumArgs( goi
.interp
, 2, argv
, "[no parameters]");
3662 if( !(target
->type
->examined
) ){
3663 e
= ERROR_TARGET_NOT_EXAMINED
;
3665 e
= target
->type
->poll( target
);
3667 if( e
!= ERROR_OK
){
3668 Jim_SetResult_sprintf( interp
, "poll-fails: %d", e
);
3675 if( goi
.argc
!= 2 ){
3676 Jim_WrongNumArgs( interp
, 2, argv
, "t|f|assert|deassert BOOL");
3679 e
= Jim_GetOpt_Nvp( &goi
, nvp_assert
, &n
);
3681 Jim_GetOpt_NvpUnknown( &goi
, nvp_assert
, 1 );
3684 /* the halt or not param */
3685 e
= Jim_GetOpt_Wide( &goi
, &a
);
3689 /* determine if we should halt or not. */
3690 target
->reset_halt
= !!a
;
3691 /* When this happens - all workareas are invalid. */
3692 target_free_all_working_areas_restore(target
, 0);
3695 if( n
->value
== NVP_ASSERT
){
3696 target
->type
->assert_reset( target
);
3698 target
->type
->deassert_reset( target
);
3703 Jim_WrongNumArgs( goi
.interp
, 0, argv
, "halt [no parameters]");
3706 target
->type
->halt( target
);
3708 case TS_CMD_WAITSTATE
:
3709 /* params: <name> statename timeoutmsecs */
3710 if( goi
.argc
!= 2 ){
3711 Jim_SetResult_sprintf( goi
.interp
, "%s STATENAME TIMEOUTMSECS", n
->name
);
3714 e
= Jim_GetOpt_Nvp( &goi
, nvp_target_state
, &n
);
3716 Jim_GetOpt_NvpUnknown( &goi
, nvp_target_state
,1 );
3719 e
= Jim_GetOpt_Wide( &goi
, &a
);
3723 e
= target_wait_state( target
, n
->value
, a
);
3724 if( e
!= ERROR_OK
){
3725 Jim_SetResult_sprintf( goi
.interp
,
3726 "target: %s wait %s fails (%d) %s",
3729 e
, target_strerror_safe(e
) );
3734 case TS_CMD_EVENTLIST
:
3735 /* List for human, Events defined for this target.
3736 * scripts/programs should use 'name cget -event NAME'
3739 target_event_action_t
*teap
;
3740 teap
= target
->event_action
;
3741 command_print( cmd_ctx
, "Event actions for target (%d) %s\n",
3742 target
->target_number
,
3744 command_print( cmd_ctx
, "%-25s | Body", "Event");
3745 command_print( cmd_ctx
, "------------------------- | ----------------------------------------");
3747 command_print( cmd_ctx
,
3749 Jim_Nvp_value2name_simple( nvp_target_event
, teap
->event
)->name
,
3750 Jim_GetString( teap
->body
, NULL
) );
3753 command_print( cmd_ctx
, "***END***");
3756 case TS_CMD_CURSTATE
:
3757 if( goi
.argc
!= 0 ){
3758 Jim_WrongNumArgs( goi
.interp
, 0, argv
, "[no parameters]");
3761 Jim_SetResultString( goi
.interp
,
3762 Jim_Nvp_value2name_simple(nvp_target_state
,target
->state
)->name
,-1);
3764 case TS_CMD_INVOKE_EVENT
:
3765 if( goi
.argc
!= 1 ){
3766 Jim_SetResult_sprintf( goi
.interp
, "%s ?EVENTNAME?",n
->name
);
3769 e
= Jim_GetOpt_Nvp( &goi
, nvp_target_event
, &n
);
3771 Jim_GetOpt_NvpUnknown( &goi
, nvp_target_event
, 1 );
3774 target_handle_event( target
, n
->value
);
3780 static int target_create( Jim_GetOptInfo
*goi
)
3789 struct command_context_s
*cmd_ctx
;
3791 cmd_ctx
= Jim_GetAssocData(goi
->interp
, "context");
3792 if( goi
->argc
< 3 ){
3793 Jim_WrongNumArgs( goi
->interp
, 1, goi
->argv
, "?name? ?type? ..options...");
3798 Jim_GetOpt_Obj( goi
, &new_cmd
);
3799 /* does this command exist? */
3800 cmd
= Jim_GetCommand( goi
->interp
, new_cmd
, JIM_ERRMSG
);
3802 cp
= Jim_GetString( new_cmd
, NULL
);
3803 Jim_SetResult_sprintf(goi
->interp
, "Command/target: %s Exists", cp
);
3808 e
= Jim_GetOpt_String( goi
, &cp2
, NULL
);
3810 /* now does target type exist */
3811 for( x
= 0 ; target_types
[x
] ; x
++ ){
3812 if( 0 == strcmp( cp
, target_types
[x
]->name
) ){
3817 if( target_types
[x
] == NULL
){
3818 Jim_SetResult_sprintf( goi
->interp
, "Unknown target type %s, try one of ", cp
);
3819 for( x
= 0 ; target_types
[x
] ; x
++ ){
3820 if( target_types
[x
+1] ){
3821 Jim_AppendStrings( goi
->interp
,
3822 Jim_GetResult(goi
->interp
),
3823 target_types
[x
]->name
,
3826 Jim_AppendStrings( goi
->interp
,
3827 Jim_GetResult(goi
->interp
),
3829 target_types
[x
]->name
,NULL
);
3836 target
= calloc(1,sizeof(target_t
));
3837 /* set target number */
3838 target
->target_number
= new_target_number();
3840 /* allocate memory for each unique target type */
3841 target
->type
= (target_type_t
*)calloc(1,sizeof(target_type_t
));
3843 memcpy( target
->type
, target_types
[x
], sizeof(target_type_t
));
3845 /* will be set by "-endian" */
3846 target
->endianness
= TARGET_ENDIAN_UNKNOWN
;
3848 target
->working_area
= 0x0;
3849 target
->working_area_size
= 0x0;
3850 target
->working_areas
= NULL
;
3851 target
->backup_working_area
= 0;
3853 target
->state
= TARGET_UNKNOWN
;
3854 target
->debug_reason
= DBG_REASON_UNDEFINED
;
3855 target
->reg_cache
= NULL
;
3856 target
->breakpoints
= NULL
;
3857 target
->watchpoints
= NULL
;
3858 target
->next
= NULL
;
3859 target
->arch_info
= NULL
;
3861 target
->display
= 1;
3863 /* initialize trace information */
3864 target
->trace_info
= malloc(sizeof(trace_t
));
3865 target
->trace_info
->num_trace_points
= 0;
3866 target
->trace_info
->trace_points_size
= 0;
3867 target
->trace_info
->trace_points
= NULL
;
3868 target
->trace_info
->trace_history_size
= 0;
3869 target
->trace_info
->trace_history
= NULL
;
3870 target
->trace_info
->trace_history_pos
= 0;
3871 target
->trace_info
->trace_history_overflowed
= 0;
3873 target
->dbgmsg
= NULL
;
3874 target
->dbg_msg_enabled
= 0;
3876 target
->endianness
= TARGET_ENDIAN_UNKNOWN
;
3878 /* Do the rest as "configure" options */
3879 goi
->isconfigure
= 1;
3880 e
= target_configure( goi
, target
);
3882 if (target
->tap
== NULL
)
3884 Jim_SetResultString( interp
, "-chain-position required when creating target", -1);
3889 free( target
->type
);
3894 if( target
->endianness
== TARGET_ENDIAN_UNKNOWN
){
3895 /* default endian to little if not specified */
3896 target
->endianness
= TARGET_LITTLE_ENDIAN
;
3899 /* incase variant is not set */
3900 if (!target
->variant
)
3901 target
->variant
= strdup("");
3903 /* create the target specific commands */
3904 if( target
->type
->register_commands
){
3905 (*(target
->type
->register_commands
))( cmd_ctx
);
3907 if( target
->type
->target_create
){
3908 (*(target
->type
->target_create
))( target
, goi
->interp
);
3911 /* append to end of list */
3914 tpp
= &(all_targets
);
3916 tpp
= &( (*tpp
)->next
);
3921 cp
= Jim_GetString( new_cmd
, NULL
);
3922 target
->cmd_name
= strdup(cp
);
3924 /* now - create the new target name command */
3925 e
= Jim_CreateCommand( goi
->interp
,
3928 tcl_target_func
, /* C function */
3929 target
, /* private data */
3930 NULL
); /* no del proc */
3935 static int jim_target( Jim_Interp
*interp
, int argc
, Jim_Obj
*const *argv
)
3939 struct command_context_s
*cmd_ctx
;
3943 /* TG = target generic */
3951 const char *target_cmds
[] = {
3952 "create", "types", "names", "current", "number",
3954 NULL
/* terminate */
3957 LOG_DEBUG("Target command params:");
3958 LOG_DEBUG(Jim_Debug_ArgvString( interp
, argc
, argv
) );
3960 cmd_ctx
= Jim_GetAssocData( interp
, "context" );
3962 Jim_GetOpt_Setup( &goi
, interp
, argc
-1, argv
+1 );
3964 if( goi
.argc
== 0 ){
3965 Jim_WrongNumArgs(interp
, 1, argv
, "missing: command ...");
3969 /* Jim_GetOpt_Debug( &goi ); */
3970 r
= Jim_GetOpt_Enum( &goi
, target_cmds
, &x
);
3977 Jim_Panic(goi
.interp
,"Why am I here?");
3979 case TG_CMD_CURRENT
:
3980 if( goi
.argc
!= 0 ){
3981 Jim_WrongNumArgs( goi
.interp
, 1, goi
.argv
, "Too many parameters");
3984 Jim_SetResultString( goi
.interp
, get_current_target( cmd_ctx
)->cmd_name
, -1 );
3987 if( goi
.argc
!= 0 ){
3988 Jim_WrongNumArgs( goi
.interp
, 1, goi
.argv
, "Too many parameters" );
3991 Jim_SetResult( goi
.interp
, Jim_NewListObj( goi
.interp
, NULL
, 0 ) );
3992 for( x
= 0 ; target_types
[x
] ; x
++ ){
3993 Jim_ListAppendElement( goi
.interp
,
3994 Jim_GetResult(goi
.interp
),
3995 Jim_NewStringObj( goi
.interp
, target_types
[x
]->name
, -1 ) );
3999 if( goi
.argc
!= 0 ){
4000 Jim_WrongNumArgs( goi
.interp
, 1, goi
.argv
, "Too many parameters" );
4003 Jim_SetResult( goi
.interp
, Jim_NewListObj( goi
.interp
, NULL
, 0 ) );
4004 target
= all_targets
;
4006 Jim_ListAppendElement( goi
.interp
,
4007 Jim_GetResult(goi
.interp
),
4008 Jim_NewStringObj( goi
.interp
, target
->cmd_name
, -1 ) );
4009 target
= target
->next
;
4014 Jim_WrongNumArgs( goi
.interp
, goi
.argc
, goi
.argv
, "?name ... config options ...");
4017 return target_create( &goi
);
4020 if( goi
.argc
!= 1 ){
4021 Jim_SetResult_sprintf( goi
.interp
, "expected: target number ?NUMBER?");
4024 e
= Jim_GetOpt_Wide( &goi
, &w
);
4030 t
= get_target_by_num(w
);
4032 Jim_SetResult_sprintf( goi
.interp
,"Target: number %d does not exist", (int)(w
));
4035 Jim_SetResultString( goi
.interp
, t
->cmd_name
, -1 );
4039 if( goi
.argc
!= 0 ){
4040 Jim_WrongNumArgs( goi
.interp
, 0, goi
.argv
, "<no parameters>");
4043 Jim_SetResult( goi
.interp
,
4044 Jim_NewIntObj( goi
.interp
, max_target_number()));
4060 static int fastload_num
;
4061 static struct FastLoad
*fastload
;
4063 static void free_fastload(void)
4068 for (i
=0; i
<fastload_num
; i
++)
4070 if (fastload
[i
].data
)
4071 free(fastload
[i
].data
);
4081 int handle_fast_load_image_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
4087 u32 max_address
=0xffffffff;
4093 duration_t duration
;
4094 char *duration_text
;
4096 if ((argc
< 1)||(argc
> 5))
4098 return ERROR_COMMAND_SYNTAX_ERROR
;
4101 /* a base address isn't always necessary, default to 0x0 (i.e. don't relocate) */
4104 image
.base_address_set
= 1;
4105 image
.base_address
= strtoul(args
[1], NULL
, 0);
4109 image
.base_address_set
= 0;
4113 image
.start_address_set
= 0;
4117 min_address
=strtoul(args
[3], NULL
, 0);
4121 max_address
=strtoul(args
[4], NULL
, 0)+min_address
;
4124 if (min_address
>max_address
)
4126 return ERROR_COMMAND_SYNTAX_ERROR
;
4129 duration_start_measure(&duration
);
4131 if (image_open(&image
, args
[0], (argc
>= 3) ? args
[2] : NULL
) != ERROR_OK
)
4138 fastload_num
=image
.num_sections
;
4139 fastload
=(struct FastLoad
*)malloc(sizeof(struct FastLoad
)*image
.num_sections
);
4142 image_close(&image
);
4145 memset(fastload
, 0, sizeof(struct FastLoad
)*image
.num_sections
);
4146 for (i
= 0; i
< image
.num_sections
; i
++)
4148 buffer
= malloc(image
.sections
[i
].size
);
4151 command_print(cmd_ctx
, "error allocating buffer for section (%d bytes)", image
.sections
[i
].size
);
4155 if ((retval
= image_read_section(&image
, i
, 0x0, image
.sections
[i
].size
, buffer
, &buf_cnt
)) != ERROR_OK
)
4165 /* DANGER!!! beware of unsigned comparision here!!! */
4167 if ((image
.sections
[i
].base_address
+buf_cnt
>=min_address
)&&
4168 (image
.sections
[i
].base_address
<max_address
))
4170 if (image
.sections
[i
].base_address
<min_address
)
4172 /* clip addresses below */
4173 offset
+=min_address
-image
.sections
[i
].base_address
;
4177 if (image
.sections
[i
].base_address
+buf_cnt
>max_address
)
4179 length
-=(image
.sections
[i
].base_address
+buf_cnt
)-max_address
;
4182 fastload
[i
].address
=image
.sections
[i
].base_address
+offset
;
4183 fastload
[i
].data
=malloc(length
);
4184 if (fastload
[i
].data
==NULL
)
4189 memcpy(fastload
[i
].data
, buffer
+offset
, length
);
4190 fastload
[i
].length
=length
;
4192 image_size
+= length
;
4193 command_print(cmd_ctx
, "%u byte written at address 0x%8.8x", length
, image
.sections
[i
].base_address
+offset
);
4199 duration_stop_measure(&duration
, &duration_text
);
4200 if (retval
==ERROR_OK
)
4202 command_print(cmd_ctx
, "Loaded %u bytes in %s", image_size
, duration_text
);
4203 command_print(cmd_ctx
, "NB!!! image has not been loaded to target, issue a subsequent 'fast_load' to do so.");
4205 free(duration_text
);
4207 image_close(&image
);
4209 if (retval
!=ERROR_OK
)
4217 int handle_fast_load_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
4220 return ERROR_COMMAND_SYNTAX_ERROR
;
4223 LOG_ERROR("No image in memory");
4227 int ms
=timeval_ms();
4229 int retval
=ERROR_OK
;
4230 for (i
=0; i
<fastload_num
;i
++)
4232 target_t
*target
= get_current_target(cmd_ctx
);
4233 command_print(cmd_ctx
, "Write to 0x%08x, length 0x%08x", fastload
[i
].address
, fastload
[i
].length
);
4234 if (retval
==ERROR_OK
)
4236 retval
= target_write_buffer(target
, fastload
[i
].address
, fastload
[i
].length
, fastload
[i
].data
);
4238 size
+=fastload
[i
].length
;
4240 int after
=timeval_ms();
4241 command_print(cmd_ctx
, "Loaded image %f kBytes/s", (float)(size
/1024.0)/((float)(after
-ms
)/1000.0));
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)