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_working_area_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
60 int handle_reg_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
61 int handle_poll_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
62 int handle_halt_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
63 int handle_wait_halt_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
64 int handle_reset_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
65 int handle_soft_reset_halt_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
66 int handle_resume_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
67 int handle_step_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
68 int handle_md_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
69 int handle_mw_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
70 int handle_load_image_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
71 int handle_dump_image_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
72 int handle_verify_image_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
73 int handle_bp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
74 int handle_rbp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
75 int handle_wp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
76 int handle_rwp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
77 int handle_virt2phys_command(command_context_t
*cmd_ctx
, char *cmd
, char **args
, int argc
);
78 int handle_profile_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
79 static int jim_array2mem(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *argv
);
80 static int jim_mem2array(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *argv
);
84 extern target_type_t arm7tdmi_target
;
85 extern target_type_t arm720t_target
;
86 extern target_type_t arm9tdmi_target
;
87 extern target_type_t arm920t_target
;
88 extern target_type_t arm966e_target
;
89 extern target_type_t arm926ejs_target
;
90 extern target_type_t feroceon_target
;
91 extern target_type_t xscale_target
;
92 extern target_type_t cortexm3_target
;
93 extern target_type_t arm11_target
;
94 extern target_type_t mips_m4k_target
;
96 target_type_t
*target_types
[] =
112 target_t
*targets
= NULL
;
113 target_event_callback_t
*target_event_callbacks
= NULL
;
114 target_timer_callback_t
*target_timer_callbacks
= NULL
;
116 char *target_state_strings
[] =
125 char *target_debug_reason_strings
[] =
127 "debug request", "breakpoint", "watchpoint",
128 "watchpoint and breakpoint", "single step",
129 "target not halted", "undefined"
132 char *target_endianess_strings
[] =
138 static int target_continous_poll
= 1;
140 /* read a u32 from a buffer in target memory endianness */
141 u32
target_buffer_get_u32(target_t
*target
, u8
*buffer
)
143 if (target
->endianness
== TARGET_LITTLE_ENDIAN
)
144 return le_to_h_u32(buffer
);
146 return be_to_h_u32(buffer
);
149 /* read a u16 from a buffer in target memory endianness */
150 u16
target_buffer_get_u16(target_t
*target
, u8
*buffer
)
152 if (target
->endianness
== TARGET_LITTLE_ENDIAN
)
153 return le_to_h_u16(buffer
);
155 return be_to_h_u16(buffer
);
158 /* write a u32 to a buffer in target memory endianness */
159 void target_buffer_set_u32(target_t
*target
, u8
*buffer
, u32 value
)
161 if (target
->endianness
== TARGET_LITTLE_ENDIAN
)
162 h_u32_to_le(buffer
, value
);
164 h_u32_to_be(buffer
, value
);
167 /* write a u16 to a buffer in target memory endianness */
168 void target_buffer_set_u16(target_t
*target
, u8
*buffer
, u16 value
)
170 if (target
->endianness
== TARGET_LITTLE_ENDIAN
)
171 h_u16_to_le(buffer
, value
);
173 h_u16_to_be(buffer
, value
);
176 /* returns a pointer to the n-th configured target */
177 target_t
* get_target_by_num(int num
)
179 target_t
*target
= targets
;
186 target
= target
->next
;
193 int get_num_by_target(target_t
*query_target
)
195 target_t
*target
= targets
;
200 if (target
== query_target
)
202 target
= target
->next
;
209 target_t
* get_current_target(command_context_t
*cmd_ctx
)
211 target_t
*target
= get_target_by_num(cmd_ctx
->current_target
);
215 LOG_ERROR("BUG: current_target out of bounds");
223 int target_poll(struct target_s
*target
)
225 /* We can't poll until after examine */
226 if (!target
->type
->examined
)
228 /* Fail silently lest we pollute the log */
231 return target
->type
->poll(target
);
234 int target_halt(struct target_s
*target
)
236 /* We can't poll until after examine */
237 if (!target
->type
->examined
)
239 LOG_ERROR("Target not examined yet");
242 return target
->type
->halt(target
);
245 int target_resume(struct target_s
*target
, int current
, u32 address
, int handle_breakpoints
, int debug_execution
)
249 /* We can't poll until after examine */
250 if (!target
->type
->examined
)
252 LOG_ERROR("Target not examined yet");
256 /* note that resume *must* be asynchronous. The CPU can halt before we poll. The CPU can
257 * even halt at the current PC as a result of a software breakpoint being inserted by (a bug?)
260 if ((retval
= target
->type
->resume(target
, current
, address
, handle_breakpoints
, debug_execution
)) != ERROR_OK
)
266 int target_process_reset(struct command_context_s
*cmd_ctx
, enum target_reset_mode reset_mode
)
268 int retval
= ERROR_OK
;
270 struct timeval timeout
, now
;
275 target_invoke_script(cmd_ctx
, target
, "pre_reset");
276 target
= target
->next
;
279 if ((retval
= jtag_init_reset(cmd_ctx
)) != ERROR_OK
)
282 keep_alive(); /* we might be running on a very slow JTAG clk */
284 /* First time this is executed after launching OpenOCD, it will read out
285 * the type of CPU, etc. and init Embedded ICE registers in host
288 * It will also set up ICE registers in the target.
290 * However, if we assert TRST later, we need to set up the registers again.
292 * For the "reset halt/init" case we must only set up the registers here.
294 if ((retval
= target_examine(cmd_ctx
)) != ERROR_OK
)
297 keep_alive(); /* we might be running on a very slow JTAG clk */
302 /* we have no idea what state the target is in, so we
303 * have to drop working areas
305 target_free_all_working_areas_restore(target
, 0);
306 target
->reset_halt
=((reset_mode
==RESET_HALT
)||(reset_mode
==RESET_INIT
));
307 target
->type
->assert_reset(target
);
308 target
= target
->next
;
310 if ((retval
= jtag_execute_queue()) != ERROR_OK
)
312 LOG_WARNING("JTAG communication failed asserting reset.");
316 /* request target halt if necessary, and schedule further action */
320 if (reset_mode
!=RESET_RUN
)
322 if ((jtag_reset_config
& RESET_SRST_PULLS_TRST
)==0)
325 target
= target
->next
;
328 if ((retval
= jtag_execute_queue()) != ERROR_OK
)
330 LOG_WARNING("JTAG communication failed while reset was asserted. Consider using srst_only for reset_config.");
337 target
->type
->deassert_reset(target
);
338 /* We can fail to bring the target into the halted state */
340 if (target
->reset_halt
&&((target
->state
!= TARGET_HALTED
)))
342 LOG_WARNING("Failed to reset target into halted mode - issuing halt");
343 target
->type
->halt(target
);
346 target
= target
->next
;
349 if ((retval
= jtag_execute_queue()) != ERROR_OK
)
351 LOG_WARNING("JTAG communication failed while deasserting reset.");
355 if (jtag_reset_config
& RESET_SRST_PULLS_TRST
)
357 /* If TRST was asserted we need to set up registers again */
358 if ((retval
= target_examine(cmd_ctx
)) != ERROR_OK
)
362 LOG_DEBUG("Waiting for halted stated as appropriate");
364 if ((reset_mode
== RESET_HALT
) || (reset_mode
== RESET_INIT
))
366 /* Wait for reset to complete, maximum 5 seconds. */
367 if (((retval
=target_wait_state(target
, TARGET_HALTED
, 5000)))==ERROR_OK
)
369 if (reset_mode
== RESET_INIT
)
370 target_invoke_script(cmd_ctx
, target
, "post_reset");
374 /* We want any events to be processed before the prompt */
375 target_call_timer_callbacks_now();
380 static int default_virt2phys(struct target_s
*target
, u32
virtual, u32
*physical
)
386 static int default_mmu(struct target_s
*target
, int *enabled
)
392 static int default_examine(struct command_context_s
*cmd_ctx
, struct target_s
*target
)
394 target
->type
->examined
= 1;
399 /* Targets that correctly implement init+examine, i.e.
400 * no communication with target during init:
404 int target_examine(struct command_context_s
*cmd_ctx
)
406 int retval
= ERROR_OK
;
407 target_t
*target
= targets
;
410 if ((retval
= target
->type
->examine(cmd_ctx
, target
))!=ERROR_OK
)
412 target
= target
->next
;
417 static int target_write_memory_imp(struct target_s
*target
, u32 address
, u32 size
, u32 count
, u8
*buffer
)
419 if (!target
->type
->examined
)
421 LOG_ERROR("Target not examined yet");
424 return target
->type
->write_memory_imp(target
, address
, size
, count
, buffer
);
427 static int target_read_memory_imp(struct target_s
*target
, u32 address
, u32 size
, u32 count
, u8
*buffer
)
429 if (!target
->type
->examined
)
431 LOG_ERROR("Target not examined yet");
434 return target
->type
->read_memory_imp(target
, address
, size
, count
, buffer
);
437 static int target_soft_reset_halt_imp(struct target_s
*target
)
439 if (!target
->type
->examined
)
441 LOG_ERROR("Target not examined yet");
444 return target
->type
->soft_reset_halt_imp(target
);
447 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
)
449 if (!target
->type
->examined
)
451 LOG_ERROR("Target not examined yet");
454 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
);
457 int target_init(struct command_context_s
*cmd_ctx
)
459 target_t
*target
= targets
;
463 target
->type
->examined
= 0;
464 if (target
->type
->examine
== NULL
)
466 target
->type
->examine
= default_examine
;
469 if (target
->type
->init_target(cmd_ctx
, target
) != ERROR_OK
)
471 LOG_ERROR("target '%s' init failed", target
->type
->name
);
475 /* Set up default functions if none are provided by target */
476 if (target
->type
->virt2phys
== NULL
)
478 target
->type
->virt2phys
= default_virt2phys
;
480 target
->type
->virt2phys
= default_virt2phys
;
481 /* a non-invasive way(in terms of patches) to add some code that
482 * runs before the type->write/read_memory implementation
484 target
->type
->write_memory_imp
= target
->type
->write_memory
;
485 target
->type
->write_memory
= target_write_memory_imp
;
486 target
->type
->read_memory_imp
= target
->type
->read_memory
;
487 target
->type
->read_memory
= target_read_memory_imp
;
488 target
->type
->soft_reset_halt_imp
= target
->type
->soft_reset_halt
;
489 target
->type
->soft_reset_halt
= target_soft_reset_halt_imp
;
490 target
->type
->run_algorithm_imp
= target
->type
->run_algorithm
;
491 target
->type
->run_algorithm
= target_run_algorithm_imp
;
494 if (target
->type
->mmu
== NULL
)
496 target
->type
->mmu
= default_mmu
;
498 target
= target
->next
;
503 target_register_user_commands(cmd_ctx
);
504 target_register_timer_callback(handle_target
, 100, 1, NULL
);
510 int target_register_event_callback(int (*callback
)(struct target_s
*target
, enum target_event event
, void *priv
), void *priv
)
512 target_event_callback_t
**callbacks_p
= &target_event_callbacks
;
514 if (callback
== NULL
)
516 return ERROR_INVALID_ARGUMENTS
;
521 while ((*callbacks_p
)->next
)
522 callbacks_p
= &((*callbacks_p
)->next
);
523 callbacks_p
= &((*callbacks_p
)->next
);
526 (*callbacks_p
) = malloc(sizeof(target_event_callback_t
));
527 (*callbacks_p
)->callback
= callback
;
528 (*callbacks_p
)->priv
= priv
;
529 (*callbacks_p
)->next
= NULL
;
534 int target_register_timer_callback(int (*callback
)(void *priv
), int time_ms
, int periodic
, void *priv
)
536 target_timer_callback_t
**callbacks_p
= &target_timer_callbacks
;
539 if (callback
== NULL
)
541 return ERROR_INVALID_ARGUMENTS
;
546 while ((*callbacks_p
)->next
)
547 callbacks_p
= &((*callbacks_p
)->next
);
548 callbacks_p
= &((*callbacks_p
)->next
);
551 (*callbacks_p
) = malloc(sizeof(target_timer_callback_t
));
552 (*callbacks_p
)->callback
= callback
;
553 (*callbacks_p
)->periodic
= periodic
;
554 (*callbacks_p
)->time_ms
= time_ms
;
556 gettimeofday(&now
, NULL
);
557 (*callbacks_p
)->when
.tv_usec
= now
.tv_usec
+ (time_ms
% 1000) * 1000;
558 time_ms
-= (time_ms
% 1000);
559 (*callbacks_p
)->when
.tv_sec
= now
.tv_sec
+ (time_ms
/ 1000);
560 if ((*callbacks_p
)->when
.tv_usec
> 1000000)
562 (*callbacks_p
)->when
.tv_usec
= (*callbacks_p
)->when
.tv_usec
- 1000000;
563 (*callbacks_p
)->when
.tv_sec
+= 1;
566 (*callbacks_p
)->priv
= priv
;
567 (*callbacks_p
)->next
= NULL
;
572 int target_unregister_event_callback(int (*callback
)(struct target_s
*target
, enum target_event event
, void *priv
), void *priv
)
574 target_event_callback_t
**p
= &target_event_callbacks
;
575 target_event_callback_t
*c
= target_event_callbacks
;
577 if (callback
== NULL
)
579 return ERROR_INVALID_ARGUMENTS
;
584 target_event_callback_t
*next
= c
->next
;
585 if ((c
->callback
== callback
) && (c
->priv
== priv
))
599 int target_unregister_timer_callback(int (*callback
)(void *priv
), void *priv
)
601 target_timer_callback_t
**p
= &target_timer_callbacks
;
602 target_timer_callback_t
*c
= target_timer_callbacks
;
604 if (callback
== NULL
)
606 return ERROR_INVALID_ARGUMENTS
;
611 target_timer_callback_t
*next
= c
->next
;
612 if ((c
->callback
== callback
) && (c
->priv
== priv
))
626 int target_call_event_callbacks(target_t
*target
, enum target_event event
)
628 target_event_callback_t
*callback
= target_event_callbacks
;
629 target_event_callback_t
*next_callback
;
631 LOG_DEBUG("target event %i", event
);
635 next_callback
= callback
->next
;
636 callback
->callback(target
, event
, callback
->priv
);
637 callback
= next_callback
;
643 static int target_call_timer_callbacks_check_time(int checktime
)
645 target_timer_callback_t
*callback
= target_timer_callbacks
;
646 target_timer_callback_t
*next_callback
;
651 gettimeofday(&now
, NULL
);
655 next_callback
= callback
->next
;
657 if ((!checktime
&&callback
->periodic
)||
658 (((now
.tv_sec
>= callback
->when
.tv_sec
) && (now
.tv_usec
>= callback
->when
.tv_usec
))
659 || (now
.tv_sec
> callback
->when
.tv_sec
)))
661 if(callback
->callback
!= NULL
)
663 callback
->callback(callback
->priv
);
664 if (callback
->periodic
)
666 int time_ms
= callback
->time_ms
;
667 callback
->when
.tv_usec
= now
.tv_usec
+ (time_ms
% 1000) * 1000;
668 time_ms
-= (time_ms
% 1000);
669 callback
->when
.tv_sec
= now
.tv_sec
+ time_ms
/ 1000;
670 if (callback
->when
.tv_usec
> 1000000)
672 callback
->when
.tv_usec
= callback
->when
.tv_usec
- 1000000;
673 callback
->when
.tv_sec
+= 1;
677 target_unregister_timer_callback(callback
->callback
, callback
->priv
);
681 callback
= next_callback
;
687 int target_call_timer_callbacks()
689 return target_call_timer_callbacks_check_time(1);
692 /* invoke periodic callbacks immediately */
693 int target_call_timer_callbacks_now()
695 return target_call_timer_callbacks(0);
698 int target_alloc_working_area(struct target_s
*target
, u32 size
, working_area_t
**area
)
700 working_area_t
*c
= target
->working_areas
;
701 working_area_t
*new_wa
= NULL
;
703 /* Reevaluate working area address based on MMU state*/
704 if (target
->working_areas
== NULL
)
708 retval
= target
->type
->mmu(target
, &enabled
);
709 if (retval
!= ERROR_OK
)
715 target
->working_area
= target
->working_area_virt
;
719 target
->working_area
= target
->working_area_phys
;
723 /* only allocate multiples of 4 byte */
726 LOG_ERROR("BUG: code tried to allocate unaligned number of bytes, padding");
727 size
= CEIL(size
, 4);
730 /* see if there's already a matching working area */
733 if ((c
->free
) && (c
->size
== size
))
741 /* if not, allocate a new one */
744 working_area_t
**p
= &target
->working_areas
;
745 u32 first_free
= target
->working_area
;
746 u32 free_size
= target
->working_area_size
;
748 LOG_DEBUG("allocating new working area");
750 c
= target
->working_areas
;
753 first_free
+= c
->size
;
754 free_size
-= c
->size
;
759 if (free_size
< size
)
761 LOG_WARNING("not enough working area available(requested %d, free %d)", size
, free_size
);
762 return ERROR_TARGET_RESOURCE_NOT_AVAILABLE
;
765 new_wa
= malloc(sizeof(working_area_t
));
768 new_wa
->address
= first_free
;
770 if (target
->backup_working_area
)
772 new_wa
->backup
= malloc(new_wa
->size
);
773 target
->type
->read_memory(target
, new_wa
->address
, 4, new_wa
->size
/ 4, new_wa
->backup
);
777 new_wa
->backup
= NULL
;
780 /* put new entry in list */
784 /* mark as used, and return the new (reused) area */
794 int target_free_working_area_restore(struct target_s
*target
, working_area_t
*area
, int restore
)
799 if (restore
&&target
->backup_working_area
)
800 target
->type
->write_memory(target
, area
->address
, 4, area
->size
/ 4, area
->backup
);
804 /* mark user pointer invalid */
811 int target_free_working_area(struct target_s
*target
, working_area_t
*area
)
813 return target_free_working_area_restore(target
, area
, 1);
816 int target_free_all_working_areas_restore(struct target_s
*target
, int restore
)
818 working_area_t
*c
= target
->working_areas
;
822 working_area_t
*next
= c
->next
;
823 target_free_working_area_restore(target
, c
, restore
);
833 target
->working_areas
= NULL
;
838 int target_free_all_working_areas(struct target_s
*target
)
840 return target_free_all_working_areas_restore(target
, 1);
843 int target_register_commands(struct command_context_s
*cmd_ctx
)
845 register_command(cmd_ctx
, NULL
, "target", handle_target_command
, COMMAND_CONFIG
, "target <cpu> [reset_init default - DEPRECATED] <chainpos> <endianness> <variant> [cpu type specifc args]");
846 register_command(cmd_ctx
, NULL
, "targets", handle_targets_command
, COMMAND_EXEC
, NULL
);
847 register_command(cmd_ctx
, NULL
, "working_area", handle_working_area_command
, COMMAND_ANY
, "working_area <target#> <address> <size> <'backup'|'nobackup'> [virtual address]");
848 register_command(cmd_ctx
, NULL
, "virt2phys", handle_virt2phys_command
, COMMAND_ANY
, "virt2phys <virtual address>");
849 register_command(cmd_ctx
, NULL
, "profile", handle_profile_command
, COMMAND_EXEC
, "PRELIMINARY! - profile <seconds> <gmon.out>");
852 /* script procedures */
853 register_jim(cmd_ctx
, "ocd_mem2array", jim_mem2array
, "read memory and return as a TCL array for script processing");
854 register_jim(cmd_ctx
, "ocd_array2mem", jim_array2mem
, "convert a TCL array to memory locations and write the values");
858 int target_arch_state(struct target_s
*target
)
863 LOG_USER("No target has been configured");
867 LOG_USER("target state: %s", target_state_strings
[target
->state
]);
869 if (target
->state
!=TARGET_HALTED
)
872 retval
=target
->type
->arch_state(target
);
876 /* Single aligned words are guaranteed to use 16 or 32 bit access
877 * mode respectively, otherwise data is handled as quickly as
880 int target_write_buffer(struct target_s
*target
, u32 address
, u32 size
, u8
*buffer
)
883 LOG_DEBUG("writing buffer of %i byte at 0x%8.8x", size
, address
);
885 if (!target
->type
->examined
)
887 LOG_ERROR("Target not examined yet");
891 if (address
+size
<address
)
893 /* GDB can request this when e.g. PC is 0xfffffffc*/
894 LOG_ERROR("address+size wrapped(0x%08x, 0x%08x)", address
, size
);
898 if (((address
% 2) == 0) && (size
== 2))
900 return target
->type
->write_memory(target
, address
, 2, 1, buffer
);
903 /* handle unaligned head bytes */
906 int unaligned
= 4 - (address
% 4);
908 if (unaligned
> size
)
911 if ((retval
= target
->type
->write_memory(target
, address
, 1, unaligned
, buffer
)) != ERROR_OK
)
915 address
+= unaligned
;
919 /* handle aligned words */
922 int aligned
= size
- (size
% 4);
924 /* use bulk writes above a certain limit. This may have to be changed */
927 if ((retval
= target
->type
->bulk_write_memory(target
, address
, aligned
/ 4, buffer
)) != ERROR_OK
)
932 if ((retval
= target
->type
->write_memory(target
, address
, 4, aligned
/ 4, buffer
)) != ERROR_OK
)
941 /* handle tail writes of less than 4 bytes */
944 if ((retval
= target
->type
->write_memory(target
, address
, 1, size
, buffer
)) != ERROR_OK
)
952 /* Single aligned words are guaranteed to use 16 or 32 bit access
953 * mode respectively, otherwise data is handled as quickly as
956 int target_read_buffer(struct target_s
*target
, u32 address
, u32 size
, u8
*buffer
)
959 LOG_DEBUG("reading buffer of %i byte at 0x%8.8x", size
, address
);
961 if (!target
->type
->examined
)
963 LOG_ERROR("Target not examined yet");
967 if (address
+size
<address
)
969 /* GDB can request this when e.g. PC is 0xfffffffc*/
970 LOG_ERROR("address+size wrapped(0x%08x, 0x%08x)", address
, size
);
974 if (((address
% 2) == 0) && (size
== 2))
976 return target
->type
->read_memory(target
, address
, 2, 1, buffer
);
979 /* handle unaligned head bytes */
982 int unaligned
= 4 - (address
% 4);
984 if (unaligned
> size
)
987 if ((retval
= target
->type
->read_memory(target
, address
, 1, unaligned
, buffer
)) != ERROR_OK
)
991 address
+= unaligned
;
995 /* handle aligned words */
998 int aligned
= size
- (size
% 4);
1000 if ((retval
= target
->type
->read_memory(target
, address
, 4, aligned
/ 4, buffer
)) != ERROR_OK
)
1008 /* handle tail writes of less than 4 bytes */
1011 if ((retval
= target
->type
->read_memory(target
, address
, 1, size
, buffer
)) != ERROR_OK
)
1018 int target_checksum_memory(struct target_s
*target
, u32 address
, u32 size
, u32
* crc
)
1024 if (!target
->type
->examined
)
1026 LOG_ERROR("Target not examined yet");
1030 if ((retval
= target
->type
->checksum_memory(target
, address
,
1031 size
, &checksum
)) == ERROR_TARGET_RESOURCE_NOT_AVAILABLE
)
1033 buffer
= malloc(size
);
1036 LOG_ERROR("error allocating buffer for section (%d bytes)", size
);
1037 return ERROR_INVALID_ARGUMENTS
;
1039 retval
= target_read_buffer(target
, address
, size
, buffer
);
1040 if (retval
!= ERROR_OK
)
1046 /* convert to target endianess */
1047 for (i
= 0; i
< (size
/sizeof(u32
)); i
++)
1050 target_data
= target_buffer_get_u32(target
, &buffer
[i
*sizeof(u32
)]);
1051 target_buffer_set_u32(target
, &buffer
[i
*sizeof(u32
)], target_data
);
1054 retval
= image_calculate_checksum( buffer
, size
, &checksum
);
1063 int target_blank_check_memory(struct target_s
*target
, u32 address
, u32 size
, u32
* blank
)
1066 if (!target
->type
->examined
)
1068 LOG_ERROR("Target not examined yet");
1072 if (target
->type
->blank_check_memory
== 0)
1073 return ERROR_TARGET_RESOURCE_NOT_AVAILABLE
;
1075 retval
= target
->type
->blank_check_memory(target
, address
, size
, blank
);
1080 int target_read_u32(struct target_s
*target
, u32 address
, u32
*value
)
1083 if (!target
->type
->examined
)
1085 LOG_ERROR("Target not examined yet");
1089 int retval
= target
->type
->read_memory(target
, address
, 4, 1, value_buf
);
1091 if (retval
== ERROR_OK
)
1093 *value
= target_buffer_get_u32(target
, value_buf
);
1094 LOG_DEBUG("address: 0x%8.8x, value: 0x%8.8x", address
, *value
);
1099 LOG_DEBUG("address: 0x%8.8x failed", address
);
1105 int target_read_u16(struct target_s
*target
, u32 address
, u16
*value
)
1108 if (!target
->type
->examined
)
1110 LOG_ERROR("Target not examined yet");
1114 int retval
= target
->type
->read_memory(target
, address
, 2, 1, value_buf
);
1116 if (retval
== ERROR_OK
)
1118 *value
= target_buffer_get_u16(target
, value_buf
);
1119 LOG_DEBUG("address: 0x%8.8x, value: 0x%4.4x", address
, *value
);
1124 LOG_DEBUG("address: 0x%8.8x failed", address
);
1130 int target_read_u8(struct target_s
*target
, u32 address
, u8
*value
)
1132 int retval
= target
->type
->read_memory(target
, address
, 1, 1, value
);
1133 if (!target
->type
->examined
)
1135 LOG_ERROR("Target not examined yet");
1139 if (retval
== ERROR_OK
)
1141 LOG_DEBUG("address: 0x%8.8x, value: 0x%2.2x", address
, *value
);
1146 LOG_DEBUG("address: 0x%8.8x failed", address
);
1152 int target_write_u32(struct target_s
*target
, u32 address
, u32 value
)
1156 if (!target
->type
->examined
)
1158 LOG_ERROR("Target not examined yet");
1162 LOG_DEBUG("address: 0x%8.8x, value: 0x%8.8x", address
, value
);
1164 target_buffer_set_u32(target
, value_buf
, value
);
1165 if ((retval
= target
->type
->write_memory(target
, address
, 4, 1, value_buf
)) != ERROR_OK
)
1167 LOG_DEBUG("failed: %i", retval
);
1173 int target_write_u16(struct target_s
*target
, u32 address
, u16 value
)
1177 if (!target
->type
->examined
)
1179 LOG_ERROR("Target not examined yet");
1183 LOG_DEBUG("address: 0x%8.8x, value: 0x%8.8x", address
, value
);
1185 target_buffer_set_u16(target
, value_buf
, value
);
1186 if ((retval
= target
->type
->write_memory(target
, address
, 2, 1, value_buf
)) != ERROR_OK
)
1188 LOG_DEBUG("failed: %i", retval
);
1194 int target_write_u8(struct target_s
*target
, u32 address
, u8 value
)
1197 if (!target
->type
->examined
)
1199 LOG_ERROR("Target not examined yet");
1203 LOG_DEBUG("address: 0x%8.8x, value: 0x%2.2x", address
, value
);
1205 if ((retval
= target
->type
->read_memory(target
, address
, 1, 1, &value
)) != ERROR_OK
)
1207 LOG_DEBUG("failed: %i", retval
);
1213 int target_register_user_commands(struct command_context_s
*cmd_ctx
)
1215 register_command(cmd_ctx
, NULL
, "reg", handle_reg_command
, COMMAND_EXEC
, NULL
);
1216 register_command(cmd_ctx
, NULL
, "poll", handle_poll_command
, COMMAND_EXEC
, "poll target state");
1217 register_command(cmd_ctx
, NULL
, "wait_halt", handle_wait_halt_command
, COMMAND_EXEC
, "wait for target halt [time (s)]");
1218 register_command(cmd_ctx
, NULL
, "halt", handle_halt_command
, COMMAND_EXEC
, "halt target");
1219 register_command(cmd_ctx
, NULL
, "resume", handle_resume_command
, COMMAND_EXEC
, "resume target [addr]");
1220 register_command(cmd_ctx
, NULL
, "step", handle_step_command
, COMMAND_EXEC
, "step one instruction from current PC or [addr]");
1221 register_command(cmd_ctx
, NULL
, "reset", handle_reset_command
, COMMAND_EXEC
, "reset target [run|halt|init]");
1222 register_command(cmd_ctx
, NULL
, "soft_reset_halt", handle_soft_reset_halt_command
, COMMAND_EXEC
, "halt the target and do a soft reset");
1224 register_command(cmd_ctx
, NULL
, "mdw", handle_md_command
, COMMAND_EXEC
, "display memory words <addr> [count]");
1225 register_command(cmd_ctx
, NULL
, "mdh", handle_md_command
, COMMAND_EXEC
, "display memory half-words <addr> [count]");
1226 register_command(cmd_ctx
, NULL
, "mdb", handle_md_command
, COMMAND_EXEC
, "display memory bytes <addr> [count]");
1228 register_command(cmd_ctx
, NULL
, "mww", handle_mw_command
, COMMAND_EXEC
, "write memory word <addr> <value> [count]");
1229 register_command(cmd_ctx
, NULL
, "mwh", handle_mw_command
, COMMAND_EXEC
, "write memory half-word <addr> <value> [count]");
1230 register_command(cmd_ctx
, NULL
, "mwb", handle_mw_command
, COMMAND_EXEC
, "write memory byte <addr> <value> [count]");
1232 register_command(cmd_ctx
, NULL
, "bp", handle_bp_command
, COMMAND_EXEC
, "set breakpoint <address> <length> [hw]");
1233 register_command(cmd_ctx
, NULL
, "rbp", handle_rbp_command
, COMMAND_EXEC
, "remove breakpoint <adress>");
1234 register_command(cmd_ctx
, NULL
, "wp", handle_wp_command
, COMMAND_EXEC
, "set watchpoint <address> <length> <r/w/a> [value] [mask]");
1235 register_command(cmd_ctx
, NULL
, "rwp", handle_rwp_command
, COMMAND_EXEC
, "remove watchpoint <adress>");
1237 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]");
1238 register_command(cmd_ctx
, NULL
, "dump_image", handle_dump_image_command
, COMMAND_EXEC
, "dump_image <file> <address> <size>");
1239 register_command(cmd_ctx
, NULL
, "verify_image", handle_verify_image_command
, COMMAND_EXEC
, "verify_image <file> [offset] [type]");
1241 target_request_register_commands(cmd_ctx
);
1242 trace_register_commands(cmd_ctx
);
1247 int handle_targets_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1249 target_t
*target
= targets
;
1254 int num
= strtoul(args
[0], NULL
, 0);
1259 target
= target
->next
;
1263 cmd_ctx
->current_target
= num
;
1265 command_print(cmd_ctx
, "%i is out of bounds, only %i targets are configured", num
, count
);
1272 command_print(cmd_ctx
, "%i: %s (%s), state: %s", count
++, target
->type
->name
, target_endianess_strings
[target
->endianness
], target_state_strings
[target
->state
]);
1273 target
= target
->next
;
1279 int handle_target_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1286 return ERROR_COMMAND_SYNTAX_ERROR
;
1289 /* search for the specified target */
1290 if (args
[0] && (args
[0][0] != 0))
1292 for (i
= 0; target_types
[i
]; i
++)
1294 if (strcmp(args
[0], target_types
[i
]->name
) == 0)
1296 target_t
**last_target_p
= &targets
;
1298 /* register target specific commands */
1299 if (target_types
[i
]->register_commands(cmd_ctx
) != ERROR_OK
)
1301 LOG_ERROR("couldn't register '%s' commands", args
[0]);
1307 while ((*last_target_p
)->next
)
1308 last_target_p
= &((*last_target_p
)->next
);
1309 last_target_p
= &((*last_target_p
)->next
);
1312 *last_target_p
= malloc(sizeof(target_t
));
1314 /* allocate memory for each unique target type */
1315 (*last_target_p
)->type
= (target_type_t
*)malloc(sizeof(target_type_t
));
1316 *((*last_target_p
)->type
) = *target_types
[i
];
1318 if (strcmp(args
[1], "big") == 0)
1319 (*last_target_p
)->endianness
= TARGET_BIG_ENDIAN
;
1320 else if (strcmp(args
[1], "little") == 0)
1321 (*last_target_p
)->endianness
= TARGET_LITTLE_ENDIAN
;
1324 LOG_ERROR("endianness must be either 'little' or 'big', not '%s'", args
[1]);
1325 return ERROR_COMMAND_SYNTAX_ERROR
;
1328 if (strcmp(args
[2], "reset_halt") == 0)
1330 LOG_WARNING("reset_mode argument is obsolete.");
1331 return ERROR_COMMAND_SYNTAX_ERROR
;
1333 else if (strcmp(args
[2], "reset_run") == 0)
1335 LOG_WARNING("reset_mode argument is obsolete.");
1336 return ERROR_COMMAND_SYNTAX_ERROR
;
1338 else if (strcmp(args
[2], "reset_init") == 0)
1340 LOG_WARNING("reset_mode argument is obsolete.");
1341 return ERROR_COMMAND_SYNTAX_ERROR
;
1343 else if (strcmp(args
[2], "run_and_halt") == 0)
1345 LOG_WARNING("reset_mode argument is obsolete.");
1346 return ERROR_COMMAND_SYNTAX_ERROR
;
1348 else if (strcmp(args
[2], "run_and_init") == 0)
1350 LOG_WARNING("reset_mode argument is obsolete.");
1351 return ERROR_COMMAND_SYNTAX_ERROR
;
1355 /* Kludge! we want to make this reset arg optional while remaining compatible! */
1360 (*last_target_p
)->working_area
= 0x0;
1361 (*last_target_p
)->working_area_size
= 0x0;
1362 (*last_target_p
)->working_areas
= NULL
;
1363 (*last_target_p
)->backup_working_area
= 0;
1365 (*last_target_p
)->state
= TARGET_UNKNOWN
;
1366 (*last_target_p
)->debug_reason
= DBG_REASON_UNDEFINED
;
1367 (*last_target_p
)->reg_cache
= NULL
;
1368 (*last_target_p
)->breakpoints
= NULL
;
1369 (*last_target_p
)->watchpoints
= NULL
;
1370 (*last_target_p
)->next
= NULL
;
1371 (*last_target_p
)->arch_info
= NULL
;
1373 /* initialize trace information */
1374 (*last_target_p
)->trace_info
= malloc(sizeof(trace_t
));
1375 (*last_target_p
)->trace_info
->num_trace_points
= 0;
1376 (*last_target_p
)->trace_info
->trace_points_size
= 0;
1377 (*last_target_p
)->trace_info
->trace_points
= NULL
;
1378 (*last_target_p
)->trace_info
->trace_history_size
= 0;
1379 (*last_target_p
)->trace_info
->trace_history
= NULL
;
1380 (*last_target_p
)->trace_info
->trace_history_pos
= 0;
1381 (*last_target_p
)->trace_info
->trace_history_overflowed
= 0;
1383 (*last_target_p
)->dbgmsg
= NULL
;
1384 (*last_target_p
)->dbg_msg_enabled
= 0;
1386 (*last_target_p
)->type
->target_command(cmd_ctx
, cmd
, args
, argc
, *last_target_p
);
1394 /* no matching target found */
1397 LOG_ERROR("target '%s' not found", args
[0]);
1398 return ERROR_COMMAND_SYNTAX_ERROR
;
1404 int target_invoke_script(struct command_context_s
*cmd_ctx
, target_t
*target
, char *name
)
1406 return command_run_linef(cmd_ctx
, " if {[catch {info body target_%d_%s} t]==0} {target_%d_%s}",
1407 get_num_by_target(target
), name
,
1408 get_num_by_target(target
), name
);
1411 int handle_working_area_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1413 target_t
*target
= NULL
;
1415 if ((argc
< 4) || (argc
> 5))
1417 return ERROR_COMMAND_SYNTAX_ERROR
;
1420 target
= get_target_by_num(strtoul(args
[0], NULL
, 0));
1423 return ERROR_COMMAND_SYNTAX_ERROR
;
1425 target_free_all_working_areas(target
);
1427 target
->working_area_phys
= target
->working_area_virt
= strtoul(args
[1], NULL
, 0);
1430 target
->working_area_virt
= strtoul(args
[4], NULL
, 0);
1432 target
->working_area_size
= strtoul(args
[2], NULL
, 0);
1434 if (strcmp(args
[3], "backup") == 0)
1436 target
->backup_working_area
= 1;
1438 else if (strcmp(args
[3], "nobackup") == 0)
1440 target
->backup_working_area
= 0;
1444 LOG_ERROR("unrecognized <backup|nobackup> argument (%s)", args
[3]);
1445 return ERROR_COMMAND_SYNTAX_ERROR
;
1452 /* process target state changes */
1453 int handle_target(void *priv
)
1455 target_t
*target
= targets
;
1459 if (target_continous_poll
)
1461 /* polling may fail silently until the target has been examined */
1462 target_poll(target
);
1465 target
= target
->next
;
1471 int handle_reg_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1480 target
= get_current_target(cmd_ctx
);
1482 /* list all available registers for the current target */
1485 reg_cache_t
*cache
= target
->reg_cache
;
1491 for (i
= 0; i
< cache
->num_regs
; i
++)
1493 value
= buf_to_str(cache
->reg_list
[i
].value
, cache
->reg_list
[i
].size
, 16);
1494 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
);
1497 cache
= cache
->next
;
1503 /* access a single register by its ordinal number */
1504 if ((args
[0][0] >= '0') && (args
[0][0] <= '9'))
1506 int num
= strtoul(args
[0], NULL
, 0);
1507 reg_cache_t
*cache
= target
->reg_cache
;
1513 for (i
= 0; i
< cache
->num_regs
; i
++)
1517 reg
= &cache
->reg_list
[i
];
1523 cache
= cache
->next
;
1528 command_print(cmd_ctx
, "%i is out of bounds, the current target has only %i registers (0 - %i)", num
, count
, count
- 1);
1531 } else /* access a single register by its name */
1533 reg
= register_get_by_name(target
->reg_cache
, args
[0], 1);
1537 command_print(cmd_ctx
, "register %s not found in current target", args
[0]);
1542 /* display a register */
1543 if ((argc
== 1) || ((argc
== 2) && !((args
[1][0] >= '0') && (args
[1][0] <= '9'))))
1545 if ((argc
== 2) && (strcmp(args
[1], "force") == 0))
1548 if (reg
->valid
== 0)
1550 reg_arch_type_t
*arch_type
= register_get_arch_type(reg
->arch_type
);
1551 if (arch_type
== NULL
)
1553 LOG_ERROR("BUG: encountered unregistered arch type");
1556 arch_type
->get(reg
);
1558 value
= buf_to_str(reg
->value
, reg
->size
, 16);
1559 command_print(cmd_ctx
, "%s (/%i): 0x%s", reg
->name
, reg
->size
, value
);
1564 /* set register value */
1567 u8
*buf
= malloc(CEIL(reg
->size
, 8));
1568 str_to_buf(args
[1], strlen(args
[1]), buf
, reg
->size
, 0);
1570 reg_arch_type_t
*arch_type
= register_get_arch_type(reg
->arch_type
);
1571 if (arch_type
== NULL
)
1573 LOG_ERROR("BUG: encountered unregistered arch type");
1577 arch_type
->set(reg
, buf
);
1579 value
= buf_to_str(reg
->value
, reg
->size
, 16);
1580 command_print(cmd_ctx
, "%s (/%i): 0x%s", reg
->name
, reg
->size
, value
);
1588 command_print(cmd_ctx
, "usage: reg <#|name> [value]");
1594 int handle_poll_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1596 target_t
*target
= get_current_target(cmd_ctx
);
1600 target_poll(target
);
1601 target_arch_state(target
);
1605 if (strcmp(args
[0], "on") == 0)
1607 target_continous_poll
= 1;
1609 else if (strcmp(args
[0], "off") == 0)
1611 target_continous_poll
= 0;
1615 command_print(cmd_ctx
, "arg is \"on\" or \"off\"");
1623 int handle_wait_halt_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1631 ms
= strtoul(args
[0], &end
, 0) * 1000;
1634 command_print(cmd_ctx
, "usage: %s [seconds]", cmd
);
1638 target_t
*target
= get_current_target(cmd_ctx
);
1640 return target_wait_state(target
, TARGET_HALTED
, ms
);
1643 int target_wait_state(target_t
*target
, enum target_state state
, int ms
)
1646 struct timeval timeout
, now
;
1648 gettimeofday(&timeout
, NULL
);
1649 timeval_add_time(&timeout
, 0, ms
* 1000);
1653 if ((retval
=target_poll(target
))!=ERROR_OK
)
1655 target_call_timer_callbacks_now();
1656 if (target
->state
== state
)
1663 LOG_USER("waiting for target %s...", target_state_strings
[state
]);
1666 gettimeofday(&now
, NULL
);
1667 if ((now
.tv_sec
> timeout
.tv_sec
) || ((now
.tv_sec
== timeout
.tv_sec
) && (now
.tv_usec
>= timeout
.tv_usec
)))
1669 LOG_ERROR("timed out while waiting for target %s", target_state_strings
[state
]);
1677 int handle_halt_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1680 target_t
*target
= get_current_target(cmd_ctx
);
1684 if ((retval
= target_halt(target
)) != ERROR_OK
)
1689 return handle_wait_halt_command(cmd_ctx
, cmd
, args
, argc
);
1692 int handle_soft_reset_halt_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1694 target_t
*target
= get_current_target(cmd_ctx
);
1696 LOG_USER("requesting target halt and executing a soft reset");
1698 target
->type
->soft_reset_halt(target
);
1703 int handle_reset_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1705 target_t
*target
= get_current_target(cmd_ctx
);
1706 enum target_reset_mode reset_mode
= RESET_RUN
;
1710 if (strcmp("run", args
[0]) == 0)
1711 reset_mode
= RESET_RUN
;
1712 else if (strcmp("halt", args
[0]) == 0)
1713 reset_mode
= RESET_HALT
;
1714 else if (strcmp("init", args
[0]) == 0)
1715 reset_mode
= RESET_INIT
;
1718 return ERROR_COMMAND_SYNTAX_ERROR
;
1722 /* reset *all* targets */
1723 target_process_reset(cmd_ctx
, reset_mode
);
1728 int handle_resume_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1731 target_t
*target
= get_current_target(cmd_ctx
);
1733 target_invoke_script(cmd_ctx
, target
, "pre_resume");
1736 retval
= target_resume(target
, 1, 0, 1, 0); /* current pc, addr = 0, handle breakpoints, not debugging */
1738 retval
= target_resume(target
, 0, strtoul(args
[0], NULL
, 0), 1, 0); /* addr = args[0], handle breakpoints, not debugging */
1741 return ERROR_COMMAND_SYNTAX_ERROR
;
1747 int handle_step_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1749 target_t
*target
= get_current_target(cmd_ctx
);
1754 target
->type
->step(target
, 1, 0, 1); /* current pc, addr = 0, handle breakpoints */
1757 target
->type
->step(target
, 0, strtoul(args
[0], NULL
, 0), 1); /* addr = args[0], handle breakpoints */
1762 int handle_md_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1764 const int line_bytecnt
= 32;
1777 target_t
*target
= get_current_target(cmd_ctx
);
1783 count
= strtoul(args
[1], NULL
, 0);
1785 address
= strtoul(args
[0], NULL
, 0);
1791 size
= 4; line_modulo
= line_bytecnt
/ 4;
1794 size
= 2; line_modulo
= line_bytecnt
/ 2;
1797 size
= 1; line_modulo
= line_bytecnt
/ 1;
1803 buffer
= calloc(count
, size
);
1804 retval
= target
->type
->read_memory(target
, address
, size
, count
, buffer
);
1805 if (retval
== ERROR_OK
)
1809 for (i
= 0; i
< count
; i
++)
1811 if (i
%line_modulo
== 0)
1812 output_len
+= snprintf(output
+ output_len
, 128 - output_len
, "0x%8.8x: ", address
+ (i
*size
));
1817 output_len
+= snprintf(output
+ output_len
, 128 - output_len
, "%8.8x ", target_buffer_get_u32(target
, &buffer
[i
*4]));
1820 output_len
+= snprintf(output
+ output_len
, 128 - output_len
, "%4.4x ", target_buffer_get_u16(target
, &buffer
[i
*2]));
1823 output_len
+= snprintf(output
+ output_len
, 128 - output_len
, "%2.2x ", buffer
[i
*1]);
1827 if ((i
%line_modulo
== line_modulo
-1) || (i
== count
- 1))
1829 command_print(cmd_ctx
, output
);
1840 int handle_mw_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1847 target_t
*target
= get_current_target(cmd_ctx
);
1850 if ((argc
< 2) || (argc
> 3))
1851 return ERROR_COMMAND_SYNTAX_ERROR
;
1853 address
= strtoul(args
[0], NULL
, 0);
1854 value
= strtoul(args
[1], NULL
, 0);
1856 count
= strtoul(args
[2], NULL
, 0);
1862 target_buffer_set_u32(target
, value_buf
, value
);
1866 target_buffer_set_u16(target
, value_buf
, value
);
1870 value_buf
[0] = value
;
1873 return ERROR_COMMAND_SYNTAX_ERROR
;
1875 for (i
=0; i
<count
; i
++)
1881 retval
= target
->type
->write_memory(target
, address
+ i
*wordsize
, 4, 1, value_buf
);
1884 retval
= target
->type
->write_memory(target
, address
+ i
*wordsize
, 2, 1, value_buf
);
1887 retval
= target
->type
->write_memory(target
, address
+ i
*wordsize
, 1, 1, value_buf
);
1892 if (retval
!=ERROR_OK
)
1902 int handle_load_image_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1908 u32 max_address
=0xffffffff;
1914 duration_t duration
;
1915 char *duration_text
;
1917 target_t
*target
= get_current_target(cmd_ctx
);
1919 if ((argc
< 1)||(argc
> 5))
1921 return ERROR_COMMAND_SYNTAX_ERROR
;
1924 /* a base address isn't always necessary, default to 0x0 (i.e. don't relocate) */
1927 image
.base_address_set
= 1;
1928 image
.base_address
= strtoul(args
[1], NULL
, 0);
1932 image
.base_address_set
= 0;
1936 image
.start_address_set
= 0;
1940 min_address
=strtoul(args
[3], NULL
, 0);
1944 max_address
=strtoul(args
[4], NULL
, 0)+min_address
;
1947 if (min_address
>max_address
)
1949 return ERROR_COMMAND_SYNTAX_ERROR
;
1953 duration_start_measure(&duration
);
1955 if (image_open(&image
, args
[0], (argc
>= 3) ? args
[2] : NULL
) != ERROR_OK
)
1962 for (i
= 0; i
< image
.num_sections
; i
++)
1964 buffer
= malloc(image
.sections
[i
].size
);
1967 command_print(cmd_ctx
, "error allocating buffer for section (%d bytes)", image
.sections
[i
].size
);
1971 if ((retval
= image_read_section(&image
, i
, 0x0, image
.sections
[i
].size
, buffer
, &buf_cnt
)) != ERROR_OK
)
1981 /* DANGER!!! beware of unsigned comparision here!!! */
1983 if ((image
.sections
[i
].base_address
+buf_cnt
>=min_address
)&&
1984 (image
.sections
[i
].base_address
<max_address
))
1986 if (image
.sections
[i
].base_address
<min_address
)
1988 /* clip addresses below */
1989 offset
+=min_address
-image
.sections
[i
].base_address
;
1993 if (image
.sections
[i
].base_address
+buf_cnt
>max_address
)
1995 length
-=(image
.sections
[i
].base_address
+buf_cnt
)-max_address
;
1998 if ((retval
= target_write_buffer(target
, image
.sections
[i
].base_address
+offset
, length
, buffer
+offset
)) != ERROR_OK
)
2003 image_size
+= length
;
2004 command_print(cmd_ctx
, "%u byte written at address 0x%8.8x", length
, image
.sections
[i
].base_address
+offset
);
2010 duration_stop_measure(&duration
, &duration_text
);
2011 if (retval
==ERROR_OK
)
2013 command_print(cmd_ctx
, "downloaded %u byte in %s", image_size
, duration_text
);
2015 free(duration_text
);
2017 image_close(&image
);
2023 int handle_dump_image_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2030 int retval
=ERROR_OK
;
2032 duration_t duration
;
2033 char *duration_text
;
2035 target_t
*target
= get_current_target(cmd_ctx
);
2039 command_print(cmd_ctx
, "usage: dump_image <filename> <address> <size>");
2043 address
= strtoul(args
[1], NULL
, 0);
2044 size
= strtoul(args
[2], NULL
, 0);
2046 if ((address
& 3) || (size
& 3))
2048 command_print(cmd_ctx
, "only 32-bit aligned address and size are supported");
2052 if (fileio_open(&fileio
, args
[0], FILEIO_WRITE
, FILEIO_BINARY
) != ERROR_OK
)
2057 duration_start_measure(&duration
);
2062 u32 this_run_size
= (size
> 560) ? 560 : size
;
2064 retval
= target
->type
->read_memory(target
, address
, 4, this_run_size
/ 4, buffer
);
2065 if (retval
!= ERROR_OK
)
2070 retval
= fileio_write(&fileio
, this_run_size
, buffer
, &size_written
);
2071 if (retval
!= ERROR_OK
)
2076 size
-= this_run_size
;
2077 address
+= this_run_size
;
2080 fileio_close(&fileio
);
2082 duration_stop_measure(&duration
, &duration_text
);
2083 if (retval
==ERROR_OK
)
2085 command_print(cmd_ctx
, "dumped %"PRIi64
" byte in %s", fileio
.size
, duration_text
);
2087 free(duration_text
);
2092 int handle_verify_image_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2100 u32 mem_checksum
= 0;
2104 duration_t duration
;
2105 char *duration_text
;
2107 target_t
*target
= get_current_target(cmd_ctx
);
2111 return ERROR_COMMAND_SYNTAX_ERROR
;
2116 LOG_ERROR("no target selected");
2120 duration_start_measure(&duration
);
2124 image
.base_address_set
= 1;
2125 image
.base_address
= strtoul(args
[1], NULL
, 0);
2129 image
.base_address_set
= 0;
2130 image
.base_address
= 0x0;
2133 image
.start_address_set
= 0;
2135 if ((retval
=image_open(&image
, args
[0], (argc
== 3) ? args
[2] : NULL
)) != ERROR_OK
)
2142 for (i
= 0; i
< image
.num_sections
; i
++)
2144 buffer
= malloc(image
.sections
[i
].size
);
2147 command_print(cmd_ctx
, "error allocating buffer for section (%d bytes)", image
.sections
[i
].size
);
2150 if ((retval
= image_read_section(&image
, i
, 0x0, image
.sections
[i
].size
, buffer
, &buf_cnt
)) != ERROR_OK
)
2156 /* calculate checksum of image */
2157 image_calculate_checksum( buffer
, buf_cnt
, &checksum
);
2159 retval
= target_checksum_memory(target
, image
.sections
[i
].base_address
, buf_cnt
, &mem_checksum
);
2160 if( retval
!= ERROR_OK
)
2166 if( checksum
!= mem_checksum
)
2168 /* failed crc checksum, fall back to a binary compare */
2171 command_print(cmd_ctx
, "checksum mismatch - attempting binary compare");
2173 data
= (u8
*)malloc(buf_cnt
);
2175 /* Can we use 32bit word accesses? */
2177 int count
= buf_cnt
;
2178 if ((count
% 4) == 0)
2183 retval
= target
->type
->read_memory(target
, image
.sections
[i
].base_address
, size
, count
, data
);
2184 if (retval
== ERROR_OK
)
2187 for (t
= 0; t
< buf_cnt
; t
++)
2189 if (data
[t
] != buffer
[t
])
2191 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
]);
2204 image_size
+= buf_cnt
;
2207 duration_stop_measure(&duration
, &duration_text
);
2208 if (retval
==ERROR_OK
)
2210 command_print(cmd_ctx
, "verified %u bytes in %s", image_size
, duration_text
);
2212 free(duration_text
);
2214 image_close(&image
);
2219 int handle_bp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2222 target_t
*target
= get_current_target(cmd_ctx
);
2226 breakpoint_t
*breakpoint
= target
->breakpoints
;
2230 if (breakpoint
->type
== BKPT_SOFT
)
2232 char* buf
= buf_to_str(breakpoint
->orig_instr
, breakpoint
->length
, 16);
2233 command_print(cmd_ctx
, "0x%8.8x, 0x%x, %i, 0x%s", breakpoint
->address
, breakpoint
->length
, breakpoint
->set
, buf
);
2238 command_print(cmd_ctx
, "0x%8.8x, 0x%x, %i", breakpoint
->address
, breakpoint
->length
, breakpoint
->set
);
2240 breakpoint
= breakpoint
->next
;
2248 length
= strtoul(args
[1], NULL
, 0);
2251 if (strcmp(args
[2], "hw") == 0)
2254 if ((retval
= breakpoint_add(target
, strtoul(args
[0], NULL
, 0), length
, hw
)) != ERROR_OK
)
2256 LOG_ERROR("Failure setting breakpoints");
2260 command_print(cmd_ctx
, "breakpoint added at address 0x%8.8x", strtoul(args
[0], NULL
, 0));
2265 command_print(cmd_ctx
, "usage: bp <address> <length> ['hw']");
2271 int handle_rbp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2273 target_t
*target
= get_current_target(cmd_ctx
);
2276 breakpoint_remove(target
, strtoul(args
[0], NULL
, 0));
2281 int handle_wp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2283 target_t
*target
= get_current_target(cmd_ctx
);
2288 watchpoint_t
*watchpoint
= target
->watchpoints
;
2292 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
);
2293 watchpoint
= watchpoint
->next
;
2298 enum watchpoint_rw type
= WPT_ACCESS
;
2299 u32 data_value
= 0x0;
2300 u32 data_mask
= 0xffffffff;
2316 command_print(cmd_ctx
, "usage: wp <address> <length> [r/w/a] [value] [mask]");
2322 data_value
= strtoul(args
[3], NULL
, 0);
2326 data_mask
= strtoul(args
[4], NULL
, 0);
2329 if ((retval
= watchpoint_add(target
, strtoul(args
[0], NULL
, 0),
2330 strtoul(args
[1], NULL
, 0), type
, data_value
, data_mask
)) != ERROR_OK
)
2332 LOG_ERROR("Failure setting breakpoints");
2337 command_print(cmd_ctx
, "usage: wp <address> <length> [r/w/a] [value] [mask]");
2343 int handle_rwp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2345 target_t
*target
= get_current_target(cmd_ctx
);
2348 watchpoint_remove(target
, strtoul(args
[0], NULL
, 0));
2353 int handle_virt2phys_command(command_context_t
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2356 target_t
*target
= get_current_target(cmd_ctx
);
2362 return ERROR_COMMAND_SYNTAX_ERROR
;
2364 va
= strtoul(args
[0], NULL
, 0);
2366 retval
= target
->type
->virt2phys(target
, va
, &pa
);
2367 if (retval
== ERROR_OK
)
2369 command_print(cmd_ctx
, "Physical address 0x%08x", pa
);
2373 /* lower levels will have logged a detailed error which is
2374 * forwarded to telnet/GDB session.
2379 static void writeLong(FILE *f
, int l
)
2384 char c
=(l
>>(i
*8))&0xff;
2385 fwrite(&c
, 1, 1, f
);
2389 static void writeString(FILE *f
, char *s
)
2391 fwrite(s
, 1, strlen(s
), f
);
2396 // Dump a gmon.out histogram file.
2397 static void writeGmon(u32
*samples
, int sampleNum
, char *filename
)
2400 FILE *f
=fopen(filename
, "w");
2403 fwrite("gmon", 1, 4, f
);
2404 writeLong(f
, 0x00000001); // Version
2405 writeLong(f
, 0); // padding
2406 writeLong(f
, 0); // padding
2407 writeLong(f
, 0); // padding
2409 fwrite("", 1, 1, f
); // GMON_TAG_TIME_HIST
2411 // figure out bucket size
2414 for (i
=0; i
<sampleNum
; i
++)
2426 int addressSpace
=(max
-min
+1);
2428 static int const maxBuckets
=256*1024; // maximum buckets.
2429 int length
=addressSpace
;
2430 if (length
> maxBuckets
)
2434 int *buckets
=malloc(sizeof(int)*length
);
2440 memset(buckets
, 0, sizeof(int)*length
);
2441 for (i
=0; i
<sampleNum
;i
++)
2443 u32 address
=samples
[i
];
2444 long long a
=address
-min
;
2445 long long b
=length
-1;
2446 long long c
=addressSpace
-1;
2447 int index
=(a
*b
)/c
; // danger!!!! int32 overflows
2451 // append binary memory gmon.out &profile_hist_hdr ((char*)&profile_hist_hdr + sizeof(struct gmon_hist_hdr))
2452 writeLong(f
, min
); // low_pc
2453 writeLong(f
, max
); // high_pc
2454 writeLong(f
, length
); // # of samples
2455 writeLong(f
, 64000000); // 64MHz
2456 writeString(f
, "seconds");
2457 for (i
=0; i
<(15-strlen("seconds")); i
++)
2459 fwrite("", 1, 1, f
); // padding
2461 writeString(f
, "s");
2463 // append binary memory gmon.out profile_hist_data (profile_hist_data + profile_hist_hdr.hist_size)
2465 char *data
=malloc(2*length
);
2468 for (i
=0; i
<length
;i
++)
2477 data
[i
*2+1]=(val
>>8)&0xff;
2480 fwrite(data
, 1, length
*2, f
);
2490 /* profiling samples the CPU PC as quickly as OpenOCD is able, which will be used as a random sampling of PC */
2491 int handle_profile_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2493 target_t
*target
= get_current_target(cmd_ctx
);
2494 struct timeval timeout
, now
;
2496 gettimeofday(&timeout
, NULL
);
2499 return ERROR_COMMAND_SYNTAX_ERROR
;
2502 timeval_add_time(&timeout
, strtoul(args
[0], &end
, 0), 0);
2508 command_print(cmd_ctx
, "Starting profiling. Halting and resuming the target as often as we can...");
2510 static const int maxSample
=10000;
2511 u32
*samples
=malloc(sizeof(u32
)*maxSample
);
2516 int retval
=ERROR_OK
;
2517 // hopefully it is safe to cache! We want to stop/restart as quickly as possible.
2518 reg_t
*reg
= register_get_by_name(target
->reg_cache
, "pc", 1);
2522 target_poll(target
);
2523 if (target
->state
== TARGET_HALTED
)
2525 u32 t
=*((u32
*)reg
->value
);
2526 samples
[numSamples
++]=t
;
2527 retval
= target_resume(target
, 1, 0, 0, 0); /* current pc, addr = 0, do not handle breakpoints, not debugging */
2528 target_poll(target
);
2529 usleep(10*1000); // sleep 10ms, i.e. <100 samples/second.
2530 } else if (target
->state
== TARGET_RUNNING
)
2532 // We want to quickly sample the PC.
2533 target_halt(target
);
2536 command_print(cmd_ctx
, "Target not halted or running");
2540 if (retval
!=ERROR_OK
)
2545 gettimeofday(&now
, NULL
);
2546 if ((numSamples
>=maxSample
) || ((now
.tv_sec
>= timeout
.tv_sec
) && (now
.tv_usec
>= timeout
.tv_usec
)))
2548 command_print(cmd_ctx
, "Profiling completed. %d samples.", numSamples
);
2549 target_poll(target
);
2550 if (target
->state
== TARGET_HALTED
)
2552 target_resume(target
, 1, 0, 0, 0); /* current pc, addr = 0, do not handle breakpoints, not debugging */
2554 target_poll(target
);
2555 writeGmon(samples
, numSamples
, args
[1]);
2556 command_print(cmd_ctx
, "Wrote %s", args
[1]);
2565 static int new_int_array_element(Jim_Interp
* interp
, const char *varname
, int idx
, u32 val
)
2568 Jim_Obj
*nameObjPtr
, *valObjPtr
;
2571 namebuf
= alloc_printf("%s(%d)", varname
, idx
);
2575 nameObjPtr
= Jim_NewStringObj(interp
, namebuf
, -1);
2576 valObjPtr
= Jim_NewIntObj(interp
, val
);
2577 if (!nameObjPtr
|| !valObjPtr
)
2583 Jim_IncrRefCount(nameObjPtr
);
2584 Jim_IncrRefCount(valObjPtr
);
2585 result
= Jim_SetVariable(interp
, nameObjPtr
, valObjPtr
);
2586 Jim_DecrRefCount(interp
, nameObjPtr
);
2587 Jim_DecrRefCount(interp
, valObjPtr
);
2589 /* printf("%s(%d) <= 0%08x\n", varname, idx, val); */
2593 static int jim_mem2array(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *argv
)
2596 command_context_t
*context
;
2603 const char *varname
;
2605 int i
, n
, e
, retval
;
2607 /* argv[1] = name of array to receive the data
2608 * argv[2] = desired width
2609 * argv[3] = memory address
2610 * argv[4] = count of times to read
2613 Jim_WrongNumArgs(interp
, 1, argv
, "varname width addr nelems");
2616 varname
= Jim_GetString(argv
[1], &len
);
2617 /* given "foo" get space for worse case "foo(%d)" .. add 20 */
2619 e
= Jim_GetLong(interp
, argv
[2], &l
);
2625 e
= Jim_GetLong(interp
, argv
[3], &l
);
2630 e
= Jim_GetLong(interp
, argv
[4], &l
);
2646 Jim_SetResult(interp
, Jim_NewEmptyStringObj(interp
));
2647 Jim_AppendStrings( interp
, Jim_GetResult(interp
), "Invalid width param, must be 8/16/32", NULL
);
2651 Jim_SetResult(interp
, Jim_NewEmptyStringObj(interp
));
2652 Jim_AppendStrings(interp
, Jim_GetResult(interp
), "mem2array: zero width read?", NULL
);
2655 if ((addr
+ (len
* width
)) < addr
) {
2656 Jim_SetResult(interp
, Jim_NewEmptyStringObj(interp
));
2657 Jim_AppendStrings(interp
, Jim_GetResult(interp
), "mem2array: addr + len - wraps to zero?", NULL
);
2660 /* absurd transfer size? */
2662 Jim_SetResult(interp
, Jim_NewEmptyStringObj(interp
));
2663 Jim_AppendStrings(interp
, Jim_GetResult(interp
), "mem2array: absurd > 64K item request", NULL
);
2668 ((width
== 2) && ((addr
& 1) == 0)) ||
2669 ((width
== 4) && ((addr
& 3) == 0))) {
2673 Jim_SetResult(interp
, Jim_NewEmptyStringObj(interp
));
2674 sprintf(buf
, "mem2array address: 0x%08x is not aligned for %d byte reads", addr
, width
);
2675 Jim_AppendStrings(interp
, Jim_GetResult(interp
), buf
, NULL
);
2679 context
= Jim_GetAssocData(interp
, "context");
2680 if (context
== NULL
)
2682 LOG_ERROR("mem2array: no command context");
2685 target
= get_current_target(context
);
2688 LOG_ERROR("mem2array: no current target");
2699 /* Slurp... in buffer size chunks */
2701 count
= len
; /* in objects.. */
2702 if (count
> (sizeof(buffer
)/width
)) {
2703 count
= (sizeof(buffer
)/width
);
2706 retval
= target
->type
->read_memory( target
, addr
, width
, count
, buffer
);
2707 if (retval
!= ERROR_OK
) {
2709 LOG_ERROR("mem2array: Read @ 0x%08x, w=%d, cnt=%d, failed", addr
, width
, count
);
2710 Jim_SetResult(interp
, Jim_NewEmptyStringObj(interp
));
2711 Jim_AppendStrings(interp
, Jim_GetResult(interp
), "mem2array: cannot read memory", NULL
);
2715 v
= 0; /* shut up gcc */
2716 for (i
= 0 ;i
< count
;i
++, n
++) {
2719 v
= target_buffer_get_u32(target
, &buffer
[i
*width
]);
2722 v
= target_buffer_get_u16(target
, &buffer
[i
*width
]);
2725 v
= buffer
[i
] & 0x0ff;
2728 new_int_array_element(interp
, varname
, n
, v
);
2734 Jim_SetResult(interp
, Jim_NewEmptyStringObj(interp
));
2739 static int get_int_array_element(Jim_Interp
* interp
, const char *varname
, int idx
, u32
*val
)
2742 Jim_Obj
*nameObjPtr
, *valObjPtr
;
2746 namebuf
= alloc_printf("%s(%d)", varname
, idx
);
2750 nameObjPtr
= Jim_NewStringObj(interp
, namebuf
, -1);
2757 Jim_IncrRefCount(nameObjPtr
);
2758 valObjPtr
= Jim_GetVariable(interp
, nameObjPtr
, JIM_ERRMSG
);
2759 Jim_DecrRefCount(interp
, nameObjPtr
);
2761 if (valObjPtr
== NULL
)
2764 result
= Jim_GetLong(interp
, valObjPtr
, &l
);
2765 /* printf("%s(%d) => 0%08x\n", varname, idx, val); */
2770 static int jim_array2mem(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *argv
)
2773 command_context_t
*context
;
2780 const char *varname
;
2782 int i
, n
, e
, retval
;
2784 /* argv[1] = name of array to get the data
2785 * argv[2] = desired width
2786 * argv[3] = memory address
2787 * argv[4] = count to write
2790 Jim_WrongNumArgs(interp
, 1, argv
, "varname width addr nelems");
2793 varname
= Jim_GetString(argv
[1], &len
);
2794 /* given "foo" get space for worse case "foo(%d)" .. add 20 */
2796 e
= Jim_GetLong(interp
, argv
[2], &l
);
2802 e
= Jim_GetLong(interp
, argv
[3], &l
);
2807 e
= Jim_GetLong(interp
, argv
[4], &l
);
2823 Jim_SetResult(interp
, Jim_NewEmptyStringObj(interp
));
2824 Jim_AppendStrings( interp
, Jim_GetResult(interp
), "Invalid width param, must be 8/16/32", NULL
);
2828 Jim_SetResult(interp
, Jim_NewEmptyStringObj(interp
));
2829 Jim_AppendStrings(interp
, Jim_GetResult(interp
), "array2mem: zero width read?", NULL
);
2832 if ((addr
+ (len
* width
)) < addr
) {
2833 Jim_SetResult(interp
, Jim_NewEmptyStringObj(interp
));
2834 Jim_AppendStrings(interp
, Jim_GetResult(interp
), "array2mem: addr + len - wraps to zero?", NULL
);
2837 /* absurd transfer size? */
2839 Jim_SetResult(interp
, Jim_NewEmptyStringObj(interp
));
2840 Jim_AppendStrings(interp
, Jim_GetResult(interp
), "array2mem: absurd > 64K item request", NULL
);
2845 ((width
== 2) && ((addr
& 1) == 0)) ||
2846 ((width
== 4) && ((addr
& 3) == 0))) {
2850 Jim_SetResult(interp
, Jim_NewEmptyStringObj(interp
));
2851 sprintf(buf
, "array2mem address: 0x%08x is not aligned for %d byte reads", addr
, width
);
2852 Jim_AppendStrings(interp
, Jim_GetResult(interp
), buf
, NULL
);
2856 context
= Jim_GetAssocData(interp
, "context");
2857 if (context
== NULL
)
2859 LOG_ERROR("array2mem: no command context");
2862 target
= get_current_target(context
);
2865 LOG_ERROR("array2mem: no current target");
2876 /* Slurp... in buffer size chunks */
2878 count
= len
; /* in objects.. */
2879 if (count
> (sizeof(buffer
)/width
)) {
2880 count
= (sizeof(buffer
)/width
);
2883 v
= 0; /* shut up gcc */
2884 for (i
= 0 ;i
< count
;i
++, n
++) {
2885 get_int_array_element(interp
, varname
, n
, &v
);
2888 target_buffer_set_u32(target
, &buffer
[i
*width
], v
);
2891 target_buffer_set_u16(target
, &buffer
[i
*width
], v
);
2894 buffer
[i
] = v
& 0x0ff;
2900 retval
= target
->type
->write_memory(target
, addr
, width
, count
, buffer
);
2901 if (retval
!= ERROR_OK
) {
2903 LOG_ERROR("array2mem: Write @ 0x%08x, w=%d, cnt=%d, failed", addr
, width
, count
);
2904 Jim_SetResult(interp
, Jim_NewEmptyStringObj(interp
));
2905 Jim_AppendStrings(interp
, Jim_GetResult(interp
), "mem2array: cannot read memory", NULL
);
2911 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)