1 /***************************************************************************
2 * Copyright (C) 2005 by Dominic Rath *
3 * Dominic.Rath@gmx.de *
5 * This program is free software; you can redistribute it and/or modify *
6 * it under the terms of the GNU General Public License as published by *
7 * the Free Software Foundation; either version 2 of the License, or *
8 * (at your option) any later version. *
10 * This program is distributed in the hope that it will be useful, *
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
13 * GNU General Public License for more details. *
15 * You should have received a copy of the GNU General Public License *
16 * along with this program; if not, write to the *
17 * Free Software Foundation, Inc., *
18 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
19 ***************************************************************************/
24 #include "replacements.h"
26 #include "target_request.h"
29 #include "configuration.h"
30 #include "binarybuffer.h"
37 #include <sys/types.h>
45 #include <time_support.h>
50 int cli_target_callback_event_handler(struct target_s
*target
, enum target_event event
, void *priv
);
52 int handle_target_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
53 int handle_targets_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
55 int handle_run_and_halt_time_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
56 int handle_working_area_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
58 int handle_reg_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
59 int handle_poll_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
60 int handle_halt_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
61 int handle_wait_halt_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
62 int handle_reset_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
63 int handle_soft_reset_halt_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
64 int handle_resume_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
65 int handle_step_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
66 int handle_md_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
67 int handle_mw_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
68 int handle_load_image_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
69 int handle_dump_image_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
70 int handle_verify_image_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
71 int handle_bp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
72 int handle_rbp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
73 int handle_wp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
74 int handle_rwp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
75 int handle_virt2phys_command(command_context_t
*cmd_ctx
, char *cmd
, char **args
, int argc
);
76 int handle_profile_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
77 static int jim_array2mem(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *argv
);
78 static int jim_mem2array(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *argv
);
82 extern target_type_t arm7tdmi_target
;
83 extern target_type_t arm720t_target
;
84 extern target_type_t arm9tdmi_target
;
85 extern target_type_t arm920t_target
;
86 extern target_type_t arm966e_target
;
87 extern target_type_t arm926ejs_target
;
88 extern target_type_t feroceon_target
;
89 extern target_type_t xscale_target
;
90 extern target_type_t cortexm3_target
;
91 extern target_type_t arm11_target
;
93 target_type_t
*target_types
[] =
108 target_t
*targets
= NULL
;
109 target_event_callback_t
*target_event_callbacks
= NULL
;
110 target_timer_callback_t
*target_timer_callbacks
= NULL
;
112 char *target_state_strings
[] =
121 char *target_debug_reason_strings
[] =
123 "debug request", "breakpoint", "watchpoint",
124 "watchpoint and breakpoint", "single step",
125 "target not halted", "undefined"
128 char *target_endianess_strings
[] =
134 static int target_continous_poll
= 1;
136 /* read a u32 from a buffer in target memory endianness */
137 u32
target_buffer_get_u32(target_t
*target
, u8
*buffer
)
139 if (target
->endianness
== TARGET_LITTLE_ENDIAN
)
140 return le_to_h_u32(buffer
);
142 return be_to_h_u32(buffer
);
145 /* read a u16 from a buffer in target memory endianness */
146 u16
target_buffer_get_u16(target_t
*target
, u8
*buffer
)
148 if (target
->endianness
== TARGET_LITTLE_ENDIAN
)
149 return le_to_h_u16(buffer
);
151 return be_to_h_u16(buffer
);
154 /* write a u32 to a buffer in target memory endianness */
155 void target_buffer_set_u32(target_t
*target
, u8
*buffer
, u32 value
)
157 if (target
->endianness
== TARGET_LITTLE_ENDIAN
)
158 h_u32_to_le(buffer
, value
);
160 h_u32_to_be(buffer
, value
);
163 /* write a u16 to a buffer in target memory endianness */
164 void target_buffer_set_u16(target_t
*target
, u8
*buffer
, u16 value
)
166 if (target
->endianness
== TARGET_LITTLE_ENDIAN
)
167 h_u16_to_le(buffer
, value
);
169 h_u16_to_be(buffer
, value
);
172 /* returns a pointer to the n-th configured target */
173 target_t
* get_target_by_num(int num
)
175 target_t
*target
= targets
;
182 target
= target
->next
;
189 int get_num_by_target(target_t
*query_target
)
191 target_t
*target
= targets
;
196 if (target
== query_target
)
198 target
= target
->next
;
205 target_t
* get_current_target(command_context_t
*cmd_ctx
)
207 target_t
*target
= get_target_by_num(cmd_ctx
->current_target
);
211 LOG_ERROR("BUG: current_target out of bounds");
218 /* Process target initialization, when target entered debug out of reset
219 * the handler is unregistered at the end of this function, so it's only called once
221 int target_init_handler(struct target_s
*target
, enum target_event event
, void *priv
)
223 struct command_context_s
*cmd_ctx
= priv
;
225 if (event
== TARGET_EVENT_HALTED
)
227 target_unregister_event_callback(target_init_handler
, priv
);
228 target_invoke_script(cmd_ctx
, target
, "post_reset");
229 jtag_execute_queue();
235 int target_run_and_halt_handler(void *priv
)
237 target_t
*target
= priv
;
244 int target_poll(struct target_s
*target
)
246 /* We can't poll until after examine */
247 if (!target
->type
->examined
)
249 /* Fail silently lest we pollute the log */
252 return target
->type
->poll(target
);
255 int target_halt(struct target_s
*target
)
257 /* We can't poll until after examine */
258 if (!target
->type
->examined
)
260 LOG_ERROR("Target not examined yet");
263 return target
->type
->halt(target
);
266 int target_resume(struct target_s
*target
, int current
, u32 address
, int handle_breakpoints
, int debug_execution
)
270 /* We can't poll until after examine */
271 if (!target
->type
->examined
)
273 LOG_ERROR("Target not examined yet");
277 if ((retval
= target
->type
->resume(target
, current
, address
, handle_breakpoints
, debug_execution
)) != ERROR_OK
)
283 int target_process_reset(struct command_context_s
*cmd_ctx
)
285 int retval
= ERROR_OK
;
287 struct timeval timeout
, now
;
289 jtag
->speed(jtag_speed
);
294 target_invoke_script(cmd_ctx
, target
, "pre_reset");
295 target
= target
->next
;
298 if ((retval
= jtag_init_reset(cmd_ctx
)) != ERROR_OK
)
301 /* First time this is executed after launching OpenOCD, it will read out
302 * the type of CPU, etc. and init Embedded ICE registers in host
305 * It will also set up ICE registers in the target.
307 * However, if we assert TRST later, we need to set up the registers again.
309 * For the "reset halt/init" case we must only set up the registers here.
311 if ((retval
= target_examine(cmd_ctx
)) != ERROR_OK
)
314 /* prepare reset_halt where necessary */
318 if (jtag_reset_config
& RESET_SRST_PULLS_TRST
)
320 switch (target
->reset_mode
)
323 command_print(cmd_ctx
, "nSRST pulls nTRST, falling back to \"reset run_and_halt\"");
324 target
->reset_mode
= RESET_RUN_AND_HALT
;
327 command_print(cmd_ctx
, "nSRST pulls nTRST, falling back to \"reset run_and_init\"");
328 target
->reset_mode
= RESET_RUN_AND_INIT
;
334 target
= target
->next
;
340 /* we have no idea what state the target is in, so we
341 * have to drop working areas
343 target_free_all_working_areas_restore(target
, 0);
344 target
->type
->assert_reset(target
);
345 target
= target
->next
;
347 if ((retval
= jtag_execute_queue()) != ERROR_OK
)
349 LOG_WARNING("JTAG communication failed asserting reset.");
353 /* request target halt if necessary, and schedule further action */
357 switch (target
->reset_mode
)
360 /* nothing to do if target just wants to be run */
362 case RESET_RUN_AND_HALT
:
364 target_register_timer_callback(target_run_and_halt_handler
, target
->run_and_halt_time
, 0, target
);
366 case RESET_RUN_AND_INIT
:
368 target_register_timer_callback(target_run_and_halt_handler
, target
->run_and_halt_time
, 0, target
);
369 target_register_event_callback(target_init_handler
, cmd_ctx
);
376 target_register_event_callback(target_init_handler
, cmd_ctx
);
379 LOG_ERROR("BUG: unknown target->reset_mode");
381 target
= target
->next
;
384 if ((retval
= jtag_execute_queue()) != ERROR_OK
)
386 LOG_WARNING("JTAG communication failed while reset was asserted. Consider using srst_only for reset_config.");
393 target
->type
->deassert_reset(target
);
394 target
= target
->next
;
397 if ((retval
= jtag_execute_queue()) != ERROR_OK
)
399 LOG_WARNING("JTAG communication failed while deasserting reset.");
403 if (jtag_reset_config
& RESET_SRST_PULLS_TRST
)
405 /* If TRST was asserted we need to set up registers again */
406 if ((retval
= target_examine(cmd_ctx
)) != ERROR_OK
)
411 LOG_DEBUG("Waiting for halted stated as approperiate");
413 /* Wait for reset to complete, maximum 5 seconds. */
414 gettimeofday(&timeout
, NULL
);
415 timeval_add_time(&timeout
, 5, 0);
418 gettimeofday(&now
, NULL
);
420 target_call_timer_callbacks_now();
425 LOG_DEBUG("Polling target");
427 if ((target
->reset_mode
== RESET_RUN_AND_INIT
) ||
428 (target
->reset_mode
== RESET_RUN_AND_HALT
) ||
429 (target
->reset_mode
== RESET_HALT
) ||
430 (target
->reset_mode
== RESET_INIT
))
432 if (target
->state
!= TARGET_HALTED
)
434 if ((now
.tv_sec
> timeout
.tv_sec
) || ((now
.tv_sec
== timeout
.tv_sec
) && (now
.tv_usec
>= timeout
.tv_usec
)))
436 LOG_USER("Timed out waiting for halt after reset");
439 /* this will send alive messages on e.g. GDB remote protocol. */
441 LOG_USER_N("%s", ""); /* avoid warning about zero length formatting message*/
445 target
= target
->next
;
447 /* All targets we're waiting for are halted */
455 /* We want any events to be processed before the prompt */
456 target_call_timer_callbacks_now();
458 /* if we timed out we need to unregister these handlers */
462 target_unregister_timer_callback(target_run_and_halt_handler
, target
);
463 target
= target
->next
;
465 target_unregister_event_callback(target_init_handler
, cmd_ctx
);
467 jtag
->speed(jtag_speed_post_reset
);
472 static int default_virt2phys(struct target_s
*target
, u32
virtual, u32
*physical
)
478 static int default_mmu(struct target_s
*target
, int *enabled
)
484 static int default_examine(struct command_context_s
*cmd_ctx
, struct target_s
*target
)
486 target
->type
->examined
= 1;
491 /* Targets that correctly implement init+examine, i.e.
492 * no communication with target during init:
496 int target_examine(struct command_context_s
*cmd_ctx
)
498 int retval
= ERROR_OK
;
499 target_t
*target
= targets
;
502 if ((retval
= target
->type
->examine(cmd_ctx
, target
))!=ERROR_OK
)
504 target
= target
->next
;
509 static int target_write_memory_imp(struct target_s
*target
, u32 address
, u32 size
, u32 count
, u8
*buffer
)
511 if (!target
->type
->examined
)
513 LOG_ERROR("Target not examined yet");
516 return target
->type
->write_memory_imp(target
, address
, size
, count
, buffer
);
519 static int target_read_memory_imp(struct target_s
*target
, u32 address
, u32 size
, u32 count
, u8
*buffer
)
521 if (!target
->type
->examined
)
523 LOG_ERROR("Target not examined yet");
526 return target
->type
->read_memory_imp(target
, address
, size
, count
, buffer
);
529 static int target_soft_reset_halt_imp(struct target_s
*target
)
531 if (!target
->type
->examined
)
533 LOG_ERROR("Target not examined yet");
536 return target
->type
->soft_reset_halt_imp(target
);
539 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
)
541 if (!target
->type
->examined
)
543 LOG_ERROR("Target not examined yet");
546 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
);
549 int target_init(struct command_context_s
*cmd_ctx
)
551 target_t
*target
= targets
;
555 target
->type
->examined
= 0;
556 if (target
->type
->examine
== NULL
)
558 target
->type
->examine
= default_examine
;
561 if (target
->type
->init_target(cmd_ctx
, target
) != ERROR_OK
)
563 LOG_ERROR("target '%s' init failed", target
->type
->name
);
567 /* Set up default functions if none are provided by target */
568 if (target
->type
->virt2phys
== NULL
)
570 target
->type
->virt2phys
= default_virt2phys
;
572 target
->type
->virt2phys
= default_virt2phys
;
573 /* a non-invasive way(in terms of patches) to add some code that
574 * runs before the type->write/read_memory implementation
576 target
->type
->write_memory_imp
= target
->type
->write_memory
;
577 target
->type
->write_memory
= target_write_memory_imp
;
578 target
->type
->read_memory_imp
= target
->type
->read_memory
;
579 target
->type
->read_memory
= target_read_memory_imp
;
580 target
->type
->soft_reset_halt_imp
= target
->type
->soft_reset_halt
;
581 target
->type
->soft_reset_halt
= target_soft_reset_halt_imp
;
582 target
->type
->run_algorithm_imp
= target
->type
->run_algorithm
;
583 target
->type
->run_algorithm
= target_run_algorithm_imp
;
586 if (target
->type
->mmu
== NULL
)
588 target
->type
->mmu
= default_mmu
;
590 target
= target
->next
;
595 target_register_user_commands(cmd_ctx
);
596 target_register_timer_callback(handle_target
, 100, 1, NULL
);
602 int target_register_event_callback(int (*callback
)(struct target_s
*target
, enum target_event event
, void *priv
), void *priv
)
604 target_event_callback_t
**callbacks_p
= &target_event_callbacks
;
606 if (callback
== NULL
)
608 return ERROR_INVALID_ARGUMENTS
;
613 while ((*callbacks_p
)->next
)
614 callbacks_p
= &((*callbacks_p
)->next
);
615 callbacks_p
= &((*callbacks_p
)->next
);
618 (*callbacks_p
) = malloc(sizeof(target_event_callback_t
));
619 (*callbacks_p
)->callback
= callback
;
620 (*callbacks_p
)->priv
= priv
;
621 (*callbacks_p
)->next
= NULL
;
626 int target_register_timer_callback(int (*callback
)(void *priv
), int time_ms
, int periodic
, void *priv
)
628 target_timer_callback_t
**callbacks_p
= &target_timer_callbacks
;
631 if (callback
== NULL
)
633 return ERROR_INVALID_ARGUMENTS
;
638 while ((*callbacks_p
)->next
)
639 callbacks_p
= &((*callbacks_p
)->next
);
640 callbacks_p
= &((*callbacks_p
)->next
);
643 (*callbacks_p
) = malloc(sizeof(target_timer_callback_t
));
644 (*callbacks_p
)->callback
= callback
;
645 (*callbacks_p
)->periodic
= periodic
;
646 (*callbacks_p
)->time_ms
= time_ms
;
648 gettimeofday(&now
, NULL
);
649 (*callbacks_p
)->when
.tv_usec
= now
.tv_usec
+ (time_ms
% 1000) * 1000;
650 time_ms
-= (time_ms
% 1000);
651 (*callbacks_p
)->when
.tv_sec
= now
.tv_sec
+ (time_ms
/ 1000);
652 if ((*callbacks_p
)->when
.tv_usec
> 1000000)
654 (*callbacks_p
)->when
.tv_usec
= (*callbacks_p
)->when
.tv_usec
- 1000000;
655 (*callbacks_p
)->when
.tv_sec
+= 1;
658 (*callbacks_p
)->priv
= priv
;
659 (*callbacks_p
)->next
= NULL
;
664 int target_unregister_event_callback(int (*callback
)(struct target_s
*target
, enum target_event event
, void *priv
), void *priv
)
666 target_event_callback_t
**p
= &target_event_callbacks
;
667 target_event_callback_t
*c
= target_event_callbacks
;
669 if (callback
== NULL
)
671 return ERROR_INVALID_ARGUMENTS
;
676 target_event_callback_t
*next
= c
->next
;
677 if ((c
->callback
== callback
) && (c
->priv
== priv
))
691 int target_unregister_timer_callback(int (*callback
)(void *priv
), void *priv
)
693 target_timer_callback_t
**p
= &target_timer_callbacks
;
694 target_timer_callback_t
*c
= target_timer_callbacks
;
696 if (callback
== NULL
)
698 return ERROR_INVALID_ARGUMENTS
;
703 target_timer_callback_t
*next
= c
->next
;
704 if ((c
->callback
== callback
) && (c
->priv
== priv
))
718 int target_call_event_callbacks(target_t
*target
, enum target_event event
)
720 target_event_callback_t
*callback
= target_event_callbacks
;
721 target_event_callback_t
*next_callback
;
723 LOG_DEBUG("target event %i", event
);
727 next_callback
= callback
->next
;
728 callback
->callback(target
, event
, callback
->priv
);
729 callback
= next_callback
;
735 static int target_call_timer_callbacks_check_time(int checktime
)
737 target_timer_callback_t
*callback
= target_timer_callbacks
;
738 target_timer_callback_t
*next_callback
;
741 gettimeofday(&now
, NULL
);
745 next_callback
= callback
->next
;
747 if ((!checktime
&&callback
->periodic
)||
748 (((now
.tv_sec
>= callback
->when
.tv_sec
) && (now
.tv_usec
>= callback
->when
.tv_usec
))
749 || (now
.tv_sec
> callback
->when
.tv_sec
)))
751 if(callback
->callback
!= NULL
)
753 callback
->callback(callback
->priv
);
754 if (callback
->periodic
)
756 int time_ms
= callback
->time_ms
;
757 callback
->when
.tv_usec
= now
.tv_usec
+ (time_ms
% 1000) * 1000;
758 time_ms
-= (time_ms
% 1000);
759 callback
->when
.tv_sec
= now
.tv_sec
+ time_ms
/ 1000;
760 if (callback
->when
.tv_usec
> 1000000)
762 callback
->when
.tv_usec
= callback
->when
.tv_usec
- 1000000;
763 callback
->when
.tv_sec
+= 1;
767 target_unregister_timer_callback(callback
->callback
, callback
->priv
);
771 callback
= next_callback
;
777 int target_call_timer_callbacks()
779 return target_call_timer_callbacks_check_time(1);
782 /* invoke periodic callbacks immediately */
783 int target_call_timer_callbacks_now()
785 return target_call_timer_callbacks(0);
788 int target_alloc_working_area(struct target_s
*target
, u32 size
, working_area_t
**area
)
790 working_area_t
*c
= target
->working_areas
;
791 working_area_t
*new_wa
= NULL
;
793 /* Reevaluate working area address based on MMU state*/
794 if (target
->working_areas
== NULL
)
798 retval
= target
->type
->mmu(target
, &enabled
);
799 if (retval
!= ERROR_OK
)
805 target
->working_area
= target
->working_area_virt
;
809 target
->working_area
= target
->working_area_phys
;
813 /* only allocate multiples of 4 byte */
816 LOG_ERROR("BUG: code tried to allocate unaligned number of bytes, padding");
817 size
= CEIL(size
, 4);
820 /* see if there's already a matching working area */
823 if ((c
->free
) && (c
->size
== size
))
831 /* if not, allocate a new one */
834 working_area_t
**p
= &target
->working_areas
;
835 u32 first_free
= target
->working_area
;
836 u32 free_size
= target
->working_area_size
;
838 LOG_DEBUG("allocating new working area");
840 c
= target
->working_areas
;
843 first_free
+= c
->size
;
844 free_size
-= c
->size
;
849 if (free_size
< size
)
851 LOG_WARNING("not enough working area available(requested %d, free %d)", size
, free_size
);
852 return ERROR_TARGET_RESOURCE_NOT_AVAILABLE
;
855 new_wa
= malloc(sizeof(working_area_t
));
858 new_wa
->address
= first_free
;
860 if (target
->backup_working_area
)
862 new_wa
->backup
= malloc(new_wa
->size
);
863 target
->type
->read_memory(target
, new_wa
->address
, 4, new_wa
->size
/ 4, new_wa
->backup
);
867 new_wa
->backup
= NULL
;
870 /* put new entry in list */
874 /* mark as used, and return the new (reused) area */
884 int target_free_working_area_restore(struct target_s
*target
, working_area_t
*area
, int restore
)
889 if (restore
&&target
->backup_working_area
)
890 target
->type
->write_memory(target
, area
->address
, 4, area
->size
/ 4, area
->backup
);
894 /* mark user pointer invalid */
901 int target_free_working_area(struct target_s
*target
, working_area_t
*area
)
903 return target_free_working_area_restore(target
, area
, 1);
906 int target_free_all_working_areas_restore(struct target_s
*target
, int restore
)
908 working_area_t
*c
= target
->working_areas
;
912 working_area_t
*next
= c
->next
;
913 target_free_working_area_restore(target
, c
, restore
);
923 target
->working_areas
= NULL
;
928 int target_free_all_working_areas(struct target_s
*target
)
930 return target_free_all_working_areas_restore(target
, 1);
933 int target_register_commands(struct command_context_s
*cmd_ctx
)
935 register_command(cmd_ctx
, NULL
, "target", handle_target_command
, COMMAND_CONFIG
, "target <cpu> [reset_init default - DEPRECATED] <chainpos> <endianness> <variant> [cpu type specifc args]");
936 register_command(cmd_ctx
, NULL
, "targets", handle_targets_command
, COMMAND_EXEC
, NULL
);
937 register_command(cmd_ctx
, NULL
, "run_and_halt_time", handle_run_and_halt_time_command
, COMMAND_CONFIG
, "<target> <run time ms>");
938 register_command(cmd_ctx
, NULL
, "working_area", handle_working_area_command
, COMMAND_ANY
, "working_area <target#> <address> <size> <'backup'|'nobackup'> [virtual address]");
939 register_command(cmd_ctx
, NULL
, "virt2phys", handle_virt2phys_command
, COMMAND_ANY
, "virt2phys <virtual address>");
940 register_command(cmd_ctx
, NULL
, "profile", handle_profile_command
, COMMAND_EXEC
, "PRELIMINARY! - profile <seconds> <gmon.out>");
943 /* script procedures */
944 register_jim(cmd_ctx
, "openocd_mem2array", jim_mem2array
, "read memory and return as a TCL array for script processing");
945 register_jim(cmd_ctx
, "openocd_array2mem", jim_mem2array
, "convert a TCL array to memory locations and write the values");
949 int target_arch_state(struct target_s
*target
)
954 LOG_USER("No target has been configured");
958 LOG_USER("target state: %s", target_state_strings
[target
->state
]);
960 if (target
->state
!=TARGET_HALTED
)
963 retval
=target
->type
->arch_state(target
);
967 /* Single aligned words are guaranteed to use 16 or 32 bit access
968 * mode respectively, otherwise data is handled as quickly as
971 int target_write_buffer(struct target_s
*target
, u32 address
, u32 size
, u8
*buffer
)
974 if (!target
->type
->examined
)
976 LOG_ERROR("Target not examined yet");
980 LOG_DEBUG("writing buffer of %i byte at 0x%8.8x", size
, address
);
982 if (((address
% 2) == 0) && (size
== 2))
984 return target
->type
->write_memory(target
, address
, 2, 1, buffer
);
987 /* handle unaligned head bytes */
990 int unaligned
= 4 - (address
% 4);
992 if (unaligned
> size
)
995 if ((retval
= target
->type
->write_memory(target
, address
, 1, unaligned
, buffer
)) != ERROR_OK
)
999 address
+= unaligned
;
1003 /* handle aligned words */
1006 int aligned
= size
- (size
% 4);
1008 /* use bulk writes above a certain limit. This may have to be changed */
1011 if ((retval
= target
->type
->bulk_write_memory(target
, address
, aligned
/ 4, buffer
)) != ERROR_OK
)
1016 if ((retval
= target
->type
->write_memory(target
, address
, 4, aligned
/ 4, buffer
)) != ERROR_OK
)
1025 /* handle tail writes of less than 4 bytes */
1028 if ((retval
= target
->type
->write_memory(target
, address
, 1, size
, buffer
)) != ERROR_OK
)
1036 /* Single aligned words are guaranteed to use 16 or 32 bit access
1037 * mode respectively, otherwise data is handled as quickly as
1040 int target_read_buffer(struct target_s
*target
, u32 address
, u32 size
, u8
*buffer
)
1043 if (!target
->type
->examined
)
1045 LOG_ERROR("Target not examined yet");
1049 LOG_DEBUG("reading buffer of %i byte at 0x%8.8x", size
, address
);
1051 if (((address
% 2) == 0) && (size
== 2))
1053 return target
->type
->read_memory(target
, address
, 2, 1, buffer
);
1056 /* handle unaligned head bytes */
1059 int unaligned
= 4 - (address
% 4);
1061 if (unaligned
> size
)
1064 if ((retval
= target
->type
->read_memory(target
, address
, 1, unaligned
, buffer
)) != ERROR_OK
)
1067 buffer
+= unaligned
;
1068 address
+= unaligned
;
1072 /* handle aligned words */
1075 int aligned
= size
- (size
% 4);
1077 if ((retval
= target
->type
->read_memory(target
, address
, 4, aligned
/ 4, buffer
)) != ERROR_OK
)
1085 /* handle tail writes of less than 4 bytes */
1088 if ((retval
= target
->type
->read_memory(target
, address
, 1, size
, buffer
)) != ERROR_OK
)
1095 int target_checksum_memory(struct target_s
*target
, u32 address
, u32 size
, u32
* crc
)
1101 if (!target
->type
->examined
)
1103 LOG_ERROR("Target not examined yet");
1107 if ((retval
= target
->type
->checksum_memory(target
, address
,
1108 size
, &checksum
)) == ERROR_TARGET_RESOURCE_NOT_AVAILABLE
)
1110 buffer
= malloc(size
);
1113 LOG_ERROR("error allocating buffer for section (%d bytes)", size
);
1114 return ERROR_INVALID_ARGUMENTS
;
1116 retval
= target_read_buffer(target
, address
, size
, buffer
);
1117 if (retval
!= ERROR_OK
)
1123 /* convert to target endianess */
1124 for (i
= 0; i
< (size
/sizeof(u32
)); i
++)
1127 target_data
= target_buffer_get_u32(target
, &buffer
[i
*sizeof(u32
)]);
1128 target_buffer_set_u32(target
, &buffer
[i
*sizeof(u32
)], target_data
);
1131 retval
= image_calculate_checksum( buffer
, size
, &checksum
);
1140 int target_blank_check_memory(struct target_s
*target
, u32 address
, u32 size
, u32
* blank
)
1143 if (!target
->type
->examined
)
1145 LOG_ERROR("Target not examined yet");
1149 if (target
->type
->blank_check_memory
== 0)
1150 return ERROR_TARGET_RESOURCE_NOT_AVAILABLE
;
1152 retval
= target
->type
->blank_check_memory(target
, address
, size
, blank
);
1157 int target_read_u32(struct target_s
*target
, u32 address
, u32
*value
)
1160 if (!target
->type
->examined
)
1162 LOG_ERROR("Target not examined yet");
1166 int retval
= target
->type
->read_memory(target
, address
, 4, 1, value_buf
);
1168 if (retval
== ERROR_OK
)
1170 *value
= target_buffer_get_u32(target
, value_buf
);
1171 LOG_DEBUG("address: 0x%8.8x, value: 0x%8.8x", address
, *value
);
1176 LOG_DEBUG("address: 0x%8.8x failed", address
);
1182 int target_read_u16(struct target_s
*target
, u32 address
, u16
*value
)
1185 if (!target
->type
->examined
)
1187 LOG_ERROR("Target not examined yet");
1191 int retval
= target
->type
->read_memory(target
, address
, 2, 1, value_buf
);
1193 if (retval
== ERROR_OK
)
1195 *value
= target_buffer_get_u16(target
, value_buf
);
1196 LOG_DEBUG("address: 0x%8.8x, value: 0x%4.4x", address
, *value
);
1201 LOG_DEBUG("address: 0x%8.8x failed", address
);
1207 int target_read_u8(struct target_s
*target
, u32 address
, u8
*value
)
1209 int retval
= target
->type
->read_memory(target
, address
, 1, 1, value
);
1210 if (!target
->type
->examined
)
1212 LOG_ERROR("Target not examined yet");
1216 if (retval
== ERROR_OK
)
1218 LOG_DEBUG("address: 0x%8.8x, value: 0x%2.2x", address
, *value
);
1223 LOG_DEBUG("address: 0x%8.8x failed", address
);
1229 int target_write_u32(struct target_s
*target
, u32 address
, u32 value
)
1233 if (!target
->type
->examined
)
1235 LOG_ERROR("Target not examined yet");
1239 LOG_DEBUG("address: 0x%8.8x, value: 0x%8.8x", address
, value
);
1241 target_buffer_set_u32(target
, value_buf
, value
);
1242 if ((retval
= target
->type
->write_memory(target
, address
, 4, 1, value_buf
)) != ERROR_OK
)
1244 LOG_DEBUG("failed: %i", retval
);
1250 int target_write_u16(struct target_s
*target
, u32 address
, u16 value
)
1254 if (!target
->type
->examined
)
1256 LOG_ERROR("Target not examined yet");
1260 LOG_DEBUG("address: 0x%8.8x, value: 0x%8.8x", address
, value
);
1262 target_buffer_set_u16(target
, value_buf
, value
);
1263 if ((retval
= target
->type
->write_memory(target
, address
, 2, 1, value_buf
)) != ERROR_OK
)
1265 LOG_DEBUG("failed: %i", retval
);
1271 int target_write_u8(struct target_s
*target
, u32 address
, u8 value
)
1274 if (!target
->type
->examined
)
1276 LOG_ERROR("Target not examined yet");
1280 LOG_DEBUG("address: 0x%8.8x, value: 0x%2.2x", address
, value
);
1282 if ((retval
= target
->type
->read_memory(target
, address
, 1, 1, &value
)) != ERROR_OK
)
1284 LOG_DEBUG("failed: %i", retval
);
1290 int target_register_user_commands(struct command_context_s
*cmd_ctx
)
1292 register_command(cmd_ctx
, NULL
, "reg", handle_reg_command
, COMMAND_EXEC
, NULL
);
1293 register_command(cmd_ctx
, NULL
, "poll", handle_poll_command
, COMMAND_EXEC
, "poll target state");
1294 register_command(cmd_ctx
, NULL
, "wait_halt", handle_wait_halt_command
, COMMAND_EXEC
, "wait for target halt [time (s)]");
1295 register_command(cmd_ctx
, NULL
, "halt", handle_halt_command
, COMMAND_EXEC
, "halt target");
1296 register_command(cmd_ctx
, NULL
, "resume", handle_resume_command
, COMMAND_EXEC
, "resume target [addr]");
1297 register_command(cmd_ctx
, NULL
, "step", handle_step_command
, COMMAND_EXEC
, "step one instruction from current PC or [addr]");
1298 register_command(cmd_ctx
, NULL
, "reset", handle_reset_command
, COMMAND_EXEC
, "reset target [run|halt|init|run_and_halt|run_and_init]");
1299 register_command(cmd_ctx
, NULL
, "soft_reset_halt", handle_soft_reset_halt_command
, COMMAND_EXEC
, "halt the target and do a soft reset");
1301 register_command(cmd_ctx
, NULL
, "mdw", handle_md_command
, COMMAND_EXEC
, "display memory words <addr> [count]");
1302 register_command(cmd_ctx
, NULL
, "mdh", handle_md_command
, COMMAND_EXEC
, "display memory half-words <addr> [count]");
1303 register_command(cmd_ctx
, NULL
, "mdb", handle_md_command
, COMMAND_EXEC
, "display memory bytes <addr> [count]");
1305 register_command(cmd_ctx
, NULL
, "mww", handle_mw_command
, COMMAND_EXEC
, "write memory word <addr> <value> [count]");
1306 register_command(cmd_ctx
, NULL
, "mwh", handle_mw_command
, COMMAND_EXEC
, "write memory half-word <addr> <value> [count]");
1307 register_command(cmd_ctx
, NULL
, "mwb", handle_mw_command
, COMMAND_EXEC
, "write memory byte <addr> <value> [count]");
1309 register_command(cmd_ctx
, NULL
, "bp", handle_bp_command
, COMMAND_EXEC
, "set breakpoint <address> <length> [hw]");
1310 register_command(cmd_ctx
, NULL
, "rbp", handle_rbp_command
, COMMAND_EXEC
, "remove breakpoint <adress>");
1311 register_command(cmd_ctx
, NULL
, "wp", handle_wp_command
, COMMAND_EXEC
, "set watchpoint <address> <length> <r/w/a> [value] [mask]");
1312 register_command(cmd_ctx
, NULL
, "rwp", handle_rwp_command
, COMMAND_EXEC
, "remove watchpoint <adress>");
1314 register_command(cmd_ctx
, NULL
, "load_image", handle_load_image_command
, COMMAND_EXEC
, "load_image <file> <address> ['bin'|'ihex'|'elf'|'s19']");
1315 register_command(cmd_ctx
, NULL
, "dump_image", handle_dump_image_command
, COMMAND_EXEC
, "dump_image <file> <address> <size>");
1316 register_command(cmd_ctx
, NULL
, "verify_image", handle_verify_image_command
, COMMAND_EXEC
, "verify_image <file> [offset] [type]");
1317 register_command(cmd_ctx
, NULL
, "load_binary", handle_load_image_command
, COMMAND_EXEC
, "[DEPRECATED] load_binary <file> <address>");
1318 register_command(cmd_ctx
, NULL
, "dump_binary", handle_dump_image_command
, COMMAND_EXEC
, "[DEPRECATED] dump_binary <file> <address> <size>");
1320 target_request_register_commands(cmd_ctx
);
1321 trace_register_commands(cmd_ctx
);
1326 int handle_targets_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1328 target_t
*target
= targets
;
1333 int num
= strtoul(args
[0], NULL
, 0);
1338 target
= target
->next
;
1342 cmd_ctx
->current_target
= num
;
1344 command_print(cmd_ctx
, "%i is out of bounds, only %i targets are configured", num
, count
);
1351 command_print(cmd_ctx
, "%i: %s (%s), state: %s", count
++, target
->type
->name
, target_endianess_strings
[target
->endianness
], target_state_strings
[target
->state
]);
1352 target
= target
->next
;
1358 int handle_target_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1365 return ERROR_COMMAND_SYNTAX_ERROR
;
1368 /* search for the specified target */
1369 if (args
[0] && (args
[0][0] != 0))
1371 for (i
= 0; target_types
[i
]; i
++)
1373 if (strcmp(args
[0], target_types
[i
]->name
) == 0)
1375 target_t
**last_target_p
= &targets
;
1377 /* register target specific commands */
1378 if (target_types
[i
]->register_commands(cmd_ctx
) != ERROR_OK
)
1380 LOG_ERROR("couldn't register '%s' commands", args
[0]);
1386 while ((*last_target_p
)->next
)
1387 last_target_p
= &((*last_target_p
)->next
);
1388 last_target_p
= &((*last_target_p
)->next
);
1391 *last_target_p
= malloc(sizeof(target_t
));
1393 /* allocate memory for each unique target type */
1394 (*last_target_p
)->type
= (target_type_t
*)malloc(sizeof(target_type_t
));
1395 *((*last_target_p
)->type
) = *target_types
[i
];
1397 if (strcmp(args
[1], "big") == 0)
1398 (*last_target_p
)->endianness
= TARGET_BIG_ENDIAN
;
1399 else if (strcmp(args
[1], "little") == 0)
1400 (*last_target_p
)->endianness
= TARGET_LITTLE_ENDIAN
;
1403 LOG_ERROR("endianness must be either 'little' or 'big', not '%s'", args
[1]);
1404 return ERROR_COMMAND_SYNTAX_ERROR
;
1407 /* what to do on a target reset */
1408 (*last_target_p
)->reset_mode
= RESET_INIT
; /* default */
1409 if (strcmp(args
[2], "reset_halt") == 0)
1410 (*last_target_p
)->reset_mode
= RESET_HALT
;
1411 else if (strcmp(args
[2], "reset_run") == 0)
1412 (*last_target_p
)->reset_mode
= RESET_RUN
;
1413 else if (strcmp(args
[2], "reset_init") == 0)
1414 (*last_target_p
)->reset_mode
= RESET_INIT
;
1415 else if (strcmp(args
[2], "run_and_halt") == 0)
1416 (*last_target_p
)->reset_mode
= RESET_RUN_AND_HALT
;
1417 else if (strcmp(args
[2], "run_and_init") == 0)
1418 (*last_target_p
)->reset_mode
= RESET_RUN_AND_INIT
;
1421 /* Kludge! we want to make this reset arg optional while remaining compatible! */
1425 (*last_target_p
)->run_and_halt_time
= 1000; /* default 1s */
1427 (*last_target_p
)->working_area
= 0x0;
1428 (*last_target_p
)->working_area_size
= 0x0;
1429 (*last_target_p
)->working_areas
= NULL
;
1430 (*last_target_p
)->backup_working_area
= 0;
1432 (*last_target_p
)->state
= TARGET_UNKNOWN
;
1433 (*last_target_p
)->debug_reason
= DBG_REASON_UNDEFINED
;
1434 (*last_target_p
)->reg_cache
= NULL
;
1435 (*last_target_p
)->breakpoints
= NULL
;
1436 (*last_target_p
)->watchpoints
= NULL
;
1437 (*last_target_p
)->next
= NULL
;
1438 (*last_target_p
)->arch_info
= NULL
;
1440 /* initialize trace information */
1441 (*last_target_p
)->trace_info
= malloc(sizeof(trace_t
));
1442 (*last_target_p
)->trace_info
->num_trace_points
= 0;
1443 (*last_target_p
)->trace_info
->trace_points_size
= 0;
1444 (*last_target_p
)->trace_info
->trace_points
= NULL
;
1445 (*last_target_p
)->trace_info
->trace_history_size
= 0;
1446 (*last_target_p
)->trace_info
->trace_history
= NULL
;
1447 (*last_target_p
)->trace_info
->trace_history_pos
= 0;
1448 (*last_target_p
)->trace_info
->trace_history_overflowed
= 0;
1450 (*last_target_p
)->dbgmsg
= NULL
;
1451 (*last_target_p
)->dbg_msg_enabled
= 0;
1453 (*last_target_p
)->type
->target_command(cmd_ctx
, cmd
, args
, argc
, *last_target_p
);
1461 /* no matching target found */
1464 LOG_ERROR("target '%s' not found", args
[0]);
1465 return ERROR_COMMAND_SYNTAX_ERROR
;
1471 int target_invoke_script(struct command_context_s
*cmd_ctx
, target_t
*target
, char *name
)
1473 return command_run_linef(cmd_ctx
, " if {[catch {info body target_%s_%d} t]==0} {target_%s_%d}",
1474 name
, get_num_by_target(target
),
1475 name
, get_num_by_target(target
));
1478 int handle_run_and_halt_time_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1480 target_t
*target
= NULL
;
1484 return ERROR_COMMAND_SYNTAX_ERROR
;
1487 target
= get_target_by_num(strtoul(args
[0], NULL
, 0));
1490 return ERROR_COMMAND_SYNTAX_ERROR
;
1493 target
->run_and_halt_time
= strtoul(args
[1], NULL
, 0);
1498 int handle_working_area_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1500 target_t
*target
= NULL
;
1502 if ((argc
< 4) || (argc
> 5))
1504 return ERROR_COMMAND_SYNTAX_ERROR
;
1507 target
= get_target_by_num(strtoul(args
[0], NULL
, 0));
1510 return ERROR_COMMAND_SYNTAX_ERROR
;
1512 target_free_all_working_areas(target
);
1514 target
->working_area_phys
= target
->working_area_virt
= strtoul(args
[1], NULL
, 0);
1517 target
->working_area_virt
= strtoul(args
[4], NULL
, 0);
1519 target
->working_area_size
= strtoul(args
[2], NULL
, 0);
1521 if (strcmp(args
[3], "backup") == 0)
1523 target
->backup_working_area
= 1;
1525 else if (strcmp(args
[3], "nobackup") == 0)
1527 target
->backup_working_area
= 0;
1531 LOG_ERROR("unrecognized <backup|nobackup> argument (%s)", args
[3]);
1532 return ERROR_COMMAND_SYNTAX_ERROR
;
1539 /* process target state changes */
1540 int handle_target(void *priv
)
1542 target_t
*target
= targets
;
1546 if (target_continous_poll
)
1548 /* polling may fail silently until the target has been examined */
1549 target_poll(target
);
1552 target
= target
->next
;
1558 int handle_reg_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1567 target
= get_current_target(cmd_ctx
);
1569 /* list all available registers for the current target */
1572 reg_cache_t
*cache
= target
->reg_cache
;
1578 for (i
= 0; i
< cache
->num_regs
; i
++)
1580 value
= buf_to_str(cache
->reg_list
[i
].value
, cache
->reg_list
[i
].size
, 16);
1581 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
);
1584 cache
= cache
->next
;
1590 /* access a single register by its ordinal number */
1591 if ((args
[0][0] >= '0') && (args
[0][0] <= '9'))
1593 int num
= strtoul(args
[0], NULL
, 0);
1594 reg_cache_t
*cache
= target
->reg_cache
;
1600 for (i
= 0; i
< cache
->num_regs
; i
++)
1604 reg
= &cache
->reg_list
[i
];
1610 cache
= cache
->next
;
1615 command_print(cmd_ctx
, "%i is out of bounds, the current target has only %i registers (0 - %i)", num
, count
, count
- 1);
1618 } else /* access a single register by its name */
1620 reg
= register_get_by_name(target
->reg_cache
, args
[0], 1);
1624 command_print(cmd_ctx
, "register %s not found in current target", args
[0]);
1629 /* display a register */
1630 if ((argc
== 1) || ((argc
== 2) && !((args
[1][0] >= '0') && (args
[1][0] <= '9'))))
1632 if ((argc
== 2) && (strcmp(args
[1], "force") == 0))
1635 if (reg
->valid
== 0)
1637 reg_arch_type_t
*arch_type
= register_get_arch_type(reg
->arch_type
);
1638 if (arch_type
== NULL
)
1640 LOG_ERROR("BUG: encountered unregistered arch type");
1643 arch_type
->get(reg
);
1645 value
= buf_to_str(reg
->value
, reg
->size
, 16);
1646 command_print(cmd_ctx
, "%s (/%i): 0x%s", reg
->name
, reg
->size
, value
);
1651 /* set register value */
1654 u8
*buf
= malloc(CEIL(reg
->size
, 8));
1655 str_to_buf(args
[1], strlen(args
[1]), buf
, reg
->size
, 0);
1657 reg_arch_type_t
*arch_type
= register_get_arch_type(reg
->arch_type
);
1658 if (arch_type
== NULL
)
1660 LOG_ERROR("BUG: encountered unregistered arch type");
1664 arch_type
->set(reg
, buf
);
1666 value
= buf_to_str(reg
->value
, reg
->size
, 16);
1667 command_print(cmd_ctx
, "%s (/%i): 0x%s", reg
->name
, reg
->size
, value
);
1675 command_print(cmd_ctx
, "usage: reg <#|name> [value]");
1680 static int wait_state(struct command_context_s
*cmd_ctx
, char *cmd
, enum target_state state
, int ms
);
1682 int handle_poll_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1684 target_t
*target
= get_current_target(cmd_ctx
);
1688 target_poll(target
);
1689 target_arch_state(target
);
1693 if (strcmp(args
[0], "on") == 0)
1695 target_continous_poll
= 1;
1697 else if (strcmp(args
[0], "off") == 0)
1699 target_continous_poll
= 0;
1703 command_print(cmd_ctx
, "arg is \"on\" or \"off\"");
1711 int handle_wait_halt_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1719 ms
= strtoul(args
[0], &end
, 0) * 1000;
1722 command_print(cmd_ctx
, "usage: %s [seconds]", cmd
);
1727 return wait_state(cmd_ctx
, cmd
, TARGET_HALTED
, ms
);
1730 static int wait_state(struct command_context_s
*cmd_ctx
, char *cmd
, enum target_state state
, int ms
)
1733 struct timeval timeout
, now
;
1735 gettimeofday(&timeout
, NULL
);
1736 timeval_add_time(&timeout
, 0, ms
* 1000);
1738 target_t
*target
= get_current_target(cmd_ctx
);
1741 if ((retval
=target_poll(target
))!=ERROR_OK
)
1743 target_call_timer_callbacks_now();
1744 if (target
->state
== state
)
1751 command_print(cmd_ctx
, "waiting for target %s...", target_state_strings
[state
]);
1754 gettimeofday(&now
, NULL
);
1755 if ((now
.tv_sec
> timeout
.tv_sec
) || ((now
.tv_sec
== timeout
.tv_sec
) && (now
.tv_usec
>= timeout
.tv_usec
)))
1757 LOG_ERROR("timed out while waiting for target %s", target_state_strings
[state
]);
1765 int handle_halt_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1768 target_t
*target
= get_current_target(cmd_ctx
);
1772 if ((retval
= target_halt(target
)) != ERROR_OK
)
1777 return handle_wait_halt_command(cmd_ctx
, cmd
, args
, argc
);
1780 int handle_soft_reset_halt_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1782 target_t
*target
= get_current_target(cmd_ctx
);
1784 LOG_USER("requesting target halt and executing a soft reset");
1786 target
->type
->soft_reset_halt(target
);
1791 int handle_reset_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1793 target_t
*target
= get_current_target(cmd_ctx
);
1794 enum target_reset_mode reset_mode
= target
->reset_mode
;
1795 enum target_reset_mode save
= target
->reset_mode
;
1801 if (strcmp("run", args
[0]) == 0)
1802 reset_mode
= RESET_RUN
;
1803 else if (strcmp("halt", args
[0]) == 0)
1804 reset_mode
= RESET_HALT
;
1805 else if (strcmp("init", args
[0]) == 0)
1806 reset_mode
= RESET_INIT
;
1807 else if (strcmp("run_and_halt", args
[0]) == 0)
1809 reset_mode
= RESET_RUN_AND_HALT
;
1812 target
->run_and_halt_time
= strtoul(args
[1], NULL
, 0);
1815 else if (strcmp("run_and_init", args
[0]) == 0)
1817 reset_mode
= RESET_RUN_AND_INIT
;
1820 target
->run_and_halt_time
= strtoul(args
[1], NULL
, 0);
1825 command_print(cmd_ctx
, "usage: reset ['run', 'halt', 'init', 'run_and_halt', 'run_and_init]");
1830 /* temporarily modify mode of current reset target */
1831 target
->reset_mode
= reset_mode
;
1833 /* reset *all* targets */
1834 target_process_reset(cmd_ctx
);
1836 /* Restore default reset mode for this target */
1837 target
->reset_mode
= save
;
1842 int handle_resume_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1845 target_t
*target
= get_current_target(cmd_ctx
);
1847 target_invoke_script(cmd_ctx
, target
, "pre_resume");
1850 retval
= target_resume(target
, 1, 0, 1, 0); /* current pc, addr = 0, handle breakpoints, not debugging */
1852 retval
= target_resume(target
, 0, strtoul(args
[0], NULL
, 0), 1, 0); /* addr = args[0], handle breakpoints, not debugging */
1855 return ERROR_COMMAND_SYNTAX_ERROR
;
1861 int handle_step_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1863 target_t
*target
= get_current_target(cmd_ctx
);
1868 target
->type
->step(target
, 1, 0, 1); /* current pc, addr = 0, handle breakpoints */
1871 target
->type
->step(target
, 0, strtoul(args
[0], NULL
, 0), 1); /* addr = args[0], handle breakpoints */
1876 int handle_md_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1878 const int line_bytecnt
= 32;
1891 target_t
*target
= get_current_target(cmd_ctx
);
1897 count
= strtoul(args
[1], NULL
, 0);
1899 address
= strtoul(args
[0], NULL
, 0);
1905 size
= 4; line_modulo
= line_bytecnt
/ 4;
1908 size
= 2; line_modulo
= line_bytecnt
/ 2;
1911 size
= 1; line_modulo
= line_bytecnt
/ 1;
1917 buffer
= calloc(count
, size
);
1918 retval
= target
->type
->read_memory(target
, address
, size
, count
, buffer
);
1919 if (retval
== ERROR_OK
)
1923 for (i
= 0; i
< count
; i
++)
1925 if (i
%line_modulo
== 0)
1926 output_len
+= snprintf(output
+ output_len
, 128 - output_len
, "0x%8.8x: ", address
+ (i
*size
));
1931 output_len
+= snprintf(output
+ output_len
, 128 - output_len
, "%8.8x ", target_buffer_get_u32(target
, &buffer
[i
*4]));
1934 output_len
+= snprintf(output
+ output_len
, 128 - output_len
, "%4.4x ", target_buffer_get_u16(target
, &buffer
[i
*2]));
1937 output_len
+= snprintf(output
+ output_len
, 128 - output_len
, "%2.2x ", buffer
[i
*1]);
1941 if ((i
%line_modulo
== line_modulo
-1) || (i
== count
- 1))
1943 command_print(cmd_ctx
, output
);
1954 int handle_mw_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1961 target_t
*target
= get_current_target(cmd_ctx
);
1964 if ((argc
< 2) || (argc
> 3))
1965 return ERROR_COMMAND_SYNTAX_ERROR
;
1967 address
= strtoul(args
[0], NULL
, 0);
1968 value
= strtoul(args
[1], NULL
, 0);
1970 count
= strtoul(args
[2], NULL
, 0);
1976 target_buffer_set_u32(target
, value_buf
, value
);
1980 target_buffer_set_u16(target
, value_buf
, value
);
1984 value_buf
[0] = value
;
1987 return ERROR_COMMAND_SYNTAX_ERROR
;
1989 for (i
=0; i
<count
; i
++)
1995 retval
= target
->type
->write_memory(target
, address
+ i
*wordsize
, 4, 1, value_buf
);
1998 retval
= target
->type
->write_memory(target
, address
+ i
*wordsize
, 2, 1, value_buf
);
2001 retval
= target
->type
->write_memory(target
, address
+ i
*wordsize
, 1, 1, value_buf
);
2006 if (retval
!=ERROR_OK
)
2016 int handle_load_image_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2026 duration_t duration
;
2027 char *duration_text
;
2029 target_t
*target
= get_current_target(cmd_ctx
);
2033 command_print(cmd_ctx
, "usage: load_image <filename> [address] [type]");
2037 /* a base address isn't always necessary, default to 0x0 (i.e. don't relocate) */
2040 image
.base_address_set
= 1;
2041 image
.base_address
= strtoul(args
[1], NULL
, 0);
2045 image
.base_address_set
= 0;
2048 image
.start_address_set
= 0;
2050 duration_start_measure(&duration
);
2052 if (image_open(&image
, args
[0], (argc
>= 3) ? args
[2] : NULL
) != ERROR_OK
)
2059 for (i
= 0; i
< image
.num_sections
; i
++)
2061 buffer
= malloc(image
.sections
[i
].size
);
2064 command_print(cmd_ctx
, "error allocating buffer for section (%d bytes)", image
.sections
[i
].size
);
2068 if ((retval
= image_read_section(&image
, i
, 0x0, image
.sections
[i
].size
, buffer
, &buf_cnt
)) != ERROR_OK
)
2073 if ((retval
= target_write_buffer(target
, image
.sections
[i
].base_address
, buf_cnt
, buffer
)) != ERROR_OK
)
2078 image_size
+= buf_cnt
;
2079 command_print(cmd_ctx
, "%u byte written at address 0x%8.8x", buf_cnt
, image
.sections
[i
].base_address
);
2084 duration_stop_measure(&duration
, &duration_text
);
2085 if (retval
==ERROR_OK
)
2087 command_print(cmd_ctx
, "downloaded %u byte in %s", image_size
, duration_text
);
2089 free(duration_text
);
2091 image_close(&image
);
2097 int handle_dump_image_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2104 int retval
=ERROR_OK
;
2106 duration_t duration
;
2107 char *duration_text
;
2109 target_t
*target
= get_current_target(cmd_ctx
);
2113 command_print(cmd_ctx
, "usage: dump_image <filename> <address> <size>");
2117 address
= strtoul(args
[1], NULL
, 0);
2118 size
= strtoul(args
[2], NULL
, 0);
2120 if ((address
& 3) || (size
& 3))
2122 command_print(cmd_ctx
, "only 32-bit aligned address and size are supported");
2126 if (fileio_open(&fileio
, args
[0], FILEIO_WRITE
, FILEIO_BINARY
) != ERROR_OK
)
2131 duration_start_measure(&duration
);
2136 u32 this_run_size
= (size
> 560) ? 560 : size
;
2138 retval
= target
->type
->read_memory(target
, address
, 4, this_run_size
/ 4, buffer
);
2139 if (retval
!= ERROR_OK
)
2144 retval
= fileio_write(&fileio
, this_run_size
, buffer
, &size_written
);
2145 if (retval
!= ERROR_OK
)
2150 size
-= this_run_size
;
2151 address
+= this_run_size
;
2154 fileio_close(&fileio
);
2156 duration_stop_measure(&duration
, &duration_text
);
2157 if (retval
==ERROR_OK
)
2159 command_print(cmd_ctx
, "dumped %"PRIi64
" byte in %s", fileio
.size
, duration_text
);
2161 free(duration_text
);
2166 int handle_verify_image_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2174 u32 mem_checksum
= 0;
2178 duration_t duration
;
2179 char *duration_text
;
2181 target_t
*target
= get_current_target(cmd_ctx
);
2185 return ERROR_COMMAND_SYNTAX_ERROR
;
2190 LOG_ERROR("no target selected");
2194 duration_start_measure(&duration
);
2198 image
.base_address_set
= 1;
2199 image
.base_address
= strtoul(args
[1], NULL
, 0);
2203 image
.base_address_set
= 0;
2204 image
.base_address
= 0x0;
2207 image
.start_address_set
= 0;
2209 if ((retval
=image_open(&image
, args
[0], (argc
== 3) ? args
[2] : NULL
)) != ERROR_OK
)
2216 for (i
= 0; i
< image
.num_sections
; i
++)
2218 buffer
= malloc(image
.sections
[i
].size
);
2221 command_print(cmd_ctx
, "error allocating buffer for section (%d bytes)", image
.sections
[i
].size
);
2224 if ((retval
= image_read_section(&image
, i
, 0x0, image
.sections
[i
].size
, buffer
, &buf_cnt
)) != ERROR_OK
)
2230 /* calculate checksum of image */
2231 image_calculate_checksum( buffer
, buf_cnt
, &checksum
);
2233 retval
= target_checksum_memory(target
, image
.sections
[i
].base_address
, buf_cnt
, &mem_checksum
);
2234 if( retval
!= ERROR_OK
)
2240 if( checksum
!= mem_checksum
)
2242 /* failed crc checksum, fall back to a binary compare */
2245 command_print(cmd_ctx
, "checksum mismatch - attempting binary compare");
2247 data
= (u8
*)malloc(buf_cnt
);
2249 /* Can we use 32bit word accesses? */
2251 int count
= buf_cnt
;
2252 if ((count
% 4) == 0)
2257 retval
= target
->type
->read_memory(target
, image
.sections
[i
].base_address
, size
, count
, data
);
2258 if (retval
== ERROR_OK
)
2261 for (t
= 0; t
< buf_cnt
; t
++)
2263 if (data
[t
] != buffer
[t
])
2265 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
]);
2278 image_size
+= buf_cnt
;
2281 duration_stop_measure(&duration
, &duration_text
);
2282 if (retval
==ERROR_OK
)
2284 command_print(cmd_ctx
, "verified %u bytes in %s", image_size
, duration_text
);
2286 free(duration_text
);
2288 image_close(&image
);
2293 int handle_bp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2296 target_t
*target
= get_current_target(cmd_ctx
);
2300 breakpoint_t
*breakpoint
= target
->breakpoints
;
2304 if (breakpoint
->type
== BKPT_SOFT
)
2306 char* buf
= buf_to_str(breakpoint
->orig_instr
, breakpoint
->length
, 16);
2307 command_print(cmd_ctx
, "0x%8.8x, 0x%x, %i, 0x%s", breakpoint
->address
, breakpoint
->length
, breakpoint
->set
, buf
);
2312 command_print(cmd_ctx
, "0x%8.8x, 0x%x, %i", breakpoint
->address
, breakpoint
->length
, breakpoint
->set
);
2314 breakpoint
= breakpoint
->next
;
2322 length
= strtoul(args
[1], NULL
, 0);
2325 if (strcmp(args
[2], "hw") == 0)
2328 if ((retval
= breakpoint_add(target
, strtoul(args
[0], NULL
, 0), length
, hw
)) != ERROR_OK
)
2330 LOG_ERROR("Failure setting breakpoints");
2334 command_print(cmd_ctx
, "breakpoint added at address 0x%8.8x", strtoul(args
[0], NULL
, 0));
2339 command_print(cmd_ctx
, "usage: bp <address> <length> ['hw']");
2345 int handle_rbp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2347 target_t
*target
= get_current_target(cmd_ctx
);
2350 breakpoint_remove(target
, strtoul(args
[0], NULL
, 0));
2355 int handle_wp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2357 target_t
*target
= get_current_target(cmd_ctx
);
2362 watchpoint_t
*watchpoint
= target
->watchpoints
;
2366 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
);
2367 watchpoint
= watchpoint
->next
;
2372 enum watchpoint_rw type
= WPT_ACCESS
;
2373 u32 data_value
= 0x0;
2374 u32 data_mask
= 0xffffffff;
2390 command_print(cmd_ctx
, "usage: wp <address> <length> [r/w/a] [value] [mask]");
2396 data_value
= strtoul(args
[3], NULL
, 0);
2400 data_mask
= strtoul(args
[4], NULL
, 0);
2403 if ((retval
= watchpoint_add(target
, strtoul(args
[0], NULL
, 0),
2404 strtoul(args
[1], NULL
, 0), type
, data_value
, data_mask
)) != ERROR_OK
)
2406 LOG_ERROR("Failure setting breakpoints");
2411 command_print(cmd_ctx
, "usage: wp <address> <length> [r/w/a] [value] [mask]");
2417 int handle_rwp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2419 target_t
*target
= get_current_target(cmd_ctx
);
2422 watchpoint_remove(target
, strtoul(args
[0], NULL
, 0));
2427 int handle_virt2phys_command(command_context_t
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2430 target_t
*target
= get_current_target(cmd_ctx
);
2436 return ERROR_COMMAND_SYNTAX_ERROR
;
2438 va
= strtoul(args
[0], NULL
, 0);
2440 retval
= target
->type
->virt2phys(target
, va
, &pa
);
2441 if (retval
== ERROR_OK
)
2443 command_print(cmd_ctx
, "Physical address 0x%08x", pa
);
2447 /* lower levels will have logged a detailed error which is
2448 * forwarded to telnet/GDB session.
2453 static void writeLong(FILE *f
, int l
)
2458 char c
=(l
>>(i
*8))&0xff;
2459 fwrite(&c
, 1, 1, f
);
2463 static void writeString(FILE *f
, char *s
)
2465 fwrite(s
, 1, strlen(s
), f
);
2470 // Dump a gmon.out histogram file.
2471 static void writeGmon(u32
*samples
, int sampleNum
, char *filename
)
2474 FILE *f
=fopen(filename
, "w");
2477 fwrite("gmon", 1, 4, f
);
2478 writeLong(f
, 0x00000001); // Version
2479 writeLong(f
, 0); // padding
2480 writeLong(f
, 0); // padding
2481 writeLong(f
, 0); // padding
2483 fwrite("", 1, 1, f
); // GMON_TAG_TIME_HIST
2485 // figure out bucket size
2488 for (i
=0; i
<sampleNum
; i
++)
2500 int addressSpace
=(max
-min
+1);
2502 static int const maxBuckets
=256*1024; // maximum buckets.
2503 int length
=addressSpace
;
2504 if (length
> maxBuckets
)
2508 int *buckets
=malloc(sizeof(int)*length
);
2514 memset(buckets
, 0, sizeof(int)*length
);
2515 for (i
=0; i
<sampleNum
;i
++)
2517 u32 address
=samples
[i
];
2518 long long a
=address
-min
;
2519 long long b
=length
-1;
2520 long long c
=addressSpace
-1;
2521 int index
=(a
*b
)/c
; // danger!!!! int32 overflows
2525 // append binary memory gmon.out &profile_hist_hdr ((char*)&profile_hist_hdr + sizeof(struct gmon_hist_hdr))
2526 writeLong(f
, min
); // low_pc
2527 writeLong(f
, max
); // high_pc
2528 writeLong(f
, length
); // # of samples
2529 writeLong(f
, 64000000); // 64MHz
2530 writeString(f
, "seconds");
2531 for (i
=0; i
<(15-strlen("seconds")); i
++)
2533 fwrite("", 1, 1, f
); // padding
2535 writeString(f
, "s");
2537 // append binary memory gmon.out profile_hist_data (profile_hist_data + profile_hist_hdr.hist_size)
2539 char *data
=malloc(2*length
);
2542 for (i
=0; i
<length
;i
++)
2551 data
[i
*2+1]=(val
>>8)&0xff;
2554 fwrite(data
, 1, length
*2, f
);
2564 /* profiling samples the CPU PC as quickly as OpenOCD is able, which will be used as a random sampling of PC */
2565 int handle_profile_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2567 target_t
*target
= get_current_target(cmd_ctx
);
2568 struct timeval timeout
, now
;
2570 gettimeofday(&timeout
, NULL
);
2573 return ERROR_COMMAND_SYNTAX_ERROR
;
2576 timeval_add_time(&timeout
, strtoul(args
[0], &end
, 0), 0);
2582 command_print(cmd_ctx
, "Starting profiling. Halting and resuming the target as often as we can...");
2584 static const int maxSample
=10000;
2585 u32
*samples
=malloc(sizeof(u32
)*maxSample
);
2590 int retval
=ERROR_OK
;
2591 // hopefully it is safe to cache! We want to stop/restart as quickly as possible.
2592 reg_t
*reg
= register_get_by_name(target
->reg_cache
, "pc", 1);
2596 target_poll(target
);
2597 if (target
->state
== TARGET_HALTED
)
2599 u32 t
=*((u32
*)reg
->value
);
2600 samples
[numSamples
++]=t
;
2601 retval
= target_resume(target
, 1, 0, 0, 0); /* current pc, addr = 0, do not handle breakpoints, not debugging */
2602 target_poll(target
);
2603 usleep(10*1000); // sleep 10ms, i.e. <100 samples/second.
2604 } else if (target
->state
== TARGET_RUNNING
)
2606 // We want to quickly sample the PC.
2607 target_halt(target
);
2610 command_print(cmd_ctx
, "Target not halted or running");
2614 if (retval
!=ERROR_OK
)
2619 gettimeofday(&now
, NULL
);
2620 if ((numSamples
>=maxSample
) || ((now
.tv_sec
>= timeout
.tv_sec
) && (now
.tv_usec
>= timeout
.tv_usec
)))
2622 command_print(cmd_ctx
, "Profiling completed. %d samples.", numSamples
);
2623 target_poll(target
);
2624 if (target
->state
== TARGET_HALTED
)
2626 target_resume(target
, 1, 0, 0, 0); /* current pc, addr = 0, do not handle breakpoints, not debugging */
2628 target_poll(target
);
2629 writeGmon(samples
, numSamples
, args
[1]);
2630 command_print(cmd_ctx
, "Wrote %s", args
[1]);
2639 static int new_int_array_element(Jim_Interp
* interp
, const char *varname
, int idx
, u32 val
)
2642 Jim_Obj
*nameObjPtr
, *valObjPtr
;
2645 namebuf
= alloc_printf("%s(%d)", varname
, idx
);
2649 nameObjPtr
= Jim_NewStringObj(interp
, namebuf
, -1);
2650 valObjPtr
= Jim_NewIntObj(interp
, val
);
2651 if (!nameObjPtr
|| !valObjPtr
)
2657 Jim_IncrRefCount(nameObjPtr
);
2658 Jim_IncrRefCount(valObjPtr
);
2659 result
= Jim_SetVariable(interp
, nameObjPtr
, valObjPtr
);
2660 Jim_DecrRefCount(interp
, nameObjPtr
);
2661 Jim_DecrRefCount(interp
, valObjPtr
);
2663 /* printf("%s(%d) <= 0%08x\n", varname, idx, val); */
2667 static int jim_mem2array(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *argv
)
2670 command_context_t
*context
;
2677 const char *varname
;
2679 int i
, n
, e
, retval
;
2681 /* argv[1] = name of array to receive the data
2682 * argv[2] = desired width
2683 * argv[3] = memory address
2684 * argv[4] = count of times to read
2687 Jim_WrongNumArgs(interp
, 1, argv
, "varname width addr nelems");
2690 varname
= Jim_GetString(argv
[1], &len
);
2691 /* given "foo" get space for worse case "foo(%d)" .. add 20 */
2693 e
= Jim_GetLong(interp
, argv
[2], &l
);
2699 e
= Jim_GetLong(interp
, argv
[3], &l
);
2704 e
= Jim_GetLong(interp
, argv
[4], &l
);
2720 Jim_SetResult(interp
, Jim_NewEmptyStringObj(interp
));
2721 Jim_AppendStrings( interp
, Jim_GetResult(interp
), "Invalid width param, must be 8/16/32", NULL
);
2725 Jim_SetResult(interp
, Jim_NewEmptyStringObj(interp
));
2726 Jim_AppendStrings(interp
, Jim_GetResult(interp
), "mem2array: zero width read?", NULL
);
2729 if ((addr
+ (len
* width
)) < addr
) {
2730 Jim_SetResult(interp
, Jim_NewEmptyStringObj(interp
));
2731 Jim_AppendStrings(interp
, Jim_GetResult(interp
), "mem2array: addr + len - wraps to zero?", NULL
);
2734 /* absurd transfer size? */
2736 Jim_SetResult(interp
, Jim_NewEmptyStringObj(interp
));
2737 Jim_AppendStrings(interp
, Jim_GetResult(interp
), "mem2array: absurd > 64K item request", NULL
);
2742 ((width
== 2) && ((addr
& 1) == 0)) ||
2743 ((width
== 4) && ((addr
& 3) == 0))) {
2747 Jim_SetResult(interp
, Jim_NewEmptyStringObj(interp
));
2748 sprintf(buf
, "mem2array address: 0x%08x is not aligned for %d byte reads", addr
, width
);
2749 Jim_AppendStrings(interp
, Jim_GetResult(interp
), buf
, NULL
);
2753 context
= Jim_GetAssocData(interp
, "context");
2754 if (context
== NULL
)
2756 LOG_ERROR("mem2array: no command context");
2759 target
= get_current_target(context
);
2762 LOG_ERROR("mem2array: no current target");
2773 /* Slurp... in buffer size chunks */
2775 count
= len
; /* in objects.. */
2776 if (count
> (sizeof(buffer
)/width
)) {
2777 count
= (sizeof(buffer
)/width
);
2780 retval
= target
->type
->read_memory( target
, addr
, width
, count
, buffer
);
2781 if (retval
!= ERROR_OK
) {
2783 LOG_ERROR("mem2array: Read @ 0x%08x, w=%d, cnt=%d, failed", addr
, width
, count
);
2784 Jim_SetResult(interp
, Jim_NewEmptyStringObj(interp
));
2785 Jim_AppendStrings(interp
, Jim_GetResult(interp
), "mem2array: cannot read memory", NULL
);
2789 v
= 0; /* shut up gcc */
2790 for (i
= 0 ;i
< count
;i
++, n
++) {
2793 v
= target_buffer_get_u32(target
, &buffer
[i
*width
]);
2796 v
= target_buffer_get_u16(target
, &buffer
[i
*width
]);
2799 v
= buffer
[i
] & 0x0ff;
2802 new_int_array_element(interp
, varname
, n
, v
);
2808 Jim_SetResult(interp
, Jim_NewEmptyStringObj(interp
));
2813 static int get_int_array_element(Jim_Interp
* interp
, const char *varname
, int idx
, u32
*val
)
2816 Jim_Obj
*nameObjPtr
, *valObjPtr
;
2820 namebuf
= alloc_printf("%s(%d)", varname
, idx
);
2824 nameObjPtr
= Jim_NewStringObj(interp
, namebuf
, -1);
2831 Jim_IncrRefCount(nameObjPtr
);
2832 valObjPtr
= Jim_GetVariable(interp
, nameObjPtr
, JIM_ERRMSG
);
2833 Jim_DecrRefCount(interp
, nameObjPtr
);
2835 if (valObjPtr
== NULL
)
2838 result
= Jim_GetLong(interp
, valObjPtr
, &l
);
2839 /* printf("%s(%d) => 0%08x\n", varname, idx, val); */
2844 static int jim_array2mem(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *argv
)
2847 command_context_t
*context
;
2854 const char *varname
;
2856 int i
, n
, e
, retval
;
2858 /* argv[1] = name of array to get the data
2859 * argv[2] = desired width
2860 * argv[3] = memory address
2861 * argv[4] = count to write
2864 Jim_WrongNumArgs(interp
, 1, argv
, "varname width addr nelems");
2867 varname
= Jim_GetString(argv
[1], &len
);
2868 /* given "foo" get space for worse case "foo(%d)" .. add 20 */
2870 e
= Jim_GetLong(interp
, argv
[2], &l
);
2876 e
= Jim_GetLong(interp
, argv
[3], &l
);
2881 e
= Jim_GetLong(interp
, argv
[4], &l
);
2897 Jim_SetResult(interp
, Jim_NewEmptyStringObj(interp
));
2898 Jim_AppendStrings( interp
, Jim_GetResult(interp
), "Invalid width param, must be 8/16/32", NULL
);
2902 Jim_SetResult(interp
, Jim_NewEmptyStringObj(interp
));
2903 Jim_AppendStrings(interp
, Jim_GetResult(interp
), "array2mem: zero width read?", NULL
);
2906 if ((addr
+ (len
* width
)) < addr
) {
2907 Jim_SetResult(interp
, Jim_NewEmptyStringObj(interp
));
2908 Jim_AppendStrings(interp
, Jim_GetResult(interp
), "array2mem: addr + len - wraps to zero?", NULL
);
2911 /* absurd transfer size? */
2913 Jim_SetResult(interp
, Jim_NewEmptyStringObj(interp
));
2914 Jim_AppendStrings(interp
, Jim_GetResult(interp
), "array2mem: absurd > 64K item request", NULL
);
2919 ((width
== 2) && ((addr
& 1) == 0)) ||
2920 ((width
== 4) && ((addr
& 3) == 0))) {
2924 Jim_SetResult(interp
, Jim_NewEmptyStringObj(interp
));
2925 sprintf(buf
, "array2mem address: 0x%08x is not aligned for %d byte reads", addr
, width
);
2926 Jim_AppendStrings(interp
, Jim_GetResult(interp
), buf
, NULL
);
2930 context
= Jim_GetAssocData(interp
, "context");
2931 if (context
== NULL
)
2933 LOG_ERROR("array2mem: no command context");
2936 target
= get_current_target(context
);
2939 LOG_ERROR("array2mem: no current target");
2950 /* Slurp... in buffer size chunks */
2952 count
= len
; /* in objects.. */
2953 if (count
> (sizeof(buffer
)/width
)) {
2954 count
= (sizeof(buffer
)/width
);
2957 v
= 0; /* shut up gcc */
2958 for (i
= 0 ;i
< count
;i
++, n
++) {
2959 get_int_array_element(interp
, varname
, n
, &v
);
2962 target_buffer_set_u32(target
, &buffer
[i
*width
], v
);
2965 target_buffer_set_u16(target
, &buffer
[i
*width
], v
);
2968 buffer
[i
] = v
& 0x0ff;
2974 retval
= target
->type
->write_memory(target
, addr
, width
, count
, buffer
);
2975 if (retval
!= ERROR_OK
) {
2977 LOG_ERROR("array2mem: Write @ 0x%08x, w=%d, cnt=%d, failed", addr
, width
, count
);
2978 Jim_SetResult(interp
, Jim_NewEmptyStringObj(interp
));
2979 Jim_AppendStrings(interp
, Jim_GetResult(interp
), "mem2array: cannot read memory", NULL
);
2985 Jim_SetResult(interp
, Jim_NewEmptyStringObj(interp
));
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)