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
);
65 int handle_targets_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
67 int handle_working_area_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
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
);
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
);
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
;
110 target_type_t
*target_types
[] =
126 target_t
*all_targets
= NULL
;
127 target_event_callback_t
*target_event_callbacks
= NULL
;
128 target_timer_callback_t
*target_timer_callbacks
= NULL
;
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 }
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
}
155 const char *target_strerror_safe( int err
)
159 n
= Jim_Nvp_value2name_simple( nvp_error_target
, err
);
160 if( n
->name
== NULL
){
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" },
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" },
179 { .name
= "gdb-start", .value
= TARGET_EVENT_GDB_START
},
180 { .name
= "gdb-end", .value
= TARGET_EVENT_GDB_END
},
183 /* historical name */
185 { .value
= TARGET_EVENT_RESET_START
, .name
= "reset-start" },
187 { .value
= TARGET_EVENT_RESET_ASSERT_PRE
, .name
= "reset-assert-pre" },
188 { .value
= TARGET_EVENT_RESET_ASSERT_POST
, .name
= "reset-assert-post" },
189 { .value
= TARGET_EVENT_RESET_DEASSERT_PRE
, .name
= "reset-deassert-pre" },
190 { .value
= TARGET_EVENT_RESET_DEASSERT_POST
, .name
= "reset-deassert-post" },
191 { .value
= TARGET_EVENT_RESET_HALT_PRE
, .name
= "reset-halt-pre" },
192 { .value
= TARGET_EVENT_RESET_HALT_POST
, .name
= "reset-halt-post" },
193 { .value
= TARGET_EVENT_RESET_WAIT_PRE
, .name
= "reset-wait-pre" },
194 { .value
= TARGET_EVENT_RESET_WAIT_POST
, .name
= "reset-wait-post" },
195 { .value
= TARGET_EVENT_RESET_INIT
, .name
= "reset-init" },
196 { .value
= TARGET_EVENT_RESET_END
, .name
= "reset-end" },
202 { .value
= TARGET_EVENT_EXAMINE_START
, .name
= "examine-start" },
203 { .value
= TARGET_EVENT_EXAMINE_START
, .name
= "examine-end" },
206 { .value
= TARGET_EVENT_DEBUG_HALTED
, .name
= "debug-halted" },
207 { .value
= TARGET_EVENT_DEBUG_RESUMED
, .name
= "debug-resumed" },
209 { .value
= TARGET_EVENT_GDB_ATTACH
, .name
= "gdb-attach" },
210 { .value
= TARGET_EVENT_GDB_DETACH
, .name
= "gdb-detach" },
213 { .value
= TARGET_EVENT_GDB_FLASH_WRITE_START
, .name
= "gdb-flash-write-start" },
214 { .value
= TARGET_EVENT_GDB_FLASH_WRITE_END
, .name
= "gdb-flash-write-end" },
216 { .value
= TARGET_EVENT_GDB_FLASH_ERASE_START
, .name
= "gdb-flash-erase-start" },
217 { .value
= TARGET_EVENT_GDB_FLASH_ERASE_END
, .name
= "gdb-flash-erase-end" },
219 { .value
= TARGET_EVENT_RESUME_START
, .name
= "resume-start" },
220 { .value
= TARGET_EVENT_RESUMED
, .name
= "resume-ok" },
221 { .value
= TARGET_EVENT_RESUME_END
, .name
= "resume-end" },
223 { .name
= NULL
, .value
= -1 }
226 const Jim_Nvp nvp_target_state
[] = {
227 { .name
= "unknown", .value
= TARGET_UNKNOWN
},
228 { .name
= "running", .value
= TARGET_RUNNING
},
229 { .name
= "halted", .value
= TARGET_HALTED
},
230 { .name
= "reset", .value
= TARGET_RESET
},
231 { .name
= "debug-running", .value
= TARGET_DEBUG_RUNNING
},
232 { .name
= NULL
, .value
= -1 },
236 const Jim_Nvp nvp_target_debug_reason
[] = {
237 { .name
= "debug-request" , .value
= DBG_REASON_DBGRQ
},
238 { .name
= "breakpoint" , .value
= DBG_REASON_BREAKPOINT
},
239 { .name
= "watchpoint" , .value
= DBG_REASON_WATCHPOINT
},
240 { .name
= "watchpoint-and-breakpoint", .value
= DBG_REASON_WPTANDBKPT
},
241 { .name
= "single-step" , .value
= DBG_REASON_SINGLESTEP
},
242 { .name
= "target-not-halted" , .value
= DBG_REASON_NOTHALTED
},
243 { .name
= "undefined" , .value
= DBG_REASON_UNDEFINED
},
244 { .name
= NULL
, .value
= -1 },
248 const Jim_Nvp nvp_target_endian
[] = {
249 { .name
= "big", .value
= TARGET_BIG_ENDIAN
},
250 { .name
= "little", .value
= TARGET_LITTLE_ENDIAN
},
251 { .name
= "be", .value
= TARGET_BIG_ENDIAN
},
252 { .name
= "le", .value
= TARGET_LITTLE_ENDIAN
},
253 { .name
= NULL
, .value
= -1 },
256 const Jim_Nvp nvp_reset_modes
[] = {
257 { .name
= "unknown", .value
= RESET_UNKNOWN
},
258 { .name
= "run" , .value
= RESET_RUN
},
259 { .name
= "halt" , .value
= RESET_HALT
},
260 { .name
= "init" , .value
= RESET_INIT
},
261 { .name
= NULL
, .value
= -1 },
265 max_target_number( void )
273 if( x
< t
->target_number
){
274 x
= (t
->target_number
)+1;
281 /* determine the number of the new target */
283 new_target_number( void )
288 /* number is 0 based */
292 if( x
< t
->target_number
){
293 x
= t
->target_number
;
300 static int target_continous_poll
= 1;
302 /* read a u32 from a buffer in target memory endianness */
303 u32
target_buffer_get_u32(target_t
*target
, u8
*buffer
)
305 if (target
->endianness
== TARGET_LITTLE_ENDIAN
)
306 return le_to_h_u32(buffer
);
308 return be_to_h_u32(buffer
);
311 /* read a u16 from a buffer in target memory endianness */
312 u16
target_buffer_get_u16(target_t
*target
, u8
*buffer
)
314 if (target
->endianness
== TARGET_LITTLE_ENDIAN
)
315 return le_to_h_u16(buffer
);
317 return be_to_h_u16(buffer
);
320 /* read a u8 from a buffer in target memory endianness */
321 u8
target_buffer_get_u8(target_t
*target
, u8
*buffer
)
323 return *buffer
& 0x0ff;
326 /* write a u32 to a buffer in target memory endianness */
327 void target_buffer_set_u32(target_t
*target
, u8
*buffer
, u32 value
)
329 if (target
->endianness
== TARGET_LITTLE_ENDIAN
)
330 h_u32_to_le(buffer
, value
);
332 h_u32_to_be(buffer
, value
);
335 /* write a u16 to a buffer in target memory endianness */
336 void target_buffer_set_u16(target_t
*target
, u8
*buffer
, u16 value
)
338 if (target
->endianness
== TARGET_LITTLE_ENDIAN
)
339 h_u16_to_le(buffer
, value
);
341 h_u16_to_be(buffer
, value
);
344 /* write a u8 to a buffer in target memory endianness */
345 void target_buffer_set_u8(target_t
*target
, u8
*buffer
, u8 value
)
350 /* returns a pointer to the n-th configured target */
351 target_t
* get_target_by_num(int num
)
353 target_t
*target
= all_targets
;
356 if( target
->target_number
== num
){
359 target
= target
->next
;
365 int get_num_by_target(target_t
*query_target
)
367 return query_target
->target_number
;
370 target_t
* get_current_target(command_context_t
*cmd_ctx
)
372 target_t
*target
= get_target_by_num(cmd_ctx
->current_target
);
376 LOG_ERROR("BUG: current_target out of bounds");
384 int target_poll(struct target_s
*target
)
386 /* We can't poll until after examine */
387 if (!target
->type
->examined
)
389 /* Fail silently lest we pollute the log */
392 return target
->type
->poll(target
);
395 int target_halt(struct target_s
*target
)
397 /* We can't poll until after examine */
398 if (!target
->type
->examined
)
400 LOG_ERROR("Target not examined yet");
403 return target
->type
->halt(target
);
406 int target_resume(struct target_s
*target
, int current
, u32 address
, int handle_breakpoints
, int debug_execution
)
410 /* We can't poll until after examine */
411 if (!target
->type
->examined
)
413 LOG_ERROR("Target not examined yet");
417 /* note that resume *must* be asynchronous. The CPU can halt before we poll. The CPU can
418 * even halt at the current PC as a result of a software breakpoint being inserted by (a bug?)
421 if ((retval
= target
->type
->resume(target
, current
, address
, handle_breakpoints
, debug_execution
)) != ERROR_OK
)
428 int target_process_reset(struct command_context_s
*cmd_ctx
, enum target_reset_mode reset_mode
)
433 n
= Jim_Nvp_value2name_simple( nvp_reset_modes
, reset_mode
);
434 if( n
->name
== NULL
){
435 LOG_ERROR("invalid reset mode");
439 sprintf( buf
, "ocd_process_reset %s", n
->name
);
440 retval
= Jim_Eval( interp
, buf
);
442 if(retval
!= JIM_OK
) {
443 Jim_PrintErrorMessage(interp
);
447 /* We want any events to be processed before the prompt */
448 retval
= target_call_timer_callbacks_now();
454 static int default_virt2phys(struct target_s
*target
, u32
virtual, u32
*physical
)
460 static int default_mmu(struct target_s
*target
, int *enabled
)
466 static int default_examine(struct target_s
*target
)
468 target
->type
->examined
= 1;
473 /* Targets that correctly implement init+examine, i.e.
474 * no communication with target during init:
478 int target_examine(void)
480 int retval
= ERROR_OK
;
481 target_t
*target
= all_targets
;
484 if ((retval
= target
->type
->examine(target
))!=ERROR_OK
)
486 target
= target
->next
;
491 static int target_write_memory_imp(struct target_s
*target
, u32 address
, u32 size
, u32 count
, u8
*buffer
)
493 if (!target
->type
->examined
)
495 LOG_ERROR("Target not examined yet");
498 return target
->type
->write_memory_imp(target
, address
, size
, count
, buffer
);
501 static int target_read_memory_imp(struct target_s
*target
, u32 address
, u32 size
, u32 count
, u8
*buffer
)
503 if (!target
->type
->examined
)
505 LOG_ERROR("Target not examined yet");
508 return target
->type
->read_memory_imp(target
, address
, size
, count
, buffer
);
511 static int target_soft_reset_halt_imp(struct target_s
*target
)
513 if (!target
->type
->examined
)
515 LOG_ERROR("Target not examined yet");
518 return target
->type
->soft_reset_halt_imp(target
);
521 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
)
523 if (!target
->type
->examined
)
525 LOG_ERROR("Target not examined yet");
528 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
);
531 int target_init(struct command_context_s
*cmd_ctx
)
533 target_t
*target
= all_targets
;
538 target
->type
->examined
= 0;
539 if (target
->type
->examine
== NULL
)
541 target
->type
->examine
= default_examine
;
544 if ((retval
= target
->type
->init_target(cmd_ctx
, target
)) != ERROR_OK
)
546 LOG_ERROR("target '%s' init failed", target
->type
->name
);
550 /* Set up default functions if none are provided by target */
551 if (target
->type
->virt2phys
== NULL
)
553 target
->type
->virt2phys
= default_virt2phys
;
555 target
->type
->virt2phys
= default_virt2phys
;
556 /* a non-invasive way(in terms of patches) to add some code that
557 * runs before the type->write/read_memory implementation
559 target
->type
->write_memory_imp
= target
->type
->write_memory
;
560 target
->type
->write_memory
= target_write_memory_imp
;
561 target
->type
->read_memory_imp
= target
->type
->read_memory
;
562 target
->type
->read_memory
= target_read_memory_imp
;
563 target
->type
->soft_reset_halt_imp
= target
->type
->soft_reset_halt
;
564 target
->type
->soft_reset_halt
= target_soft_reset_halt_imp
;
565 target
->type
->run_algorithm_imp
= target
->type
->run_algorithm
;
566 target
->type
->run_algorithm
= target_run_algorithm_imp
;
569 if (target
->type
->mmu
== NULL
)
571 target
->type
->mmu
= default_mmu
;
573 target
= target
->next
;
578 if((retval
= target_register_user_commands(cmd_ctx
)) != ERROR_OK
)
580 if((retval
= target_register_timer_callback(handle_target
, 100, 1, NULL
)) != ERROR_OK
)
587 int target_register_event_callback(int (*callback
)(struct target_s
*target
, enum target_event event
, void *priv
), void *priv
)
589 target_event_callback_t
**callbacks_p
= &target_event_callbacks
;
591 if (callback
== NULL
)
593 return ERROR_INVALID_ARGUMENTS
;
598 while ((*callbacks_p
)->next
)
599 callbacks_p
= &((*callbacks_p
)->next
);
600 callbacks_p
= &((*callbacks_p
)->next
);
603 (*callbacks_p
) = malloc(sizeof(target_event_callback_t
));
604 (*callbacks_p
)->callback
= callback
;
605 (*callbacks_p
)->priv
= priv
;
606 (*callbacks_p
)->next
= NULL
;
611 int target_register_timer_callback(int (*callback
)(void *priv
), int time_ms
, int periodic
, void *priv
)
613 target_timer_callback_t
**callbacks_p
= &target_timer_callbacks
;
616 if (callback
== NULL
)
618 return ERROR_INVALID_ARGUMENTS
;
623 while ((*callbacks_p
)->next
)
624 callbacks_p
= &((*callbacks_p
)->next
);
625 callbacks_p
= &((*callbacks_p
)->next
);
628 (*callbacks_p
) = malloc(sizeof(target_timer_callback_t
));
629 (*callbacks_p
)->callback
= callback
;
630 (*callbacks_p
)->periodic
= periodic
;
631 (*callbacks_p
)->time_ms
= time_ms
;
633 gettimeofday(&now
, NULL
);
634 (*callbacks_p
)->when
.tv_usec
= now
.tv_usec
+ (time_ms
% 1000) * 1000;
635 time_ms
-= (time_ms
% 1000);
636 (*callbacks_p
)->when
.tv_sec
= now
.tv_sec
+ (time_ms
/ 1000);
637 if ((*callbacks_p
)->when
.tv_usec
> 1000000)
639 (*callbacks_p
)->when
.tv_usec
= (*callbacks_p
)->when
.tv_usec
- 1000000;
640 (*callbacks_p
)->when
.tv_sec
+= 1;
643 (*callbacks_p
)->priv
= priv
;
644 (*callbacks_p
)->next
= NULL
;
649 int target_unregister_event_callback(int (*callback
)(struct target_s
*target
, enum target_event event
, void *priv
), void *priv
)
651 target_event_callback_t
**p
= &target_event_callbacks
;
652 target_event_callback_t
*c
= target_event_callbacks
;
654 if (callback
== NULL
)
656 return ERROR_INVALID_ARGUMENTS
;
661 target_event_callback_t
*next
= c
->next
;
662 if ((c
->callback
== callback
) && (c
->priv
== priv
))
676 int target_unregister_timer_callback(int (*callback
)(void *priv
), void *priv
)
678 target_timer_callback_t
**p
= &target_timer_callbacks
;
679 target_timer_callback_t
*c
= target_timer_callbacks
;
681 if (callback
== NULL
)
683 return ERROR_INVALID_ARGUMENTS
;
688 target_timer_callback_t
*next
= c
->next
;
689 if ((c
->callback
== callback
) && (c
->priv
== priv
))
703 int target_call_event_callbacks(target_t
*target
, enum target_event event
)
705 target_event_callback_t
*callback
= target_event_callbacks
;
706 target_event_callback_t
*next_callback
;
708 if (event
== TARGET_EVENT_HALTED
)
710 /* execute early halted first */
711 target_call_event_callbacks(target
, TARGET_EVENT_EARLY_HALTED
);
715 LOG_DEBUG("target event %i (%s)",
717 Jim_Nvp_value2name_simple( nvp_target_event
, event
)->name
);
719 target_handle_event( target
, event
);
723 next_callback
= callback
->next
;
724 callback
->callback(target
, event
, callback
->priv
);
725 callback
= next_callback
;
731 static int target_call_timer_callbacks_check_time(int checktime
)
733 target_timer_callback_t
*callback
= target_timer_callbacks
;
734 target_timer_callback_t
*next_callback
;
739 gettimeofday(&now
, NULL
);
743 next_callback
= callback
->next
;
745 if ((!checktime
&&callback
->periodic
)||
746 (((now
.tv_sec
>= callback
->when
.tv_sec
) && (now
.tv_usec
>= callback
->when
.tv_usec
))
747 || (now
.tv_sec
> callback
->when
.tv_sec
)))
749 if(callback
->callback
!= NULL
)
751 callback
->callback(callback
->priv
);
752 if (callback
->periodic
)
754 int time_ms
= callback
->time_ms
;
755 callback
->when
.tv_usec
= now
.tv_usec
+ (time_ms
% 1000) * 1000;
756 time_ms
-= (time_ms
% 1000);
757 callback
->when
.tv_sec
= now
.tv_sec
+ time_ms
/ 1000;
758 if (callback
->when
.tv_usec
> 1000000)
760 callback
->when
.tv_usec
= callback
->when
.tv_usec
- 1000000;
761 callback
->when
.tv_sec
+= 1;
767 if((retval
= target_unregister_timer_callback(callback
->callback
, callback
->priv
)) != ERROR_OK
)
773 callback
= next_callback
;
779 int target_call_timer_callbacks(void)
781 return target_call_timer_callbacks_check_time(1);
784 /* invoke periodic callbacks immediately */
785 int target_call_timer_callbacks_now(void)
787 return target_call_timer_callbacks_check_time(0);
790 int target_alloc_working_area(struct target_s
*target
, u32 size
, working_area_t
**area
)
792 working_area_t
*c
= target
->working_areas
;
793 working_area_t
*new_wa
= NULL
;
795 /* Reevaluate working area address based on MMU state*/
796 if (target
->working_areas
== NULL
)
800 retval
= target
->type
->mmu(target
, &enabled
);
801 if (retval
!= ERROR_OK
)
807 target
->working_area
= target
->working_area_virt
;
811 target
->working_area
= target
->working_area_phys
;
815 /* only allocate multiples of 4 byte */
818 LOG_ERROR("BUG: code tried to allocate unaligned number of bytes, padding");
819 size
= CEIL(size
, 4);
822 /* see if there's already a matching working area */
825 if ((c
->free
) && (c
->size
== size
))
833 /* if not, allocate a new one */
836 working_area_t
**p
= &target
->working_areas
;
837 u32 first_free
= target
->working_area
;
838 u32 free_size
= target
->working_area_size
;
840 LOG_DEBUG("allocating new working area");
842 c
= target
->working_areas
;
845 first_free
+= c
->size
;
846 free_size
-= c
->size
;
851 if (free_size
< size
)
853 LOG_WARNING("not enough working area available(requested %d, free %d)", size
, free_size
);
854 return ERROR_TARGET_RESOURCE_NOT_AVAILABLE
;
857 new_wa
= malloc(sizeof(working_area_t
));
860 new_wa
->address
= first_free
;
862 if (target
->backup_working_area
)
865 new_wa
->backup
= malloc(new_wa
->size
);
866 if((retval
= target
->type
->read_memory(target
, new_wa
->address
, 4, new_wa
->size
/ 4, new_wa
->backup
)) != ERROR_OK
)
868 free(new_wa
->backup
);
875 new_wa
->backup
= NULL
;
878 /* put new entry in list */
882 /* mark as used, and return the new (reused) area */
892 int target_free_working_area_restore(struct target_s
*target
, working_area_t
*area
, int restore
)
897 if (restore
&&target
->backup_working_area
)
900 if((retval
= target
->type
->write_memory(target
, area
->address
, 4, area
->size
/ 4, area
->backup
)) != ERROR_OK
)
906 /* mark user pointer invalid */
913 int target_free_working_area(struct target_s
*target
, working_area_t
*area
)
915 return target_free_working_area_restore(target
, area
, 1);
918 /* free resources and restore memory, if restoring memory fails,
919 * free up resources anyway
921 void target_free_all_working_areas_restore(struct target_s
*target
, int restore
)
923 working_area_t
*c
= target
->working_areas
;
927 working_area_t
*next
= c
->next
;
928 target_free_working_area_restore(target
, c
, restore
);
938 target
->working_areas
= NULL
;
941 void target_free_all_working_areas(struct target_s
*target
)
943 target_free_all_working_areas_restore(target
, 1);
946 int target_register_commands(struct command_context_s
*cmd_ctx
)
949 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)");
950 register_command(cmd_ctx
, NULL
, "working_area", handle_working_area_command
, COMMAND_ANY
, "set a new working space");
951 register_command(cmd_ctx
, NULL
, "virt2phys", handle_virt2phys_command
, COMMAND_ANY
, "translate a virtual address into a physical address");
952 register_command(cmd_ctx
, NULL
, "profile", handle_profile_command
, COMMAND_EXEC
, "profiling samples the CPU PC");
954 register_jim(cmd_ctx
, "target", jim_target
, "configure target" );
957 /* script procedures */
958 register_jim(cmd_ctx
, "ocd_mem2array", jim_mem2array
, "read memory and return as a TCL array for script processing");
959 register_jim(cmd_ctx
, "ocd_array2mem", jim_array2mem
, "convert a TCL array to memory locations and write the values");
963 int target_arch_state(struct target_s
*target
)
968 LOG_USER("No target has been configured");
972 LOG_USER("target state: %s",
973 Jim_Nvp_value2name_simple(nvp_target_state
,target
->state
)->name
);
975 if (target
->state
!=TARGET_HALTED
)
978 retval
=target
->type
->arch_state(target
);
982 /* Single aligned words are guaranteed to use 16 or 32 bit access
983 * mode respectively, otherwise data is handled as quickly as
986 int target_write_buffer(struct target_s
*target
, u32 address
, u32 size
, u8
*buffer
)
989 LOG_DEBUG("writing buffer of %i byte at 0x%8.8x", size
, address
);
991 if (!target
->type
->examined
)
993 LOG_ERROR("Target not examined yet");
997 if ((address
+ size
- 1) < address
)
999 /* GDB can request this when e.g. PC is 0xfffffffc*/
1000 LOG_ERROR("address+size wrapped(0x%08x, 0x%08x)", address
, size
);
1004 if (((address
% 2) == 0) && (size
== 2))
1006 return target
->type
->write_memory(target
, address
, 2, 1, buffer
);
1009 /* handle unaligned head bytes */
1012 int unaligned
= 4 - (address
% 4);
1014 if (unaligned
> size
)
1017 if ((retval
= target
->type
->write_memory(target
, address
, 1, unaligned
, buffer
)) != ERROR_OK
)
1020 buffer
+= unaligned
;
1021 address
+= unaligned
;
1025 /* handle aligned words */
1028 int aligned
= size
- (size
% 4);
1030 /* use bulk writes above a certain limit. This may have to be changed */
1033 if ((retval
= target
->type
->bulk_write_memory(target
, address
, aligned
/ 4, buffer
)) != ERROR_OK
)
1038 if ((retval
= target
->type
->write_memory(target
, address
, 4, aligned
/ 4, buffer
)) != ERROR_OK
)
1047 /* handle tail writes of less than 4 bytes */
1050 if ((retval
= target
->type
->write_memory(target
, address
, 1, size
, buffer
)) != ERROR_OK
)
1058 /* Single aligned words are guaranteed to use 16 or 32 bit access
1059 * mode respectively, otherwise data is handled as quickly as
1062 int target_read_buffer(struct target_s
*target
, u32 address
, u32 size
, u8
*buffer
)
1065 LOG_DEBUG("reading buffer of %i byte at 0x%8.8x", size
, address
);
1067 if (!target
->type
->examined
)
1069 LOG_ERROR("Target not examined yet");
1073 if ((address
+ size
- 1) < address
)
1075 /* GDB can request this when e.g. PC is 0xfffffffc*/
1076 LOG_ERROR("address+size wrapped(0x%08x, 0x%08x)", address
, size
);
1080 if (((address
% 2) == 0) && (size
== 2))
1082 return target
->type
->read_memory(target
, address
, 2, 1, buffer
);
1085 /* handle unaligned head bytes */
1088 int unaligned
= 4 - (address
% 4);
1090 if (unaligned
> size
)
1093 if ((retval
= target
->type
->read_memory(target
, address
, 1, unaligned
, buffer
)) != ERROR_OK
)
1096 buffer
+= unaligned
;
1097 address
+= unaligned
;
1101 /* handle aligned words */
1104 int aligned
= size
- (size
% 4);
1106 if ((retval
= target
->type
->read_memory(target
, address
, 4, aligned
/ 4, buffer
)) != ERROR_OK
)
1114 /* handle tail writes of less than 4 bytes */
1117 if ((retval
= target
->type
->read_memory(target
, address
, 1, size
, buffer
)) != ERROR_OK
)
1124 int target_checksum_memory(struct target_s
*target
, u32 address
, u32 size
, u32
* crc
)
1130 if (!target
->type
->examined
)
1132 LOG_ERROR("Target not examined yet");
1136 if ((retval
= target
->type
->checksum_memory(target
, address
,
1137 size
, &checksum
)) != ERROR_OK
)
1139 buffer
= malloc(size
);
1142 LOG_ERROR("error allocating buffer for section (%d bytes)", size
);
1143 return ERROR_INVALID_ARGUMENTS
;
1145 retval
= target_read_buffer(target
, address
, size
, buffer
);
1146 if (retval
!= ERROR_OK
)
1152 /* convert to target endianess */
1153 for (i
= 0; i
< (size
/sizeof(u32
)); i
++)
1156 target_data
= target_buffer_get_u32(target
, &buffer
[i
*sizeof(u32
)]);
1157 target_buffer_set_u32(target
, &buffer
[i
*sizeof(u32
)], target_data
);
1160 retval
= image_calculate_checksum( buffer
, size
, &checksum
);
1169 int target_blank_check_memory(struct target_s
*target
, u32 address
, u32 size
, u32
* blank
)
1172 if (!target
->type
->examined
)
1174 LOG_ERROR("Target not examined yet");
1178 if (target
->type
->blank_check_memory
== 0)
1179 return ERROR_TARGET_RESOURCE_NOT_AVAILABLE
;
1181 retval
= target
->type
->blank_check_memory(target
, address
, size
, blank
);
1186 int target_read_u32(struct target_s
*target
, u32 address
, u32
*value
)
1189 if (!target
->type
->examined
)
1191 LOG_ERROR("Target not examined yet");
1195 int retval
= target
->type
->read_memory(target
, address
, 4, 1, value_buf
);
1197 if (retval
== ERROR_OK
)
1199 *value
= target_buffer_get_u32(target
, value_buf
);
1200 LOG_DEBUG("address: 0x%8.8x, value: 0x%8.8x", address
, *value
);
1205 LOG_DEBUG("address: 0x%8.8x failed", address
);
1211 int target_read_u16(struct target_s
*target
, u32 address
, u16
*value
)
1214 if (!target
->type
->examined
)
1216 LOG_ERROR("Target not examined yet");
1220 int retval
= target
->type
->read_memory(target
, address
, 2, 1, value_buf
);
1222 if (retval
== ERROR_OK
)
1224 *value
= target_buffer_get_u16(target
, value_buf
);
1225 LOG_DEBUG("address: 0x%8.8x, value: 0x%4.4x", address
, *value
);
1230 LOG_DEBUG("address: 0x%8.8x failed", address
);
1236 int target_read_u8(struct target_s
*target
, u32 address
, u8
*value
)
1238 int retval
= target
->type
->read_memory(target
, address
, 1, 1, value
);
1239 if (!target
->type
->examined
)
1241 LOG_ERROR("Target not examined yet");
1245 if (retval
== ERROR_OK
)
1247 LOG_DEBUG("address: 0x%8.8x, value: 0x%2.2x", address
, *value
);
1252 LOG_DEBUG("address: 0x%8.8x failed", address
);
1258 int target_write_u32(struct target_s
*target
, u32 address
, u32 value
)
1262 if (!target
->type
->examined
)
1264 LOG_ERROR("Target not examined yet");
1268 LOG_DEBUG("address: 0x%8.8x, value: 0x%8.8x", address
, value
);
1270 target_buffer_set_u32(target
, value_buf
, value
);
1271 if ((retval
= target
->type
->write_memory(target
, address
, 4, 1, value_buf
)) != ERROR_OK
)
1273 LOG_DEBUG("failed: %i", retval
);
1279 int target_write_u16(struct target_s
*target
, u32 address
, u16 value
)
1283 if (!target
->type
->examined
)
1285 LOG_ERROR("Target not examined yet");
1289 LOG_DEBUG("address: 0x%8.8x, value: 0x%8.8x", address
, value
);
1291 target_buffer_set_u16(target
, value_buf
, value
);
1292 if ((retval
= target
->type
->write_memory(target
, address
, 2, 1, value_buf
)) != ERROR_OK
)
1294 LOG_DEBUG("failed: %i", retval
);
1300 int target_write_u8(struct target_s
*target
, u32 address
, u8 value
)
1303 if (!target
->type
->examined
)
1305 LOG_ERROR("Target not examined yet");
1309 LOG_DEBUG("address: 0x%8.8x, value: 0x%2.2x", address
, value
);
1311 if ((retval
= target
->type
->write_memory(target
, address
, 1, 1, &value
)) != ERROR_OK
)
1313 LOG_DEBUG("failed: %i", retval
);
1319 int target_register_user_commands(struct command_context_s
*cmd_ctx
)
1321 int retval
= ERROR_OK
;
1322 register_command(cmd_ctx
, NULL
, "reg", handle_reg_command
, COMMAND_EXEC
, "display or set a register");
1323 register_command(cmd_ctx
, NULL
, "poll", handle_poll_command
, COMMAND_EXEC
, "poll target state");
1324 register_command(cmd_ctx
, NULL
, "wait_halt", handle_wait_halt_command
, COMMAND_EXEC
, "wait for target halt [time (s)]");
1325 register_command(cmd_ctx
, NULL
, "halt", handle_halt_command
, COMMAND_EXEC
, "halt target");
1326 register_command(cmd_ctx
, NULL
, "resume", handle_resume_command
, COMMAND_EXEC
, "resume target [addr]");
1327 register_command(cmd_ctx
, NULL
, "step", handle_step_command
, COMMAND_EXEC
, "step one instruction from current PC or [addr]");
1328 register_command(cmd_ctx
, NULL
, "reset", handle_reset_command
, COMMAND_EXEC
, "reset target [run|halt|init] - default is run");
1329 register_command(cmd_ctx
, NULL
, "soft_reset_halt", handle_soft_reset_halt_command
, COMMAND_EXEC
, "halt the target and do a soft reset");
1331 register_command(cmd_ctx
, NULL
, "mdw", handle_md_command
, COMMAND_EXEC
, "display memory words <addr> [count]");
1332 register_command(cmd_ctx
, NULL
, "mdh", handle_md_command
, COMMAND_EXEC
, "display memory half-words <addr> [count]");
1333 register_command(cmd_ctx
, NULL
, "mdb", handle_md_command
, COMMAND_EXEC
, "display memory bytes <addr> [count]");
1335 register_command(cmd_ctx
, NULL
, "mww", handle_mw_command
, COMMAND_EXEC
, "write memory word <addr> <value> [count]");
1336 register_command(cmd_ctx
, NULL
, "mwh", handle_mw_command
, COMMAND_EXEC
, "write memory half-word <addr> <value> [count]");
1337 register_command(cmd_ctx
, NULL
, "mwb", handle_mw_command
, COMMAND_EXEC
, "write memory byte <addr> <value> [count]");
1339 register_command(cmd_ctx
, NULL
, "bp", handle_bp_command
, COMMAND_EXEC
, "set breakpoint <address> <length> [hw]");
1340 register_command(cmd_ctx
, NULL
, "rbp", handle_rbp_command
, COMMAND_EXEC
, "remove breakpoint <adress>");
1341 register_command(cmd_ctx
, NULL
, "wp", handle_wp_command
, COMMAND_EXEC
, "set watchpoint <address> <length> <r/w/a> [value] [mask]");
1342 register_command(cmd_ctx
, NULL
, "rwp", handle_rwp_command
, COMMAND_EXEC
, "remove watchpoint <adress>");
1344 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]");
1345 register_command(cmd_ctx
, NULL
, "dump_image", handle_dump_image_command
, COMMAND_EXEC
, "dump_image <file> <address> <size>");
1346 register_command(cmd_ctx
, NULL
, "verify_image", handle_verify_image_command
, COMMAND_EXEC
, "verify_image <file> [offset] [type]");
1348 if((retval
= target_request_register_commands(cmd_ctx
)) != ERROR_OK
)
1350 if((retval
= trace_register_commands(cmd_ctx
)) != ERROR_OK
)
1357 int handle_targets_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1360 target_t
*target
= all_targets
;
1364 /* try as tcltarget name */
1365 for( target
= all_targets
; target
; target
= target
->next
){
1366 if( target
->cmd_name
){
1367 if( 0 == strcmp( args
[0], target
->cmd_name
) ){
1373 /* no match, try as number */
1375 int num
= strtoul(args
[0], &cp
, 0 );
1377 /* then it was not a number */
1378 command_print( cmd_ctx
, "Target: %s unknown, try one of:\n", args
[0] );
1382 target
= get_target_by_num( num
);
1383 if( target
== NULL
){
1384 command_print(cmd_ctx
,"Target: %s is unknown, try one of:\n", args
[0] );
1388 cmd_ctx
->current_target
= target
->target_number
;
1393 target
= all_targets
;
1394 command_print(cmd_ctx
, " CmdName Type Endian ChainPos State ");
1395 command_print(cmd_ctx
, "-- ---------- ---------- ---------- -------- ----------");
1398 /* XX: abcdefghij abcdefghij abcdefghij abcdefghij */
1399 command_print(cmd_ctx
, "%2d: %-10s %-10s %-10s %8d %s",
1400 target
->target_number
,
1403 Jim_Nvp_value2name_simple( nvp_target_endian
, target
->endianness
)->name
,
1404 target
->chain_position
,
1405 Jim_Nvp_value2name_simple( nvp_target_state
, target
->state
)->name
);
1406 target
= target
->next
;
1414 int handle_working_area_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1416 int retval
= ERROR_OK
;
1417 target_t
*target
= NULL
;
1419 if ((argc
< 4) || (argc
> 5))
1421 return ERROR_COMMAND_SYNTAX_ERROR
;
1424 target
= get_target_by_num(strtoul(args
[0], NULL
, 0));
1427 return ERROR_COMMAND_SYNTAX_ERROR
;
1429 target_free_all_working_areas(target
);
1431 target
->working_area_phys
= target
->working_area_virt
= strtoul(args
[1], NULL
, 0);
1434 target
->working_area_virt
= strtoul(args
[4], NULL
, 0);
1436 target
->working_area_size
= strtoul(args
[2], NULL
, 0);
1438 if (strcmp(args
[3], "backup") == 0)
1440 target
->backup_working_area
= 1;
1442 else if (strcmp(args
[3], "nobackup") == 0)
1444 target
->backup_working_area
= 0;
1448 LOG_ERROR("unrecognized <backup|nobackup> argument (%s)", args
[3]);
1449 return ERROR_COMMAND_SYNTAX_ERROR
;
1456 // every 300ms we check for reset & powerdropout and issue a "reset halt" if
1459 static int powerDropout
;
1460 static int srstAsserted
;
1462 static int runPowerRestore
;
1463 static int runPowerDropout
;
1464 static int runSrstAsserted
;
1465 static int runSrstDeasserted
;
1467 static int sense_handler()
1469 static int prevSrstAsserted
= 0;
1470 static int prevPowerdropout
= 0;
1473 if ((retval
=jtag_power_dropout(&powerDropout
))!=ERROR_OK
)
1477 powerRestored
= prevPowerdropout
&& !powerDropout
;
1480 runPowerRestore
= 1;
1483 long long current
= timeval_ms();
1484 static long long lastPower
= 0;
1485 int waitMore
= lastPower
+ 2000 > current
;
1486 if (powerDropout
&& !waitMore
)
1488 runPowerDropout
= 1;
1489 lastPower
= current
;
1492 if ((retval
=jtag_srst_asserted(&srstAsserted
))!=ERROR_OK
)
1496 srstDeasserted
= prevSrstAsserted
&& !srstAsserted
;
1498 static long long lastSrst
= 0;
1499 waitMore
= lastSrst
+ 2000 > current
;
1500 if (srstDeasserted
&& !waitMore
)
1502 runSrstDeasserted
= 1;
1506 if (!prevSrstAsserted
&& srstAsserted
)
1508 runSrstAsserted
= 1;
1511 prevSrstAsserted
= srstAsserted
;
1512 prevPowerdropout
= powerDropout
;
1514 if (srstDeasserted
|| powerRestored
)
1516 /* Other than logging the event we can't do anything here.
1517 * Issuing a reset is a particularly bad idea as we might
1518 * be inside a reset already.
1526 /* process target state changes */
1527 int handle_target(void *priv
)
1529 int retval
= ERROR_OK
;
1531 /* we do not want to recurse here... */
1532 static int recursive
= 0;
1537 /* danger! running these procedures can trigger srst assertions and power dropouts.
1538 * We need to avoid an infinite loop/recursion here and we do that by
1539 * clearing the flags after running these events.
1541 int did_something
= 0;
1542 if (runSrstAsserted
)
1544 Jim_Eval( interp
, "srst_asserted");
1547 if (runSrstDeasserted
)
1549 Jim_Eval( interp
, "srst_deasserted");
1552 if (runPowerDropout
)
1554 Jim_Eval( interp
, "power_dropout");
1557 if (runPowerRestore
)
1559 Jim_Eval( interp
, "power_restore");
1565 /* clear detect flags */
1569 /* clear action flags */
1572 runSrstDeasserted
=0;
1579 target_t
*target
= all_targets
;
1584 /* only poll target if we've got power and srst isn't asserted */
1585 if (target_continous_poll
&&!powerDropout
&&!srstAsserted
)
1587 /* polling may fail silently until the target has been examined */
1588 if((retval
= target_poll(target
)) != ERROR_OK
)
1592 target
= target
->next
;
1599 int handle_reg_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1608 target
= get_current_target(cmd_ctx
);
1610 /* list all available registers for the current target */
1613 reg_cache_t
*cache
= target
->reg_cache
;
1619 for (i
= 0; i
< cache
->num_regs
; i
++)
1621 value
= buf_to_str(cache
->reg_list
[i
].value
, cache
->reg_list
[i
].size
, 16);
1622 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
);
1625 cache
= cache
->next
;
1631 /* access a single register by its ordinal number */
1632 if ((args
[0][0] >= '0') && (args
[0][0] <= '9'))
1634 int num
= strtoul(args
[0], NULL
, 0);
1635 reg_cache_t
*cache
= target
->reg_cache
;
1641 for (i
= 0; i
< cache
->num_regs
; i
++)
1645 reg
= &cache
->reg_list
[i
];
1651 cache
= cache
->next
;
1656 command_print(cmd_ctx
, "%i is out of bounds, the current target has only %i registers (0 - %i)", num
, count
, count
- 1);
1659 } else /* access a single register by its name */
1661 reg
= register_get_by_name(target
->reg_cache
, args
[0], 1);
1665 command_print(cmd_ctx
, "register %s not found in current target", args
[0]);
1670 /* display a register */
1671 if ((argc
== 1) || ((argc
== 2) && !((args
[1][0] >= '0') && (args
[1][0] <= '9'))))
1673 if ((argc
== 2) && (strcmp(args
[1], "force") == 0))
1676 if (reg
->valid
== 0)
1678 reg_arch_type_t
*arch_type
= register_get_arch_type(reg
->arch_type
);
1679 arch_type
->get(reg
);
1681 value
= buf_to_str(reg
->value
, reg
->size
, 16);
1682 command_print(cmd_ctx
, "%s (/%i): 0x%s", reg
->name
, reg
->size
, value
);
1687 /* set register value */
1690 u8
*buf
= malloc(CEIL(reg
->size
, 8));
1691 str_to_buf(args
[1], strlen(args
[1]), buf
, reg
->size
, 0);
1693 reg_arch_type_t
*arch_type
= register_get_arch_type(reg
->arch_type
);
1694 arch_type
->set(reg
, buf
);
1696 value
= buf_to_str(reg
->value
, reg
->size
, 16);
1697 command_print(cmd_ctx
, "%s (/%i): 0x%s", reg
->name
, reg
->size
, value
);
1705 command_print(cmd_ctx
, "usage: reg <#|name> [value]");
1711 int handle_poll_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1713 int retval
= ERROR_OK
;
1714 target_t
*target
= get_current_target(cmd_ctx
);
1718 if((retval
= target_poll(target
)) != ERROR_OK
)
1720 if((retval
= target_arch_state(target
)) != ERROR_OK
)
1726 if (strcmp(args
[0], "on") == 0)
1728 target_continous_poll
= 1;
1730 else if (strcmp(args
[0], "off") == 0)
1732 target_continous_poll
= 0;
1736 command_print(cmd_ctx
, "arg is \"on\" or \"off\"");
1740 return ERROR_COMMAND_SYNTAX_ERROR
;
1747 int handle_wait_halt_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1755 ms
= strtoul(args
[0], &end
, 0) * 1000;
1758 command_print(cmd_ctx
, "usage: %s [seconds]", cmd
);
1762 target_t
*target
= get_current_target(cmd_ctx
);
1764 return target_wait_state(target
, TARGET_HALTED
, ms
);
1767 int target_wait_state(target_t
*target
, enum target_state state
, int ms
)
1770 struct timeval timeout
, now
;
1772 gettimeofday(&timeout
, NULL
);
1773 timeval_add_time(&timeout
, 0, ms
* 1000);
1777 if ((retval
=target_poll(target
))!=ERROR_OK
)
1780 if (target
->state
== state
)
1787 LOG_DEBUG("waiting for target %s...",
1788 Jim_Nvp_value2name_simple(nvp_target_state
,state
)->name
);
1791 gettimeofday(&now
, NULL
);
1792 if ((now
.tv_sec
> timeout
.tv_sec
) || ((now
.tv_sec
== timeout
.tv_sec
) && (now
.tv_usec
>= timeout
.tv_usec
)))
1794 LOG_ERROR("timed out while waiting for target %s",
1795 Jim_Nvp_value2name_simple(nvp_target_state
,state
)->name
);
1803 int handle_halt_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1806 target_t
*target
= get_current_target(cmd_ctx
);
1810 if ((retval
= target_halt(target
)) != ERROR_OK
)
1815 return handle_wait_halt_command(cmd_ctx
, cmd
, args
, argc
);
1818 int handle_soft_reset_halt_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1820 target_t
*target
= get_current_target(cmd_ctx
);
1822 LOG_USER("requesting target halt and executing a soft reset");
1824 target
->type
->soft_reset_halt(target
);
1829 int handle_reset_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1832 enum target_reset_mode reset_mode
= RESET_RUN
;
1836 n
= Jim_Nvp_name2value_simple( nvp_reset_modes
, args
[0] );
1837 if( (n
->name
== NULL
) || (n
->value
== RESET_UNKNOWN
) ){
1838 return ERROR_COMMAND_SYNTAX_ERROR
;
1840 reset_mode
= n
->value
;
1843 /* reset *all* targets */
1844 return target_process_reset(cmd_ctx
, reset_mode
);
1848 int handle_resume_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1851 target_t
*target
= get_current_target(cmd_ctx
);
1853 target_handle_event( target
, TARGET_EVENT_OLD_pre_resume
);
1856 retval
= target_resume(target
, 1, 0, 1, 0); /* current pc, addr = 0, handle breakpoints, not debugging */
1858 retval
= target_resume(target
, 0, strtoul(args
[0], NULL
, 0), 1, 0); /* addr = args[0], handle breakpoints, not debugging */
1861 retval
= ERROR_COMMAND_SYNTAX_ERROR
;
1867 int handle_step_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1869 target_t
*target
= get_current_target(cmd_ctx
);
1874 return target
->type
->step(target
, 1, 0, 1); /* current pc, addr = 0, handle breakpoints */
1877 return target
->type
->step(target
, 0, strtoul(args
[0], NULL
, 0), 1); /* addr = args[0], handle breakpoints */
1882 int handle_md_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1884 const int line_bytecnt
= 32;
1897 target_t
*target
= get_current_target(cmd_ctx
);
1903 count
= strtoul(args
[1], NULL
, 0);
1905 address
= strtoul(args
[0], NULL
, 0);
1911 size
= 4; line_modulo
= line_bytecnt
/ 4;
1914 size
= 2; line_modulo
= line_bytecnt
/ 2;
1917 size
= 1; line_modulo
= line_bytecnt
/ 1;
1923 buffer
= calloc(count
, size
);
1924 retval
= target
->type
->read_memory(target
, address
, size
, count
, buffer
);
1925 if (retval
== ERROR_OK
)
1929 for (i
= 0; i
< count
; i
++)
1931 if (i
%line_modulo
== 0)
1932 output_len
+= snprintf(output
+ output_len
, 128 - output_len
, "0x%8.8x: ", address
+ (i
*size
));
1937 output_len
+= snprintf(output
+ output_len
, 128 - output_len
, "%8.8x ", target_buffer_get_u32(target
, &buffer
[i
*4]));
1940 output_len
+= snprintf(output
+ output_len
, 128 - output_len
, "%4.4x ", target_buffer_get_u16(target
, &buffer
[i
*2]));
1943 output_len
+= snprintf(output
+ output_len
, 128 - output_len
, "%2.2x ", buffer
[i
*1]);
1947 if ((i
%line_modulo
== line_modulo
-1) || (i
== count
- 1))
1949 command_print(cmd_ctx
, output
);
1960 int handle_mw_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1967 target_t
*target
= get_current_target(cmd_ctx
);
1970 if ((argc
< 2) || (argc
> 3))
1971 return ERROR_COMMAND_SYNTAX_ERROR
;
1973 address
= strtoul(args
[0], NULL
, 0);
1974 value
= strtoul(args
[1], NULL
, 0);
1976 count
= strtoul(args
[2], NULL
, 0);
1982 target_buffer_set_u32(target
, value_buf
, value
);
1986 target_buffer_set_u16(target
, value_buf
, value
);
1990 value_buf
[0] = value
;
1993 return ERROR_COMMAND_SYNTAX_ERROR
;
1995 for (i
=0; i
<count
; i
++)
2001 retval
= target
->type
->write_memory(target
, address
+ i
*wordsize
, 4, 1, value_buf
);
2004 retval
= target
->type
->write_memory(target
, address
+ i
*wordsize
, 2, 1, value_buf
);
2007 retval
= target
->type
->write_memory(target
, address
+ i
*wordsize
, 1, 1, value_buf
);
2014 if (retval
!=ERROR_OK
)
2024 int handle_load_image_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2030 u32 max_address
=0xffffffff;
2032 int retval
, retvaltemp
;
2036 duration_t duration
;
2037 char *duration_text
;
2039 target_t
*target
= get_current_target(cmd_ctx
);
2041 if ((argc
< 1)||(argc
> 5))
2043 return ERROR_COMMAND_SYNTAX_ERROR
;
2046 /* a base address isn't always necessary, default to 0x0 (i.e. don't relocate) */
2049 image
.base_address_set
= 1;
2050 image
.base_address
= strtoul(args
[1], NULL
, 0);
2054 image
.base_address_set
= 0;
2058 image
.start_address_set
= 0;
2062 min_address
=strtoul(args
[3], NULL
, 0);
2066 max_address
=strtoul(args
[4], NULL
, 0)+min_address
;
2069 if (min_address
>max_address
)
2071 return ERROR_COMMAND_SYNTAX_ERROR
;
2075 duration_start_measure(&duration
);
2077 if (image_open(&image
, args
[0], (argc
>= 3) ? args
[2] : NULL
) != ERROR_OK
)
2084 for (i
= 0; i
< image
.num_sections
; i
++)
2086 buffer
= malloc(image
.sections
[i
].size
);
2089 command_print(cmd_ctx
, "error allocating buffer for section (%d bytes)", image
.sections
[i
].size
);
2093 if ((retval
= image_read_section(&image
, i
, 0x0, image
.sections
[i
].size
, buffer
, &buf_cnt
)) != ERROR_OK
)
2103 /* DANGER!!! beware of unsigned comparision here!!! */
2105 if ((image
.sections
[i
].base_address
+buf_cnt
>=min_address
)&&
2106 (image
.sections
[i
].base_address
<max_address
))
2108 if (image
.sections
[i
].base_address
<min_address
)
2110 /* clip addresses below */
2111 offset
+=min_address
-image
.sections
[i
].base_address
;
2115 if (image
.sections
[i
].base_address
+buf_cnt
>max_address
)
2117 length
-=(image
.sections
[i
].base_address
+buf_cnt
)-max_address
;
2120 if ((retval
= target_write_buffer(target
, image
.sections
[i
].base_address
+offset
, length
, buffer
+offset
)) != ERROR_OK
)
2125 image_size
+= length
;
2126 command_print(cmd_ctx
, "%u byte written at address 0x%8.8x", length
, image
.sections
[i
].base_address
+offset
);
2132 if((retvaltemp
= duration_stop_measure(&duration
, &duration_text
)) != ERROR_OK
)
2134 image_close(&image
);
2138 if (retval
==ERROR_OK
)
2140 command_print(cmd_ctx
, "downloaded %u byte in %s", image_size
, duration_text
);
2142 free(duration_text
);
2144 image_close(&image
);
2150 int handle_dump_image_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2157 int retval
=ERROR_OK
, retvaltemp
;
2159 duration_t duration
;
2160 char *duration_text
;
2162 target_t
*target
= get_current_target(cmd_ctx
);
2166 command_print(cmd_ctx
, "usage: dump_image <filename> <address> <size>");
2170 address
= strtoul(args
[1], NULL
, 0);
2171 size
= strtoul(args
[2], NULL
, 0);
2173 if ((address
& 3) || (size
& 3))
2175 command_print(cmd_ctx
, "only 32-bit aligned address and size are supported");
2179 if (fileio_open(&fileio
, args
[0], FILEIO_WRITE
, FILEIO_BINARY
) != ERROR_OK
)
2184 duration_start_measure(&duration
);
2189 u32 this_run_size
= (size
> 560) ? 560 : size
;
2191 retval
= target
->type
->read_memory(target
, address
, 4, this_run_size
/ 4, buffer
);
2192 if (retval
!= ERROR_OK
)
2197 retval
= fileio_write(&fileio
, this_run_size
, buffer
, &size_written
);
2198 if (retval
!= ERROR_OK
)
2203 size
-= this_run_size
;
2204 address
+= this_run_size
;
2207 if((retvaltemp
= fileio_close(&fileio
)) != ERROR_OK
)
2210 if((retvaltemp
= duration_stop_measure(&duration
, &duration_text
)) != ERROR_OK
)
2213 if (retval
==ERROR_OK
)
2215 command_print(cmd_ctx
, "dumped %"PRIi64
" byte in %s", fileio
.size
, duration_text
);
2217 free(duration_text
);
2222 int handle_verify_image_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2228 int retval
, retvaltemp
;
2230 u32 mem_checksum
= 0;
2234 duration_t duration
;
2235 char *duration_text
;
2237 target_t
*target
= get_current_target(cmd_ctx
);
2241 return ERROR_COMMAND_SYNTAX_ERROR
;
2246 LOG_ERROR("no target selected");
2250 duration_start_measure(&duration
);
2254 image
.base_address_set
= 1;
2255 image
.base_address
= strtoul(args
[1], NULL
, 0);
2259 image
.base_address_set
= 0;
2260 image
.base_address
= 0x0;
2263 image
.start_address_set
= 0;
2265 if ((retval
=image_open(&image
, args
[0], (argc
== 3) ? args
[2] : NULL
)) != ERROR_OK
)
2272 for (i
= 0; i
< image
.num_sections
; i
++)
2274 buffer
= malloc(image
.sections
[i
].size
);
2277 command_print(cmd_ctx
, "error allocating buffer for section (%d bytes)", image
.sections
[i
].size
);
2280 if ((retval
= image_read_section(&image
, i
, 0x0, image
.sections
[i
].size
, buffer
, &buf_cnt
)) != ERROR_OK
)
2286 /* calculate checksum of image */
2287 image_calculate_checksum( buffer
, buf_cnt
, &checksum
);
2289 retval
= target_checksum_memory(target
, image
.sections
[i
].base_address
, buf_cnt
, &mem_checksum
);
2290 if( retval
!= ERROR_OK
)
2296 if( checksum
!= mem_checksum
)
2298 /* failed crc checksum, fall back to a binary compare */
2301 command_print(cmd_ctx
, "checksum mismatch - attempting binary compare");
2303 data
= (u8
*)malloc(buf_cnt
);
2305 /* Can we use 32bit word accesses? */
2307 int count
= buf_cnt
;
2308 if ((count
% 4) == 0)
2313 retval
= target
->type
->read_memory(target
, image
.sections
[i
].base_address
, size
, count
, data
);
2314 if (retval
== ERROR_OK
)
2317 for (t
= 0; t
< buf_cnt
; t
++)
2319 if (data
[t
] != buffer
[t
])
2321 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
]);
2338 image_size
+= buf_cnt
;
2342 if((retvaltemp
= duration_stop_measure(&duration
, &duration_text
)) != ERROR_OK
)
2344 image_close(&image
);
2348 if (retval
==ERROR_OK
)
2350 command_print(cmd_ctx
, "verified %u bytes in %s", image_size
, duration_text
);
2352 free(duration_text
);
2354 image_close(&image
);
2359 int handle_bp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2362 target_t
*target
= get_current_target(cmd_ctx
);
2366 breakpoint_t
*breakpoint
= target
->breakpoints
;
2370 if (breakpoint
->type
== BKPT_SOFT
)
2372 char* buf
= buf_to_str(breakpoint
->orig_instr
, breakpoint
->length
, 16);
2373 command_print(cmd_ctx
, "0x%8.8x, 0x%x, %i, 0x%s", breakpoint
->address
, breakpoint
->length
, breakpoint
->set
, buf
);
2378 command_print(cmd_ctx
, "0x%8.8x, 0x%x, %i", breakpoint
->address
, breakpoint
->length
, breakpoint
->set
);
2380 breakpoint
= breakpoint
->next
;
2388 length
= strtoul(args
[1], NULL
, 0);
2391 if (strcmp(args
[2], "hw") == 0)
2394 if ((retval
= breakpoint_add(target
, strtoul(args
[0], NULL
, 0), length
, hw
)) != ERROR_OK
)
2396 LOG_ERROR("Failure setting breakpoints");
2400 command_print(cmd_ctx
, "breakpoint added at address 0x%8.8x", strtoul(args
[0], NULL
, 0));
2405 command_print(cmd_ctx
, "usage: bp <address> <length> ['hw']");
2411 int handle_rbp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2413 target_t
*target
= get_current_target(cmd_ctx
);
2416 breakpoint_remove(target
, strtoul(args
[0], NULL
, 0));
2421 int handle_wp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2423 target_t
*target
= get_current_target(cmd_ctx
);
2428 watchpoint_t
*watchpoint
= target
->watchpoints
;
2432 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
);
2433 watchpoint
= watchpoint
->next
;
2438 enum watchpoint_rw type
= WPT_ACCESS
;
2439 u32 data_value
= 0x0;
2440 u32 data_mask
= 0xffffffff;
2456 command_print(cmd_ctx
, "usage: wp <address> <length> [r/w/a] [value] [mask]");
2462 data_value
= strtoul(args
[3], NULL
, 0);
2466 data_mask
= strtoul(args
[4], NULL
, 0);
2469 if ((retval
= watchpoint_add(target
, strtoul(args
[0], NULL
, 0),
2470 strtoul(args
[1], NULL
, 0), type
, data_value
, data_mask
)) != ERROR_OK
)
2472 LOG_ERROR("Failure setting breakpoints");
2477 command_print(cmd_ctx
, "usage: wp <address> <length> [r/w/a] [value] [mask]");
2483 int handle_rwp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2485 target_t
*target
= get_current_target(cmd_ctx
);
2488 watchpoint_remove(target
, strtoul(args
[0], NULL
, 0));
2493 int handle_virt2phys_command(command_context_t
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2496 target_t
*target
= get_current_target(cmd_ctx
);
2502 return ERROR_COMMAND_SYNTAX_ERROR
;
2504 va
= strtoul(args
[0], NULL
, 0);
2506 retval
= target
->type
->virt2phys(target
, va
, &pa
);
2507 if (retval
== ERROR_OK
)
2509 command_print(cmd_ctx
, "Physical address 0x%08x", pa
);
2513 /* lower levels will have logged a detailed error which is
2514 * forwarded to telnet/GDB session.
2519 static void writeLong(FILE *f
, int l
)
2524 char c
=(l
>>(i
*8))&0xff;
2525 fwrite(&c
, 1, 1, f
);
2529 static void writeString(FILE *f
, char *s
)
2531 fwrite(s
, 1, strlen(s
), f
);
2536 // Dump a gmon.out histogram file.
2537 static void writeGmon(u32
*samples
, int sampleNum
, char *filename
)
2540 FILE *f
=fopen(filename
, "w");
2543 fwrite("gmon", 1, 4, f
);
2544 writeLong(f
, 0x00000001); // Version
2545 writeLong(f
, 0); // padding
2546 writeLong(f
, 0); // padding
2547 writeLong(f
, 0); // padding
2549 fwrite("", 1, 1, f
); // GMON_TAG_TIME_HIST
2551 // figure out bucket size
2554 for (i
=0; i
<sampleNum
; i
++)
2566 int addressSpace
=(max
-min
+1);
2568 static int const maxBuckets
=256*1024; // maximum buckets.
2569 int length
=addressSpace
;
2570 if (length
> maxBuckets
)
2574 int *buckets
=malloc(sizeof(int)*length
);
2580 memset(buckets
, 0, sizeof(int)*length
);
2581 for (i
=0; i
<sampleNum
;i
++)
2583 u32 address
=samples
[i
];
2584 long long a
=address
-min
;
2585 long long b
=length
-1;
2586 long long c
=addressSpace
-1;
2587 int index
=(a
*b
)/c
; // danger!!!! int32 overflows
2591 // append binary memory gmon.out &profile_hist_hdr ((char*)&profile_hist_hdr + sizeof(struct gmon_hist_hdr))
2592 writeLong(f
, min
); // low_pc
2593 writeLong(f
, max
); // high_pc
2594 writeLong(f
, length
); // # of samples
2595 writeLong(f
, 64000000); // 64MHz
2596 writeString(f
, "seconds");
2597 for (i
=0; i
<(15-strlen("seconds")); i
++)
2599 fwrite("", 1, 1, f
); // padding
2601 writeString(f
, "s");
2603 // append binary memory gmon.out profile_hist_data (profile_hist_data + profile_hist_hdr.hist_size)
2605 char *data
=malloc(2*length
);
2608 for (i
=0; i
<length
;i
++)
2617 data
[i
*2+1]=(val
>>8)&0xff;
2620 fwrite(data
, 1, length
*2, f
);
2630 /* profiling samples the CPU PC as quickly as OpenOCD is able, which will be used as a random sampling of PC */
2631 int handle_profile_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2633 target_t
*target
= get_current_target(cmd_ctx
);
2634 struct timeval timeout
, now
;
2636 gettimeofday(&timeout
, NULL
);
2639 return ERROR_COMMAND_SYNTAX_ERROR
;
2642 timeval_add_time(&timeout
, strtoul(args
[0], &end
, 0), 0);
2648 command_print(cmd_ctx
, "Starting profiling. Halting and resuming the target as often as we can...");
2650 static const int maxSample
=10000;
2651 u32
*samples
=malloc(sizeof(u32
)*maxSample
);
2656 int retval
=ERROR_OK
;
2657 // hopefully it is safe to cache! We want to stop/restart as quickly as possible.
2658 reg_t
*reg
= register_get_by_name(target
->reg_cache
, "pc", 1);
2662 target_poll(target
);
2663 if (target
->state
== TARGET_HALTED
)
2665 u32 t
=*((u32
*)reg
->value
);
2666 samples
[numSamples
++]=t
;
2667 retval
= target_resume(target
, 1, 0, 0, 0); /* current pc, addr = 0, do not handle breakpoints, not debugging */
2668 target_poll(target
);
2669 alive_sleep(10); // sleep 10ms, i.e. <100 samples/second.
2670 } else if (target
->state
== TARGET_RUNNING
)
2672 // We want to quickly sample the PC.
2673 if((retval
= target_halt(target
)) != ERROR_OK
)
2680 command_print(cmd_ctx
, "Target not halted or running");
2684 if (retval
!=ERROR_OK
)
2689 gettimeofday(&now
, NULL
);
2690 if ((numSamples
>=maxSample
) || ((now
.tv_sec
>= timeout
.tv_sec
) && (now
.tv_usec
>= timeout
.tv_usec
)))
2692 command_print(cmd_ctx
, "Profiling completed. %d samples.", numSamples
);
2693 if((retval
= target_poll(target
)) != ERROR_OK
)
2698 if (target
->state
== TARGET_HALTED
)
2700 target_resume(target
, 1, 0, 0, 0); /* current pc, addr = 0, do not handle breakpoints, not debugging */
2702 if((retval
= target_poll(target
)) != ERROR_OK
)
2707 writeGmon(samples
, numSamples
, args
[1]);
2708 command_print(cmd_ctx
, "Wrote %s", args
[1]);
2717 static int new_int_array_element(Jim_Interp
* interp
, const char *varname
, int idx
, u32 val
)
2720 Jim_Obj
*nameObjPtr
, *valObjPtr
;
2723 namebuf
= alloc_printf("%s(%d)", varname
, idx
);
2727 nameObjPtr
= Jim_NewStringObj(interp
, namebuf
, -1);
2728 valObjPtr
= Jim_NewIntObj(interp
, val
);
2729 if (!nameObjPtr
|| !valObjPtr
)
2735 Jim_IncrRefCount(nameObjPtr
);
2736 Jim_IncrRefCount(valObjPtr
);
2737 result
= Jim_SetVariable(interp
, nameObjPtr
, valObjPtr
);
2738 Jim_DecrRefCount(interp
, nameObjPtr
);
2739 Jim_DecrRefCount(interp
, valObjPtr
);
2741 /* printf("%s(%d) <= 0%08x\n", varname, idx, val); */
2745 static int jim_mem2array(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *argv
)
2747 command_context_t
*context
;
2750 context
= Jim_GetAssocData(interp
, "context");
2751 if (context
== NULL
)
2753 LOG_ERROR("mem2array: no command context");
2756 target
= get_current_target(context
);
2759 LOG_ERROR("mem2array: no current target");
2763 return target_mem2array(interp
, target
, argc
,argv
);
2766 static int target_mem2array(Jim_Interp
*interp
, target_t
*target
, int argc
, Jim_Obj
*const *argv
)
2774 const char *varname
;
2776 int i
, n
, e
, retval
;
2778 /* argv[1] = name of array to receive the data
2779 * argv[2] = desired width
2780 * argv[3] = memory address
2781 * argv[4] = count of times to read
2784 Jim_WrongNumArgs(interp
, 1, argv
, "varname width addr nelems");
2787 varname
= Jim_GetString(argv
[1], &len
);
2788 /* given "foo" get space for worse case "foo(%d)" .. add 20 */
2790 e
= Jim_GetLong(interp
, argv
[2], &l
);
2796 e
= Jim_GetLong(interp
, argv
[3], &l
);
2801 e
= Jim_GetLong(interp
, argv
[4], &l
);
2817 Jim_SetResult(interp
, Jim_NewEmptyStringObj(interp
));
2818 Jim_AppendStrings( interp
, Jim_GetResult(interp
), "Invalid width param, must be 8/16/32", NULL
);
2822 Jim_SetResult(interp
, Jim_NewEmptyStringObj(interp
));
2823 Jim_AppendStrings(interp
, Jim_GetResult(interp
), "mem2array: zero width read?", NULL
);
2826 if ((addr
+ (len
* width
)) < addr
) {
2827 Jim_SetResult(interp
, Jim_NewEmptyStringObj(interp
));
2828 Jim_AppendStrings(interp
, Jim_GetResult(interp
), "mem2array: addr + len - wraps to zero?", NULL
);
2831 /* absurd transfer size? */
2833 Jim_SetResult(interp
, Jim_NewEmptyStringObj(interp
));
2834 Jim_AppendStrings(interp
, Jim_GetResult(interp
), "mem2array: absurd > 64K item request", NULL
);
2839 ((width
== 2) && ((addr
& 1) == 0)) ||
2840 ((width
== 4) && ((addr
& 3) == 0))) {
2844 Jim_SetResult(interp
, Jim_NewEmptyStringObj(interp
));
2845 sprintf(buf
, "mem2array address: 0x%08x is not aligned for %d byte reads", addr
, width
);
2846 Jim_AppendStrings(interp
, Jim_GetResult(interp
), buf
, NULL
);
2857 /* Slurp... in buffer size chunks */
2859 count
= len
; /* in objects.. */
2860 if (count
> (sizeof(buffer
)/width
)) {
2861 count
= (sizeof(buffer
)/width
);
2864 retval
= target
->type
->read_memory( target
, addr
, width
, count
, buffer
);
2865 if (retval
!= ERROR_OK
) {
2867 LOG_ERROR("mem2array: Read @ 0x%08x, w=%d, cnt=%d, failed", addr
, width
, count
);
2868 Jim_SetResult(interp
, Jim_NewEmptyStringObj(interp
));
2869 Jim_AppendStrings(interp
, Jim_GetResult(interp
), "mem2array: cannot read memory", NULL
);
2873 v
= 0; /* shut up gcc */
2874 for (i
= 0 ;i
< count
;i
++, n
++) {
2877 v
= target_buffer_get_u32(target
, &buffer
[i
*width
]);
2880 v
= target_buffer_get_u16(target
, &buffer
[i
*width
]);
2883 v
= buffer
[i
] & 0x0ff;
2886 new_int_array_element(interp
, varname
, n
, v
);
2892 Jim_SetResult(interp
, Jim_NewEmptyStringObj(interp
));
2897 static int get_int_array_element(Jim_Interp
* interp
, const char *varname
, int idx
, u32
*val
)
2900 Jim_Obj
*nameObjPtr
, *valObjPtr
;
2904 namebuf
= alloc_printf("%s(%d)", varname
, idx
);
2908 nameObjPtr
= Jim_NewStringObj(interp
, namebuf
, -1);
2915 Jim_IncrRefCount(nameObjPtr
);
2916 valObjPtr
= Jim_GetVariable(interp
, nameObjPtr
, JIM_ERRMSG
);
2917 Jim_DecrRefCount(interp
, nameObjPtr
);
2919 if (valObjPtr
== NULL
)
2922 result
= Jim_GetLong(interp
, valObjPtr
, &l
);
2923 /* printf("%s(%d) => 0%08x\n", varname, idx, val); */
2928 static int jim_array2mem(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *argv
)
2930 command_context_t
*context
;
2933 context
= Jim_GetAssocData(interp
, "context");
2934 if (context
== NULL
){
2935 LOG_ERROR("array2mem: no command context");
2938 target
= get_current_target(context
);
2939 if (target
== NULL
){
2940 LOG_ERROR("array2mem: no current target");
2944 return target_array2mem( interp
,target
, argc
, argv
);
2948 static int target_array2mem(Jim_Interp
*interp
, target_t
*target
, int argc
, Jim_Obj
*const *argv
)
2956 const char *varname
;
2958 int i
, n
, e
, retval
;
2960 /* argv[1] = name of array to get the data
2961 * argv[2] = desired width
2962 * argv[3] = memory address
2963 * argv[4] = count to write
2966 Jim_WrongNumArgs(interp
, 1, argv
, "varname width addr nelems");
2969 varname
= Jim_GetString(argv
[1], &len
);
2970 /* given "foo" get space for worse case "foo(%d)" .. add 20 */
2972 e
= Jim_GetLong(interp
, argv
[2], &l
);
2978 e
= Jim_GetLong(interp
, argv
[3], &l
);
2983 e
= Jim_GetLong(interp
, argv
[4], &l
);
2999 Jim_SetResult(interp
, Jim_NewEmptyStringObj(interp
));
3000 Jim_AppendStrings( interp
, Jim_GetResult(interp
), "Invalid width param, must be 8/16/32", NULL
);
3004 Jim_SetResult(interp
, Jim_NewEmptyStringObj(interp
));
3005 Jim_AppendStrings(interp
, Jim_GetResult(interp
), "array2mem: zero width read?", NULL
);
3008 if ((addr
+ (len
* width
)) < addr
) {
3009 Jim_SetResult(interp
, Jim_NewEmptyStringObj(interp
));
3010 Jim_AppendStrings(interp
, Jim_GetResult(interp
), "array2mem: addr + len - wraps to zero?", NULL
);
3013 /* absurd transfer size? */
3015 Jim_SetResult(interp
, Jim_NewEmptyStringObj(interp
));
3016 Jim_AppendStrings(interp
, Jim_GetResult(interp
), "array2mem: absurd > 64K item request", NULL
);
3021 ((width
== 2) && ((addr
& 1) == 0)) ||
3022 ((width
== 4) && ((addr
& 3) == 0))) {
3026 Jim_SetResult(interp
, Jim_NewEmptyStringObj(interp
));
3027 sprintf(buf
, "array2mem address: 0x%08x is not aligned for %d byte reads", addr
, width
);
3028 Jim_AppendStrings(interp
, Jim_GetResult(interp
), buf
, NULL
);
3040 /* Slurp... in buffer size chunks */
3042 count
= len
; /* in objects.. */
3043 if (count
> (sizeof(buffer
)/width
)) {
3044 count
= (sizeof(buffer
)/width
);
3047 v
= 0; /* shut up gcc */
3048 for (i
= 0 ;i
< count
;i
++, n
++) {
3049 get_int_array_element(interp
, varname
, n
, &v
);
3052 target_buffer_set_u32(target
, &buffer
[i
*width
], v
);
3055 target_buffer_set_u16(target
, &buffer
[i
*width
], v
);
3058 buffer
[i
] = v
& 0x0ff;
3064 retval
= target
->type
->write_memory(target
, addr
, width
, count
, buffer
);
3065 if (retval
!= ERROR_OK
) {
3067 LOG_ERROR("array2mem: Write @ 0x%08x, w=%d, cnt=%d, failed", addr
, width
, count
);
3068 Jim_SetResult(interp
, Jim_NewEmptyStringObj(interp
));
3069 Jim_AppendStrings(interp
, Jim_GetResult(interp
), "array2mem: cannot read memory", NULL
);
3075 Jim_SetResult(interp
, Jim_NewEmptyStringObj(interp
));
3081 target_all_handle_event( enum target_event e
)
3086 LOG_DEBUG( "**all*targets: event: %d, %s",
3088 Jim_Nvp_value2name_simple( nvp_target_event
, e
)->name
);
3090 target
= all_targets
;
3092 target_handle_event( target
, e
);
3093 target
= target
->next
;
3098 target_handle_event( target_t
*target
, enum target_event e
)
3100 target_event_action_t
*teap
;
3103 teap
= target
->event_action
;
3107 if( teap
->event
== e
){
3109 LOG_DEBUG( "target: (%d) %s (%s) event: %d (%s) action: %s\n",
3110 target
->target_number
,
3114 Jim_Nvp_value2name_simple( nvp_target_event
, e
)->name
,
3115 Jim_GetString( teap
->body
, NULL
) );
3116 if (Jim_EvalObj( interp
, teap
->body
)!=JIM_OK
)
3118 Jim_PrintErrorMessage(interp
);
3124 LOG_DEBUG( "event: %d %s - no action",
3126 Jim_Nvp_value2name_simple( nvp_target_event
, e
)->name
);
3130 enum target_cfg_param
{
3133 TCFG_WORK_AREA_VIRT
,
3134 TCFG_WORK_AREA_PHYS
,
3135 TCFG_WORK_AREA_SIZE
,
3136 TCFG_WORK_AREA_BACKUP
,
3139 TCFG_CHAIN_POSITION
,
3143 static Jim_Nvp nvp_config_opts
[] = {
3144 { .name
= "-type", .value
= TCFG_TYPE
},
3145 { .name
= "-event", .value
= TCFG_EVENT
},
3146 { .name
= "-work-area-virt", .value
= TCFG_WORK_AREA_VIRT
},
3147 { .name
= "-work-area-phys", .value
= TCFG_WORK_AREA_PHYS
},
3148 { .name
= "-work-area-size", .value
= TCFG_WORK_AREA_SIZE
},
3149 { .name
= "-work-area-backup", .value
= TCFG_WORK_AREA_BACKUP
},
3150 { .name
= "-endian" , .value
= TCFG_ENDIAN
},
3151 { .name
= "-variant", .value
= TCFG_VARIANT
},
3152 { .name
= "-chain-position", .value
= TCFG_CHAIN_POSITION
},
3154 { .name
= NULL
, .value
= -1 }
3159 target_configure( Jim_GetOptInfo
*goi
,
3169 /* parse config or cget options ... */
3170 while( goi
->argc
> 0 ){
3171 Jim_SetEmptyResult( goi
->interp
);
3172 //Jim_GetOpt_Debug( goi );
3174 if( target
->type
->target_jim_configure
){
3175 /* target defines a configure function */
3176 /* target gets first dibs on parameters */
3177 e
= (*(target
->type
->target_jim_configure
))( target
, goi
);
3186 /* otherwise we 'continue' below */
3188 e
= Jim_GetOpt_Nvp( goi
, nvp_config_opts
, &n
);
3190 Jim_GetOpt_NvpUnknown( goi
, nvp_config_opts
, 0 );
3196 if( goi
->isconfigure
){
3197 Jim_SetResult_sprintf( goi
->interp
, "not setable: %s", n
->name
);
3201 if( goi
->argc
!= 0 ){
3202 Jim_WrongNumArgs( goi
->interp
, goi
->argc
, goi
->argv
, "NO PARAMS");
3206 Jim_SetResultString( goi
->interp
, target
->type
->name
, -1 );
3210 if( goi
->argc
== 0 ){
3211 Jim_WrongNumArgs( goi
->interp
, goi
->argc
, goi
->argv
, "-event ?event-name? ...");
3215 e
= Jim_GetOpt_Nvp( goi
, nvp_target_event
, &n
);
3217 Jim_GetOpt_NvpUnknown( goi
, nvp_target_event
, 1 );
3221 if( goi
->isconfigure
){
3222 if( goi
->argc
!= 1 ){
3223 Jim_WrongNumArgs( goi
->interp
, goi
->argc
, goi
->argv
, "-event ?event-name? ?EVENT-BODY?");
3227 if( goi
->argc
!= 0 ){
3228 Jim_WrongNumArgs(goi
->interp
, goi
->argc
, goi
->argv
, "-event ?event-name?");
3235 target_event_action_t
*teap
;
3237 teap
= target
->event_action
;
3238 /* replace existing? */
3240 if( teap
->event
== n
->value
){
3246 if( goi
->isconfigure
){
3249 teap
= calloc( 1, sizeof(*teap
) );
3251 teap
->event
= n
->value
;
3252 Jim_GetOpt_Obj( goi
, &o
);
3254 Jim_DecrRefCount( interp
, teap
->body
);
3256 teap
->body
= Jim_DuplicateObj( goi
->interp
, o
);
3259 * Tcl/TK - "tk events" have a nice feature.
3260 * See the "BIND" command.
3261 * We should support that here.
3262 * You can specify %X and %Y in the event code.
3263 * The idea is: %T - target name.
3264 * The idea is: %N - target number
3265 * The idea is: %E - event name.
3267 Jim_IncrRefCount( teap
->body
);
3269 /* add to head of event list */
3270 teap
->next
= target
->event_action
;
3271 target
->event_action
= teap
;
3272 Jim_SetEmptyResult(goi
->interp
);
3276 Jim_SetEmptyResult( goi
->interp
);
3278 Jim_SetResult( goi
->interp
, Jim_DuplicateObj( goi
->interp
, teap
->body
) );
3285 case TCFG_WORK_AREA_VIRT
:
3286 if( goi
->isconfigure
){
3287 target_free_all_working_areas(target
);
3288 e
= Jim_GetOpt_Wide( goi
, &w
);
3292 target
->working_area_virt
= w
;
3294 if( goi
->argc
!= 0 ){
3298 Jim_SetResult( interp
, Jim_NewIntObj( goi
->interp
, target
->working_area_virt
) );
3302 case TCFG_WORK_AREA_PHYS
:
3303 if( goi
->isconfigure
){
3304 target_free_all_working_areas(target
);
3305 e
= Jim_GetOpt_Wide( goi
, &w
);
3309 target
->working_area_phys
= w
;
3311 if( goi
->argc
!= 0 ){
3315 Jim_SetResult( interp
, Jim_NewIntObj( goi
->interp
, target
->working_area_phys
) );
3319 case TCFG_WORK_AREA_SIZE
:
3320 if( goi
->isconfigure
){
3321 target_free_all_working_areas(target
);
3322 e
= Jim_GetOpt_Wide( goi
, &w
);
3326 target
->working_area_size
= w
;
3328 if( goi
->argc
!= 0 ){
3332 Jim_SetResult( interp
, Jim_NewIntObj( goi
->interp
, target
->working_area_size
) );
3336 case TCFG_WORK_AREA_BACKUP
:
3337 if( goi
->isconfigure
){
3338 target_free_all_working_areas(target
);
3339 e
= Jim_GetOpt_Wide( goi
, &w
);
3343 /* make this exactly 1 or 0 */
3344 target
->backup_working_area
= (!!w
);
3346 if( goi
->argc
!= 0 ){
3350 Jim_SetResult( interp
, Jim_NewIntObj( goi
->interp
, target
->working_area_size
) );
3351 /* loop for more e*/
3355 if( goi
->isconfigure
){
3356 e
= Jim_GetOpt_Nvp( goi
, nvp_target_endian
, &n
);
3358 Jim_GetOpt_NvpUnknown( goi
, nvp_target_endian
, 1 );
3361 target
->endianness
= n
->value
;
3363 if( goi
->argc
!= 0 ){
3367 n
= Jim_Nvp_value2name_simple( nvp_target_endian
, target
->endianness
);
3368 if( n
->name
== NULL
){
3369 target
->endianness
= TARGET_LITTLE_ENDIAN
;
3370 n
= Jim_Nvp_value2name_simple( nvp_target_endian
, target
->endianness
);
3372 Jim_SetResultString( goi
->interp
, n
->name
, -1 );
3377 if( goi
->isconfigure
){
3378 if( goi
->argc
< 1 ){
3379 Jim_SetResult_sprintf( goi
->interp
,
3384 if( target
->variant
){
3385 free((void *)(target
->variant
));
3387 e
= Jim_GetOpt_String( goi
, &cp
, NULL
);
3388 target
->variant
= strdup(cp
);
3390 if( goi
->argc
!= 0 ){
3394 Jim_SetResultString( goi
->interp
, target
->variant
,-1 );
3397 case TCFG_CHAIN_POSITION
:
3398 if( goi
->isconfigure
){
3399 target_free_all_working_areas(target
);
3400 e
= Jim_GetOpt_Wide( goi
, &w
);
3404 if (jtag_get_device(w
)==NULL
)
3407 /* make this exactly 1 or 0 */
3408 target
->chain_position
= w
;
3410 if( goi
->argc
!= 0 ){
3414 Jim_SetResult( interp
, Jim_NewIntObj( goi
->interp
, target
->chain_position
) );
3415 /* loop for more e*/
3418 } /* while( goi->argc ) */
3419 /* done - we return */
3424 /** this is the 'tcl' handler for the target specific command */
3426 tcl_target_func( Jim_Interp
*interp
,
3428 Jim_Obj
*const *argv
)
3436 struct command_context_s
*cmd_ctx
;
3444 TS_CMD_MWW
, TS_CMD_MWH
, TS_CMD_MWB
,
3445 TS_CMD_MDW
, TS_CMD_MDH
, TS_CMD_MDB
,
3446 TS_CMD_MRW
, TS_CMD_MRH
, TS_CMD_MRB
,
3447 TS_CMD_MEM2ARRAY
, TS_CMD_ARRAY2MEM
,
3455 TS_CMD_INVOKE_EVENT
,
3458 static const Jim_Nvp target_options
[] = {
3459 { .name
= "configure", .value
= TS_CMD_CONFIGURE
},
3460 { .name
= "cget", .value
= TS_CMD_CGET
},
3461 { .name
= "mww", .value
= TS_CMD_MWW
},
3462 { .name
= "mwh", .value
= TS_CMD_MWH
},
3463 { .name
= "mwb", .value
= TS_CMD_MWB
},
3464 { .name
= "mdw", .value
= TS_CMD_MDW
},
3465 { .name
= "mdh", .value
= TS_CMD_MDH
},
3466 { .name
= "mdb", .value
= TS_CMD_MDB
},
3467 { .name
= "mem2array", .value
= TS_CMD_MEM2ARRAY
},
3468 { .name
= "array2mem", .value
= TS_CMD_ARRAY2MEM
},
3469 { .name
= "eventlist", .value
= TS_CMD_EVENTLIST
},
3470 { .name
= "curstate", .value
= TS_CMD_CURSTATE
},
3472 { .name
= "arp_examine", .value
= TS_CMD_EXAMINE
},
3473 { .name
= "arp_poll", .value
= TS_CMD_POLL
},
3474 { .name
= "arp_reset", .value
= TS_CMD_RESET
},
3475 { .name
= "arp_halt", .value
= TS_CMD_HALT
},
3476 { .name
= "arp_waitstate", .value
= TS_CMD_WAITSTATE
},
3477 { .name
= "invoke-event", .value
= TS_CMD_INVOKE_EVENT
},
3479 { .name
= NULL
, .value
= -1 },
3483 /* go past the "command" */
3484 Jim_GetOpt_Setup( &goi
, interp
, argc
-1, argv
+1 );
3486 target
= Jim_CmdPrivData( goi
.interp
);
3487 cmd_ctx
= Jim_GetAssocData(goi
.interp
, "context");
3489 /* commands here are in an NVP table */
3490 e
= Jim_GetOpt_Nvp( &goi
, target_options
, &n
);
3492 Jim_GetOpt_NvpUnknown( &goi
, target_options
, 0 );
3495 // Assume blank result
3496 Jim_SetEmptyResult( goi
.interp
);
3499 case TS_CMD_CONFIGURE
:
3501 Jim_WrongNumArgs( goi
.interp
, goi
.argc
, goi
.argv
, "missing: -option VALUE ...");
3504 goi
.isconfigure
= 1;
3505 return target_configure( &goi
, target
);
3507 // some things take params
3509 Jim_WrongNumArgs( goi
.interp
, 0, goi
.argv
, "missing: ?-option?");
3512 goi
.isconfigure
= 0;
3513 return target_configure( &goi
, target
);
3521 * argv[3] = optional count.
3524 if( (goi
.argc
== 3) || (goi
.argc
== 4) ){
3528 Jim_SetResult_sprintf( goi
.interp
, "expected: %s ADDR DATA [COUNT]", n
->name
);
3532 e
= Jim_GetOpt_Wide( &goi
, &a
);
3537 e
= Jim_GetOpt_Wide( &goi
, &b
);
3542 e
= Jim_GetOpt_Wide( &goi
, &c
);
3552 target_buffer_set_u32( target
, target_buf
, b
);
3556 target_buffer_set_u16( target
, target_buf
, b
);
3560 target_buffer_set_u8( target
, target_buf
, b
);
3564 for( x
= 0 ; x
< c
; x
++ ){
3565 e
= target
->type
->write_memory( target
, a
, b
, 1, target_buf
);
3566 if( e
!= ERROR_OK
){
3567 Jim_SetResult_sprintf( interp
, "Error writing @ 0x%08x: %d\n", (int)(a
), e
);
3580 /* argv[0] = command
3582 * argv[2] = optional count
3584 if( (goi
.argc
== 2) || (goi
.argc
== 3) ){
3585 Jim_SetResult_sprintf( goi
.interp
, "expected: %s ADDR [COUNT]", n
->name
);
3588 e
= Jim_GetOpt_Wide( &goi
, &a
);
3593 e
= Jim_GetOpt_Wide( &goi
, &c
);
3600 b
= 1; /* shut up gcc */
3613 /* convert to "bytes" */
3615 /* count is now in 'BYTES' */
3621 e
= target
->type
->read_memory( target
, a
, b
, y
/ b
, target_buf
);
3622 if( e
!= ERROR_OK
){
3623 Jim_SetResult_sprintf( interp
, "error reading target @ 0x%08lx", (int)(a
) );
3627 Jim_fprintf( interp
, interp
->cookie_stdout
, "0x%08x ", (int)(a
) );
3630 for( x
= 0 ; (x
< 16) && (x
< y
) ; x
+= 4 ){
3631 z
= target_buffer_get_u32( target
, &(target_buf
[ x
* 4 ]) );
3632 Jim_fprintf( interp
, interp
->cookie_stdout
, "%08x ", (int)(z
) );
3634 for( ; (x
< 16) ; x
+= 4 ){
3635 Jim_fprintf( interp
, interp
->cookie_stdout
, " " );
3639 for( x
= 0 ; (x
< 16) && (x
< y
) ; x
+= 2 ){
3640 z
= target_buffer_get_u16( target
, &(target_buf
[ x
* 2 ]) );
3641 Jim_fprintf( interp
, interp
->cookie_stdout
, "%04x ", (int)(z
) );
3643 for( ; (x
< 16) ; x
+= 2 ){
3644 Jim_fprintf( interp
, interp
->cookie_stdout
, " " );
3649 for( x
= 0 ; (x
< 16) && (x
< y
) ; x
+= 1 ){
3650 z
= target_buffer_get_u8( target
, &(target_buf
[ x
* 4 ]) );
3651 Jim_fprintf( interp
, interp
->cookie_stdout
, "%02x ", (int)(z
) );
3653 for( ; (x
< 16) ; x
+= 1 ){
3654 Jim_fprintf( interp
, interp
->cookie_stdout
, " " );
3658 /* ascii-ify the bytes */
3659 for( x
= 0 ; x
< y
; x
++ ){
3660 if( (target_buf
[x
] >= 0x20) &&
3661 (target_buf
[x
] <= 0x7e) ){
3665 target_buf
[x
] = '.';
3670 target_buf
[x
] = ' ';
3675 /* print - with a newline */
3676 Jim_fprintf( interp
, interp
->cookie_stdout
, "%s\n", target_buf
);
3682 case TS_CMD_MEM2ARRAY
:
3683 return target_mem2array( goi
.interp
, target
, goi
.argc
, goi
.argv
);
3685 case TS_CMD_ARRAY2MEM
:
3686 return target_array2mem( goi
.interp
, target
, goi
.argc
, goi
.argv
);
3688 case TS_CMD_EXAMINE
:
3690 Jim_WrongNumArgs( goi
.interp
, 2, argv
, "[no parameters]");
3693 e
= target
->type
->examine( target
);
3694 if( e
!= ERROR_OK
){
3695 Jim_SetResult_sprintf( interp
, "examine-fails: %d", e
);
3701 Jim_WrongNumArgs( goi
.interp
, 2, argv
, "[no parameters]");
3704 if( !(target
->type
->examined
) ){
3705 e
= ERROR_TARGET_NOT_EXAMINED
;
3707 e
= target
->type
->poll( target
);
3709 if( e
!= ERROR_OK
){
3710 Jim_SetResult_sprintf( interp
, "poll-fails: %d", e
);
3717 if( goi
.argc
!= 2 ){
3718 Jim_WrongNumArgs( interp
, 2, argv
, "t|f|assert|deassert BOOL");
3721 e
= Jim_GetOpt_Nvp( &goi
, nvp_assert
, &n
);
3723 Jim_GetOpt_NvpUnknown( &goi
, nvp_assert
, 1 );
3726 // the halt or not param
3727 e
= Jim_GetOpt_Wide( &goi
, &a
);
3731 // determine if we should halt or not.
3732 target
->reset_halt
= !!a
;
3733 // When this happens - all workareas are invalid.
3734 target_free_all_working_areas_restore(target
, 0);
3737 if( n
->value
== NVP_ASSERT
){
3738 target
->type
->assert_reset( target
);
3740 target
->type
->deassert_reset( target
);
3745 Jim_WrongNumArgs( goi
.interp
, 0, argv
, "halt [no parameters]");
3748 target
->type
->halt( target
);
3750 case TS_CMD_WAITSTATE
:
3751 // params: <name> statename timeoutmsecs
3752 if( goi
.argc
!= 2 ){
3753 Jim_SetResult_sprintf( goi
.interp
, "%s STATENAME TIMEOUTMSECS", n
->name
);
3756 e
= Jim_GetOpt_Nvp( &goi
, nvp_target_state
, &n
);
3758 Jim_GetOpt_NvpUnknown( &goi
, nvp_target_state
,1 );
3761 e
= Jim_GetOpt_Wide( &goi
, &a
);
3765 e
= target_wait_state( target
, n
->value
, a
);
3766 if( e
!= ERROR_OK
){
3767 Jim_SetResult_sprintf( goi
.interp
,
3768 "target: %s wait %s fails (%d) %s",
3771 e
, target_strerror_safe(e
) );
3776 case TS_CMD_EVENTLIST
:
3777 /* List for human, Events defined for this target.
3778 * scripts/programs should use 'name cget -event NAME'
3781 target_event_action_t
*teap
;
3782 teap
= target
->event_action
;
3783 command_print( cmd_ctx
, "Event actions for target (%d) %s\n",
3784 target
->target_number
,
3786 command_print( cmd_ctx
, "%-25s | Body", "Event");
3787 command_print( cmd_ctx
, "------------------------- | ----------------------------------------");
3789 command_print( cmd_ctx
,
3791 Jim_Nvp_value2name_simple( nvp_target_event
, teap
->event
)->name
,
3792 Jim_GetString( teap
->body
, NULL
) );
3795 command_print( cmd_ctx
, "***END***");
3798 case TS_CMD_CURSTATE
:
3799 if( goi
.argc
!= 0 ){
3800 Jim_WrongNumArgs( goi
.interp
, 0, argv
, "[no parameters]");
3803 Jim_SetResultString( goi
.interp
,
3804 Jim_Nvp_value2name_simple(nvp_target_state
,target
->state
)->name
,-1);
3806 case TS_CMD_INVOKE_EVENT
:
3807 if( goi
.argc
!= 1 ){
3808 Jim_SetResult_sprintf( goi
.interp
, "%s ?EVENTNAME?",n
->name
);
3811 e
= Jim_GetOpt_Nvp( &goi
, nvp_target_event
, &n
);
3813 Jim_GetOpt_NvpUnknown( &goi
, nvp_target_event
, 1 );
3816 target_handle_event( target
, n
->value
);
3824 target_create( Jim_GetOptInfo
*goi
)
3834 struct command_context_s
*cmd_ctx
;
3836 cmd_ctx
= Jim_GetAssocData(goi
->interp
, "context");
3837 if( goi
->argc
< 3 ){
3838 Jim_WrongNumArgs( goi
->interp
, 1, goi
->argv
, "?name? ?type? ..options...");
3843 Jim_GetOpt_Obj( goi
, &new_cmd
);
3844 /* does this command exist? */
3845 cmd
= Jim_GetCommand( goi
->interp
, new_cmd
, JIM_ERRMSG
);
3847 cp
= Jim_GetString( new_cmd
, NULL
);
3848 Jim_SetResult_sprintf(goi
->interp
, "Command/target: %s Exists", cp
);
3853 e
= Jim_GetOpt_String( goi
, &cp2
, NULL
);
3855 /* now does target type exist */
3856 for( x
= 0 ; target_types
[x
] ; x
++ ){
3857 if( 0 == strcmp( cp
, target_types
[x
]->name
) ){
3862 if( target_types
[x
] == NULL
){
3863 Jim_SetResult_sprintf( goi
->interp
, "Unknown target type %s, try one of ", cp
);
3864 for( x
= 0 ; target_types
[x
] ; x
++ ){
3865 if( target_types
[x
+1] ){
3866 Jim_AppendStrings( goi
->interp
,
3867 Jim_GetResult(goi
->interp
),
3868 target_types
[x
]->name
,
3871 Jim_AppendStrings( goi
->interp
,
3872 Jim_GetResult(goi
->interp
),
3874 target_types
[x
]->name
,NULL
);
3882 target
= calloc(1,sizeof(target_t
));
3883 /* set target number */
3884 target
->target_number
= new_target_number();
3886 /* allocate memory for each unique target type */
3887 target
->type
= (target_type_t
*)calloc(1,sizeof(target_type_t
));
3889 memcpy( target
->type
, target_types
[x
], sizeof(target_type_t
));
3891 /* will be set by "-endian" */
3892 target
->endianness
= TARGET_ENDIAN_UNKNOWN
;
3894 target
->working_area
= 0x0;
3895 target
->working_area_size
= 0x0;
3896 target
->working_areas
= NULL
;
3897 target
->backup_working_area
= 0;
3899 target
->state
= TARGET_UNKNOWN
;
3900 target
->debug_reason
= DBG_REASON_UNDEFINED
;
3901 target
->reg_cache
= NULL
;
3902 target
->breakpoints
= NULL
;
3903 target
->watchpoints
= NULL
;
3904 target
->next
= NULL
;
3905 target
->arch_info
= NULL
;
3907 target
->display
= 1;
3909 /* initialize trace information */
3910 target
->trace_info
= malloc(sizeof(trace_t
));
3911 target
->trace_info
->num_trace_points
= 0;
3912 target
->trace_info
->trace_points_size
= 0;
3913 target
->trace_info
->trace_points
= NULL
;
3914 target
->trace_info
->trace_history_size
= 0;
3915 target
->trace_info
->trace_history
= NULL
;
3916 target
->trace_info
->trace_history_pos
= 0;
3917 target
->trace_info
->trace_history_overflowed
= 0;
3919 target
->dbgmsg
= NULL
;
3920 target
->dbg_msg_enabled
= 0;
3922 target
->endianness
= TARGET_ENDIAN_UNKNOWN
;
3924 /* Do the rest as "configure" options */
3925 goi
->isconfigure
= 1;
3926 e
= target_configure( goi
, target
);
3928 free( target
->type
);
3933 if( target
->endianness
== TARGET_ENDIAN_UNKNOWN
){
3934 /* default endian to little if not specified */
3935 target
->endianness
= TARGET_LITTLE_ENDIAN
;
3938 /* create the target specific commands */
3939 if( target
->type
->register_commands
){
3940 (*(target
->type
->register_commands
))( cmd_ctx
);
3942 if( target
->type
->target_create
){
3943 (*(target
->type
->target_create
))( target
, goi
->interp
);
3946 /* append to end of list */
3949 tpp
= &(all_targets
);
3951 tpp
= &( (*tpp
)->next
);
3956 cp
= Jim_GetString( new_cmd
, NULL
);
3957 target
->cmd_name
= strdup(cp
);
3959 /* now - create the new target name command */
3960 e
= Jim_CreateCommand( goi
->interp
,
3963 tcl_target_func
, /* C function */
3964 target
, /* private data */
3965 NULL
); /* no del proc */
3971 jim_target( Jim_Interp
*interp
, int argc
, Jim_Obj
*const *argv
)
3975 struct command_context_s
*cmd_ctx
;
3980 /* TG = target generic */
3988 const char *target_cmds
[] = {
3989 "create", "types", "names", "current", "number",
3994 LOG_DEBUG("Target command params:");
3995 LOG_DEBUG(Jim_Debug_ArgvString( interp
, argc
, argv
) );
3997 cmd_ctx
= Jim_GetAssocData( interp
, "context" );
3999 Jim_GetOpt_Setup( &goi
, interp
, argc
-1, argv
+1 );
4001 if( goi
.argc
== 0 ){
4002 Jim_WrongNumArgs(interp
, 1, argv
, "missing: command ...");
4006 /* is this old syntax? */
4007 /* To determine: We have to peek at argv[0]*/
4008 cp
= Jim_GetString( goi
.argv
[0], NULL
);
4009 for( x
= 0 ; target_types
[x
] ; x
++ ){
4010 if( 0 == strcmp(cp
,target_types
[x
]->name
) ){
4014 if( target_types
[x
] ){
4015 /* YES IT IS OLD SYNTAX */
4016 Jim_Obj
*new_argv
[10];
4019 /* target_old_syntax
4021 * It appears that there are 2 old syntaxes:
4023 * target <typename> <endian> <chain position> <variant>
4027 * target <typename> <endian> <reset mode> <chain position> <variant>
4031 /* The minimum number of arguments is 4 */
4033 Jim_WrongNumArgs( interp
, 1, argv
, "[OLDSYNTAX] ?TYPE? ?ENDIAN? ?CHAIN-POSITION? ?VARIANT?");
4038 new_argv
[0] = argv
[0];
4039 new_argv
[1] = Jim_NewStringObj( interp
, "create", -1 );
4042 sprintf( buf
, "target%d", new_target_number() );
4043 new_argv
[2] = Jim_NewStringObj( interp
, buf
, -1 );
4045 new_argv
[3] = goi
.argv
[0]; /* typename */
4046 new_argv
[4] = Jim_NewStringObj( interp
, "-endian", -1 );
4047 new_argv
[5] = goi
.argv
[1];
4048 new_argv
[6] = Jim_NewStringObj( interp
, "-chain-position", -1 );
4050 /* If goi.argv[2] is not a number, we need to skip it since it is the reset mode. */
4052 int chain_position_argv
= 2;
4053 if (JIM_ERR
== Jim_GetWide(interp
, goi
.argv
[chain_position_argv
], &w
)) {
4054 if (chain_position_argv
+ 1 < goi
.argc
) {
4055 chain_position_argv
+= 1;
4057 Jim_WrongNumArgs( interp
, 1, argv
, "[OLDSYNTAX] ?TYPE? ?ENDIAN? ?RESET? ?CHAIN-POSITION? ?VARIANT?");
4062 new_argv
[7] = goi
.argv
[chain_position_argv
];
4064 /* Only provide a variant configure option if there was a variant specified */
4065 if (chain_position_argv
+ 1 < goi
.argc
) {
4066 new_argv
[8] = Jim_NewStringObj( interp
, "-variant", -1 );
4067 new_argv
[9] = goi
.argv
[chain_position_argv
+ 1];
4078 * argv[3] = typename
4081 * argv[6] = -position
4083 * argv[8] = -variant
4084 * argv[9] = "somestring"
4087 /* don't let these be released */
4088 for( x
= 0 ; x
< new_argc
; x
++ ){
4089 Jim_IncrRefCount( new_argv
[x
]);
4092 LOG_DEBUG("Target OLD SYNTAX - converted to new syntax");
4094 r
= jim_target( goi
.interp
, new_argc
, new_argv
);
4096 /* release? these items */
4097 for( x
= 0 ; x
< new_argc
; x
++ ){
4098 Jim_DecrRefCount( interp
, new_argv
[x
] );
4103 //Jim_GetOpt_Debug( &goi );
4104 r
= Jim_GetOpt_Enum( &goi
, target_cmds
, &x
);
4111 Jim_Panic(goi
.interp
,"Why am I here?");
4113 case TG_CMD_CURRENT
:
4114 if( goi
.argc
!= 0 ){
4115 Jim_WrongNumArgs( goi
.interp
, 1, goi
.argv
, "Too many parameters");
4118 Jim_SetResultString( goi
.interp
, get_current_target( cmd_ctx
)->cmd_name
, -1 );
4121 if( goi
.argc
!= 0 ){
4122 Jim_WrongNumArgs( goi
.interp
, 1, goi
.argv
, "Too many parameters" );
4125 Jim_SetResult( goi
.interp
, Jim_NewListObj( goi
.interp
, NULL
, 0 ) );
4126 for( x
= 0 ; target_types
[x
] ; x
++ ){
4127 Jim_ListAppendElement( goi
.interp
,
4128 Jim_GetResult(goi
.interp
),
4129 Jim_NewStringObj( goi
.interp
, target_types
[x
]->name
, -1 ) );
4133 if( goi
.argc
!= 0 ){
4134 Jim_WrongNumArgs( goi
.interp
, 1, goi
.argv
, "Too many parameters" );
4137 Jim_SetResult( goi
.interp
, Jim_NewListObj( goi
.interp
, NULL
, 0 ) );
4138 target
= all_targets
;
4140 Jim_ListAppendElement( goi
.interp
,
4141 Jim_GetResult(goi
.interp
),
4142 Jim_NewStringObj( goi
.interp
, target
->cmd_name
, -1 ) );
4143 target
= target
->next
;
4148 Jim_WrongNumArgs( goi
.interp
, goi
.argc
, goi
.argv
, "?name ... config options ...");
4151 return target_create( &goi
);
4154 if( goi
.argc
!= 1 ){
4155 Jim_SetResult_sprintf( goi
.interp
, "expected: target number ?NUMBER?");
4158 e
= Jim_GetOpt_Wide( &goi
, &w
);
4164 t
= get_target_by_num(w
);
4166 Jim_SetResult_sprintf( goi
.interp
,"Target: number %d does not exist", (int)(w
));
4169 Jim_SetResultString( goi
.interp
, t
->cmd_name
, -1 );
4173 if( goi
.argc
!= 0 ){
4174 Jim_WrongNumArgs( goi
.interp
, 0, goi
.argv
, "<no parameters>");
4177 Jim_SetResult( goi
.interp
,
4178 Jim_NewIntObj( goi
.interp
, max_target_number()));
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)