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
;
274 target_invoke_script(cmd_ctx
, target
, "pre_reset");
275 target
= target
->next
;
278 if ((retval
= jtag_init_reset(cmd_ctx
)) != ERROR_OK
)
281 keep_alive(); /* we might be running on a very slow JTAG clk */
283 /* First time this is executed after launching OpenOCD, it will read out
284 * the type of CPU, etc. and init Embedded ICE registers in host
287 * It will also set up ICE registers in the target.
289 * However, if we assert TRST later, we need to set up the registers again.
291 * For the "reset halt/init" case we must only set up the registers here.
293 if ((retval
= target_examine(cmd_ctx
)) != ERROR_OK
)
296 keep_alive(); /* we might be running on a very slow JTAG clk */
301 /* we have no idea what state the target is in, so we
302 * have to drop working areas
304 target_free_all_working_areas_restore(target
, 0);
305 target
->reset_halt
=((reset_mode
==RESET_HALT
)||(reset_mode
==RESET_INIT
));
306 target
->type
->assert_reset(target
);
307 target
= target
->next
;
309 if ((retval
= jtag_execute_queue()) != ERROR_OK
)
311 LOG_WARNING("JTAG communication failed asserting reset.");
315 /* request target halt if necessary, and schedule further action */
319 if (reset_mode
!=RESET_RUN
)
321 if ((jtag_reset_config
& RESET_SRST_PULLS_TRST
)==0)
324 target
= target
->next
;
327 if ((retval
= jtag_execute_queue()) != ERROR_OK
)
329 LOG_WARNING("JTAG communication failed while reset was asserted. Consider using srst_only for reset_config.");
336 target
->type
->deassert_reset(target
);
337 /* We can fail to bring the target into the halted state */
338 if (target
->reset_halt
)
340 /* wait up to 1 second for halt. */
341 target_wait_state(target
, TARGET_HALTED
, 1000);
342 if (target
->state
!= TARGET_HALTED
)
344 LOG_WARNING("Failed to reset target into halted mode - issuing halt");
345 target
->type
->halt(target
);
349 target
= target
->next
;
352 if ((retval
= jtag_execute_queue()) != ERROR_OK
)
354 LOG_WARNING("JTAG communication failed while deasserting reset.");
358 if (jtag_reset_config
& RESET_SRST_PULLS_TRST
)
360 /* If TRST was asserted we need to set up registers again */
361 if ((retval
= target_examine(cmd_ctx
)) != ERROR_OK
)
365 LOG_DEBUG("Waiting for halted stated as appropriate");
367 if ((reset_mode
== RESET_HALT
) || (reset_mode
== RESET_INIT
))
372 /* Wait for reset to complete, maximum 5 seconds. */
373 if (((retval
=target_wait_state(target
, TARGET_HALTED
, 5000)))==ERROR_OK
)
375 if (reset_mode
== RESET_INIT
)
376 target_invoke_script(cmd_ctx
, target
, "post_reset");
378 target
= target
->next
;
382 /* We want any events to be processed before the prompt */
383 target_call_timer_callbacks_now();
388 static int default_virt2phys(struct target_s
*target
, u32
virtual, u32
*physical
)
394 static int default_mmu(struct target_s
*target
, int *enabled
)
400 static int default_examine(struct command_context_s
*cmd_ctx
, struct target_s
*target
)
402 target
->type
->examined
= 1;
407 /* Targets that correctly implement init+examine, i.e.
408 * no communication with target during init:
412 int target_examine(struct command_context_s
*cmd_ctx
)
414 int retval
= ERROR_OK
;
415 target_t
*target
= targets
;
418 if ((retval
= target
->type
->examine(cmd_ctx
, target
))!=ERROR_OK
)
420 target
= target
->next
;
425 static int target_write_memory_imp(struct target_s
*target
, u32 address
, u32 size
, u32 count
, u8
*buffer
)
427 if (!target
->type
->examined
)
429 LOG_ERROR("Target not examined yet");
432 return target
->type
->write_memory_imp(target
, address
, size
, count
, buffer
);
435 static int target_read_memory_imp(struct target_s
*target
, u32 address
, u32 size
, u32 count
, u8
*buffer
)
437 if (!target
->type
->examined
)
439 LOG_ERROR("Target not examined yet");
442 return target
->type
->read_memory_imp(target
, address
, size
, count
, buffer
);
445 static int target_soft_reset_halt_imp(struct target_s
*target
)
447 if (!target
->type
->examined
)
449 LOG_ERROR("Target not examined yet");
452 return target
->type
->soft_reset_halt_imp(target
);
455 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
)
457 if (!target
->type
->examined
)
459 LOG_ERROR("Target not examined yet");
462 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
);
465 int target_init(struct command_context_s
*cmd_ctx
)
467 target_t
*target
= targets
;
471 target
->type
->examined
= 0;
472 if (target
->type
->examine
== NULL
)
474 target
->type
->examine
= default_examine
;
477 if (target
->type
->init_target(cmd_ctx
, target
) != ERROR_OK
)
479 LOG_ERROR("target '%s' init failed", target
->type
->name
);
483 /* Set up default functions if none are provided by target */
484 if (target
->type
->virt2phys
== NULL
)
486 target
->type
->virt2phys
= default_virt2phys
;
488 target
->type
->virt2phys
= default_virt2phys
;
489 /* a non-invasive way(in terms of patches) to add some code that
490 * runs before the type->write/read_memory implementation
492 target
->type
->write_memory_imp
= target
->type
->write_memory
;
493 target
->type
->write_memory
= target_write_memory_imp
;
494 target
->type
->read_memory_imp
= target
->type
->read_memory
;
495 target
->type
->read_memory
= target_read_memory_imp
;
496 target
->type
->soft_reset_halt_imp
= target
->type
->soft_reset_halt
;
497 target
->type
->soft_reset_halt
= target_soft_reset_halt_imp
;
498 target
->type
->run_algorithm_imp
= target
->type
->run_algorithm
;
499 target
->type
->run_algorithm
= target_run_algorithm_imp
;
502 if (target
->type
->mmu
== NULL
)
504 target
->type
->mmu
= default_mmu
;
506 target
= target
->next
;
511 target_register_user_commands(cmd_ctx
);
512 target_register_timer_callback(handle_target
, 100, 1, NULL
);
518 int target_register_event_callback(int (*callback
)(struct target_s
*target
, enum target_event event
, void *priv
), void *priv
)
520 target_event_callback_t
**callbacks_p
= &target_event_callbacks
;
522 if (callback
== NULL
)
524 return ERROR_INVALID_ARGUMENTS
;
529 while ((*callbacks_p
)->next
)
530 callbacks_p
= &((*callbacks_p
)->next
);
531 callbacks_p
= &((*callbacks_p
)->next
);
534 (*callbacks_p
) = malloc(sizeof(target_event_callback_t
));
535 (*callbacks_p
)->callback
= callback
;
536 (*callbacks_p
)->priv
= priv
;
537 (*callbacks_p
)->next
= NULL
;
542 int target_register_timer_callback(int (*callback
)(void *priv
), int time_ms
, int periodic
, void *priv
)
544 target_timer_callback_t
**callbacks_p
= &target_timer_callbacks
;
547 if (callback
== NULL
)
549 return ERROR_INVALID_ARGUMENTS
;
554 while ((*callbacks_p
)->next
)
555 callbacks_p
= &((*callbacks_p
)->next
);
556 callbacks_p
= &((*callbacks_p
)->next
);
559 (*callbacks_p
) = malloc(sizeof(target_timer_callback_t
));
560 (*callbacks_p
)->callback
= callback
;
561 (*callbacks_p
)->periodic
= periodic
;
562 (*callbacks_p
)->time_ms
= time_ms
;
564 gettimeofday(&now
, NULL
);
565 (*callbacks_p
)->when
.tv_usec
= now
.tv_usec
+ (time_ms
% 1000) * 1000;
566 time_ms
-= (time_ms
% 1000);
567 (*callbacks_p
)->when
.tv_sec
= now
.tv_sec
+ (time_ms
/ 1000);
568 if ((*callbacks_p
)->when
.tv_usec
> 1000000)
570 (*callbacks_p
)->when
.tv_usec
= (*callbacks_p
)->when
.tv_usec
- 1000000;
571 (*callbacks_p
)->when
.tv_sec
+= 1;
574 (*callbacks_p
)->priv
= priv
;
575 (*callbacks_p
)->next
= NULL
;
580 int target_unregister_event_callback(int (*callback
)(struct target_s
*target
, enum target_event event
, void *priv
), void *priv
)
582 target_event_callback_t
**p
= &target_event_callbacks
;
583 target_event_callback_t
*c
= target_event_callbacks
;
585 if (callback
== NULL
)
587 return ERROR_INVALID_ARGUMENTS
;
592 target_event_callback_t
*next
= c
->next
;
593 if ((c
->callback
== callback
) && (c
->priv
== priv
))
607 int target_unregister_timer_callback(int (*callback
)(void *priv
), void *priv
)
609 target_timer_callback_t
**p
= &target_timer_callbacks
;
610 target_timer_callback_t
*c
= target_timer_callbacks
;
612 if (callback
== NULL
)
614 return ERROR_INVALID_ARGUMENTS
;
619 target_timer_callback_t
*next
= c
->next
;
620 if ((c
->callback
== callback
) && (c
->priv
== priv
))
634 int target_call_event_callbacks(target_t
*target
, enum target_event event
)
636 target_event_callback_t
*callback
= target_event_callbacks
;
637 target_event_callback_t
*next_callback
;
639 LOG_DEBUG("target event %i", event
);
643 next_callback
= callback
->next
;
644 callback
->callback(target
, event
, callback
->priv
);
645 callback
= next_callback
;
651 static int target_call_timer_callbacks_check_time(int checktime
)
653 target_timer_callback_t
*callback
= target_timer_callbacks
;
654 target_timer_callback_t
*next_callback
;
659 gettimeofday(&now
, NULL
);
663 next_callback
= callback
->next
;
665 if ((!checktime
&&callback
->periodic
)||
666 (((now
.tv_sec
>= callback
->when
.tv_sec
) && (now
.tv_usec
>= callback
->when
.tv_usec
))
667 || (now
.tv_sec
> callback
->when
.tv_sec
)))
669 if(callback
->callback
!= NULL
)
671 callback
->callback(callback
->priv
);
672 if (callback
->periodic
)
674 int time_ms
= callback
->time_ms
;
675 callback
->when
.tv_usec
= now
.tv_usec
+ (time_ms
% 1000) * 1000;
676 time_ms
-= (time_ms
% 1000);
677 callback
->when
.tv_sec
= now
.tv_sec
+ time_ms
/ 1000;
678 if (callback
->when
.tv_usec
> 1000000)
680 callback
->when
.tv_usec
= callback
->when
.tv_usec
- 1000000;
681 callback
->when
.tv_sec
+= 1;
685 target_unregister_timer_callback(callback
->callback
, callback
->priv
);
689 callback
= next_callback
;
695 int target_call_timer_callbacks()
697 return target_call_timer_callbacks_check_time(1);
700 /* invoke periodic callbacks immediately */
701 int target_call_timer_callbacks_now()
703 return target_call_timer_callbacks(0);
706 int target_alloc_working_area(struct target_s
*target
, u32 size
, working_area_t
**area
)
708 working_area_t
*c
= target
->working_areas
;
709 working_area_t
*new_wa
= NULL
;
711 /* Reevaluate working area address based on MMU state*/
712 if (target
->working_areas
== NULL
)
716 retval
= target
->type
->mmu(target
, &enabled
);
717 if (retval
!= ERROR_OK
)
723 target
->working_area
= target
->working_area_virt
;
727 target
->working_area
= target
->working_area_phys
;
731 /* only allocate multiples of 4 byte */
734 LOG_ERROR("BUG: code tried to allocate unaligned number of bytes, padding");
735 size
= CEIL(size
, 4);
738 /* see if there's already a matching working area */
741 if ((c
->free
) && (c
->size
== size
))
749 /* if not, allocate a new one */
752 working_area_t
**p
= &target
->working_areas
;
753 u32 first_free
= target
->working_area
;
754 u32 free_size
= target
->working_area_size
;
756 LOG_DEBUG("allocating new working area");
758 c
= target
->working_areas
;
761 first_free
+= c
->size
;
762 free_size
-= c
->size
;
767 if (free_size
< size
)
769 LOG_WARNING("not enough working area available(requested %d, free %d)", size
, free_size
);
770 return ERROR_TARGET_RESOURCE_NOT_AVAILABLE
;
773 new_wa
= malloc(sizeof(working_area_t
));
776 new_wa
->address
= first_free
;
778 if (target
->backup_working_area
)
780 new_wa
->backup
= malloc(new_wa
->size
);
781 target
->type
->read_memory(target
, new_wa
->address
, 4, new_wa
->size
/ 4, new_wa
->backup
);
785 new_wa
->backup
= NULL
;
788 /* put new entry in list */
792 /* mark as used, and return the new (reused) area */
802 int target_free_working_area_restore(struct target_s
*target
, working_area_t
*area
, int restore
)
807 if (restore
&&target
->backup_working_area
)
808 target
->type
->write_memory(target
, area
->address
, 4, area
->size
/ 4, area
->backup
);
812 /* mark user pointer invalid */
819 int target_free_working_area(struct target_s
*target
, working_area_t
*area
)
821 return target_free_working_area_restore(target
, area
, 1);
824 int target_free_all_working_areas_restore(struct target_s
*target
, int restore
)
826 working_area_t
*c
= target
->working_areas
;
830 working_area_t
*next
= c
->next
;
831 target_free_working_area_restore(target
, c
, restore
);
841 target
->working_areas
= NULL
;
846 int target_free_all_working_areas(struct target_s
*target
)
848 return target_free_all_working_areas_restore(target
, 1);
851 int target_register_commands(struct command_context_s
*cmd_ctx
)
853 register_command(cmd_ctx
, NULL
, "target", handle_target_command
, COMMAND_CONFIG
, "target <cpu> [reset_init default - DEPRECATED] <chainpos> <endianness> <variant> [cpu type specifc args]");
854 register_command(cmd_ctx
, NULL
, "targets", handle_targets_command
, COMMAND_EXEC
, NULL
);
855 register_command(cmd_ctx
, NULL
, "working_area", handle_working_area_command
, COMMAND_ANY
, "working_area <target#> <address> <size> <'backup'|'nobackup'> [virtual address]");
856 register_command(cmd_ctx
, NULL
, "virt2phys", handle_virt2phys_command
, COMMAND_ANY
, "virt2phys <virtual address>");
857 register_command(cmd_ctx
, NULL
, "profile", handle_profile_command
, COMMAND_EXEC
, "PRELIMINARY! - profile <seconds> <gmon.out>");
860 /* script procedures */
861 register_jim(cmd_ctx
, "ocd_mem2array", jim_mem2array
, "read memory and return as a TCL array for script processing");
862 register_jim(cmd_ctx
, "ocd_array2mem", jim_array2mem
, "convert a TCL array to memory locations and write the values");
866 int target_arch_state(struct target_s
*target
)
871 LOG_USER("No target has been configured");
875 LOG_USER("target state: %s", target_state_strings
[target
->state
]);
877 if (target
->state
!=TARGET_HALTED
)
880 retval
=target
->type
->arch_state(target
);
884 /* Single aligned words are guaranteed to use 16 or 32 bit access
885 * mode respectively, otherwise data is handled as quickly as
888 int target_write_buffer(struct target_s
*target
, u32 address
, u32 size
, u8
*buffer
)
891 LOG_DEBUG("writing buffer of %i byte at 0x%8.8x", size
, address
);
893 if (!target
->type
->examined
)
895 LOG_ERROR("Target not examined yet");
899 if (address
+size
<address
)
901 /* GDB can request this when e.g. PC is 0xfffffffc*/
902 LOG_ERROR("address+size wrapped(0x%08x, 0x%08x)", address
, size
);
906 if (((address
% 2) == 0) && (size
== 2))
908 return target
->type
->write_memory(target
, address
, 2, 1, buffer
);
911 /* handle unaligned head bytes */
914 int unaligned
= 4 - (address
% 4);
916 if (unaligned
> size
)
919 if ((retval
= target
->type
->write_memory(target
, address
, 1, unaligned
, buffer
)) != ERROR_OK
)
923 address
+= unaligned
;
927 /* handle aligned words */
930 int aligned
= size
- (size
% 4);
932 /* use bulk writes above a certain limit. This may have to be changed */
935 if ((retval
= target
->type
->bulk_write_memory(target
, address
, aligned
/ 4, buffer
)) != ERROR_OK
)
940 if ((retval
= target
->type
->write_memory(target
, address
, 4, aligned
/ 4, buffer
)) != ERROR_OK
)
949 /* handle tail writes of less than 4 bytes */
952 if ((retval
= target
->type
->write_memory(target
, address
, 1, size
, buffer
)) != ERROR_OK
)
960 /* Single aligned words are guaranteed to use 16 or 32 bit access
961 * mode respectively, otherwise data is handled as quickly as
964 int target_read_buffer(struct target_s
*target
, u32 address
, u32 size
, u8
*buffer
)
967 LOG_DEBUG("reading buffer of %i byte at 0x%8.8x", size
, address
);
969 if (!target
->type
->examined
)
971 LOG_ERROR("Target not examined yet");
975 if (address
+size
<address
)
977 /* GDB can request this when e.g. PC is 0xfffffffc*/
978 LOG_ERROR("address+size wrapped(0x%08x, 0x%08x)", address
, size
);
982 if (((address
% 2) == 0) && (size
== 2))
984 return target
->type
->read_memory(target
, address
, 2, 1, buffer
);
987 /* handle unaligned head bytes */
990 int unaligned
= 4 - (address
% 4);
992 if (unaligned
> size
)
995 if ((retval
= target
->type
->read_memory(target
, address
, 1, unaligned
, buffer
)) != ERROR_OK
)
999 address
+= unaligned
;
1003 /* handle aligned words */
1006 int aligned
= size
- (size
% 4);
1008 if ((retval
= target
->type
->read_memory(target
, address
, 4, aligned
/ 4, buffer
)) != ERROR_OK
)
1016 /* handle tail writes of less than 4 bytes */
1019 if ((retval
= target
->type
->read_memory(target
, address
, 1, size
, buffer
)) != ERROR_OK
)
1026 int target_checksum_memory(struct target_s
*target
, u32 address
, u32 size
, u32
* crc
)
1032 if (!target
->type
->examined
)
1034 LOG_ERROR("Target not examined yet");
1038 if ((retval
= target
->type
->checksum_memory(target
, address
,
1039 size
, &checksum
)) == ERROR_TARGET_RESOURCE_NOT_AVAILABLE
)
1041 buffer
= malloc(size
);
1044 LOG_ERROR("error allocating buffer for section (%d bytes)", size
);
1045 return ERROR_INVALID_ARGUMENTS
;
1047 retval
= target_read_buffer(target
, address
, size
, buffer
);
1048 if (retval
!= ERROR_OK
)
1054 /* convert to target endianess */
1055 for (i
= 0; i
< (size
/sizeof(u32
)); i
++)
1058 target_data
= target_buffer_get_u32(target
, &buffer
[i
*sizeof(u32
)]);
1059 target_buffer_set_u32(target
, &buffer
[i
*sizeof(u32
)], target_data
);
1062 retval
= image_calculate_checksum( buffer
, size
, &checksum
);
1071 int target_blank_check_memory(struct target_s
*target
, u32 address
, u32 size
, u32
* blank
)
1074 if (!target
->type
->examined
)
1076 LOG_ERROR("Target not examined yet");
1080 if (target
->type
->blank_check_memory
== 0)
1081 return ERROR_TARGET_RESOURCE_NOT_AVAILABLE
;
1083 retval
= target
->type
->blank_check_memory(target
, address
, size
, blank
);
1088 int target_read_u32(struct target_s
*target
, u32 address
, u32
*value
)
1091 if (!target
->type
->examined
)
1093 LOG_ERROR("Target not examined yet");
1097 int retval
= target
->type
->read_memory(target
, address
, 4, 1, value_buf
);
1099 if (retval
== ERROR_OK
)
1101 *value
= target_buffer_get_u32(target
, value_buf
);
1102 LOG_DEBUG("address: 0x%8.8x, value: 0x%8.8x", address
, *value
);
1107 LOG_DEBUG("address: 0x%8.8x failed", address
);
1113 int target_read_u16(struct target_s
*target
, u32 address
, u16
*value
)
1116 if (!target
->type
->examined
)
1118 LOG_ERROR("Target not examined yet");
1122 int retval
= target
->type
->read_memory(target
, address
, 2, 1, value_buf
);
1124 if (retval
== ERROR_OK
)
1126 *value
= target_buffer_get_u16(target
, value_buf
);
1127 LOG_DEBUG("address: 0x%8.8x, value: 0x%4.4x", address
, *value
);
1132 LOG_DEBUG("address: 0x%8.8x failed", address
);
1138 int target_read_u8(struct target_s
*target
, u32 address
, u8
*value
)
1140 int retval
= target
->type
->read_memory(target
, address
, 1, 1, value
);
1141 if (!target
->type
->examined
)
1143 LOG_ERROR("Target not examined yet");
1147 if (retval
== ERROR_OK
)
1149 LOG_DEBUG("address: 0x%8.8x, value: 0x%2.2x", address
, *value
);
1154 LOG_DEBUG("address: 0x%8.8x failed", address
);
1160 int target_write_u32(struct target_s
*target
, u32 address
, u32 value
)
1164 if (!target
->type
->examined
)
1166 LOG_ERROR("Target not examined yet");
1170 LOG_DEBUG("address: 0x%8.8x, value: 0x%8.8x", address
, value
);
1172 target_buffer_set_u32(target
, value_buf
, value
);
1173 if ((retval
= target
->type
->write_memory(target
, address
, 4, 1, value_buf
)) != ERROR_OK
)
1175 LOG_DEBUG("failed: %i", retval
);
1181 int target_write_u16(struct target_s
*target
, u32 address
, u16 value
)
1185 if (!target
->type
->examined
)
1187 LOG_ERROR("Target not examined yet");
1191 LOG_DEBUG("address: 0x%8.8x, value: 0x%8.8x", address
, value
);
1193 target_buffer_set_u16(target
, value_buf
, value
);
1194 if ((retval
= target
->type
->write_memory(target
, address
, 2, 1, value_buf
)) != ERROR_OK
)
1196 LOG_DEBUG("failed: %i", retval
);
1202 int target_write_u8(struct target_s
*target
, u32 address
, u8 value
)
1205 if (!target
->type
->examined
)
1207 LOG_ERROR("Target not examined yet");
1211 LOG_DEBUG("address: 0x%8.8x, value: 0x%2.2x", address
, value
);
1213 if ((retval
= target
->type
->read_memory(target
, address
, 1, 1, &value
)) != ERROR_OK
)
1215 LOG_DEBUG("failed: %i", retval
);
1221 int target_register_user_commands(struct command_context_s
*cmd_ctx
)
1223 register_command(cmd_ctx
, NULL
, "reg", handle_reg_command
, COMMAND_EXEC
, NULL
);
1224 register_command(cmd_ctx
, NULL
, "poll", handle_poll_command
, COMMAND_EXEC
, "poll target state");
1225 register_command(cmd_ctx
, NULL
, "wait_halt", handle_wait_halt_command
, COMMAND_EXEC
, "wait for target halt [time (s)]");
1226 register_command(cmd_ctx
, NULL
, "halt", handle_halt_command
, COMMAND_EXEC
, "halt target");
1227 register_command(cmd_ctx
, NULL
, "resume", handle_resume_command
, COMMAND_EXEC
, "resume target [addr]");
1228 register_command(cmd_ctx
, NULL
, "step", handle_step_command
, COMMAND_EXEC
, "step one instruction from current PC or [addr]");
1229 register_command(cmd_ctx
, NULL
, "reset", handle_reset_command
, COMMAND_EXEC
, "reset target [run|halt|init]");
1230 register_command(cmd_ctx
, NULL
, "soft_reset_halt", handle_soft_reset_halt_command
, COMMAND_EXEC
, "halt the target and do a soft reset");
1232 register_command(cmd_ctx
, NULL
, "mdw", handle_md_command
, COMMAND_EXEC
, "display memory words <addr> [count]");
1233 register_command(cmd_ctx
, NULL
, "mdh", handle_md_command
, COMMAND_EXEC
, "display memory half-words <addr> [count]");
1234 register_command(cmd_ctx
, NULL
, "mdb", handle_md_command
, COMMAND_EXEC
, "display memory bytes <addr> [count]");
1236 register_command(cmd_ctx
, NULL
, "mww", handle_mw_command
, COMMAND_EXEC
, "write memory word <addr> <value> [count]");
1237 register_command(cmd_ctx
, NULL
, "mwh", handle_mw_command
, COMMAND_EXEC
, "write memory half-word <addr> <value> [count]");
1238 register_command(cmd_ctx
, NULL
, "mwb", handle_mw_command
, COMMAND_EXEC
, "write memory byte <addr> <value> [count]");
1240 register_command(cmd_ctx
, NULL
, "bp", handle_bp_command
, COMMAND_EXEC
, "set breakpoint <address> <length> [hw]");
1241 register_command(cmd_ctx
, NULL
, "rbp", handle_rbp_command
, COMMAND_EXEC
, "remove breakpoint <adress>");
1242 register_command(cmd_ctx
, NULL
, "wp", handle_wp_command
, COMMAND_EXEC
, "set watchpoint <address> <length> <r/w/a> [value] [mask]");
1243 register_command(cmd_ctx
, NULL
, "rwp", handle_rwp_command
, COMMAND_EXEC
, "remove watchpoint <adress>");
1245 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]");
1246 register_command(cmd_ctx
, NULL
, "dump_image", handle_dump_image_command
, COMMAND_EXEC
, "dump_image <file> <address> <size>");
1247 register_command(cmd_ctx
, NULL
, "verify_image", handle_verify_image_command
, COMMAND_EXEC
, "verify_image <file> [offset] [type]");
1249 target_request_register_commands(cmd_ctx
);
1250 trace_register_commands(cmd_ctx
);
1255 int handle_targets_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1257 target_t
*target
= targets
;
1262 int num
= strtoul(args
[0], NULL
, 0);
1267 target
= target
->next
;
1271 cmd_ctx
->current_target
= num
;
1273 command_print(cmd_ctx
, "%i is out of bounds, only %i targets are configured", num
, count
);
1280 command_print(cmd_ctx
, "%i: %s (%s), state: %s", count
++, target
->type
->name
, target_endianess_strings
[target
->endianness
], target_state_strings
[target
->state
]);
1281 target
= target
->next
;
1287 int handle_target_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1294 return ERROR_COMMAND_SYNTAX_ERROR
;
1297 /* search for the specified target */
1298 if (args
[0] && (args
[0][0] != 0))
1300 for (i
= 0; target_types
[i
]; i
++)
1302 if (strcmp(args
[0], target_types
[i
]->name
) == 0)
1304 target_t
**last_target_p
= &targets
;
1306 /* register target specific commands */
1307 if (target_types
[i
]->register_commands(cmd_ctx
) != ERROR_OK
)
1309 LOG_ERROR("couldn't register '%s' commands", args
[0]);
1315 while ((*last_target_p
)->next
)
1316 last_target_p
= &((*last_target_p
)->next
);
1317 last_target_p
= &((*last_target_p
)->next
);
1320 *last_target_p
= malloc(sizeof(target_t
));
1322 /* allocate memory for each unique target type */
1323 (*last_target_p
)->type
= (target_type_t
*)malloc(sizeof(target_type_t
));
1324 *((*last_target_p
)->type
) = *target_types
[i
];
1326 if (strcmp(args
[1], "big") == 0)
1327 (*last_target_p
)->endianness
= TARGET_BIG_ENDIAN
;
1328 else if (strcmp(args
[1], "little") == 0)
1329 (*last_target_p
)->endianness
= TARGET_LITTLE_ENDIAN
;
1332 LOG_ERROR("endianness must be either 'little' or 'big', not '%s'", args
[1]);
1333 return ERROR_COMMAND_SYNTAX_ERROR
;
1336 if (strcmp(args
[2], "reset_halt") == 0)
1338 LOG_WARNING("reset_mode argument is obsolete.");
1339 return ERROR_COMMAND_SYNTAX_ERROR
;
1341 else if (strcmp(args
[2], "reset_run") == 0)
1343 LOG_WARNING("reset_mode argument is obsolete.");
1344 return ERROR_COMMAND_SYNTAX_ERROR
;
1346 else if (strcmp(args
[2], "reset_init") == 0)
1348 LOG_WARNING("reset_mode argument is obsolete.");
1349 return ERROR_COMMAND_SYNTAX_ERROR
;
1351 else if (strcmp(args
[2], "run_and_halt") == 0)
1353 LOG_WARNING("reset_mode argument is obsolete.");
1354 return ERROR_COMMAND_SYNTAX_ERROR
;
1356 else if (strcmp(args
[2], "run_and_init") == 0)
1358 LOG_WARNING("reset_mode argument is obsolete.");
1359 return ERROR_COMMAND_SYNTAX_ERROR
;
1363 /* Kludge! we want to make this reset arg optional while remaining compatible! */
1368 (*last_target_p
)->working_area
= 0x0;
1369 (*last_target_p
)->working_area_size
= 0x0;
1370 (*last_target_p
)->working_areas
= NULL
;
1371 (*last_target_p
)->backup_working_area
= 0;
1373 (*last_target_p
)->state
= TARGET_UNKNOWN
;
1374 (*last_target_p
)->debug_reason
= DBG_REASON_UNDEFINED
;
1375 (*last_target_p
)->reg_cache
= NULL
;
1376 (*last_target_p
)->breakpoints
= NULL
;
1377 (*last_target_p
)->watchpoints
= NULL
;
1378 (*last_target_p
)->next
= NULL
;
1379 (*last_target_p
)->arch_info
= NULL
;
1381 /* initialize trace information */
1382 (*last_target_p
)->trace_info
= malloc(sizeof(trace_t
));
1383 (*last_target_p
)->trace_info
->num_trace_points
= 0;
1384 (*last_target_p
)->trace_info
->trace_points_size
= 0;
1385 (*last_target_p
)->trace_info
->trace_points
= NULL
;
1386 (*last_target_p
)->trace_info
->trace_history_size
= 0;
1387 (*last_target_p
)->trace_info
->trace_history
= NULL
;
1388 (*last_target_p
)->trace_info
->trace_history_pos
= 0;
1389 (*last_target_p
)->trace_info
->trace_history_overflowed
= 0;
1391 (*last_target_p
)->dbgmsg
= NULL
;
1392 (*last_target_p
)->dbg_msg_enabled
= 0;
1394 (*last_target_p
)->type
->target_command(cmd_ctx
, cmd
, args
, argc
, *last_target_p
);
1402 /* no matching target found */
1405 LOG_ERROR("target '%s' not found", args
[0]);
1406 return ERROR_COMMAND_SYNTAX_ERROR
;
1412 int target_invoke_script(struct command_context_s
*cmd_ctx
, target_t
*target
, char *name
)
1414 return command_run_linef(cmd_ctx
, " if {[catch {info body target_%d_%s} t]==0} {target_%d_%s}",
1415 get_num_by_target(target
), name
,
1416 get_num_by_target(target
), name
);
1419 int handle_working_area_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1421 target_t
*target
= NULL
;
1423 if ((argc
< 4) || (argc
> 5))
1425 return ERROR_COMMAND_SYNTAX_ERROR
;
1428 target
= get_target_by_num(strtoul(args
[0], NULL
, 0));
1431 return ERROR_COMMAND_SYNTAX_ERROR
;
1433 target_free_all_working_areas(target
);
1435 target
->working_area_phys
= target
->working_area_virt
= strtoul(args
[1], NULL
, 0);
1438 target
->working_area_virt
= strtoul(args
[4], NULL
, 0);
1440 target
->working_area_size
= strtoul(args
[2], NULL
, 0);
1442 if (strcmp(args
[3], "backup") == 0)
1444 target
->backup_working_area
= 1;
1446 else if (strcmp(args
[3], "nobackup") == 0)
1448 target
->backup_working_area
= 0;
1452 LOG_ERROR("unrecognized <backup|nobackup> argument (%s)", args
[3]);
1453 return ERROR_COMMAND_SYNTAX_ERROR
;
1460 /* process target state changes */
1461 int handle_target(void *priv
)
1463 target_t
*target
= targets
;
1467 if (target_continous_poll
)
1469 /* polling may fail silently until the target has been examined */
1470 target_poll(target
);
1473 target
= target
->next
;
1479 int handle_reg_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1488 target
= get_current_target(cmd_ctx
);
1490 /* list all available registers for the current target */
1493 reg_cache_t
*cache
= target
->reg_cache
;
1499 for (i
= 0; i
< cache
->num_regs
; i
++)
1501 value
= buf_to_str(cache
->reg_list
[i
].value
, cache
->reg_list
[i
].size
, 16);
1502 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
);
1505 cache
= cache
->next
;
1511 /* access a single register by its ordinal number */
1512 if ((args
[0][0] >= '0') && (args
[0][0] <= '9'))
1514 int num
= strtoul(args
[0], NULL
, 0);
1515 reg_cache_t
*cache
= target
->reg_cache
;
1521 for (i
= 0; i
< cache
->num_regs
; i
++)
1525 reg
= &cache
->reg_list
[i
];
1531 cache
= cache
->next
;
1536 command_print(cmd_ctx
, "%i is out of bounds, the current target has only %i registers (0 - %i)", num
, count
, count
- 1);
1539 } else /* access a single register by its name */
1541 reg
= register_get_by_name(target
->reg_cache
, args
[0], 1);
1545 command_print(cmd_ctx
, "register %s not found in current target", args
[0]);
1550 /* display a register */
1551 if ((argc
== 1) || ((argc
== 2) && !((args
[1][0] >= '0') && (args
[1][0] <= '9'))))
1553 if ((argc
== 2) && (strcmp(args
[1], "force") == 0))
1556 if (reg
->valid
== 0)
1558 reg_arch_type_t
*arch_type
= register_get_arch_type(reg
->arch_type
);
1559 if (arch_type
== NULL
)
1561 LOG_ERROR("BUG: encountered unregistered arch type");
1564 arch_type
->get(reg
);
1566 value
= buf_to_str(reg
->value
, reg
->size
, 16);
1567 command_print(cmd_ctx
, "%s (/%i): 0x%s", reg
->name
, reg
->size
, value
);
1572 /* set register value */
1575 u8
*buf
= malloc(CEIL(reg
->size
, 8));
1576 str_to_buf(args
[1], strlen(args
[1]), buf
, reg
->size
, 0);
1578 reg_arch_type_t
*arch_type
= register_get_arch_type(reg
->arch_type
);
1579 if (arch_type
== NULL
)
1581 LOG_ERROR("BUG: encountered unregistered arch type");
1585 arch_type
->set(reg
, buf
);
1587 value
= buf_to_str(reg
->value
, reg
->size
, 16);
1588 command_print(cmd_ctx
, "%s (/%i): 0x%s", reg
->name
, reg
->size
, value
);
1596 command_print(cmd_ctx
, "usage: reg <#|name> [value]");
1602 int handle_poll_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1604 target_t
*target
= get_current_target(cmd_ctx
);
1608 target_poll(target
);
1609 target_arch_state(target
);
1613 if (strcmp(args
[0], "on") == 0)
1615 target_continous_poll
= 1;
1617 else if (strcmp(args
[0], "off") == 0)
1619 target_continous_poll
= 0;
1623 command_print(cmd_ctx
, "arg is \"on\" or \"off\"");
1631 int handle_wait_halt_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1639 ms
= strtoul(args
[0], &end
, 0) * 1000;
1642 command_print(cmd_ctx
, "usage: %s [seconds]", cmd
);
1646 target_t
*target
= get_current_target(cmd_ctx
);
1648 return target_wait_state(target
, TARGET_HALTED
, ms
);
1651 int target_wait_state(target_t
*target
, enum target_state state
, int ms
)
1654 struct timeval timeout
, now
;
1656 gettimeofday(&timeout
, NULL
);
1657 timeval_add_time(&timeout
, 0, ms
* 1000);
1661 if ((retval
=target_poll(target
))!=ERROR_OK
)
1663 target_call_timer_callbacks_now();
1664 if (target
->state
== state
)
1671 LOG_USER("waiting for target %s...", target_state_strings
[state
]);
1674 gettimeofday(&now
, NULL
);
1675 if ((now
.tv_sec
> timeout
.tv_sec
) || ((now
.tv_sec
== timeout
.tv_sec
) && (now
.tv_usec
>= timeout
.tv_usec
)))
1677 LOG_ERROR("timed out while waiting for target %s", target_state_strings
[state
]);
1685 int handle_halt_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1688 target_t
*target
= get_current_target(cmd_ctx
);
1692 if ((retval
= target_halt(target
)) != ERROR_OK
)
1697 return handle_wait_halt_command(cmd_ctx
, cmd
, args
, argc
);
1700 int handle_soft_reset_halt_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1702 target_t
*target
= get_current_target(cmd_ctx
);
1704 LOG_USER("requesting target halt and executing a soft reset");
1706 target
->type
->soft_reset_halt(target
);
1711 int handle_reset_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1713 enum target_reset_mode reset_mode
= RESET_RUN
;
1717 if (strcmp("run", args
[0]) == 0)
1718 reset_mode
= RESET_RUN
;
1719 else if (strcmp("halt", args
[0]) == 0)
1720 reset_mode
= RESET_HALT
;
1721 else if (strcmp("init", args
[0]) == 0)
1722 reset_mode
= RESET_INIT
;
1725 return ERROR_COMMAND_SYNTAX_ERROR
;
1729 /* reset *all* targets */
1730 target_process_reset(cmd_ctx
, reset_mode
);
1735 int handle_resume_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1738 target_t
*target
= get_current_target(cmd_ctx
);
1740 target_invoke_script(cmd_ctx
, target
, "pre_resume");
1743 retval
= target_resume(target
, 1, 0, 1, 0); /* current pc, addr = 0, handle breakpoints, not debugging */
1745 retval
= target_resume(target
, 0, strtoul(args
[0], NULL
, 0), 1, 0); /* addr = args[0], handle breakpoints, not debugging */
1748 return ERROR_COMMAND_SYNTAX_ERROR
;
1754 int handle_step_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1756 target_t
*target
= get_current_target(cmd_ctx
);
1761 target
->type
->step(target
, 1, 0, 1); /* current pc, addr = 0, handle breakpoints */
1764 target
->type
->step(target
, 0, strtoul(args
[0], NULL
, 0), 1); /* addr = args[0], handle breakpoints */
1769 int handle_md_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1771 const int line_bytecnt
= 32;
1784 target_t
*target
= get_current_target(cmd_ctx
);
1790 count
= strtoul(args
[1], NULL
, 0);
1792 address
= strtoul(args
[0], NULL
, 0);
1798 size
= 4; line_modulo
= line_bytecnt
/ 4;
1801 size
= 2; line_modulo
= line_bytecnt
/ 2;
1804 size
= 1; line_modulo
= line_bytecnt
/ 1;
1810 buffer
= calloc(count
, size
);
1811 retval
= target
->type
->read_memory(target
, address
, size
, count
, buffer
);
1812 if (retval
== ERROR_OK
)
1816 for (i
= 0; i
< count
; i
++)
1818 if (i
%line_modulo
== 0)
1819 output_len
+= snprintf(output
+ output_len
, 128 - output_len
, "0x%8.8x: ", address
+ (i
*size
));
1824 output_len
+= snprintf(output
+ output_len
, 128 - output_len
, "%8.8x ", target_buffer_get_u32(target
, &buffer
[i
*4]));
1827 output_len
+= snprintf(output
+ output_len
, 128 - output_len
, "%4.4x ", target_buffer_get_u16(target
, &buffer
[i
*2]));
1830 output_len
+= snprintf(output
+ output_len
, 128 - output_len
, "%2.2x ", buffer
[i
*1]);
1834 if ((i
%line_modulo
== line_modulo
-1) || (i
== count
- 1))
1836 command_print(cmd_ctx
, output
);
1847 int handle_mw_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1854 target_t
*target
= get_current_target(cmd_ctx
);
1857 if ((argc
< 2) || (argc
> 3))
1858 return ERROR_COMMAND_SYNTAX_ERROR
;
1860 address
= strtoul(args
[0], NULL
, 0);
1861 value
= strtoul(args
[1], NULL
, 0);
1863 count
= strtoul(args
[2], NULL
, 0);
1869 target_buffer_set_u32(target
, value_buf
, value
);
1873 target_buffer_set_u16(target
, value_buf
, value
);
1877 value_buf
[0] = value
;
1880 return ERROR_COMMAND_SYNTAX_ERROR
;
1882 for (i
=0; i
<count
; i
++)
1888 retval
= target
->type
->write_memory(target
, address
+ i
*wordsize
, 4, 1, value_buf
);
1891 retval
= target
->type
->write_memory(target
, address
+ i
*wordsize
, 2, 1, value_buf
);
1894 retval
= target
->type
->write_memory(target
, address
+ i
*wordsize
, 1, 1, value_buf
);
1899 if (retval
!=ERROR_OK
)
1909 int handle_load_image_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1915 u32 max_address
=0xffffffff;
1921 duration_t duration
;
1922 char *duration_text
;
1924 target_t
*target
= get_current_target(cmd_ctx
);
1926 if ((argc
< 1)||(argc
> 5))
1928 return ERROR_COMMAND_SYNTAX_ERROR
;
1931 /* a base address isn't always necessary, default to 0x0 (i.e. don't relocate) */
1934 image
.base_address_set
= 1;
1935 image
.base_address
= strtoul(args
[1], NULL
, 0);
1939 image
.base_address_set
= 0;
1943 image
.start_address_set
= 0;
1947 min_address
=strtoul(args
[3], NULL
, 0);
1951 max_address
=strtoul(args
[4], NULL
, 0)+min_address
;
1954 if (min_address
>max_address
)
1956 return ERROR_COMMAND_SYNTAX_ERROR
;
1960 duration_start_measure(&duration
);
1962 if (image_open(&image
, args
[0], (argc
>= 3) ? args
[2] : NULL
) != ERROR_OK
)
1969 for (i
= 0; i
< image
.num_sections
; i
++)
1971 buffer
= malloc(image
.sections
[i
].size
);
1974 command_print(cmd_ctx
, "error allocating buffer for section (%d bytes)", image
.sections
[i
].size
);
1978 if ((retval
= image_read_section(&image
, i
, 0x0, image
.sections
[i
].size
, buffer
, &buf_cnt
)) != ERROR_OK
)
1988 /* DANGER!!! beware of unsigned comparision here!!! */
1990 if ((image
.sections
[i
].base_address
+buf_cnt
>=min_address
)&&
1991 (image
.sections
[i
].base_address
<max_address
))
1993 if (image
.sections
[i
].base_address
<min_address
)
1995 /* clip addresses below */
1996 offset
+=min_address
-image
.sections
[i
].base_address
;
2000 if (image
.sections
[i
].base_address
+buf_cnt
>max_address
)
2002 length
-=(image
.sections
[i
].base_address
+buf_cnt
)-max_address
;
2005 if ((retval
= target_write_buffer(target
, image
.sections
[i
].base_address
+offset
, length
, buffer
+offset
)) != ERROR_OK
)
2010 image_size
+= length
;
2011 command_print(cmd_ctx
, "%u byte written at address 0x%8.8x", length
, image
.sections
[i
].base_address
+offset
);
2017 duration_stop_measure(&duration
, &duration_text
);
2018 if (retval
==ERROR_OK
)
2020 command_print(cmd_ctx
, "downloaded %u byte in %s", image_size
, duration_text
);
2022 free(duration_text
);
2024 image_close(&image
);
2030 int handle_dump_image_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2037 int retval
=ERROR_OK
;
2039 duration_t duration
;
2040 char *duration_text
;
2042 target_t
*target
= get_current_target(cmd_ctx
);
2046 command_print(cmd_ctx
, "usage: dump_image <filename> <address> <size>");
2050 address
= strtoul(args
[1], NULL
, 0);
2051 size
= strtoul(args
[2], NULL
, 0);
2053 if ((address
& 3) || (size
& 3))
2055 command_print(cmd_ctx
, "only 32-bit aligned address and size are supported");
2059 if (fileio_open(&fileio
, args
[0], FILEIO_WRITE
, FILEIO_BINARY
) != ERROR_OK
)
2064 duration_start_measure(&duration
);
2069 u32 this_run_size
= (size
> 560) ? 560 : size
;
2071 retval
= target
->type
->read_memory(target
, address
, 4, this_run_size
/ 4, buffer
);
2072 if (retval
!= ERROR_OK
)
2077 retval
= fileio_write(&fileio
, this_run_size
, buffer
, &size_written
);
2078 if (retval
!= ERROR_OK
)
2083 size
-= this_run_size
;
2084 address
+= this_run_size
;
2087 fileio_close(&fileio
);
2089 duration_stop_measure(&duration
, &duration_text
);
2090 if (retval
==ERROR_OK
)
2092 command_print(cmd_ctx
, "dumped %"PRIi64
" byte in %s", fileio
.size
, duration_text
);
2094 free(duration_text
);
2099 int handle_verify_image_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2107 u32 mem_checksum
= 0;
2111 duration_t duration
;
2112 char *duration_text
;
2114 target_t
*target
= get_current_target(cmd_ctx
);
2118 return ERROR_COMMAND_SYNTAX_ERROR
;
2123 LOG_ERROR("no target selected");
2127 duration_start_measure(&duration
);
2131 image
.base_address_set
= 1;
2132 image
.base_address
= strtoul(args
[1], NULL
, 0);
2136 image
.base_address_set
= 0;
2137 image
.base_address
= 0x0;
2140 image
.start_address_set
= 0;
2142 if ((retval
=image_open(&image
, args
[0], (argc
== 3) ? args
[2] : NULL
)) != ERROR_OK
)
2149 for (i
= 0; i
< image
.num_sections
; i
++)
2151 buffer
= malloc(image
.sections
[i
].size
);
2154 command_print(cmd_ctx
, "error allocating buffer for section (%d bytes)", image
.sections
[i
].size
);
2157 if ((retval
= image_read_section(&image
, i
, 0x0, image
.sections
[i
].size
, buffer
, &buf_cnt
)) != ERROR_OK
)
2163 /* calculate checksum of image */
2164 image_calculate_checksum( buffer
, buf_cnt
, &checksum
);
2166 retval
= target_checksum_memory(target
, image
.sections
[i
].base_address
, buf_cnt
, &mem_checksum
);
2167 if( retval
!= ERROR_OK
)
2173 if( checksum
!= mem_checksum
)
2175 /* failed crc checksum, fall back to a binary compare */
2178 command_print(cmd_ctx
, "checksum mismatch - attempting binary compare");
2180 data
= (u8
*)malloc(buf_cnt
);
2182 /* Can we use 32bit word accesses? */
2184 int count
= buf_cnt
;
2185 if ((count
% 4) == 0)
2190 retval
= target
->type
->read_memory(target
, image
.sections
[i
].base_address
, size
, count
, data
);
2191 if (retval
== ERROR_OK
)
2194 for (t
= 0; t
< buf_cnt
; t
++)
2196 if (data
[t
] != buffer
[t
])
2198 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
]);
2211 image_size
+= buf_cnt
;
2214 duration_stop_measure(&duration
, &duration_text
);
2215 if (retval
==ERROR_OK
)
2217 command_print(cmd_ctx
, "verified %u bytes in %s", image_size
, duration_text
);
2219 free(duration_text
);
2221 image_close(&image
);
2226 int handle_bp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2229 target_t
*target
= get_current_target(cmd_ctx
);
2233 breakpoint_t
*breakpoint
= target
->breakpoints
;
2237 if (breakpoint
->type
== BKPT_SOFT
)
2239 char* buf
= buf_to_str(breakpoint
->orig_instr
, breakpoint
->length
, 16);
2240 command_print(cmd_ctx
, "0x%8.8x, 0x%x, %i, 0x%s", breakpoint
->address
, breakpoint
->length
, breakpoint
->set
, buf
);
2245 command_print(cmd_ctx
, "0x%8.8x, 0x%x, %i", breakpoint
->address
, breakpoint
->length
, breakpoint
->set
);
2247 breakpoint
= breakpoint
->next
;
2255 length
= strtoul(args
[1], NULL
, 0);
2258 if (strcmp(args
[2], "hw") == 0)
2261 if ((retval
= breakpoint_add(target
, strtoul(args
[0], NULL
, 0), length
, hw
)) != ERROR_OK
)
2263 LOG_ERROR("Failure setting breakpoints");
2267 command_print(cmd_ctx
, "breakpoint added at address 0x%8.8x", strtoul(args
[0], NULL
, 0));
2272 command_print(cmd_ctx
, "usage: bp <address> <length> ['hw']");
2278 int handle_rbp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2280 target_t
*target
= get_current_target(cmd_ctx
);
2283 breakpoint_remove(target
, strtoul(args
[0], NULL
, 0));
2288 int handle_wp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2290 target_t
*target
= get_current_target(cmd_ctx
);
2295 watchpoint_t
*watchpoint
= target
->watchpoints
;
2299 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
);
2300 watchpoint
= watchpoint
->next
;
2305 enum watchpoint_rw type
= WPT_ACCESS
;
2306 u32 data_value
= 0x0;
2307 u32 data_mask
= 0xffffffff;
2323 command_print(cmd_ctx
, "usage: wp <address> <length> [r/w/a] [value] [mask]");
2329 data_value
= strtoul(args
[3], NULL
, 0);
2333 data_mask
= strtoul(args
[4], NULL
, 0);
2336 if ((retval
= watchpoint_add(target
, strtoul(args
[0], NULL
, 0),
2337 strtoul(args
[1], NULL
, 0), type
, data_value
, data_mask
)) != ERROR_OK
)
2339 LOG_ERROR("Failure setting breakpoints");
2344 command_print(cmd_ctx
, "usage: wp <address> <length> [r/w/a] [value] [mask]");
2350 int handle_rwp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2352 target_t
*target
= get_current_target(cmd_ctx
);
2355 watchpoint_remove(target
, strtoul(args
[0], NULL
, 0));
2360 int handle_virt2phys_command(command_context_t
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2363 target_t
*target
= get_current_target(cmd_ctx
);
2369 return ERROR_COMMAND_SYNTAX_ERROR
;
2371 va
= strtoul(args
[0], NULL
, 0);
2373 retval
= target
->type
->virt2phys(target
, va
, &pa
);
2374 if (retval
== ERROR_OK
)
2376 command_print(cmd_ctx
, "Physical address 0x%08x", pa
);
2380 /* lower levels will have logged a detailed error which is
2381 * forwarded to telnet/GDB session.
2386 static void writeLong(FILE *f
, int l
)
2391 char c
=(l
>>(i
*8))&0xff;
2392 fwrite(&c
, 1, 1, f
);
2396 static void writeString(FILE *f
, char *s
)
2398 fwrite(s
, 1, strlen(s
), f
);
2403 // Dump a gmon.out histogram file.
2404 static void writeGmon(u32
*samples
, int sampleNum
, char *filename
)
2407 FILE *f
=fopen(filename
, "w");
2410 fwrite("gmon", 1, 4, f
);
2411 writeLong(f
, 0x00000001); // Version
2412 writeLong(f
, 0); // padding
2413 writeLong(f
, 0); // padding
2414 writeLong(f
, 0); // padding
2416 fwrite("", 1, 1, f
); // GMON_TAG_TIME_HIST
2418 // figure out bucket size
2421 for (i
=0; i
<sampleNum
; i
++)
2433 int addressSpace
=(max
-min
+1);
2435 static int const maxBuckets
=256*1024; // maximum buckets.
2436 int length
=addressSpace
;
2437 if (length
> maxBuckets
)
2441 int *buckets
=malloc(sizeof(int)*length
);
2447 memset(buckets
, 0, sizeof(int)*length
);
2448 for (i
=0; i
<sampleNum
;i
++)
2450 u32 address
=samples
[i
];
2451 long long a
=address
-min
;
2452 long long b
=length
-1;
2453 long long c
=addressSpace
-1;
2454 int index
=(a
*b
)/c
; // danger!!!! int32 overflows
2458 // append binary memory gmon.out &profile_hist_hdr ((char*)&profile_hist_hdr + sizeof(struct gmon_hist_hdr))
2459 writeLong(f
, min
); // low_pc
2460 writeLong(f
, max
); // high_pc
2461 writeLong(f
, length
); // # of samples
2462 writeLong(f
, 64000000); // 64MHz
2463 writeString(f
, "seconds");
2464 for (i
=0; i
<(15-strlen("seconds")); i
++)
2466 fwrite("", 1, 1, f
); // padding
2468 writeString(f
, "s");
2470 // append binary memory gmon.out profile_hist_data (profile_hist_data + profile_hist_hdr.hist_size)
2472 char *data
=malloc(2*length
);
2475 for (i
=0; i
<length
;i
++)
2484 data
[i
*2+1]=(val
>>8)&0xff;
2487 fwrite(data
, 1, length
*2, f
);
2497 /* profiling samples the CPU PC as quickly as OpenOCD is able, which will be used as a random sampling of PC */
2498 int handle_profile_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2500 target_t
*target
= get_current_target(cmd_ctx
);
2501 struct timeval timeout
, now
;
2503 gettimeofday(&timeout
, NULL
);
2506 return ERROR_COMMAND_SYNTAX_ERROR
;
2509 timeval_add_time(&timeout
, strtoul(args
[0], &end
, 0), 0);
2515 command_print(cmd_ctx
, "Starting profiling. Halting and resuming the target as often as we can...");
2517 static const int maxSample
=10000;
2518 u32
*samples
=malloc(sizeof(u32
)*maxSample
);
2523 int retval
=ERROR_OK
;
2524 // hopefully it is safe to cache! We want to stop/restart as quickly as possible.
2525 reg_t
*reg
= register_get_by_name(target
->reg_cache
, "pc", 1);
2529 target_poll(target
);
2530 if (target
->state
== TARGET_HALTED
)
2532 u32 t
=*((u32
*)reg
->value
);
2533 samples
[numSamples
++]=t
;
2534 retval
= target_resume(target
, 1, 0, 0, 0); /* current pc, addr = 0, do not handle breakpoints, not debugging */
2535 target_poll(target
);
2536 usleep(10*1000); // sleep 10ms, i.e. <100 samples/second.
2537 } else if (target
->state
== TARGET_RUNNING
)
2539 // We want to quickly sample the PC.
2540 target_halt(target
);
2543 command_print(cmd_ctx
, "Target not halted or running");
2547 if (retval
!=ERROR_OK
)
2552 gettimeofday(&now
, NULL
);
2553 if ((numSamples
>=maxSample
) || ((now
.tv_sec
>= timeout
.tv_sec
) && (now
.tv_usec
>= timeout
.tv_usec
)))
2555 command_print(cmd_ctx
, "Profiling completed. %d samples.", numSamples
);
2556 target_poll(target
);
2557 if (target
->state
== TARGET_HALTED
)
2559 target_resume(target
, 1, 0, 0, 0); /* current pc, addr = 0, do not handle breakpoints, not debugging */
2561 target_poll(target
);
2562 writeGmon(samples
, numSamples
, args
[1]);
2563 command_print(cmd_ctx
, "Wrote %s", args
[1]);
2572 static int new_int_array_element(Jim_Interp
* interp
, const char *varname
, int idx
, u32 val
)
2575 Jim_Obj
*nameObjPtr
, *valObjPtr
;
2578 namebuf
= alloc_printf("%s(%d)", varname
, idx
);
2582 nameObjPtr
= Jim_NewStringObj(interp
, namebuf
, -1);
2583 valObjPtr
= Jim_NewIntObj(interp
, val
);
2584 if (!nameObjPtr
|| !valObjPtr
)
2590 Jim_IncrRefCount(nameObjPtr
);
2591 Jim_IncrRefCount(valObjPtr
);
2592 result
= Jim_SetVariable(interp
, nameObjPtr
, valObjPtr
);
2593 Jim_DecrRefCount(interp
, nameObjPtr
);
2594 Jim_DecrRefCount(interp
, valObjPtr
);
2596 /* printf("%s(%d) <= 0%08x\n", varname, idx, val); */
2600 static int jim_mem2array(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *argv
)
2603 command_context_t
*context
;
2610 const char *varname
;
2612 int i
, n
, e
, retval
;
2614 /* argv[1] = name of array to receive the data
2615 * argv[2] = desired width
2616 * argv[3] = memory address
2617 * argv[4] = count of times to read
2620 Jim_WrongNumArgs(interp
, 1, argv
, "varname width addr nelems");
2623 varname
= Jim_GetString(argv
[1], &len
);
2624 /* given "foo" get space for worse case "foo(%d)" .. add 20 */
2626 e
= Jim_GetLong(interp
, argv
[2], &l
);
2632 e
= Jim_GetLong(interp
, argv
[3], &l
);
2637 e
= Jim_GetLong(interp
, argv
[4], &l
);
2653 Jim_SetResult(interp
, Jim_NewEmptyStringObj(interp
));
2654 Jim_AppendStrings( interp
, Jim_GetResult(interp
), "Invalid width param, must be 8/16/32", NULL
);
2658 Jim_SetResult(interp
, Jim_NewEmptyStringObj(interp
));
2659 Jim_AppendStrings(interp
, Jim_GetResult(interp
), "mem2array: zero width read?", NULL
);
2662 if ((addr
+ (len
* width
)) < addr
) {
2663 Jim_SetResult(interp
, Jim_NewEmptyStringObj(interp
));
2664 Jim_AppendStrings(interp
, Jim_GetResult(interp
), "mem2array: addr + len - wraps to zero?", NULL
);
2667 /* absurd transfer size? */
2669 Jim_SetResult(interp
, Jim_NewEmptyStringObj(interp
));
2670 Jim_AppendStrings(interp
, Jim_GetResult(interp
), "mem2array: absurd > 64K item request", NULL
);
2675 ((width
== 2) && ((addr
& 1) == 0)) ||
2676 ((width
== 4) && ((addr
& 3) == 0))) {
2680 Jim_SetResult(interp
, Jim_NewEmptyStringObj(interp
));
2681 sprintf(buf
, "mem2array address: 0x%08x is not aligned for %d byte reads", addr
, width
);
2682 Jim_AppendStrings(interp
, Jim_GetResult(interp
), buf
, NULL
);
2686 context
= Jim_GetAssocData(interp
, "context");
2687 if (context
== NULL
)
2689 LOG_ERROR("mem2array: no command context");
2692 target
= get_current_target(context
);
2695 LOG_ERROR("mem2array: no current target");
2706 /* Slurp... in buffer size chunks */
2708 count
= len
; /* in objects.. */
2709 if (count
> (sizeof(buffer
)/width
)) {
2710 count
= (sizeof(buffer
)/width
);
2713 retval
= target
->type
->read_memory( target
, addr
, width
, count
, buffer
);
2714 if (retval
!= ERROR_OK
) {
2716 LOG_ERROR("mem2array: Read @ 0x%08x, w=%d, cnt=%d, failed", addr
, width
, count
);
2717 Jim_SetResult(interp
, Jim_NewEmptyStringObj(interp
));
2718 Jim_AppendStrings(interp
, Jim_GetResult(interp
), "mem2array: cannot read memory", NULL
);
2722 v
= 0; /* shut up gcc */
2723 for (i
= 0 ;i
< count
;i
++, n
++) {
2726 v
= target_buffer_get_u32(target
, &buffer
[i
*width
]);
2729 v
= target_buffer_get_u16(target
, &buffer
[i
*width
]);
2732 v
= buffer
[i
] & 0x0ff;
2735 new_int_array_element(interp
, varname
, n
, v
);
2741 Jim_SetResult(interp
, Jim_NewEmptyStringObj(interp
));
2746 static int get_int_array_element(Jim_Interp
* interp
, const char *varname
, int idx
, u32
*val
)
2749 Jim_Obj
*nameObjPtr
, *valObjPtr
;
2753 namebuf
= alloc_printf("%s(%d)", varname
, idx
);
2757 nameObjPtr
= Jim_NewStringObj(interp
, namebuf
, -1);
2764 Jim_IncrRefCount(nameObjPtr
);
2765 valObjPtr
= Jim_GetVariable(interp
, nameObjPtr
, JIM_ERRMSG
);
2766 Jim_DecrRefCount(interp
, nameObjPtr
);
2768 if (valObjPtr
== NULL
)
2771 result
= Jim_GetLong(interp
, valObjPtr
, &l
);
2772 /* printf("%s(%d) => 0%08x\n", varname, idx, val); */
2777 static int jim_array2mem(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *argv
)
2780 command_context_t
*context
;
2787 const char *varname
;
2789 int i
, n
, e
, retval
;
2791 /* argv[1] = name of array to get the data
2792 * argv[2] = desired width
2793 * argv[3] = memory address
2794 * argv[4] = count to write
2797 Jim_WrongNumArgs(interp
, 1, argv
, "varname width addr nelems");
2800 varname
= Jim_GetString(argv
[1], &len
);
2801 /* given "foo" get space for worse case "foo(%d)" .. add 20 */
2803 e
= Jim_GetLong(interp
, argv
[2], &l
);
2809 e
= Jim_GetLong(interp
, argv
[3], &l
);
2814 e
= Jim_GetLong(interp
, argv
[4], &l
);
2830 Jim_SetResult(interp
, Jim_NewEmptyStringObj(interp
));
2831 Jim_AppendStrings( interp
, Jim_GetResult(interp
), "Invalid width param, must be 8/16/32", NULL
);
2835 Jim_SetResult(interp
, Jim_NewEmptyStringObj(interp
));
2836 Jim_AppendStrings(interp
, Jim_GetResult(interp
), "array2mem: zero width read?", NULL
);
2839 if ((addr
+ (len
* width
)) < addr
) {
2840 Jim_SetResult(interp
, Jim_NewEmptyStringObj(interp
));
2841 Jim_AppendStrings(interp
, Jim_GetResult(interp
), "array2mem: addr + len - wraps to zero?", NULL
);
2844 /* absurd transfer size? */
2846 Jim_SetResult(interp
, Jim_NewEmptyStringObj(interp
));
2847 Jim_AppendStrings(interp
, Jim_GetResult(interp
), "array2mem: absurd > 64K item request", NULL
);
2852 ((width
== 2) && ((addr
& 1) == 0)) ||
2853 ((width
== 4) && ((addr
& 3) == 0))) {
2857 Jim_SetResult(interp
, Jim_NewEmptyStringObj(interp
));
2858 sprintf(buf
, "array2mem address: 0x%08x is not aligned for %d byte reads", addr
, width
);
2859 Jim_AppendStrings(interp
, Jim_GetResult(interp
), buf
, NULL
);
2863 context
= Jim_GetAssocData(interp
, "context");
2864 if (context
== NULL
)
2866 LOG_ERROR("array2mem: no command context");
2869 target
= get_current_target(context
);
2872 LOG_ERROR("array2mem: no current target");
2883 /* Slurp... in buffer size chunks */
2885 count
= len
; /* in objects.. */
2886 if (count
> (sizeof(buffer
)/width
)) {
2887 count
= (sizeof(buffer
)/width
);
2890 v
= 0; /* shut up gcc */
2891 for (i
= 0 ;i
< count
;i
++, n
++) {
2892 get_int_array_element(interp
, varname
, n
, &v
);
2895 target_buffer_set_u32(target
, &buffer
[i
*width
], v
);
2898 target_buffer_set_u16(target
, &buffer
[i
*width
], v
);
2901 buffer
[i
] = v
& 0x0ff;
2907 retval
= target
->type
->write_memory(target
, addr
, width
, count
, buffer
);
2908 if (retval
!= ERROR_OK
) {
2910 LOG_ERROR("array2mem: Write @ 0x%08x, w=%d, cnt=%d, failed", addr
, width
, count
);
2911 Jim_SetResult(interp
, Jim_NewEmptyStringObj(interp
));
2912 Jim_AppendStrings(interp
, Jim_GetResult(interp
), "mem2array: cannot read memory", NULL
);
2918 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)