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 LOG_DEBUG("writing buffer of %i byte at 0x%8.8x", size
, address
);
974 if (!target
->type
->examined
)
976 LOG_ERROR("Target not examined yet");
980 if (address
+size
<address
)
982 /* GDB can request this when e.g. PC is 0xfffffffc*/
983 LOG_ERROR("address+size wrapped(0x%08x, 0x%08x)", address
, size
);
987 if (((address
% 2) == 0) && (size
== 2))
989 return target
->type
->write_memory(target
, address
, 2, 1, buffer
);
992 /* handle unaligned head bytes */
995 int unaligned
= 4 - (address
% 4);
997 if (unaligned
> size
)
1000 if ((retval
= target
->type
->write_memory(target
, address
, 1, unaligned
, buffer
)) != ERROR_OK
)
1003 buffer
+= unaligned
;
1004 address
+= unaligned
;
1008 /* handle aligned words */
1011 int aligned
= size
- (size
% 4);
1013 /* use bulk writes above a certain limit. This may have to be changed */
1016 if ((retval
= target
->type
->bulk_write_memory(target
, address
, aligned
/ 4, buffer
)) != ERROR_OK
)
1021 if ((retval
= target
->type
->write_memory(target
, address
, 4, aligned
/ 4, buffer
)) != ERROR_OK
)
1030 /* handle tail writes of less than 4 bytes */
1033 if ((retval
= target
->type
->write_memory(target
, address
, 1, size
, buffer
)) != ERROR_OK
)
1041 /* Single aligned words are guaranteed to use 16 or 32 bit access
1042 * mode respectively, otherwise data is handled as quickly as
1045 int target_read_buffer(struct target_s
*target
, u32 address
, u32 size
, u8
*buffer
)
1048 LOG_DEBUG("reading buffer of %i byte at 0x%8.8x", size
, address
);
1050 if (!target
->type
->examined
)
1052 LOG_ERROR("Target not examined yet");
1056 if (address
+size
<address
)
1058 /* GDB can request this when e.g. PC is 0xfffffffc*/
1059 LOG_ERROR("address+size wrapped(0x%08x, 0x%08x)", address
, size
);
1063 if (((address
% 2) == 0) && (size
== 2))
1065 return target
->type
->read_memory(target
, address
, 2, 1, buffer
);
1068 /* handle unaligned head bytes */
1071 int unaligned
= 4 - (address
% 4);
1073 if (unaligned
> size
)
1076 if ((retval
= target
->type
->read_memory(target
, address
, 1, unaligned
, buffer
)) != ERROR_OK
)
1079 buffer
+= unaligned
;
1080 address
+= unaligned
;
1084 /* handle aligned words */
1087 int aligned
= size
- (size
% 4);
1089 if ((retval
= target
->type
->read_memory(target
, address
, 4, aligned
/ 4, buffer
)) != ERROR_OK
)
1097 /* handle tail writes of less than 4 bytes */
1100 if ((retval
= target
->type
->read_memory(target
, address
, 1, size
, buffer
)) != ERROR_OK
)
1107 int target_checksum_memory(struct target_s
*target
, u32 address
, u32 size
, u32
* crc
)
1113 if (!target
->type
->examined
)
1115 LOG_ERROR("Target not examined yet");
1119 if ((retval
= target
->type
->checksum_memory(target
, address
,
1120 size
, &checksum
)) == ERROR_TARGET_RESOURCE_NOT_AVAILABLE
)
1122 buffer
= malloc(size
);
1125 LOG_ERROR("error allocating buffer for section (%d bytes)", size
);
1126 return ERROR_INVALID_ARGUMENTS
;
1128 retval
= target_read_buffer(target
, address
, size
, buffer
);
1129 if (retval
!= ERROR_OK
)
1135 /* convert to target endianess */
1136 for (i
= 0; i
< (size
/sizeof(u32
)); i
++)
1139 target_data
= target_buffer_get_u32(target
, &buffer
[i
*sizeof(u32
)]);
1140 target_buffer_set_u32(target
, &buffer
[i
*sizeof(u32
)], target_data
);
1143 retval
= image_calculate_checksum( buffer
, size
, &checksum
);
1152 int target_blank_check_memory(struct target_s
*target
, u32 address
, u32 size
, u32
* blank
)
1155 if (!target
->type
->examined
)
1157 LOG_ERROR("Target not examined yet");
1161 if (target
->type
->blank_check_memory
== 0)
1162 return ERROR_TARGET_RESOURCE_NOT_AVAILABLE
;
1164 retval
= target
->type
->blank_check_memory(target
, address
, size
, blank
);
1169 int target_read_u32(struct target_s
*target
, u32 address
, u32
*value
)
1172 if (!target
->type
->examined
)
1174 LOG_ERROR("Target not examined yet");
1178 int retval
= target
->type
->read_memory(target
, address
, 4, 1, value_buf
);
1180 if (retval
== ERROR_OK
)
1182 *value
= target_buffer_get_u32(target
, value_buf
);
1183 LOG_DEBUG("address: 0x%8.8x, value: 0x%8.8x", address
, *value
);
1188 LOG_DEBUG("address: 0x%8.8x failed", address
);
1194 int target_read_u16(struct target_s
*target
, u32 address
, u16
*value
)
1197 if (!target
->type
->examined
)
1199 LOG_ERROR("Target not examined yet");
1203 int retval
= target
->type
->read_memory(target
, address
, 2, 1, value_buf
);
1205 if (retval
== ERROR_OK
)
1207 *value
= target_buffer_get_u16(target
, value_buf
);
1208 LOG_DEBUG("address: 0x%8.8x, value: 0x%4.4x", address
, *value
);
1213 LOG_DEBUG("address: 0x%8.8x failed", address
);
1219 int target_read_u8(struct target_s
*target
, u32 address
, u8
*value
)
1221 int retval
= target
->type
->read_memory(target
, address
, 1, 1, value
);
1222 if (!target
->type
->examined
)
1224 LOG_ERROR("Target not examined yet");
1228 if (retval
== ERROR_OK
)
1230 LOG_DEBUG("address: 0x%8.8x, value: 0x%2.2x", address
, *value
);
1235 LOG_DEBUG("address: 0x%8.8x failed", address
);
1241 int target_write_u32(struct target_s
*target
, u32 address
, u32 value
)
1245 if (!target
->type
->examined
)
1247 LOG_ERROR("Target not examined yet");
1251 LOG_DEBUG("address: 0x%8.8x, value: 0x%8.8x", address
, value
);
1253 target_buffer_set_u32(target
, value_buf
, value
);
1254 if ((retval
= target
->type
->write_memory(target
, address
, 4, 1, value_buf
)) != ERROR_OK
)
1256 LOG_DEBUG("failed: %i", retval
);
1262 int target_write_u16(struct target_s
*target
, u32 address
, u16 value
)
1266 if (!target
->type
->examined
)
1268 LOG_ERROR("Target not examined yet");
1272 LOG_DEBUG("address: 0x%8.8x, value: 0x%8.8x", address
, value
);
1274 target_buffer_set_u16(target
, value_buf
, value
);
1275 if ((retval
= target
->type
->write_memory(target
, address
, 2, 1, value_buf
)) != ERROR_OK
)
1277 LOG_DEBUG("failed: %i", retval
);
1283 int target_write_u8(struct target_s
*target
, u32 address
, u8 value
)
1286 if (!target
->type
->examined
)
1288 LOG_ERROR("Target not examined yet");
1292 LOG_DEBUG("address: 0x%8.8x, value: 0x%2.2x", address
, value
);
1294 if ((retval
= target
->type
->read_memory(target
, address
, 1, 1, &value
)) != ERROR_OK
)
1296 LOG_DEBUG("failed: %i", retval
);
1302 int target_register_user_commands(struct command_context_s
*cmd_ctx
)
1304 register_command(cmd_ctx
, NULL
, "reg", handle_reg_command
, COMMAND_EXEC
, NULL
);
1305 register_command(cmd_ctx
, NULL
, "poll", handle_poll_command
, COMMAND_EXEC
, "poll target state");
1306 register_command(cmd_ctx
, NULL
, "wait_halt", handle_wait_halt_command
, COMMAND_EXEC
, "wait for target halt [time (s)]");
1307 register_command(cmd_ctx
, NULL
, "halt", handle_halt_command
, COMMAND_EXEC
, "halt target");
1308 register_command(cmd_ctx
, NULL
, "resume", handle_resume_command
, COMMAND_EXEC
, "resume target [addr]");
1309 register_command(cmd_ctx
, NULL
, "step", handle_step_command
, COMMAND_EXEC
, "step one instruction from current PC or [addr]");
1310 register_command(cmd_ctx
, NULL
, "reset", handle_reset_command
, COMMAND_EXEC
, "reset target [run|halt|init|run_and_halt|run_and_init]");
1311 register_command(cmd_ctx
, NULL
, "soft_reset_halt", handle_soft_reset_halt_command
, COMMAND_EXEC
, "halt the target and do a soft reset");
1313 register_command(cmd_ctx
, NULL
, "mdw", handle_md_command
, COMMAND_EXEC
, "display memory words <addr> [count]");
1314 register_command(cmd_ctx
, NULL
, "mdh", handle_md_command
, COMMAND_EXEC
, "display memory half-words <addr> [count]");
1315 register_command(cmd_ctx
, NULL
, "mdb", handle_md_command
, COMMAND_EXEC
, "display memory bytes <addr> [count]");
1317 register_command(cmd_ctx
, NULL
, "mww", handle_mw_command
, COMMAND_EXEC
, "write memory word <addr> <value> [count]");
1318 register_command(cmd_ctx
, NULL
, "mwh", handle_mw_command
, COMMAND_EXEC
, "write memory half-word <addr> <value> [count]");
1319 register_command(cmd_ctx
, NULL
, "mwb", handle_mw_command
, COMMAND_EXEC
, "write memory byte <addr> <value> [count]");
1321 register_command(cmd_ctx
, NULL
, "bp", handle_bp_command
, COMMAND_EXEC
, "set breakpoint <address> <length> [hw]");
1322 register_command(cmd_ctx
, NULL
, "rbp", handle_rbp_command
, COMMAND_EXEC
, "remove breakpoint <adress>");
1323 register_command(cmd_ctx
, NULL
, "wp", handle_wp_command
, COMMAND_EXEC
, "set watchpoint <address> <length> <r/w/a> [value] [mask]");
1324 register_command(cmd_ctx
, NULL
, "rwp", handle_rwp_command
, COMMAND_EXEC
, "remove watchpoint <adress>");
1326 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]");
1327 register_command(cmd_ctx
, NULL
, "dump_image", handle_dump_image_command
, COMMAND_EXEC
, "dump_image <file> <address> <size>");
1328 register_command(cmd_ctx
, NULL
, "verify_image", handle_verify_image_command
, COMMAND_EXEC
, "verify_image <file> [offset] [type]");
1330 target_request_register_commands(cmd_ctx
);
1331 trace_register_commands(cmd_ctx
);
1336 int handle_targets_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1338 target_t
*target
= targets
;
1343 int num
= strtoul(args
[0], NULL
, 0);
1348 target
= target
->next
;
1352 cmd_ctx
->current_target
= num
;
1354 command_print(cmd_ctx
, "%i is out of bounds, only %i targets are configured", num
, count
);
1361 command_print(cmd_ctx
, "%i: %s (%s), state: %s", count
++, target
->type
->name
, target_endianess_strings
[target
->endianness
], target_state_strings
[target
->state
]);
1362 target
= target
->next
;
1368 int handle_target_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1375 return ERROR_COMMAND_SYNTAX_ERROR
;
1378 /* search for the specified target */
1379 if (args
[0] && (args
[0][0] != 0))
1381 for (i
= 0; target_types
[i
]; i
++)
1383 if (strcmp(args
[0], target_types
[i
]->name
) == 0)
1385 target_t
**last_target_p
= &targets
;
1387 /* register target specific commands */
1388 if (target_types
[i
]->register_commands(cmd_ctx
) != ERROR_OK
)
1390 LOG_ERROR("couldn't register '%s' commands", args
[0]);
1396 while ((*last_target_p
)->next
)
1397 last_target_p
= &((*last_target_p
)->next
);
1398 last_target_p
= &((*last_target_p
)->next
);
1401 *last_target_p
= malloc(sizeof(target_t
));
1403 /* allocate memory for each unique target type */
1404 (*last_target_p
)->type
= (target_type_t
*)malloc(sizeof(target_type_t
));
1405 *((*last_target_p
)->type
) = *target_types
[i
];
1407 if (strcmp(args
[1], "big") == 0)
1408 (*last_target_p
)->endianness
= TARGET_BIG_ENDIAN
;
1409 else if (strcmp(args
[1], "little") == 0)
1410 (*last_target_p
)->endianness
= TARGET_LITTLE_ENDIAN
;
1413 LOG_ERROR("endianness must be either 'little' or 'big', not '%s'", args
[1]);
1414 return ERROR_COMMAND_SYNTAX_ERROR
;
1417 if (strcmp(args
[2], "reset_halt") == 0)
1419 LOG_WARNING("reset_mode argument is obsolete.");
1420 return ERROR_COMMAND_SYNTAX_ERROR
;
1422 else if (strcmp(args
[2], "reset_run") == 0)
1424 LOG_WARNING("reset_mode argument is obsolete.");
1425 return ERROR_COMMAND_SYNTAX_ERROR
;
1427 else if (strcmp(args
[2], "reset_init") == 0)
1429 LOG_WARNING("reset_mode argument is obsolete.");
1430 return ERROR_COMMAND_SYNTAX_ERROR
;
1432 else if (strcmp(args
[2], "run_and_halt") == 0)
1434 LOG_WARNING("reset_mode argument is obsolete.");
1435 return ERROR_COMMAND_SYNTAX_ERROR
;
1437 else if (strcmp(args
[2], "run_and_init") == 0)
1439 LOG_WARNING("reset_mode argument is obsolete.");
1440 return ERROR_COMMAND_SYNTAX_ERROR
;
1444 /* Kludge! we want to make this reset arg optional while remaining compatible! */
1448 (*last_target_p
)->run_and_halt_time
= 1000; /* default 1s */
1450 (*last_target_p
)->working_area
= 0x0;
1451 (*last_target_p
)->working_area_size
= 0x0;
1452 (*last_target_p
)->working_areas
= NULL
;
1453 (*last_target_p
)->backup_working_area
= 0;
1455 (*last_target_p
)->state
= TARGET_UNKNOWN
;
1456 (*last_target_p
)->debug_reason
= DBG_REASON_UNDEFINED
;
1457 (*last_target_p
)->reg_cache
= NULL
;
1458 (*last_target_p
)->breakpoints
= NULL
;
1459 (*last_target_p
)->watchpoints
= NULL
;
1460 (*last_target_p
)->next
= NULL
;
1461 (*last_target_p
)->arch_info
= NULL
;
1463 /* initialize trace information */
1464 (*last_target_p
)->trace_info
= malloc(sizeof(trace_t
));
1465 (*last_target_p
)->trace_info
->num_trace_points
= 0;
1466 (*last_target_p
)->trace_info
->trace_points_size
= 0;
1467 (*last_target_p
)->trace_info
->trace_points
= NULL
;
1468 (*last_target_p
)->trace_info
->trace_history_size
= 0;
1469 (*last_target_p
)->trace_info
->trace_history
= NULL
;
1470 (*last_target_p
)->trace_info
->trace_history_pos
= 0;
1471 (*last_target_p
)->trace_info
->trace_history_overflowed
= 0;
1473 (*last_target_p
)->dbgmsg
= NULL
;
1474 (*last_target_p
)->dbg_msg_enabled
= 0;
1476 (*last_target_p
)->type
->target_command(cmd_ctx
, cmd
, args
, argc
, *last_target_p
);
1484 /* no matching target found */
1487 LOG_ERROR("target '%s' not found", args
[0]);
1488 return ERROR_COMMAND_SYNTAX_ERROR
;
1494 int target_invoke_script(struct command_context_s
*cmd_ctx
, target_t
*target
, char *name
)
1496 return command_run_linef(cmd_ctx
, " if {[catch {info body target_%d_%s} t]==0} {target_%d_%s}",
1497 get_num_by_target(target
), name
,
1498 get_num_by_target(target
), name
);
1501 int handle_run_and_halt_time_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1503 target_t
*target
= NULL
;
1507 return ERROR_COMMAND_SYNTAX_ERROR
;
1510 target
= get_target_by_num(strtoul(args
[0], NULL
, 0));
1513 return ERROR_COMMAND_SYNTAX_ERROR
;
1516 target
->run_and_halt_time
= strtoul(args
[1], NULL
, 0);
1521 int handle_working_area_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1523 target_t
*target
= NULL
;
1525 if ((argc
< 4) || (argc
> 5))
1527 return ERROR_COMMAND_SYNTAX_ERROR
;
1530 target
= get_target_by_num(strtoul(args
[0], NULL
, 0));
1533 return ERROR_COMMAND_SYNTAX_ERROR
;
1535 target_free_all_working_areas(target
);
1537 target
->working_area_phys
= target
->working_area_virt
= strtoul(args
[1], NULL
, 0);
1540 target
->working_area_virt
= strtoul(args
[4], NULL
, 0);
1542 target
->working_area_size
= strtoul(args
[2], NULL
, 0);
1544 if (strcmp(args
[3], "backup") == 0)
1546 target
->backup_working_area
= 1;
1548 else if (strcmp(args
[3], "nobackup") == 0)
1550 target
->backup_working_area
= 0;
1554 LOG_ERROR("unrecognized <backup|nobackup> argument (%s)", args
[3]);
1555 return ERROR_COMMAND_SYNTAX_ERROR
;
1562 /* process target state changes */
1563 int handle_target(void *priv
)
1565 target_t
*target
= targets
;
1569 if (target_continous_poll
)
1571 /* polling may fail silently until the target has been examined */
1572 target_poll(target
);
1575 target
= target
->next
;
1581 int handle_reg_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1590 target
= get_current_target(cmd_ctx
);
1592 /* list all available registers for the current target */
1595 reg_cache_t
*cache
= target
->reg_cache
;
1601 for (i
= 0; i
< cache
->num_regs
; i
++)
1603 value
= buf_to_str(cache
->reg_list
[i
].value
, cache
->reg_list
[i
].size
, 16);
1604 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
);
1607 cache
= cache
->next
;
1613 /* access a single register by its ordinal number */
1614 if ((args
[0][0] >= '0') && (args
[0][0] <= '9'))
1616 int num
= strtoul(args
[0], NULL
, 0);
1617 reg_cache_t
*cache
= target
->reg_cache
;
1623 for (i
= 0; i
< cache
->num_regs
; i
++)
1627 reg
= &cache
->reg_list
[i
];
1633 cache
= cache
->next
;
1638 command_print(cmd_ctx
, "%i is out of bounds, the current target has only %i registers (0 - %i)", num
, count
, count
- 1);
1641 } else /* access a single register by its name */
1643 reg
= register_get_by_name(target
->reg_cache
, args
[0], 1);
1647 command_print(cmd_ctx
, "register %s not found in current target", args
[0]);
1652 /* display a register */
1653 if ((argc
== 1) || ((argc
== 2) && !((args
[1][0] >= '0') && (args
[1][0] <= '9'))))
1655 if ((argc
== 2) && (strcmp(args
[1], "force") == 0))
1658 if (reg
->valid
== 0)
1660 reg_arch_type_t
*arch_type
= register_get_arch_type(reg
->arch_type
);
1661 if (arch_type
== NULL
)
1663 LOG_ERROR("BUG: encountered unregistered arch type");
1666 arch_type
->get(reg
);
1668 value
= buf_to_str(reg
->value
, reg
->size
, 16);
1669 command_print(cmd_ctx
, "%s (/%i): 0x%s", reg
->name
, reg
->size
, value
);
1674 /* set register value */
1677 u8
*buf
= malloc(CEIL(reg
->size
, 8));
1678 str_to_buf(args
[1], strlen(args
[1]), buf
, reg
->size
, 0);
1680 reg_arch_type_t
*arch_type
= register_get_arch_type(reg
->arch_type
);
1681 if (arch_type
== NULL
)
1683 LOG_ERROR("BUG: encountered unregistered arch type");
1687 arch_type
->set(reg
, buf
);
1689 value
= buf_to_str(reg
->value
, reg
->size
, 16);
1690 command_print(cmd_ctx
, "%s (/%i): 0x%s", reg
->name
, reg
->size
, value
);
1698 command_print(cmd_ctx
, "usage: reg <#|name> [value]");
1704 int handle_poll_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1706 target_t
*target
= get_current_target(cmd_ctx
);
1710 target_poll(target
);
1711 target_arch_state(target
);
1715 if (strcmp(args
[0], "on") == 0)
1717 target_continous_poll
= 1;
1719 else if (strcmp(args
[0], "off") == 0)
1721 target_continous_poll
= 0;
1725 command_print(cmd_ctx
, "arg is \"on\" or \"off\"");
1733 int handle_wait_halt_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1741 ms
= strtoul(args
[0], &end
, 0) * 1000;
1744 command_print(cmd_ctx
, "usage: %s [seconds]", cmd
);
1748 target_t
*target
= get_current_target(cmd_ctx
);
1750 return target_wait_state(target
, TARGET_HALTED
, ms
);
1753 int target_wait_state(target_t
*target
, enum target_state state
, int ms
)
1756 struct timeval timeout
, now
;
1758 gettimeofday(&timeout
, NULL
);
1759 timeval_add_time(&timeout
, 0, ms
* 1000);
1763 if ((retval
=target_poll(target
))!=ERROR_OK
)
1765 target_call_timer_callbacks_now();
1766 if (target
->state
== state
)
1773 LOG_USER("waiting for target %s...", target_state_strings
[state
]);
1776 gettimeofday(&now
, NULL
);
1777 if ((now
.tv_sec
> timeout
.tv_sec
) || ((now
.tv_sec
== timeout
.tv_sec
) && (now
.tv_usec
>= timeout
.tv_usec
)))
1779 LOG_ERROR("timed out while waiting for target %s", target_state_strings
[state
]);
1787 int handle_halt_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1790 target_t
*target
= get_current_target(cmd_ctx
);
1794 if ((retval
= target_halt(target
)) != ERROR_OK
)
1799 return handle_wait_halt_command(cmd_ctx
, cmd
, args
, argc
);
1802 int handle_soft_reset_halt_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1804 target_t
*target
= get_current_target(cmd_ctx
);
1806 LOG_USER("requesting target halt and executing a soft reset");
1808 target
->type
->soft_reset_halt(target
);
1813 int handle_reset_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1815 target_t
*target
= get_current_target(cmd_ctx
);
1816 enum target_reset_mode reset_mode
= RESET_RUN
;
1822 if (strcmp("run", args
[0]) == 0)
1823 reset_mode
= RESET_RUN
;
1824 else if (strcmp("halt", args
[0]) == 0)
1825 reset_mode
= RESET_HALT
;
1826 else if (strcmp("init", args
[0]) == 0)
1827 reset_mode
= RESET_INIT
;
1828 else if (strcmp("run_and_halt", args
[0]) == 0)
1830 reset_mode
= RESET_RUN_AND_HALT
;
1833 target
->run_and_halt_time
= strtoul(args
[1], NULL
, 0);
1836 else if (strcmp("run_and_init", args
[0]) == 0)
1838 reset_mode
= RESET_RUN_AND_INIT
;
1841 target
->run_and_halt_time
= strtoul(args
[1], NULL
, 0);
1846 command_print(cmd_ctx
, "usage: reset ['run', 'halt', 'init', 'run_and_halt', 'run_and_init]");
1851 /* reset *all* targets */
1852 target_process_reset(cmd_ctx
, reset_mode
);
1857 int handle_resume_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1860 target_t
*target
= get_current_target(cmd_ctx
);
1862 target_invoke_script(cmd_ctx
, target
, "pre_resume");
1865 retval
= target_resume(target
, 1, 0, 1, 0); /* current pc, addr = 0, handle breakpoints, not debugging */
1867 retval
= target_resume(target
, 0, strtoul(args
[0], NULL
, 0), 1, 0); /* addr = args[0], handle breakpoints, not debugging */
1870 return ERROR_COMMAND_SYNTAX_ERROR
;
1876 int handle_step_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1878 target_t
*target
= get_current_target(cmd_ctx
);
1883 target
->type
->step(target
, 1, 0, 1); /* current pc, addr = 0, handle breakpoints */
1886 target
->type
->step(target
, 0, strtoul(args
[0], NULL
, 0), 1); /* addr = args[0], handle breakpoints */
1891 int handle_md_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1893 const int line_bytecnt
= 32;
1906 target_t
*target
= get_current_target(cmd_ctx
);
1912 count
= strtoul(args
[1], NULL
, 0);
1914 address
= strtoul(args
[0], NULL
, 0);
1920 size
= 4; line_modulo
= line_bytecnt
/ 4;
1923 size
= 2; line_modulo
= line_bytecnt
/ 2;
1926 size
= 1; line_modulo
= line_bytecnt
/ 1;
1932 buffer
= calloc(count
, size
);
1933 retval
= target
->type
->read_memory(target
, address
, size
, count
, buffer
);
1934 if (retval
== ERROR_OK
)
1938 for (i
= 0; i
< count
; i
++)
1940 if (i
%line_modulo
== 0)
1941 output_len
+= snprintf(output
+ output_len
, 128 - output_len
, "0x%8.8x: ", address
+ (i
*size
));
1946 output_len
+= snprintf(output
+ output_len
, 128 - output_len
, "%8.8x ", target_buffer_get_u32(target
, &buffer
[i
*4]));
1949 output_len
+= snprintf(output
+ output_len
, 128 - output_len
, "%4.4x ", target_buffer_get_u16(target
, &buffer
[i
*2]));
1952 output_len
+= snprintf(output
+ output_len
, 128 - output_len
, "%2.2x ", buffer
[i
*1]);
1956 if ((i
%line_modulo
== line_modulo
-1) || (i
== count
- 1))
1958 command_print(cmd_ctx
, output
);
1969 int handle_mw_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1976 target_t
*target
= get_current_target(cmd_ctx
);
1979 if ((argc
< 2) || (argc
> 3))
1980 return ERROR_COMMAND_SYNTAX_ERROR
;
1982 address
= strtoul(args
[0], NULL
, 0);
1983 value
= strtoul(args
[1], NULL
, 0);
1985 count
= strtoul(args
[2], NULL
, 0);
1991 target_buffer_set_u32(target
, value_buf
, value
);
1995 target_buffer_set_u16(target
, value_buf
, value
);
1999 value_buf
[0] = value
;
2002 return ERROR_COMMAND_SYNTAX_ERROR
;
2004 for (i
=0; i
<count
; i
++)
2010 retval
= target
->type
->write_memory(target
, address
+ i
*wordsize
, 4, 1, value_buf
);
2013 retval
= target
->type
->write_memory(target
, address
+ i
*wordsize
, 2, 1, value_buf
);
2016 retval
= target
->type
->write_memory(target
, address
+ i
*wordsize
, 1, 1, value_buf
);
2021 if (retval
!=ERROR_OK
)
2031 int handle_load_image_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2037 u32 max_address
=0xffffffff;
2043 duration_t duration
;
2044 char *duration_text
;
2046 target_t
*target
= get_current_target(cmd_ctx
);
2048 if ((argc
< 1)||(argc
> 5))
2050 return ERROR_COMMAND_SYNTAX_ERROR
;
2053 /* a base address isn't always necessary, default to 0x0 (i.e. don't relocate) */
2056 image
.base_address_set
= 1;
2057 image
.base_address
= strtoul(args
[1], NULL
, 0);
2061 image
.base_address_set
= 0;
2065 image
.start_address_set
= 0;
2069 min_address
=strtoul(args
[3], NULL
, 0);
2073 max_address
=strtoul(args
[4], NULL
, 0)+min_address
;
2076 if (min_address
>max_address
)
2078 return ERROR_COMMAND_SYNTAX_ERROR
;
2082 duration_start_measure(&duration
);
2084 if (image_open(&image
, args
[0], (argc
>= 3) ? args
[2] : NULL
) != ERROR_OK
)
2091 for (i
= 0; i
< image
.num_sections
; i
++)
2093 buffer
= malloc(image
.sections
[i
].size
);
2096 command_print(cmd_ctx
, "error allocating buffer for section (%d bytes)", image
.sections
[i
].size
);
2100 if ((retval
= image_read_section(&image
, i
, 0x0, image
.sections
[i
].size
, buffer
, &buf_cnt
)) != ERROR_OK
)
2110 /* DANGER!!! beware of unsigned comparision here!!! */
2112 if ((image
.sections
[i
].base_address
+buf_cnt
>=min_address
)&&
2113 (image
.sections
[i
].base_address
<max_address
))
2115 if (image
.sections
[i
].base_address
<min_address
)
2117 /* clip addresses below */
2118 offset
+=min_address
-image
.sections
[i
].base_address
;
2122 if (image
.sections
[i
].base_address
+buf_cnt
>max_address
)
2124 length
-=(image
.sections
[i
].base_address
+buf_cnt
)-max_address
;
2127 if ((retval
= target_write_buffer(target
, image
.sections
[i
].base_address
+offset
, length
, buffer
+offset
)) != ERROR_OK
)
2132 image_size
+= length
;
2133 command_print(cmd_ctx
, "%u byte written at address 0x%8.8x", length
, image
.sections
[i
].base_address
+offset
);
2139 duration_stop_measure(&duration
, &duration_text
);
2140 if (retval
==ERROR_OK
)
2142 command_print(cmd_ctx
, "downloaded %u byte in %s", image_size
, duration_text
);
2144 free(duration_text
);
2146 image_close(&image
);
2152 int handle_dump_image_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2159 int retval
=ERROR_OK
;
2161 duration_t duration
;
2162 char *duration_text
;
2164 target_t
*target
= get_current_target(cmd_ctx
);
2168 command_print(cmd_ctx
, "usage: dump_image <filename> <address> <size>");
2172 address
= strtoul(args
[1], NULL
, 0);
2173 size
= strtoul(args
[2], NULL
, 0);
2175 if ((address
& 3) || (size
& 3))
2177 command_print(cmd_ctx
, "only 32-bit aligned address and size are supported");
2181 if (fileio_open(&fileio
, args
[0], FILEIO_WRITE
, FILEIO_BINARY
) != ERROR_OK
)
2186 duration_start_measure(&duration
);
2191 u32 this_run_size
= (size
> 560) ? 560 : size
;
2193 retval
= target
->type
->read_memory(target
, address
, 4, this_run_size
/ 4, buffer
);
2194 if (retval
!= ERROR_OK
)
2199 retval
= fileio_write(&fileio
, this_run_size
, buffer
, &size_written
);
2200 if (retval
!= ERROR_OK
)
2205 size
-= this_run_size
;
2206 address
+= this_run_size
;
2209 fileio_close(&fileio
);
2211 duration_stop_measure(&duration
, &duration_text
);
2212 if (retval
==ERROR_OK
)
2214 command_print(cmd_ctx
, "dumped %"PRIi64
" byte in %s", fileio
.size
, duration_text
);
2216 free(duration_text
);
2221 int handle_verify_image_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2229 u32 mem_checksum
= 0;
2233 duration_t duration
;
2234 char *duration_text
;
2236 target_t
*target
= get_current_target(cmd_ctx
);
2240 return ERROR_COMMAND_SYNTAX_ERROR
;
2245 LOG_ERROR("no target selected");
2249 duration_start_measure(&duration
);
2253 image
.base_address_set
= 1;
2254 image
.base_address
= strtoul(args
[1], NULL
, 0);
2258 image
.base_address_set
= 0;
2259 image
.base_address
= 0x0;
2262 image
.start_address_set
= 0;
2264 if ((retval
=image_open(&image
, args
[0], (argc
== 3) ? args
[2] : NULL
)) != ERROR_OK
)
2271 for (i
= 0; i
< image
.num_sections
; i
++)
2273 buffer
= malloc(image
.sections
[i
].size
);
2276 command_print(cmd_ctx
, "error allocating buffer for section (%d bytes)", image
.sections
[i
].size
);
2279 if ((retval
= image_read_section(&image
, i
, 0x0, image
.sections
[i
].size
, buffer
, &buf_cnt
)) != ERROR_OK
)
2285 /* calculate checksum of image */
2286 image_calculate_checksum( buffer
, buf_cnt
, &checksum
);
2288 retval
= target_checksum_memory(target
, image
.sections
[i
].base_address
, buf_cnt
, &mem_checksum
);
2289 if( retval
!= ERROR_OK
)
2295 if( checksum
!= mem_checksum
)
2297 /* failed crc checksum, fall back to a binary compare */
2300 command_print(cmd_ctx
, "checksum mismatch - attempting binary compare");
2302 data
= (u8
*)malloc(buf_cnt
);
2304 /* Can we use 32bit word accesses? */
2306 int count
= buf_cnt
;
2307 if ((count
% 4) == 0)
2312 retval
= target
->type
->read_memory(target
, image
.sections
[i
].base_address
, size
, count
, data
);
2313 if (retval
== ERROR_OK
)
2316 for (t
= 0; t
< buf_cnt
; t
++)
2318 if (data
[t
] != buffer
[t
])
2320 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
]);
2333 image_size
+= buf_cnt
;
2336 duration_stop_measure(&duration
, &duration_text
);
2337 if (retval
==ERROR_OK
)
2339 command_print(cmd_ctx
, "verified %u bytes in %s", image_size
, duration_text
);
2341 free(duration_text
);
2343 image_close(&image
);
2348 int handle_bp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2351 target_t
*target
= get_current_target(cmd_ctx
);
2355 breakpoint_t
*breakpoint
= target
->breakpoints
;
2359 if (breakpoint
->type
== BKPT_SOFT
)
2361 char* buf
= buf_to_str(breakpoint
->orig_instr
, breakpoint
->length
, 16);
2362 command_print(cmd_ctx
, "0x%8.8x, 0x%x, %i, 0x%s", breakpoint
->address
, breakpoint
->length
, breakpoint
->set
, buf
);
2367 command_print(cmd_ctx
, "0x%8.8x, 0x%x, %i", breakpoint
->address
, breakpoint
->length
, breakpoint
->set
);
2369 breakpoint
= breakpoint
->next
;
2377 length
= strtoul(args
[1], NULL
, 0);
2380 if (strcmp(args
[2], "hw") == 0)
2383 if ((retval
= breakpoint_add(target
, strtoul(args
[0], NULL
, 0), length
, hw
)) != ERROR_OK
)
2385 LOG_ERROR("Failure setting breakpoints");
2389 command_print(cmd_ctx
, "breakpoint added at address 0x%8.8x", strtoul(args
[0], NULL
, 0));
2394 command_print(cmd_ctx
, "usage: bp <address> <length> ['hw']");
2400 int handle_rbp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2402 target_t
*target
= get_current_target(cmd_ctx
);
2405 breakpoint_remove(target
, strtoul(args
[0], NULL
, 0));
2410 int handle_wp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2412 target_t
*target
= get_current_target(cmd_ctx
);
2417 watchpoint_t
*watchpoint
= target
->watchpoints
;
2421 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
);
2422 watchpoint
= watchpoint
->next
;
2427 enum watchpoint_rw type
= WPT_ACCESS
;
2428 u32 data_value
= 0x0;
2429 u32 data_mask
= 0xffffffff;
2445 command_print(cmd_ctx
, "usage: wp <address> <length> [r/w/a] [value] [mask]");
2451 data_value
= strtoul(args
[3], NULL
, 0);
2455 data_mask
= strtoul(args
[4], NULL
, 0);
2458 if ((retval
= watchpoint_add(target
, strtoul(args
[0], NULL
, 0),
2459 strtoul(args
[1], NULL
, 0), type
, data_value
, data_mask
)) != ERROR_OK
)
2461 LOG_ERROR("Failure setting breakpoints");
2466 command_print(cmd_ctx
, "usage: wp <address> <length> [r/w/a] [value] [mask]");
2472 int handle_rwp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2474 target_t
*target
= get_current_target(cmd_ctx
);
2477 watchpoint_remove(target
, strtoul(args
[0], NULL
, 0));
2482 int handle_virt2phys_command(command_context_t
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2485 target_t
*target
= get_current_target(cmd_ctx
);
2491 return ERROR_COMMAND_SYNTAX_ERROR
;
2493 va
= strtoul(args
[0], NULL
, 0);
2495 retval
= target
->type
->virt2phys(target
, va
, &pa
);
2496 if (retval
== ERROR_OK
)
2498 command_print(cmd_ctx
, "Physical address 0x%08x", pa
);
2502 /* lower levels will have logged a detailed error which is
2503 * forwarded to telnet/GDB session.
2508 static void writeLong(FILE *f
, int l
)
2513 char c
=(l
>>(i
*8))&0xff;
2514 fwrite(&c
, 1, 1, f
);
2518 static void writeString(FILE *f
, char *s
)
2520 fwrite(s
, 1, strlen(s
), f
);
2525 // Dump a gmon.out histogram file.
2526 static void writeGmon(u32
*samples
, int sampleNum
, char *filename
)
2529 FILE *f
=fopen(filename
, "w");
2532 fwrite("gmon", 1, 4, f
);
2533 writeLong(f
, 0x00000001); // Version
2534 writeLong(f
, 0); // padding
2535 writeLong(f
, 0); // padding
2536 writeLong(f
, 0); // padding
2538 fwrite("", 1, 1, f
); // GMON_TAG_TIME_HIST
2540 // figure out bucket size
2543 for (i
=0; i
<sampleNum
; i
++)
2555 int addressSpace
=(max
-min
+1);
2557 static int const maxBuckets
=256*1024; // maximum buckets.
2558 int length
=addressSpace
;
2559 if (length
> maxBuckets
)
2563 int *buckets
=malloc(sizeof(int)*length
);
2569 memset(buckets
, 0, sizeof(int)*length
);
2570 for (i
=0; i
<sampleNum
;i
++)
2572 u32 address
=samples
[i
];
2573 long long a
=address
-min
;
2574 long long b
=length
-1;
2575 long long c
=addressSpace
-1;
2576 int index
=(a
*b
)/c
; // danger!!!! int32 overflows
2580 // append binary memory gmon.out &profile_hist_hdr ((char*)&profile_hist_hdr + sizeof(struct gmon_hist_hdr))
2581 writeLong(f
, min
); // low_pc
2582 writeLong(f
, max
); // high_pc
2583 writeLong(f
, length
); // # of samples
2584 writeLong(f
, 64000000); // 64MHz
2585 writeString(f
, "seconds");
2586 for (i
=0; i
<(15-strlen("seconds")); i
++)
2588 fwrite("", 1, 1, f
); // padding
2590 writeString(f
, "s");
2592 // append binary memory gmon.out profile_hist_data (profile_hist_data + profile_hist_hdr.hist_size)
2594 char *data
=malloc(2*length
);
2597 for (i
=0; i
<length
;i
++)
2606 data
[i
*2+1]=(val
>>8)&0xff;
2609 fwrite(data
, 1, length
*2, f
);
2619 /* profiling samples the CPU PC as quickly as OpenOCD is able, which will be used as a random sampling of PC */
2620 int handle_profile_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2622 target_t
*target
= get_current_target(cmd_ctx
);
2623 struct timeval timeout
, now
;
2625 gettimeofday(&timeout
, NULL
);
2628 return ERROR_COMMAND_SYNTAX_ERROR
;
2631 timeval_add_time(&timeout
, strtoul(args
[0], &end
, 0), 0);
2637 command_print(cmd_ctx
, "Starting profiling. Halting and resuming the target as often as we can...");
2639 static const int maxSample
=10000;
2640 u32
*samples
=malloc(sizeof(u32
)*maxSample
);
2645 int retval
=ERROR_OK
;
2646 // hopefully it is safe to cache! We want to stop/restart as quickly as possible.
2647 reg_t
*reg
= register_get_by_name(target
->reg_cache
, "pc", 1);
2651 target_poll(target
);
2652 if (target
->state
== TARGET_HALTED
)
2654 u32 t
=*((u32
*)reg
->value
);
2655 samples
[numSamples
++]=t
;
2656 retval
= target_resume(target
, 1, 0, 0, 0); /* current pc, addr = 0, do not handle breakpoints, not debugging */
2657 target_poll(target
);
2658 usleep(10*1000); // sleep 10ms, i.e. <100 samples/second.
2659 } else if (target
->state
== TARGET_RUNNING
)
2661 // We want to quickly sample the PC.
2662 target_halt(target
);
2665 command_print(cmd_ctx
, "Target not halted or running");
2669 if (retval
!=ERROR_OK
)
2674 gettimeofday(&now
, NULL
);
2675 if ((numSamples
>=maxSample
) || ((now
.tv_sec
>= timeout
.tv_sec
) && (now
.tv_usec
>= timeout
.tv_usec
)))
2677 command_print(cmd_ctx
, "Profiling completed. %d samples.", numSamples
);
2678 target_poll(target
);
2679 if (target
->state
== TARGET_HALTED
)
2681 target_resume(target
, 1, 0, 0, 0); /* current pc, addr = 0, do not handle breakpoints, not debugging */
2683 target_poll(target
);
2684 writeGmon(samples
, numSamples
, args
[1]);
2685 command_print(cmd_ctx
, "Wrote %s", args
[1]);
2694 static int new_int_array_element(Jim_Interp
* interp
, const char *varname
, int idx
, u32 val
)
2697 Jim_Obj
*nameObjPtr
, *valObjPtr
;
2700 namebuf
= alloc_printf("%s(%d)", varname
, idx
);
2704 nameObjPtr
= Jim_NewStringObj(interp
, namebuf
, -1);
2705 valObjPtr
= Jim_NewIntObj(interp
, val
);
2706 if (!nameObjPtr
|| !valObjPtr
)
2712 Jim_IncrRefCount(nameObjPtr
);
2713 Jim_IncrRefCount(valObjPtr
);
2714 result
= Jim_SetVariable(interp
, nameObjPtr
, valObjPtr
);
2715 Jim_DecrRefCount(interp
, nameObjPtr
);
2716 Jim_DecrRefCount(interp
, valObjPtr
);
2718 /* printf("%s(%d) <= 0%08x\n", varname, idx, val); */
2722 static int jim_mem2array(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *argv
)
2725 command_context_t
*context
;
2732 const char *varname
;
2734 int i
, n
, e
, retval
;
2736 /* argv[1] = name of array to receive the data
2737 * argv[2] = desired width
2738 * argv[3] = memory address
2739 * argv[4] = count of times to read
2742 Jim_WrongNumArgs(interp
, 1, argv
, "varname width addr nelems");
2745 varname
= Jim_GetString(argv
[1], &len
);
2746 /* given "foo" get space for worse case "foo(%d)" .. add 20 */
2748 e
= Jim_GetLong(interp
, argv
[2], &l
);
2754 e
= Jim_GetLong(interp
, argv
[3], &l
);
2759 e
= Jim_GetLong(interp
, argv
[4], &l
);
2775 Jim_SetResult(interp
, Jim_NewEmptyStringObj(interp
));
2776 Jim_AppendStrings( interp
, Jim_GetResult(interp
), "Invalid width param, must be 8/16/32", NULL
);
2780 Jim_SetResult(interp
, Jim_NewEmptyStringObj(interp
));
2781 Jim_AppendStrings(interp
, Jim_GetResult(interp
), "mem2array: zero width read?", NULL
);
2784 if ((addr
+ (len
* width
)) < addr
) {
2785 Jim_SetResult(interp
, Jim_NewEmptyStringObj(interp
));
2786 Jim_AppendStrings(interp
, Jim_GetResult(interp
), "mem2array: addr + len - wraps to zero?", NULL
);
2789 /* absurd transfer size? */
2791 Jim_SetResult(interp
, Jim_NewEmptyStringObj(interp
));
2792 Jim_AppendStrings(interp
, Jim_GetResult(interp
), "mem2array: absurd > 64K item request", NULL
);
2797 ((width
== 2) && ((addr
& 1) == 0)) ||
2798 ((width
== 4) && ((addr
& 3) == 0))) {
2802 Jim_SetResult(interp
, Jim_NewEmptyStringObj(interp
));
2803 sprintf(buf
, "mem2array address: 0x%08x is not aligned for %d byte reads", addr
, width
);
2804 Jim_AppendStrings(interp
, Jim_GetResult(interp
), buf
, NULL
);
2808 context
= Jim_GetAssocData(interp
, "context");
2809 if (context
== NULL
)
2811 LOG_ERROR("mem2array: no command context");
2814 target
= get_current_target(context
);
2817 LOG_ERROR("mem2array: no current target");
2828 /* Slurp... in buffer size chunks */
2830 count
= len
; /* in objects.. */
2831 if (count
> (sizeof(buffer
)/width
)) {
2832 count
= (sizeof(buffer
)/width
);
2835 retval
= target
->type
->read_memory( target
, addr
, width
, count
, buffer
);
2836 if (retval
!= ERROR_OK
) {
2838 LOG_ERROR("mem2array: Read @ 0x%08x, w=%d, cnt=%d, failed", addr
, width
, count
);
2839 Jim_SetResult(interp
, Jim_NewEmptyStringObj(interp
));
2840 Jim_AppendStrings(interp
, Jim_GetResult(interp
), "mem2array: cannot read memory", NULL
);
2844 v
= 0; /* shut up gcc */
2845 for (i
= 0 ;i
< count
;i
++, n
++) {
2848 v
= target_buffer_get_u32(target
, &buffer
[i
*width
]);
2851 v
= target_buffer_get_u16(target
, &buffer
[i
*width
]);
2854 v
= buffer
[i
] & 0x0ff;
2857 new_int_array_element(interp
, varname
, n
, v
);
2863 Jim_SetResult(interp
, Jim_NewEmptyStringObj(interp
));
2868 static int get_int_array_element(Jim_Interp
* interp
, const char *varname
, int idx
, u32
*val
)
2871 Jim_Obj
*nameObjPtr
, *valObjPtr
;
2875 namebuf
= alloc_printf("%s(%d)", varname
, idx
);
2879 nameObjPtr
= Jim_NewStringObj(interp
, namebuf
, -1);
2886 Jim_IncrRefCount(nameObjPtr
);
2887 valObjPtr
= Jim_GetVariable(interp
, nameObjPtr
, JIM_ERRMSG
);
2888 Jim_DecrRefCount(interp
, nameObjPtr
);
2890 if (valObjPtr
== NULL
)
2893 result
= Jim_GetLong(interp
, valObjPtr
, &l
);
2894 /* printf("%s(%d) => 0%08x\n", varname, idx, val); */
2899 static int jim_array2mem(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *argv
)
2902 command_context_t
*context
;
2909 const char *varname
;
2911 int i
, n
, e
, retval
;
2913 /* argv[1] = name of array to get the data
2914 * argv[2] = desired width
2915 * argv[3] = memory address
2916 * argv[4] = count to write
2919 Jim_WrongNumArgs(interp
, 1, argv
, "varname width addr nelems");
2922 varname
= Jim_GetString(argv
[1], &len
);
2923 /* given "foo" get space for worse case "foo(%d)" .. add 20 */
2925 e
= Jim_GetLong(interp
, argv
[2], &l
);
2931 e
= Jim_GetLong(interp
, argv
[3], &l
);
2936 e
= Jim_GetLong(interp
, argv
[4], &l
);
2952 Jim_SetResult(interp
, Jim_NewEmptyStringObj(interp
));
2953 Jim_AppendStrings( interp
, Jim_GetResult(interp
), "Invalid width param, must be 8/16/32", NULL
);
2957 Jim_SetResult(interp
, Jim_NewEmptyStringObj(interp
));
2958 Jim_AppendStrings(interp
, Jim_GetResult(interp
), "array2mem: zero width read?", NULL
);
2961 if ((addr
+ (len
* width
)) < addr
) {
2962 Jim_SetResult(interp
, Jim_NewEmptyStringObj(interp
));
2963 Jim_AppendStrings(interp
, Jim_GetResult(interp
), "array2mem: addr + len - wraps to zero?", NULL
);
2966 /* absurd transfer size? */
2968 Jim_SetResult(interp
, Jim_NewEmptyStringObj(interp
));
2969 Jim_AppendStrings(interp
, Jim_GetResult(interp
), "array2mem: absurd > 64K item request", NULL
);
2974 ((width
== 2) && ((addr
& 1) == 0)) ||
2975 ((width
== 4) && ((addr
& 3) == 0))) {
2979 Jim_SetResult(interp
, Jim_NewEmptyStringObj(interp
));
2980 sprintf(buf
, "array2mem address: 0x%08x is not aligned for %d byte reads", addr
, width
);
2981 Jim_AppendStrings(interp
, Jim_GetResult(interp
), buf
, NULL
);
2985 context
= Jim_GetAssocData(interp
, "context");
2986 if (context
== NULL
)
2988 LOG_ERROR("array2mem: no command context");
2991 target
= get_current_target(context
);
2994 LOG_ERROR("array2mem: no current target");
3005 /* Slurp... in buffer size chunks */
3007 count
= len
; /* in objects.. */
3008 if (count
> (sizeof(buffer
)/width
)) {
3009 count
= (sizeof(buffer
)/width
);
3012 v
= 0; /* shut up gcc */
3013 for (i
= 0 ;i
< count
;i
++, n
++) {
3014 get_int_array_element(interp
, varname
, n
, &v
);
3017 target_buffer_set_u32(target
, &buffer
[i
*width
], v
);
3020 target_buffer_set_u16(target
, &buffer
[i
*width
], v
);
3023 buffer
[i
] = v
& 0x0ff;
3029 retval
= target
->type
->write_memory(target
, addr
, width
, count
, buffer
);
3030 if (retval
!= ERROR_OK
) {
3032 LOG_ERROR("array2mem: Write @ 0x%08x, w=%d, cnt=%d, failed", addr
, width
, count
);
3033 Jim_SetResult(interp
, Jim_NewEmptyStringObj(interp
));
3034 Jim_AppendStrings(interp
, Jim_GetResult(interp
), "mem2array: cannot read memory", NULL
);
3040 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)