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 * This program is free software; you can redistribute it and/or modify *
9 * it under the terms of the GNU General Public License as published by *
10 * the Free Software Foundation; either version 2 of the License, or *
11 * (at your option) any later version. *
13 * This program is distributed in the hope that it will be useful, *
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
16 * GNU General Public License for more details. *
18 * You should have received a copy of the GNU General Public License *
19 * along with this program; if not, write to the *
20 * Free Software Foundation, Inc., *
21 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
22 ***************************************************************************/
27 #include "replacements.h"
29 #include "target_request.h"
32 #include "configuration.h"
33 #include "binarybuffer.h"
40 #include <sys/types.h>
48 #include <time_support.h>
53 int cli_target_callback_event_handler(struct target_s
*target
, enum target_event event
, void *priv
);
55 int handle_target_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
56 int handle_targets_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
58 int handle_run_and_halt_time_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
59 int handle_working_area_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
61 int handle_reg_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
62 int handle_poll_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
63 int handle_halt_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
64 int handle_wait_halt_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
65 int handle_reset_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
66 int handle_soft_reset_halt_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
67 int handle_resume_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
68 int handle_step_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
69 int handle_md_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
70 int handle_mw_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
71 int handle_load_image_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
72 int handle_dump_image_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
73 int handle_verify_image_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
74 int handle_bp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
75 int handle_rbp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
76 int handle_wp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
77 int handle_rwp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
78 int handle_virt2phys_command(command_context_t
*cmd_ctx
, char *cmd
, char **args
, int argc
);
79 int handle_profile_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
80 static int jim_array2mem(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *argv
);
81 static int jim_mem2array(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *argv
);
85 extern target_type_t arm7tdmi_target
;
86 extern target_type_t arm720t_target
;
87 extern target_type_t arm9tdmi_target
;
88 extern target_type_t arm920t_target
;
89 extern target_type_t arm966e_target
;
90 extern target_type_t arm926ejs_target
;
91 extern target_type_t feroceon_target
;
92 extern target_type_t xscale_target
;
93 extern target_type_t cortexm3_target
;
94 extern target_type_t arm11_target
;
95 extern target_type_t mips_m4k_target
;
97 target_type_t
*target_types
[] =
113 target_t
*targets
= NULL
;
114 target_event_callback_t
*target_event_callbacks
= NULL
;
115 target_timer_callback_t
*target_timer_callbacks
= NULL
;
117 char *target_state_strings
[] =
126 char *target_debug_reason_strings
[] =
128 "debug request", "breakpoint", "watchpoint",
129 "watchpoint and breakpoint", "single step",
130 "target not halted", "undefined"
133 char *target_endianess_strings
[] =
139 static int target_continous_poll
= 1;
141 /* read a u32 from a buffer in target memory endianness */
142 u32
target_buffer_get_u32(target_t
*target
, u8
*buffer
)
144 if (target
->endianness
== TARGET_LITTLE_ENDIAN
)
145 return le_to_h_u32(buffer
);
147 return be_to_h_u32(buffer
);
150 /* read a u16 from a buffer in target memory endianness */
151 u16
target_buffer_get_u16(target_t
*target
, u8
*buffer
)
153 if (target
->endianness
== TARGET_LITTLE_ENDIAN
)
154 return le_to_h_u16(buffer
);
156 return be_to_h_u16(buffer
);
159 /* write a u32 to a buffer in target memory endianness */
160 void target_buffer_set_u32(target_t
*target
, u8
*buffer
, u32 value
)
162 if (target
->endianness
== TARGET_LITTLE_ENDIAN
)
163 h_u32_to_le(buffer
, value
);
165 h_u32_to_be(buffer
, value
);
168 /* write a u16 to a buffer in target memory endianness */
169 void target_buffer_set_u16(target_t
*target
, u8
*buffer
, u16 value
)
171 if (target
->endianness
== TARGET_LITTLE_ENDIAN
)
172 h_u16_to_le(buffer
, value
);
174 h_u16_to_be(buffer
, value
);
177 /* returns a pointer to the n-th configured target */
178 target_t
* get_target_by_num(int num
)
180 target_t
*target
= targets
;
187 target
= target
->next
;
194 int get_num_by_target(target_t
*query_target
)
196 target_t
*target
= targets
;
201 if (target
== query_target
)
203 target
= target
->next
;
210 target_t
* get_current_target(command_context_t
*cmd_ctx
)
212 target_t
*target
= get_target_by_num(cmd_ctx
->current_target
);
216 LOG_ERROR("BUG: current_target out of bounds");
223 /* Process target initialization, when target entered debug out of reset
224 * the handler is unregistered at the end of this function, so it's only called once
226 int target_init_handler(struct target_s
*target
, enum target_event event
, void *priv
)
228 struct command_context_s
*cmd_ctx
= priv
;
230 if (event
== TARGET_EVENT_HALTED
)
232 target_unregister_event_callback(target_init_handler
, priv
);
233 target_invoke_script(cmd_ctx
, target
, "post_reset");
234 jtag_execute_queue();
240 int target_run_and_halt_handler(void *priv
)
242 target_t
*target
= priv
;
249 int target_poll(struct target_s
*target
)
251 /* We can't poll until after examine */
252 if (!target
->type
->examined
)
254 /* Fail silently lest we pollute the log */
257 return target
->type
->poll(target
);
260 int target_halt(struct target_s
*target
)
262 /* We can't poll until after examine */
263 if (!target
->type
->examined
)
265 LOG_ERROR("Target not examined yet");
268 return target
->type
->halt(target
);
271 int target_resume(struct target_s
*target
, int current
, u32 address
, int handle_breakpoints
, int debug_execution
)
275 /* We can't poll until after examine */
276 if (!target
->type
->examined
)
278 LOG_ERROR("Target not examined yet");
282 /* note that resume *must* be asynchronous. The CPU can halt before we poll. The CPU can
283 * even halt at the current PC as a result of a software breakpoint being inserted by (a bug?)
286 if ((retval
= target
->type
->resume(target
, current
, address
, handle_breakpoints
, debug_execution
)) != ERROR_OK
)
292 int target_process_reset(struct command_context_s
*cmd_ctx
, enum target_reset_mode reset_mode
)
294 int retval
= ERROR_OK
;
296 struct timeval timeout
, now
;
301 target_invoke_script(cmd_ctx
, target
, "pre_reset");
302 target
= target
->next
;
305 if ((retval
= jtag_init_reset(cmd_ctx
)) != ERROR_OK
)
308 keep_alive(); /* we might be running on a very slow JTAG clk */
310 /* First time this is executed after launching OpenOCD, it will read out
311 * the type of CPU, etc. and init Embedded ICE registers in host
314 * It will also set up ICE registers in the target.
316 * However, if we assert TRST later, we need to set up the registers again.
318 * For the "reset halt/init" case we must only set up the registers here.
320 if ((retval
= target_examine(cmd_ctx
)) != ERROR_OK
)
323 keep_alive(); /* we might be running on a very slow JTAG clk */
328 /* we have no idea what state the target is in, so we
329 * have to drop working areas
331 target_free_all_working_areas_restore(target
, 0);
332 target
->reset_halt
=((reset_mode
==RESET_HALT
)||(reset_mode
==RESET_INIT
));
333 target
->type
->assert_reset(target
);
334 target
= target
->next
;
336 if ((retval
= jtag_execute_queue()) != ERROR_OK
)
338 LOG_WARNING("JTAG communication failed asserting reset.");
342 /* request target halt if necessary, and schedule further action */
349 /* nothing to do if target just wants to be run */
351 case RESET_RUN_AND_HALT
:
353 target_register_timer_callback(target_run_and_halt_handler
, target
->run_and_halt_time
, 0, target
);
355 case RESET_RUN_AND_INIT
:
357 target_register_timer_callback(target_run_and_halt_handler
, target
->run_and_halt_time
, 0, target
);
358 target_register_event_callback(target_init_handler
, cmd_ctx
);
361 if ((jtag_reset_config
& RESET_SRST_PULLS_TRST
)==0)
365 if ((jtag_reset_config
& RESET_SRST_PULLS_TRST
)==0)
367 target_register_event_callback(target_init_handler
, cmd_ctx
);
370 LOG_ERROR("BUG: unknown target->reset_mode");
372 target
= target
->next
;
375 if ((retval
= jtag_execute_queue()) != ERROR_OK
)
377 LOG_WARNING("JTAG communication failed while reset was asserted. Consider using srst_only for reset_config.");
384 target
->type
->deassert_reset(target
);
385 /* We can fail to bring the target into the halted state */
387 if (target
->reset_halt
&&((target
->state
!= TARGET_HALTED
)))
389 LOG_WARNING("Failed to reset target into halted mode - issuing halt");
390 target
->type
->halt(target
);
393 target
= target
->next
;
396 if ((retval
= jtag_execute_queue()) != ERROR_OK
)
398 LOG_WARNING("JTAG communication failed while deasserting reset.");
402 if (jtag_reset_config
& RESET_SRST_PULLS_TRST
)
404 /* If TRST was asserted we need to set up registers again */
405 if ((retval
= target_examine(cmd_ctx
)) != ERROR_OK
)
409 LOG_DEBUG("Waiting for halted stated as appropriate");
411 /* Wait for reset to complete, maximum 5 seconds. */
412 gettimeofday(&timeout
, NULL
);
413 timeval_add_time(&timeout
, 5, 0);
416 gettimeofday(&now
, NULL
);
418 target_call_timer_callbacks_now();
423 LOG_DEBUG("Polling target");
425 if ((reset_mode
== RESET_RUN_AND_INIT
) ||
426 (reset_mode
== RESET_RUN_AND_HALT
) ||
427 (reset_mode
== RESET_HALT
) ||
428 (reset_mode
== RESET_INIT
))
430 if (target
->state
!= TARGET_HALTED
)
432 if ((now
.tv_sec
> timeout
.tv_sec
) || ((now
.tv_sec
== timeout
.tv_sec
) && (now
.tv_usec
>= timeout
.tv_usec
)))
434 LOG_USER("Timed out waiting for halt after reset");
437 /* this will send alive messages on e.g. GDB remote protocol. */
439 LOG_USER_N("%s", ""); /* avoid warning about zero length formatting message*/
443 target
= target
->next
;
445 /* All targets we're waiting for are halted */
453 /* We want any events to be processed before the prompt */
454 target_call_timer_callbacks_now();
456 /* if we timed out we need to unregister these handlers */
460 target_unregister_timer_callback(target_run_and_halt_handler
, target
);
461 target
= target
->next
;
463 target_unregister_event_callback(target_init_handler
, cmd_ctx
);
468 static int default_virt2phys(struct target_s
*target
, u32
virtual, u32
*physical
)
474 static int default_mmu(struct target_s
*target
, int *enabled
)
480 static int default_examine(struct command_context_s
*cmd_ctx
, struct target_s
*target
)
482 target
->type
->examined
= 1;
487 /* Targets that correctly implement init+examine, i.e.
488 * no communication with target during init:
492 int target_examine(struct command_context_s
*cmd_ctx
)
494 int retval
= ERROR_OK
;
495 target_t
*target
= targets
;
498 if ((retval
= target
->type
->examine(cmd_ctx
, target
))!=ERROR_OK
)
500 target
= target
->next
;
505 static int target_write_memory_imp(struct target_s
*target
, u32 address
, u32 size
, u32 count
, u8
*buffer
)
507 if (!target
->type
->examined
)
509 LOG_ERROR("Target not examined yet");
512 return target
->type
->write_memory_imp(target
, address
, size
, count
, buffer
);
515 static int target_read_memory_imp(struct target_s
*target
, u32 address
, u32 size
, u32 count
, u8
*buffer
)
517 if (!target
->type
->examined
)
519 LOG_ERROR("Target not examined yet");
522 return target
->type
->read_memory_imp(target
, address
, size
, count
, buffer
);
525 static int target_soft_reset_halt_imp(struct target_s
*target
)
527 if (!target
->type
->examined
)
529 LOG_ERROR("Target not examined yet");
532 return target
->type
->soft_reset_halt_imp(target
);
535 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
)
537 if (!target
->type
->examined
)
539 LOG_ERROR("Target not examined yet");
542 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
);
545 int target_init(struct command_context_s
*cmd_ctx
)
547 target_t
*target
= targets
;
551 target
->type
->examined
= 0;
552 if (target
->type
->examine
== NULL
)
554 target
->type
->examine
= default_examine
;
557 if (target
->type
->init_target(cmd_ctx
, target
) != ERROR_OK
)
559 LOG_ERROR("target '%s' init failed", target
->type
->name
);
563 /* Set up default functions if none are provided by target */
564 if (target
->type
->virt2phys
== NULL
)
566 target
->type
->virt2phys
= default_virt2phys
;
568 target
->type
->virt2phys
= default_virt2phys
;
569 /* a non-invasive way(in terms of patches) to add some code that
570 * runs before the type->write/read_memory implementation
572 target
->type
->write_memory_imp
= target
->type
->write_memory
;
573 target
->type
->write_memory
= target_write_memory_imp
;
574 target
->type
->read_memory_imp
= target
->type
->read_memory
;
575 target
->type
->read_memory
= target_read_memory_imp
;
576 target
->type
->soft_reset_halt_imp
= target
->type
->soft_reset_halt
;
577 target
->type
->soft_reset_halt
= target_soft_reset_halt_imp
;
578 target
->type
->run_algorithm_imp
= target
->type
->run_algorithm
;
579 target
->type
->run_algorithm
= target_run_algorithm_imp
;
582 if (target
->type
->mmu
== NULL
)
584 target
->type
->mmu
= default_mmu
;
586 target
= target
->next
;
591 target_register_user_commands(cmd_ctx
);
592 target_register_timer_callback(handle_target
, 100, 1, NULL
);
598 int target_register_event_callback(int (*callback
)(struct target_s
*target
, enum target_event event
, void *priv
), void *priv
)
600 target_event_callback_t
**callbacks_p
= &target_event_callbacks
;
602 if (callback
== NULL
)
604 return ERROR_INVALID_ARGUMENTS
;
609 while ((*callbacks_p
)->next
)
610 callbacks_p
= &((*callbacks_p
)->next
);
611 callbacks_p
= &((*callbacks_p
)->next
);
614 (*callbacks_p
) = malloc(sizeof(target_event_callback_t
));
615 (*callbacks_p
)->callback
= callback
;
616 (*callbacks_p
)->priv
= priv
;
617 (*callbacks_p
)->next
= NULL
;
622 int target_register_timer_callback(int (*callback
)(void *priv
), int time_ms
, int periodic
, void *priv
)
624 target_timer_callback_t
**callbacks_p
= &target_timer_callbacks
;
627 if (callback
== NULL
)
629 return ERROR_INVALID_ARGUMENTS
;
634 while ((*callbacks_p
)->next
)
635 callbacks_p
= &((*callbacks_p
)->next
);
636 callbacks_p
= &((*callbacks_p
)->next
);
639 (*callbacks_p
) = malloc(sizeof(target_timer_callback_t
));
640 (*callbacks_p
)->callback
= callback
;
641 (*callbacks_p
)->periodic
= periodic
;
642 (*callbacks_p
)->time_ms
= time_ms
;
644 gettimeofday(&now
, NULL
);
645 (*callbacks_p
)->when
.tv_usec
= now
.tv_usec
+ (time_ms
% 1000) * 1000;
646 time_ms
-= (time_ms
% 1000);
647 (*callbacks_p
)->when
.tv_sec
= now
.tv_sec
+ (time_ms
/ 1000);
648 if ((*callbacks_p
)->when
.tv_usec
> 1000000)
650 (*callbacks_p
)->when
.tv_usec
= (*callbacks_p
)->when
.tv_usec
- 1000000;
651 (*callbacks_p
)->when
.tv_sec
+= 1;
654 (*callbacks_p
)->priv
= priv
;
655 (*callbacks_p
)->next
= NULL
;
660 int target_unregister_event_callback(int (*callback
)(struct target_s
*target
, enum target_event event
, void *priv
), void *priv
)
662 target_event_callback_t
**p
= &target_event_callbacks
;
663 target_event_callback_t
*c
= target_event_callbacks
;
665 if (callback
== NULL
)
667 return ERROR_INVALID_ARGUMENTS
;
672 target_event_callback_t
*next
= c
->next
;
673 if ((c
->callback
== callback
) && (c
->priv
== priv
))
687 int target_unregister_timer_callback(int (*callback
)(void *priv
), void *priv
)
689 target_timer_callback_t
**p
= &target_timer_callbacks
;
690 target_timer_callback_t
*c
= target_timer_callbacks
;
692 if (callback
== NULL
)
694 return ERROR_INVALID_ARGUMENTS
;
699 target_timer_callback_t
*next
= c
->next
;
700 if ((c
->callback
== callback
) && (c
->priv
== priv
))
714 int target_call_event_callbacks(target_t
*target
, enum target_event event
)
716 target_event_callback_t
*callback
= target_event_callbacks
;
717 target_event_callback_t
*next_callback
;
719 LOG_DEBUG("target event %i", 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;
765 target_unregister_timer_callback(callback
->callback
, callback
->priv
);
769 callback
= next_callback
;
775 int target_call_timer_callbacks()
777 return target_call_timer_callbacks_check_time(1);
780 /* invoke periodic callbacks immediately */
781 int target_call_timer_callbacks_now()
783 return target_call_timer_callbacks(0);
786 int target_alloc_working_area(struct target_s
*target
, u32 size
, working_area_t
**area
)
788 working_area_t
*c
= target
->working_areas
;
789 working_area_t
*new_wa
= NULL
;
791 /* Reevaluate working area address based on MMU state*/
792 if (target
->working_areas
== NULL
)
796 retval
= target
->type
->mmu(target
, &enabled
);
797 if (retval
!= ERROR_OK
)
803 target
->working_area
= target
->working_area_virt
;
807 target
->working_area
= target
->working_area_phys
;
811 /* only allocate multiples of 4 byte */
814 LOG_ERROR("BUG: code tried to allocate unaligned number of bytes, padding");
815 size
= CEIL(size
, 4);
818 /* see if there's already a matching working area */
821 if ((c
->free
) && (c
->size
== size
))
829 /* if not, allocate a new one */
832 working_area_t
**p
= &target
->working_areas
;
833 u32 first_free
= target
->working_area
;
834 u32 free_size
= target
->working_area_size
;
836 LOG_DEBUG("allocating new working area");
838 c
= target
->working_areas
;
841 first_free
+= c
->size
;
842 free_size
-= c
->size
;
847 if (free_size
< size
)
849 LOG_WARNING("not enough working area available(requested %d, free %d)", size
, free_size
);
850 return ERROR_TARGET_RESOURCE_NOT_AVAILABLE
;
853 new_wa
= malloc(sizeof(working_area_t
));
856 new_wa
->address
= first_free
;
858 if (target
->backup_working_area
)
860 new_wa
->backup
= malloc(new_wa
->size
);
861 target
->type
->read_memory(target
, new_wa
->address
, 4, new_wa
->size
/ 4, new_wa
->backup
);
865 new_wa
->backup
= NULL
;
868 /* put new entry in list */
872 /* mark as used, and return the new (reused) area */
882 int target_free_working_area_restore(struct target_s
*target
, working_area_t
*area
, int restore
)
887 if (restore
&&target
->backup_working_area
)
888 target
->type
->write_memory(target
, area
->address
, 4, area
->size
/ 4, area
->backup
);
892 /* mark user pointer invalid */
899 int target_free_working_area(struct target_s
*target
, working_area_t
*area
)
901 return target_free_working_area_restore(target
, area
, 1);
904 int target_free_all_working_areas_restore(struct target_s
*target
, int restore
)
906 working_area_t
*c
= target
->working_areas
;
910 working_area_t
*next
= c
->next
;
911 target_free_working_area_restore(target
, c
, restore
);
921 target
->working_areas
= NULL
;
926 int target_free_all_working_areas(struct target_s
*target
)
928 return target_free_all_working_areas_restore(target
, 1);
931 int target_register_commands(struct command_context_s
*cmd_ctx
)
933 register_command(cmd_ctx
, NULL
, "target", handle_target_command
, COMMAND_CONFIG
, "target <cpu> [reset_init default - DEPRECATED] <chainpos> <endianness> <variant> [cpu type specifc args]");
934 register_command(cmd_ctx
, NULL
, "targets", handle_targets_command
, COMMAND_EXEC
, NULL
);
935 register_command(cmd_ctx
, NULL
, "run_and_halt_time", handle_run_and_halt_time_command
, COMMAND_CONFIG
, "<target> <run time ms>");
936 register_command(cmd_ctx
, NULL
, "working_area", handle_working_area_command
, COMMAND_ANY
, "working_area <target#> <address> <size> <'backup'|'nobackup'> [virtual address]");
937 register_command(cmd_ctx
, NULL
, "virt2phys", handle_virt2phys_command
, COMMAND_ANY
, "virt2phys <virtual address>");
938 register_command(cmd_ctx
, NULL
, "profile", handle_profile_command
, COMMAND_EXEC
, "PRELIMINARY! - profile <seconds> <gmon.out>");
941 /* script procedures */
942 register_jim(cmd_ctx
, "ocd_mem2array", jim_mem2array
, "read memory and return as a TCL array for script processing");
943 register_jim(cmd_ctx
, "ocd_array2mem", jim_array2mem
, "convert a TCL array to memory locations and write the values");
947 int target_arch_state(struct target_s
*target
)
952 LOG_USER("No target has been configured");
956 LOG_USER("target state: %s", target_state_strings
[target
->state
]);
958 if (target
->state
!=TARGET_HALTED
)
961 retval
=target
->type
->arch_state(target
);
965 /* Single aligned words are guaranteed to use 16 or 32 bit access
966 * mode respectively, otherwise data is handled as quickly as
969 int target_write_buffer(struct target_s
*target
, u32 address
, u32 size
, u8
*buffer
)
972 if (!target
->type
->examined
)
974 LOG_ERROR("Target not examined yet");
978 LOG_DEBUG("writing buffer of %i byte at 0x%8.8x", size
, address
);
980 if (((address
% 2) == 0) && (size
== 2))
982 return target
->type
->write_memory(target
, address
, 2, 1, buffer
);
985 /* handle unaligned head bytes */
988 int unaligned
= 4 - (address
% 4);
990 if (unaligned
> size
)
993 if ((retval
= target
->type
->write_memory(target
, address
, 1, unaligned
, buffer
)) != ERROR_OK
)
997 address
+= unaligned
;
1001 /* handle aligned words */
1004 int aligned
= size
- (size
% 4);
1006 /* use bulk writes above a certain limit. This may have to be changed */
1009 if ((retval
= target
->type
->bulk_write_memory(target
, address
, aligned
/ 4, buffer
)) != ERROR_OK
)
1014 if ((retval
= target
->type
->write_memory(target
, address
, 4, aligned
/ 4, buffer
)) != ERROR_OK
)
1023 /* handle tail writes of less than 4 bytes */
1026 if ((retval
= target
->type
->write_memory(target
, address
, 1, size
, buffer
)) != ERROR_OK
)
1034 /* Single aligned words are guaranteed to use 16 or 32 bit access
1035 * mode respectively, otherwise data is handled as quickly as
1038 int target_read_buffer(struct target_s
*target
, u32 address
, u32 size
, u8
*buffer
)
1041 if (!target
->type
->examined
)
1043 LOG_ERROR("Target not examined yet");
1047 LOG_DEBUG("reading buffer of %i byte at 0x%8.8x", size
, address
);
1049 if (((address
% 2) == 0) && (size
== 2))
1051 return target
->type
->read_memory(target
, address
, 2, 1, buffer
);
1054 /* handle unaligned head bytes */
1057 int unaligned
= 4 - (address
% 4);
1059 if (unaligned
> size
)
1062 if ((retval
= target
->type
->read_memory(target
, address
, 1, unaligned
, buffer
)) != ERROR_OK
)
1065 buffer
+= unaligned
;
1066 address
+= unaligned
;
1070 /* handle aligned words */
1073 int aligned
= size
- (size
% 4);
1075 if ((retval
= target
->type
->read_memory(target
, address
, 4, aligned
/ 4, buffer
)) != ERROR_OK
)
1083 /* handle tail writes of less than 4 bytes */
1086 if ((retval
= target
->type
->read_memory(target
, address
, 1, size
, buffer
)) != ERROR_OK
)
1093 int target_checksum_memory(struct target_s
*target
, u32 address
, u32 size
, u32
* crc
)
1099 if (!target
->type
->examined
)
1101 LOG_ERROR("Target not examined yet");
1105 if ((retval
= target
->type
->checksum_memory(target
, address
,
1106 size
, &checksum
)) == ERROR_TARGET_RESOURCE_NOT_AVAILABLE
)
1108 buffer
= malloc(size
);
1111 LOG_ERROR("error allocating buffer for section (%d bytes)", size
);
1112 return ERROR_INVALID_ARGUMENTS
;
1114 retval
= target_read_buffer(target
, address
, size
, buffer
);
1115 if (retval
!= ERROR_OK
)
1121 /* convert to target endianess */
1122 for (i
= 0; i
< (size
/sizeof(u32
)); i
++)
1125 target_data
= target_buffer_get_u32(target
, &buffer
[i
*sizeof(u32
)]);
1126 target_buffer_set_u32(target
, &buffer
[i
*sizeof(u32
)], target_data
);
1129 retval
= image_calculate_checksum( buffer
, size
, &checksum
);
1138 int target_blank_check_memory(struct target_s
*target
, u32 address
, u32 size
, u32
* blank
)
1141 if (!target
->type
->examined
)
1143 LOG_ERROR("Target not examined yet");
1147 if (target
->type
->blank_check_memory
== 0)
1148 return ERROR_TARGET_RESOURCE_NOT_AVAILABLE
;
1150 retval
= target
->type
->blank_check_memory(target
, address
, size
, blank
);
1155 int target_read_u32(struct target_s
*target
, u32 address
, u32
*value
)
1158 if (!target
->type
->examined
)
1160 LOG_ERROR("Target not examined yet");
1164 int retval
= target
->type
->read_memory(target
, address
, 4, 1, value_buf
);
1166 if (retval
== ERROR_OK
)
1168 *value
= target_buffer_get_u32(target
, value_buf
);
1169 LOG_DEBUG("address: 0x%8.8x, value: 0x%8.8x", address
, *value
);
1174 LOG_DEBUG("address: 0x%8.8x failed", address
);
1180 int target_read_u16(struct target_s
*target
, u32 address
, u16
*value
)
1183 if (!target
->type
->examined
)
1185 LOG_ERROR("Target not examined yet");
1189 int retval
= target
->type
->read_memory(target
, address
, 2, 1, value_buf
);
1191 if (retval
== ERROR_OK
)
1193 *value
= target_buffer_get_u16(target
, value_buf
);
1194 LOG_DEBUG("address: 0x%8.8x, value: 0x%4.4x", address
, *value
);
1199 LOG_DEBUG("address: 0x%8.8x failed", address
);
1205 int target_read_u8(struct target_s
*target
, u32 address
, u8
*value
)
1207 int retval
= target
->type
->read_memory(target
, address
, 1, 1, value
);
1208 if (!target
->type
->examined
)
1210 LOG_ERROR("Target not examined yet");
1214 if (retval
== ERROR_OK
)
1216 LOG_DEBUG("address: 0x%8.8x, value: 0x%2.2x", address
, *value
);
1221 LOG_DEBUG("address: 0x%8.8x failed", address
);
1227 int target_write_u32(struct target_s
*target
, u32 address
, u32 value
)
1231 if (!target
->type
->examined
)
1233 LOG_ERROR("Target not examined yet");
1237 LOG_DEBUG("address: 0x%8.8x, value: 0x%8.8x", address
, value
);
1239 target_buffer_set_u32(target
, value_buf
, value
);
1240 if ((retval
= target
->type
->write_memory(target
, address
, 4, 1, value_buf
)) != ERROR_OK
)
1242 LOG_DEBUG("failed: %i", retval
);
1248 int target_write_u16(struct target_s
*target
, u32 address
, u16 value
)
1252 if (!target
->type
->examined
)
1254 LOG_ERROR("Target not examined yet");
1258 LOG_DEBUG("address: 0x%8.8x, value: 0x%8.8x", address
, value
);
1260 target_buffer_set_u16(target
, value_buf
, value
);
1261 if ((retval
= target
->type
->write_memory(target
, address
, 2, 1, value_buf
)) != ERROR_OK
)
1263 LOG_DEBUG("failed: %i", retval
);
1269 int target_write_u8(struct target_s
*target
, u32 address
, u8 value
)
1272 if (!target
->type
->examined
)
1274 LOG_ERROR("Target not examined yet");
1278 LOG_DEBUG("address: 0x%8.8x, value: 0x%2.2x", address
, value
);
1280 if ((retval
= target
->type
->read_memory(target
, address
, 1, 1, &value
)) != ERROR_OK
)
1282 LOG_DEBUG("failed: %i", retval
);
1288 int target_register_user_commands(struct command_context_s
*cmd_ctx
)
1290 register_command(cmd_ctx
, NULL
, "reg", handle_reg_command
, COMMAND_EXEC
, NULL
);
1291 register_command(cmd_ctx
, NULL
, "poll", handle_poll_command
, COMMAND_EXEC
, "poll target state");
1292 register_command(cmd_ctx
, NULL
, "wait_halt", handle_wait_halt_command
, COMMAND_EXEC
, "wait for target halt [time (s)]");
1293 register_command(cmd_ctx
, NULL
, "halt", handle_halt_command
, COMMAND_EXEC
, "halt target");
1294 register_command(cmd_ctx
, NULL
, "resume", handle_resume_command
, COMMAND_EXEC
, "resume target [addr]");
1295 register_command(cmd_ctx
, NULL
, "step", handle_step_command
, COMMAND_EXEC
, "step one instruction from current PC or [addr]");
1296 register_command(cmd_ctx
, NULL
, "reset", handle_reset_command
, COMMAND_EXEC
, "reset target [run|halt|init|run_and_halt|run_and_init]");
1297 register_command(cmd_ctx
, NULL
, "soft_reset_halt", handle_soft_reset_halt_command
, COMMAND_EXEC
, "halt the target and do a soft reset");
1299 register_command(cmd_ctx
, NULL
, "mdw", handle_md_command
, COMMAND_EXEC
, "display memory words <addr> [count]");
1300 register_command(cmd_ctx
, NULL
, "mdh", handle_md_command
, COMMAND_EXEC
, "display memory half-words <addr> [count]");
1301 register_command(cmd_ctx
, NULL
, "mdb", handle_md_command
, COMMAND_EXEC
, "display memory bytes <addr> [count]");
1303 register_command(cmd_ctx
, NULL
, "mww", handle_mw_command
, COMMAND_EXEC
, "write memory word <addr> <value> [count]");
1304 register_command(cmd_ctx
, NULL
, "mwh", handle_mw_command
, COMMAND_EXEC
, "write memory half-word <addr> <value> [count]");
1305 register_command(cmd_ctx
, NULL
, "mwb", handle_mw_command
, COMMAND_EXEC
, "write memory byte <addr> <value> [count]");
1307 register_command(cmd_ctx
, NULL
, "bp", handle_bp_command
, COMMAND_EXEC
, "set breakpoint <address> <length> [hw]");
1308 register_command(cmd_ctx
, NULL
, "rbp", handle_rbp_command
, COMMAND_EXEC
, "remove breakpoint <adress>");
1309 register_command(cmd_ctx
, NULL
, "wp", handle_wp_command
, COMMAND_EXEC
, "set watchpoint <address> <length> <r/w/a> [value] [mask]");
1310 register_command(cmd_ctx
, NULL
, "rwp", handle_rwp_command
, COMMAND_EXEC
, "remove watchpoint <adress>");
1312 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]");
1313 register_command(cmd_ctx
, NULL
, "dump_image", handle_dump_image_command
, COMMAND_EXEC
, "dump_image <file> <address> <size>");
1314 register_command(cmd_ctx
, NULL
, "verify_image", handle_verify_image_command
, COMMAND_EXEC
, "verify_image <file> [offset] [type]");
1316 target_request_register_commands(cmd_ctx
);
1317 trace_register_commands(cmd_ctx
);
1322 int handle_targets_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1324 target_t
*target
= targets
;
1329 int num
= strtoul(args
[0], NULL
, 0);
1334 target
= target
->next
;
1338 cmd_ctx
->current_target
= num
;
1340 command_print(cmd_ctx
, "%i is out of bounds, only %i targets are configured", num
, count
);
1347 command_print(cmd_ctx
, "%i: %s (%s), state: %s", count
++, target
->type
->name
, target_endianess_strings
[target
->endianness
], target_state_strings
[target
->state
]);
1348 target
= target
->next
;
1354 int handle_target_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1361 return ERROR_COMMAND_SYNTAX_ERROR
;
1364 /* search for the specified target */
1365 if (args
[0] && (args
[0][0] != 0))
1367 for (i
= 0; target_types
[i
]; i
++)
1369 if (strcmp(args
[0], target_types
[i
]->name
) == 0)
1371 target_t
**last_target_p
= &targets
;
1373 /* register target specific commands */
1374 if (target_types
[i
]->register_commands(cmd_ctx
) != ERROR_OK
)
1376 LOG_ERROR("couldn't register '%s' commands", args
[0]);
1382 while ((*last_target_p
)->next
)
1383 last_target_p
= &((*last_target_p
)->next
);
1384 last_target_p
= &((*last_target_p
)->next
);
1387 *last_target_p
= malloc(sizeof(target_t
));
1389 /* allocate memory for each unique target type */
1390 (*last_target_p
)->type
= (target_type_t
*)malloc(sizeof(target_type_t
));
1391 *((*last_target_p
)->type
) = *target_types
[i
];
1393 if (strcmp(args
[1], "big") == 0)
1394 (*last_target_p
)->endianness
= TARGET_BIG_ENDIAN
;
1395 else if (strcmp(args
[1], "little") == 0)
1396 (*last_target_p
)->endianness
= TARGET_LITTLE_ENDIAN
;
1399 LOG_ERROR("endianness must be either 'little' or 'big', not '%s'", args
[1]);
1400 return ERROR_COMMAND_SYNTAX_ERROR
;
1403 if (strcmp(args
[2], "reset_halt") == 0)
1405 LOG_WARNING("reset_mode argument is obsolete.");
1406 return ERROR_COMMAND_SYNTAX_ERROR
;
1408 else if (strcmp(args
[2], "reset_run") == 0)
1410 LOG_WARNING("reset_mode argument is obsolete.");
1411 return ERROR_COMMAND_SYNTAX_ERROR
;
1413 else if (strcmp(args
[2], "reset_init") == 0)
1415 LOG_WARNING("reset_mode argument is obsolete.");
1416 return ERROR_COMMAND_SYNTAX_ERROR
;
1418 else if (strcmp(args
[2], "run_and_halt") == 0)
1420 LOG_WARNING("reset_mode argument is obsolete.");
1421 return ERROR_COMMAND_SYNTAX_ERROR
;
1423 else if (strcmp(args
[2], "run_and_init") == 0)
1425 LOG_WARNING("reset_mode argument is obsolete.");
1426 return ERROR_COMMAND_SYNTAX_ERROR
;
1430 /* Kludge! we want to make this reset arg optional while remaining compatible! */
1434 (*last_target_p
)->run_and_halt_time
= 1000; /* default 1s */
1436 (*last_target_p
)->working_area
= 0x0;
1437 (*last_target_p
)->working_area_size
= 0x0;
1438 (*last_target_p
)->working_areas
= NULL
;
1439 (*last_target_p
)->backup_working_area
= 0;
1441 (*last_target_p
)->state
= TARGET_UNKNOWN
;
1442 (*last_target_p
)->debug_reason
= DBG_REASON_UNDEFINED
;
1443 (*last_target_p
)->reg_cache
= NULL
;
1444 (*last_target_p
)->breakpoints
= NULL
;
1445 (*last_target_p
)->watchpoints
= NULL
;
1446 (*last_target_p
)->next
= NULL
;
1447 (*last_target_p
)->arch_info
= NULL
;
1449 /* initialize trace information */
1450 (*last_target_p
)->trace_info
= malloc(sizeof(trace_t
));
1451 (*last_target_p
)->trace_info
->num_trace_points
= 0;
1452 (*last_target_p
)->trace_info
->trace_points_size
= 0;
1453 (*last_target_p
)->trace_info
->trace_points
= NULL
;
1454 (*last_target_p
)->trace_info
->trace_history_size
= 0;
1455 (*last_target_p
)->trace_info
->trace_history
= NULL
;
1456 (*last_target_p
)->trace_info
->trace_history_pos
= 0;
1457 (*last_target_p
)->trace_info
->trace_history_overflowed
= 0;
1459 (*last_target_p
)->dbgmsg
= NULL
;
1460 (*last_target_p
)->dbg_msg_enabled
= 0;
1462 (*last_target_p
)->type
->target_command(cmd_ctx
, cmd
, args
, argc
, *last_target_p
);
1470 /* no matching target found */
1473 LOG_ERROR("target '%s' not found", args
[0]);
1474 return ERROR_COMMAND_SYNTAX_ERROR
;
1480 int target_invoke_script(struct command_context_s
*cmd_ctx
, target_t
*target
, char *name
)
1482 return command_run_linef(cmd_ctx
, " if {[catch {info body target_%d_%s} t]==0} {target_%d_%s}",
1483 get_num_by_target(target
), name
,
1484 get_num_by_target(target
), name
);
1487 int handle_run_and_halt_time_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1489 target_t
*target
= NULL
;
1493 return ERROR_COMMAND_SYNTAX_ERROR
;
1496 target
= get_target_by_num(strtoul(args
[0], NULL
, 0));
1499 return ERROR_COMMAND_SYNTAX_ERROR
;
1502 target
->run_and_halt_time
= strtoul(args
[1], NULL
, 0);
1507 int handle_working_area_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1509 target_t
*target
= NULL
;
1511 if ((argc
< 4) || (argc
> 5))
1513 return ERROR_COMMAND_SYNTAX_ERROR
;
1516 target
= get_target_by_num(strtoul(args
[0], NULL
, 0));
1519 return ERROR_COMMAND_SYNTAX_ERROR
;
1521 target_free_all_working_areas(target
);
1523 target
->working_area_phys
= target
->working_area_virt
= strtoul(args
[1], NULL
, 0);
1526 target
->working_area_virt
= strtoul(args
[4], NULL
, 0);
1528 target
->working_area_size
= strtoul(args
[2], NULL
, 0);
1530 if (strcmp(args
[3], "backup") == 0)
1532 target
->backup_working_area
= 1;
1534 else if (strcmp(args
[3], "nobackup") == 0)
1536 target
->backup_working_area
= 0;
1540 LOG_ERROR("unrecognized <backup|nobackup> argument (%s)", args
[3]);
1541 return ERROR_COMMAND_SYNTAX_ERROR
;
1548 /* process target state changes */
1549 int handle_target(void *priv
)
1551 target_t
*target
= targets
;
1555 if (target_continous_poll
)
1557 /* polling may fail silently until the target has been examined */
1558 target_poll(target
);
1561 target
= target
->next
;
1567 int handle_reg_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1576 target
= get_current_target(cmd_ctx
);
1578 /* list all available registers for the current target */
1581 reg_cache_t
*cache
= target
->reg_cache
;
1587 for (i
= 0; i
< cache
->num_regs
; i
++)
1589 value
= buf_to_str(cache
->reg_list
[i
].value
, cache
->reg_list
[i
].size
, 16);
1590 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
);
1593 cache
= cache
->next
;
1599 /* access a single register by its ordinal number */
1600 if ((args
[0][0] >= '0') && (args
[0][0] <= '9'))
1602 int num
= strtoul(args
[0], NULL
, 0);
1603 reg_cache_t
*cache
= target
->reg_cache
;
1609 for (i
= 0; i
< cache
->num_regs
; i
++)
1613 reg
= &cache
->reg_list
[i
];
1619 cache
= cache
->next
;
1624 command_print(cmd_ctx
, "%i is out of bounds, the current target has only %i registers (0 - %i)", num
, count
, count
- 1);
1627 } else /* access a single register by its name */
1629 reg
= register_get_by_name(target
->reg_cache
, args
[0], 1);
1633 command_print(cmd_ctx
, "register %s not found in current target", args
[0]);
1638 /* display a register */
1639 if ((argc
== 1) || ((argc
== 2) && !((args
[1][0] >= '0') && (args
[1][0] <= '9'))))
1641 if ((argc
== 2) && (strcmp(args
[1], "force") == 0))
1644 if (reg
->valid
== 0)
1646 reg_arch_type_t
*arch_type
= register_get_arch_type(reg
->arch_type
);
1647 if (arch_type
== NULL
)
1649 LOG_ERROR("BUG: encountered unregistered arch type");
1652 arch_type
->get(reg
);
1654 value
= buf_to_str(reg
->value
, reg
->size
, 16);
1655 command_print(cmd_ctx
, "%s (/%i): 0x%s", reg
->name
, reg
->size
, value
);
1660 /* set register value */
1663 u8
*buf
= malloc(CEIL(reg
->size
, 8));
1664 str_to_buf(args
[1], strlen(args
[1]), buf
, reg
->size
, 0);
1666 reg_arch_type_t
*arch_type
= register_get_arch_type(reg
->arch_type
);
1667 if (arch_type
== NULL
)
1669 LOG_ERROR("BUG: encountered unregistered arch type");
1673 arch_type
->set(reg
, buf
);
1675 value
= buf_to_str(reg
->value
, reg
->size
, 16);
1676 command_print(cmd_ctx
, "%s (/%i): 0x%s", reg
->name
, reg
->size
, value
);
1684 command_print(cmd_ctx
, "usage: reg <#|name> [value]");
1690 int handle_poll_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1692 target_t
*target
= get_current_target(cmd_ctx
);
1696 target_poll(target
);
1697 target_arch_state(target
);
1701 if (strcmp(args
[0], "on") == 0)
1703 target_continous_poll
= 1;
1705 else if (strcmp(args
[0], "off") == 0)
1707 target_continous_poll
= 0;
1711 command_print(cmd_ctx
, "arg is \"on\" or \"off\"");
1719 int handle_wait_halt_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1727 ms
= strtoul(args
[0], &end
, 0) * 1000;
1730 command_print(cmd_ctx
, "usage: %s [seconds]", cmd
);
1734 target_t
*target
= get_current_target(cmd_ctx
);
1736 return target_wait_state(target
, TARGET_HALTED
, ms
);
1739 int target_wait_state(target_t
*target
, enum target_state state
, int ms
)
1742 struct timeval timeout
, now
;
1744 gettimeofday(&timeout
, NULL
);
1745 timeval_add_time(&timeout
, 0, ms
* 1000);
1749 if ((retval
=target_poll(target
))!=ERROR_OK
)
1751 target_call_timer_callbacks_now();
1752 if (target
->state
== state
)
1759 LOG_USER("waiting for target %s...", target_state_strings
[state
]);
1762 gettimeofday(&now
, NULL
);
1763 if ((now
.tv_sec
> timeout
.tv_sec
) || ((now
.tv_sec
== timeout
.tv_sec
) && (now
.tv_usec
>= timeout
.tv_usec
)))
1765 LOG_ERROR("timed out while waiting for target %s", target_state_strings
[state
]);
1773 int handle_halt_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1776 target_t
*target
= get_current_target(cmd_ctx
);
1780 if ((retval
= target_halt(target
)) != ERROR_OK
)
1785 return handle_wait_halt_command(cmd_ctx
, cmd
, args
, argc
);
1788 int handle_soft_reset_halt_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1790 target_t
*target
= get_current_target(cmd_ctx
);
1792 LOG_USER("requesting target halt and executing a soft reset");
1794 target
->type
->soft_reset_halt(target
);
1799 int handle_reset_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1801 target_t
*target
= get_current_target(cmd_ctx
);
1802 enum target_reset_mode reset_mode
= RESET_RUN
;
1808 if (strcmp("run", args
[0]) == 0)
1809 reset_mode
= RESET_RUN
;
1810 else if (strcmp("halt", args
[0]) == 0)
1811 reset_mode
= RESET_HALT
;
1812 else if (strcmp("init", args
[0]) == 0)
1813 reset_mode
= RESET_INIT
;
1814 else if (strcmp("run_and_halt", args
[0]) == 0)
1816 reset_mode
= RESET_RUN_AND_HALT
;
1819 target
->run_and_halt_time
= strtoul(args
[1], NULL
, 0);
1822 else if (strcmp("run_and_init", args
[0]) == 0)
1824 reset_mode
= RESET_RUN_AND_INIT
;
1827 target
->run_and_halt_time
= strtoul(args
[1], NULL
, 0);
1832 command_print(cmd_ctx
, "usage: reset ['run', 'halt', 'init', 'run_and_halt', 'run_and_init]");
1837 /* reset *all* targets */
1838 target_process_reset(cmd_ctx
, reset_mode
);
1843 int handle_resume_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1846 target_t
*target
= get_current_target(cmd_ctx
);
1848 target_invoke_script(cmd_ctx
, target
, "pre_resume");
1851 retval
= target_resume(target
, 1, 0, 1, 0); /* current pc, addr = 0, handle breakpoints, not debugging */
1853 retval
= target_resume(target
, 0, strtoul(args
[0], NULL
, 0), 1, 0); /* addr = args[0], handle breakpoints, not debugging */
1856 return ERROR_COMMAND_SYNTAX_ERROR
;
1862 int handle_step_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1864 target_t
*target
= get_current_target(cmd_ctx
);
1869 target
->type
->step(target
, 1, 0, 1); /* current pc, addr = 0, handle breakpoints */
1872 target
->type
->step(target
, 0, strtoul(args
[0], NULL
, 0), 1); /* addr = args[0], handle breakpoints */
1877 int handle_md_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1879 const int line_bytecnt
= 32;
1892 target_t
*target
= get_current_target(cmd_ctx
);
1898 count
= strtoul(args
[1], NULL
, 0);
1900 address
= strtoul(args
[0], NULL
, 0);
1906 size
= 4; line_modulo
= line_bytecnt
/ 4;
1909 size
= 2; line_modulo
= line_bytecnt
/ 2;
1912 size
= 1; line_modulo
= line_bytecnt
/ 1;
1918 buffer
= calloc(count
, size
);
1919 retval
= target
->type
->read_memory(target
, address
, size
, count
, buffer
);
1920 if (retval
== ERROR_OK
)
1924 for (i
= 0; i
< count
; i
++)
1926 if (i
%line_modulo
== 0)
1927 output_len
+= snprintf(output
+ output_len
, 128 - output_len
, "0x%8.8x: ", address
+ (i
*size
));
1932 output_len
+= snprintf(output
+ output_len
, 128 - output_len
, "%8.8x ", target_buffer_get_u32(target
, &buffer
[i
*4]));
1935 output_len
+= snprintf(output
+ output_len
, 128 - output_len
, "%4.4x ", target_buffer_get_u16(target
, &buffer
[i
*2]));
1938 output_len
+= snprintf(output
+ output_len
, 128 - output_len
, "%2.2x ", buffer
[i
*1]);
1942 if ((i
%line_modulo
== line_modulo
-1) || (i
== count
- 1))
1944 command_print(cmd_ctx
, output
);
1955 int handle_mw_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1962 target_t
*target
= get_current_target(cmd_ctx
);
1965 if ((argc
< 2) || (argc
> 3))
1966 return ERROR_COMMAND_SYNTAX_ERROR
;
1968 address
= strtoul(args
[0], NULL
, 0);
1969 value
= strtoul(args
[1], NULL
, 0);
1971 count
= strtoul(args
[2], NULL
, 0);
1977 target_buffer_set_u32(target
, value_buf
, value
);
1981 target_buffer_set_u16(target
, value_buf
, value
);
1985 value_buf
[0] = value
;
1988 return ERROR_COMMAND_SYNTAX_ERROR
;
1990 for (i
=0; i
<count
; i
++)
1996 retval
= target
->type
->write_memory(target
, address
+ i
*wordsize
, 4, 1, value_buf
);
1999 retval
= target
->type
->write_memory(target
, address
+ i
*wordsize
, 2, 1, value_buf
);
2002 retval
= target
->type
->write_memory(target
, address
+ i
*wordsize
, 1, 1, value_buf
);
2007 if (retval
!=ERROR_OK
)
2017 int handle_load_image_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2023 u32 max_address
=0xffffffff;
2029 duration_t duration
;
2030 char *duration_text
;
2032 target_t
*target
= get_current_target(cmd_ctx
);
2034 if ((argc
< 1)||(argc
> 5))
2036 return ERROR_COMMAND_SYNTAX_ERROR
;
2039 /* a base address isn't always necessary, default to 0x0 (i.e. don't relocate) */
2042 image
.base_address_set
= 1;
2043 image
.base_address
= strtoul(args
[1], NULL
, 0);
2047 image
.base_address_set
= 0;
2051 image
.start_address_set
= 0;
2055 min_address
=strtoul(args
[3], NULL
, 0);
2059 max_address
=strtoul(args
[4], NULL
, 0)+min_address
;
2062 if (min_address
>max_address
)
2064 return ERROR_COMMAND_SYNTAX_ERROR
;
2068 duration_start_measure(&duration
);
2070 if (image_open(&image
, args
[0], (argc
>= 3) ? args
[2] : NULL
) != ERROR_OK
)
2077 for (i
= 0; i
< image
.num_sections
; i
++)
2079 buffer
= malloc(image
.sections
[i
].size
);
2082 command_print(cmd_ctx
, "error allocating buffer for section (%d bytes)", image
.sections
[i
].size
);
2086 if ((retval
= image_read_section(&image
, i
, 0x0, image
.sections
[i
].size
, buffer
, &buf_cnt
)) != ERROR_OK
)
2096 /* DANGER!!! beware of unsigned comparision here!!! */
2098 if ((image
.sections
[i
].base_address
+buf_cnt
>=min_address
)&&
2099 (image
.sections
[i
].base_address
<max_address
))
2101 if (image
.sections
[i
].base_address
<min_address
)
2103 /* clip addresses below */
2104 offset
+=min_address
-image
.sections
[i
].base_address
;
2108 if (image
.sections
[i
].base_address
+buf_cnt
>max_address
)
2110 length
-=(image
.sections
[i
].base_address
+buf_cnt
)-max_address
;
2113 if ((retval
= target_write_buffer(target
, image
.sections
[i
].base_address
+offset
, length
, buffer
+offset
)) != ERROR_OK
)
2118 image_size
+= length
;
2119 command_print(cmd_ctx
, "%u byte written at address 0x%8.8x", length
, image
.sections
[i
].base_address
+offset
);
2125 duration_stop_measure(&duration
, &duration_text
);
2126 if (retval
==ERROR_OK
)
2128 command_print(cmd_ctx
, "downloaded %u byte in %s", image_size
, duration_text
);
2130 free(duration_text
);
2132 image_close(&image
);
2138 int handle_dump_image_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2145 int retval
=ERROR_OK
;
2147 duration_t duration
;
2148 char *duration_text
;
2150 target_t
*target
= get_current_target(cmd_ctx
);
2154 command_print(cmd_ctx
, "usage: dump_image <filename> <address> <size>");
2158 address
= strtoul(args
[1], NULL
, 0);
2159 size
= strtoul(args
[2], NULL
, 0);
2161 if ((address
& 3) || (size
& 3))
2163 command_print(cmd_ctx
, "only 32-bit aligned address and size are supported");
2167 if (fileio_open(&fileio
, args
[0], FILEIO_WRITE
, FILEIO_BINARY
) != ERROR_OK
)
2172 duration_start_measure(&duration
);
2177 u32 this_run_size
= (size
> 560) ? 560 : size
;
2179 retval
= target
->type
->read_memory(target
, address
, 4, this_run_size
/ 4, buffer
);
2180 if (retval
!= ERROR_OK
)
2185 retval
= fileio_write(&fileio
, this_run_size
, buffer
, &size_written
);
2186 if (retval
!= ERROR_OK
)
2191 size
-= this_run_size
;
2192 address
+= this_run_size
;
2195 fileio_close(&fileio
);
2197 duration_stop_measure(&duration
, &duration_text
);
2198 if (retval
==ERROR_OK
)
2200 command_print(cmd_ctx
, "dumped %"PRIi64
" byte in %s", fileio
.size
, duration_text
);
2202 free(duration_text
);
2207 int handle_verify_image_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2215 u32 mem_checksum
= 0;
2219 duration_t duration
;
2220 char *duration_text
;
2222 target_t
*target
= get_current_target(cmd_ctx
);
2226 return ERROR_COMMAND_SYNTAX_ERROR
;
2231 LOG_ERROR("no target selected");
2235 duration_start_measure(&duration
);
2239 image
.base_address_set
= 1;
2240 image
.base_address
= strtoul(args
[1], NULL
, 0);
2244 image
.base_address_set
= 0;
2245 image
.base_address
= 0x0;
2248 image
.start_address_set
= 0;
2250 if ((retval
=image_open(&image
, args
[0], (argc
== 3) ? args
[2] : NULL
)) != ERROR_OK
)
2257 for (i
= 0; i
< image
.num_sections
; i
++)
2259 buffer
= malloc(image
.sections
[i
].size
);
2262 command_print(cmd_ctx
, "error allocating buffer for section (%d bytes)", image
.sections
[i
].size
);
2265 if ((retval
= image_read_section(&image
, i
, 0x0, image
.sections
[i
].size
, buffer
, &buf_cnt
)) != ERROR_OK
)
2271 /* calculate checksum of image */
2272 image_calculate_checksum( buffer
, buf_cnt
, &checksum
);
2274 retval
= target_checksum_memory(target
, image
.sections
[i
].base_address
, buf_cnt
, &mem_checksum
);
2275 if( retval
!= ERROR_OK
)
2281 if( checksum
!= mem_checksum
)
2283 /* failed crc checksum, fall back to a binary compare */
2286 command_print(cmd_ctx
, "checksum mismatch - attempting binary compare");
2288 data
= (u8
*)malloc(buf_cnt
);
2290 /* Can we use 32bit word accesses? */
2292 int count
= buf_cnt
;
2293 if ((count
% 4) == 0)
2298 retval
= target
->type
->read_memory(target
, image
.sections
[i
].base_address
, size
, count
, data
);
2299 if (retval
== ERROR_OK
)
2302 for (t
= 0; t
< buf_cnt
; t
++)
2304 if (data
[t
] != buffer
[t
])
2306 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
]);
2319 image_size
+= buf_cnt
;
2322 duration_stop_measure(&duration
, &duration_text
);
2323 if (retval
==ERROR_OK
)
2325 command_print(cmd_ctx
, "verified %u bytes in %s", image_size
, duration_text
);
2327 free(duration_text
);
2329 image_close(&image
);
2334 int handle_bp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2337 target_t
*target
= get_current_target(cmd_ctx
);
2341 breakpoint_t
*breakpoint
= target
->breakpoints
;
2345 if (breakpoint
->type
== BKPT_SOFT
)
2347 char* buf
= buf_to_str(breakpoint
->orig_instr
, breakpoint
->length
, 16);
2348 command_print(cmd_ctx
, "0x%8.8x, 0x%x, %i, 0x%s", breakpoint
->address
, breakpoint
->length
, breakpoint
->set
, buf
);
2353 command_print(cmd_ctx
, "0x%8.8x, 0x%x, %i", breakpoint
->address
, breakpoint
->length
, breakpoint
->set
);
2355 breakpoint
= breakpoint
->next
;
2363 length
= strtoul(args
[1], NULL
, 0);
2366 if (strcmp(args
[2], "hw") == 0)
2369 if ((retval
= breakpoint_add(target
, strtoul(args
[0], NULL
, 0), length
, hw
)) != ERROR_OK
)
2371 LOG_ERROR("Failure setting breakpoints");
2375 command_print(cmd_ctx
, "breakpoint added at address 0x%8.8x", strtoul(args
[0], NULL
, 0));
2380 command_print(cmd_ctx
, "usage: bp <address> <length> ['hw']");
2386 int handle_rbp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2388 target_t
*target
= get_current_target(cmd_ctx
);
2391 breakpoint_remove(target
, strtoul(args
[0], NULL
, 0));
2396 int handle_wp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2398 target_t
*target
= get_current_target(cmd_ctx
);
2403 watchpoint_t
*watchpoint
= target
->watchpoints
;
2407 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
);
2408 watchpoint
= watchpoint
->next
;
2413 enum watchpoint_rw type
= WPT_ACCESS
;
2414 u32 data_value
= 0x0;
2415 u32 data_mask
= 0xffffffff;
2431 command_print(cmd_ctx
, "usage: wp <address> <length> [r/w/a] [value] [mask]");
2437 data_value
= strtoul(args
[3], NULL
, 0);
2441 data_mask
= strtoul(args
[4], NULL
, 0);
2444 if ((retval
= watchpoint_add(target
, strtoul(args
[0], NULL
, 0),
2445 strtoul(args
[1], NULL
, 0), type
, data_value
, data_mask
)) != ERROR_OK
)
2447 LOG_ERROR("Failure setting breakpoints");
2452 command_print(cmd_ctx
, "usage: wp <address> <length> [r/w/a] [value] [mask]");
2458 int handle_rwp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2460 target_t
*target
= get_current_target(cmd_ctx
);
2463 watchpoint_remove(target
, strtoul(args
[0], NULL
, 0));
2468 int handle_virt2phys_command(command_context_t
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2471 target_t
*target
= get_current_target(cmd_ctx
);
2477 return ERROR_COMMAND_SYNTAX_ERROR
;
2479 va
= strtoul(args
[0], NULL
, 0);
2481 retval
= target
->type
->virt2phys(target
, va
, &pa
);
2482 if (retval
== ERROR_OK
)
2484 command_print(cmd_ctx
, "Physical address 0x%08x", pa
);
2488 /* lower levels will have logged a detailed error which is
2489 * forwarded to telnet/GDB session.
2494 static void writeLong(FILE *f
, int l
)
2499 char c
=(l
>>(i
*8))&0xff;
2500 fwrite(&c
, 1, 1, f
);
2504 static void writeString(FILE *f
, char *s
)
2506 fwrite(s
, 1, strlen(s
), f
);
2511 // Dump a gmon.out histogram file.
2512 static void writeGmon(u32
*samples
, int sampleNum
, char *filename
)
2515 FILE *f
=fopen(filename
, "w");
2518 fwrite("gmon", 1, 4, f
);
2519 writeLong(f
, 0x00000001); // Version
2520 writeLong(f
, 0); // padding
2521 writeLong(f
, 0); // padding
2522 writeLong(f
, 0); // padding
2524 fwrite("", 1, 1, f
); // GMON_TAG_TIME_HIST
2526 // figure out bucket size
2529 for (i
=0; i
<sampleNum
; i
++)
2541 int addressSpace
=(max
-min
+1);
2543 static int const maxBuckets
=256*1024; // maximum buckets.
2544 int length
=addressSpace
;
2545 if (length
> maxBuckets
)
2549 int *buckets
=malloc(sizeof(int)*length
);
2555 memset(buckets
, 0, sizeof(int)*length
);
2556 for (i
=0; i
<sampleNum
;i
++)
2558 u32 address
=samples
[i
];
2559 long long a
=address
-min
;
2560 long long b
=length
-1;
2561 long long c
=addressSpace
-1;
2562 int index
=(a
*b
)/c
; // danger!!!! int32 overflows
2566 // append binary memory gmon.out &profile_hist_hdr ((char*)&profile_hist_hdr + sizeof(struct gmon_hist_hdr))
2567 writeLong(f
, min
); // low_pc
2568 writeLong(f
, max
); // high_pc
2569 writeLong(f
, length
); // # of samples
2570 writeLong(f
, 64000000); // 64MHz
2571 writeString(f
, "seconds");
2572 for (i
=0; i
<(15-strlen("seconds")); i
++)
2574 fwrite("", 1, 1, f
); // padding
2576 writeString(f
, "s");
2578 // append binary memory gmon.out profile_hist_data (profile_hist_data + profile_hist_hdr.hist_size)
2580 char *data
=malloc(2*length
);
2583 for (i
=0; i
<length
;i
++)
2592 data
[i
*2+1]=(val
>>8)&0xff;
2595 fwrite(data
, 1, length
*2, f
);
2605 /* profiling samples the CPU PC as quickly as OpenOCD is able, which will be used as a random sampling of PC */
2606 int handle_profile_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2608 target_t
*target
= get_current_target(cmd_ctx
);
2609 struct timeval timeout
, now
;
2611 gettimeofday(&timeout
, NULL
);
2614 return ERROR_COMMAND_SYNTAX_ERROR
;
2617 timeval_add_time(&timeout
, strtoul(args
[0], &end
, 0), 0);
2623 command_print(cmd_ctx
, "Starting profiling. Halting and resuming the target as often as we can...");
2625 static const int maxSample
=10000;
2626 u32
*samples
=malloc(sizeof(u32
)*maxSample
);
2631 int retval
=ERROR_OK
;
2632 // hopefully it is safe to cache! We want to stop/restart as quickly as possible.
2633 reg_t
*reg
= register_get_by_name(target
->reg_cache
, "pc", 1);
2637 target_poll(target
);
2638 if (target
->state
== TARGET_HALTED
)
2640 u32 t
=*((u32
*)reg
->value
);
2641 samples
[numSamples
++]=t
;
2642 retval
= target_resume(target
, 1, 0, 0, 0); /* current pc, addr = 0, do not handle breakpoints, not debugging */
2643 target_poll(target
);
2644 usleep(10*1000); // sleep 10ms, i.e. <100 samples/second.
2645 } else if (target
->state
== TARGET_RUNNING
)
2647 // We want to quickly sample the PC.
2648 target_halt(target
);
2651 command_print(cmd_ctx
, "Target not halted or running");
2655 if (retval
!=ERROR_OK
)
2660 gettimeofday(&now
, NULL
);
2661 if ((numSamples
>=maxSample
) || ((now
.tv_sec
>= timeout
.tv_sec
) && (now
.tv_usec
>= timeout
.tv_usec
)))
2663 command_print(cmd_ctx
, "Profiling completed. %d samples.", numSamples
);
2664 target_poll(target
);
2665 if (target
->state
== TARGET_HALTED
)
2667 target_resume(target
, 1, 0, 0, 0); /* current pc, addr = 0, do not handle breakpoints, not debugging */
2669 target_poll(target
);
2670 writeGmon(samples
, numSamples
, args
[1]);
2671 command_print(cmd_ctx
, "Wrote %s", args
[1]);
2680 static int new_int_array_element(Jim_Interp
* interp
, const char *varname
, int idx
, u32 val
)
2683 Jim_Obj
*nameObjPtr
, *valObjPtr
;
2686 namebuf
= alloc_printf("%s(%d)", varname
, idx
);
2690 nameObjPtr
= Jim_NewStringObj(interp
, namebuf
, -1);
2691 valObjPtr
= Jim_NewIntObj(interp
, val
);
2692 if (!nameObjPtr
|| !valObjPtr
)
2698 Jim_IncrRefCount(nameObjPtr
);
2699 Jim_IncrRefCount(valObjPtr
);
2700 result
= Jim_SetVariable(interp
, nameObjPtr
, valObjPtr
);
2701 Jim_DecrRefCount(interp
, nameObjPtr
);
2702 Jim_DecrRefCount(interp
, valObjPtr
);
2704 /* printf("%s(%d) <= 0%08x\n", varname, idx, val); */
2708 static int jim_mem2array(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *argv
)
2711 command_context_t
*context
;
2718 const char *varname
;
2720 int i
, n
, e
, retval
;
2722 /* argv[1] = name of array to receive the data
2723 * argv[2] = desired width
2724 * argv[3] = memory address
2725 * argv[4] = count of times to read
2728 Jim_WrongNumArgs(interp
, 1, argv
, "varname width addr nelems");
2731 varname
= Jim_GetString(argv
[1], &len
);
2732 /* given "foo" get space for worse case "foo(%d)" .. add 20 */
2734 e
= Jim_GetLong(interp
, argv
[2], &l
);
2740 e
= Jim_GetLong(interp
, argv
[3], &l
);
2745 e
= Jim_GetLong(interp
, argv
[4], &l
);
2761 Jim_SetResult(interp
, Jim_NewEmptyStringObj(interp
));
2762 Jim_AppendStrings( interp
, Jim_GetResult(interp
), "Invalid width param, must be 8/16/32", NULL
);
2766 Jim_SetResult(interp
, Jim_NewEmptyStringObj(interp
));
2767 Jim_AppendStrings(interp
, Jim_GetResult(interp
), "mem2array: zero width read?", NULL
);
2770 if ((addr
+ (len
* width
)) < addr
) {
2771 Jim_SetResult(interp
, Jim_NewEmptyStringObj(interp
));
2772 Jim_AppendStrings(interp
, Jim_GetResult(interp
), "mem2array: addr + len - wraps to zero?", NULL
);
2775 /* absurd transfer size? */
2777 Jim_SetResult(interp
, Jim_NewEmptyStringObj(interp
));
2778 Jim_AppendStrings(interp
, Jim_GetResult(interp
), "mem2array: absurd > 64K item request", NULL
);
2783 ((width
== 2) && ((addr
& 1) == 0)) ||
2784 ((width
== 4) && ((addr
& 3) == 0))) {
2788 Jim_SetResult(interp
, Jim_NewEmptyStringObj(interp
));
2789 sprintf(buf
, "mem2array address: 0x%08x is not aligned for %d byte reads", addr
, width
);
2790 Jim_AppendStrings(interp
, Jim_GetResult(interp
), buf
, NULL
);
2794 context
= Jim_GetAssocData(interp
, "context");
2795 if (context
== NULL
)
2797 LOG_ERROR("mem2array: no command context");
2800 target
= get_current_target(context
);
2803 LOG_ERROR("mem2array: no current target");
2814 /* Slurp... in buffer size chunks */
2816 count
= len
; /* in objects.. */
2817 if (count
> (sizeof(buffer
)/width
)) {
2818 count
= (sizeof(buffer
)/width
);
2821 retval
= target
->type
->read_memory( target
, addr
, width
, count
, buffer
);
2822 if (retval
!= ERROR_OK
) {
2824 LOG_ERROR("mem2array: Read @ 0x%08x, w=%d, cnt=%d, failed", addr
, width
, count
);
2825 Jim_SetResult(interp
, Jim_NewEmptyStringObj(interp
));
2826 Jim_AppendStrings(interp
, Jim_GetResult(interp
), "mem2array: cannot read memory", NULL
);
2830 v
= 0; /* shut up gcc */
2831 for (i
= 0 ;i
< count
;i
++, n
++) {
2834 v
= target_buffer_get_u32(target
, &buffer
[i
*width
]);
2837 v
= target_buffer_get_u16(target
, &buffer
[i
*width
]);
2840 v
= buffer
[i
] & 0x0ff;
2843 new_int_array_element(interp
, varname
, n
, v
);
2849 Jim_SetResult(interp
, Jim_NewEmptyStringObj(interp
));
2854 static int get_int_array_element(Jim_Interp
* interp
, const char *varname
, int idx
, u32
*val
)
2857 Jim_Obj
*nameObjPtr
, *valObjPtr
;
2861 namebuf
= alloc_printf("%s(%d)", varname
, idx
);
2865 nameObjPtr
= Jim_NewStringObj(interp
, namebuf
, -1);
2872 Jim_IncrRefCount(nameObjPtr
);
2873 valObjPtr
= Jim_GetVariable(interp
, nameObjPtr
, JIM_ERRMSG
);
2874 Jim_DecrRefCount(interp
, nameObjPtr
);
2876 if (valObjPtr
== NULL
)
2879 result
= Jim_GetLong(interp
, valObjPtr
, &l
);
2880 /* printf("%s(%d) => 0%08x\n", varname, idx, val); */
2885 static int jim_array2mem(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *argv
)
2888 command_context_t
*context
;
2895 const char *varname
;
2897 int i
, n
, e
, retval
;
2899 /* argv[1] = name of array to get the data
2900 * argv[2] = desired width
2901 * argv[3] = memory address
2902 * argv[4] = count to write
2905 Jim_WrongNumArgs(interp
, 1, argv
, "varname width addr nelems");
2908 varname
= Jim_GetString(argv
[1], &len
);
2909 /* given "foo" get space for worse case "foo(%d)" .. add 20 */
2911 e
= Jim_GetLong(interp
, argv
[2], &l
);
2917 e
= Jim_GetLong(interp
, argv
[3], &l
);
2922 e
= Jim_GetLong(interp
, argv
[4], &l
);
2938 Jim_SetResult(interp
, Jim_NewEmptyStringObj(interp
));
2939 Jim_AppendStrings( interp
, Jim_GetResult(interp
), "Invalid width param, must be 8/16/32", NULL
);
2943 Jim_SetResult(interp
, Jim_NewEmptyStringObj(interp
));
2944 Jim_AppendStrings(interp
, Jim_GetResult(interp
), "array2mem: zero width read?", NULL
);
2947 if ((addr
+ (len
* width
)) < addr
) {
2948 Jim_SetResult(interp
, Jim_NewEmptyStringObj(interp
));
2949 Jim_AppendStrings(interp
, Jim_GetResult(interp
), "array2mem: addr + len - wraps to zero?", NULL
);
2952 /* absurd transfer size? */
2954 Jim_SetResult(interp
, Jim_NewEmptyStringObj(interp
));
2955 Jim_AppendStrings(interp
, Jim_GetResult(interp
), "array2mem: absurd > 64K item request", NULL
);
2960 ((width
== 2) && ((addr
& 1) == 0)) ||
2961 ((width
== 4) && ((addr
& 3) == 0))) {
2965 Jim_SetResult(interp
, Jim_NewEmptyStringObj(interp
));
2966 sprintf(buf
, "array2mem address: 0x%08x is not aligned for %d byte reads", addr
, width
);
2967 Jim_AppendStrings(interp
, Jim_GetResult(interp
), buf
, NULL
);
2971 context
= Jim_GetAssocData(interp
, "context");
2972 if (context
== NULL
)
2974 LOG_ERROR("array2mem: no command context");
2977 target
= get_current_target(context
);
2980 LOG_ERROR("array2mem: no current target");
2991 /* Slurp... in buffer size chunks */
2993 count
= len
; /* in objects.. */
2994 if (count
> (sizeof(buffer
)/width
)) {
2995 count
= (sizeof(buffer
)/width
);
2998 v
= 0; /* shut up gcc */
2999 for (i
= 0 ;i
< count
;i
++, n
++) {
3000 get_int_array_element(interp
, varname
, n
, &v
);
3003 target_buffer_set_u32(target
, &buffer
[i
*width
], v
);
3006 target_buffer_set_u16(target
, &buffer
[i
*width
], v
);
3009 buffer
[i
] = v
& 0x0ff;
3015 retval
= target
->type
->write_memory(target
, addr
, width
, count
, buffer
);
3016 if (retval
!= ERROR_OK
) {
3018 LOG_ERROR("array2mem: Write @ 0x%08x, w=%d, cnt=%d, failed", addr
, width
, count
);
3019 Jim_SetResult(interp
, Jim_NewEmptyStringObj(interp
));
3020 Jim_AppendStrings(interp
, Jim_GetResult(interp
), "mem2array: cannot read memory", NULL
);
3026 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)