1 /***************************************************************************
2 * Copyright (C) 2005 by Dominic Rath *
3 * Dominic.Rath@gmx.de *
5 * This program is free software; you can redistribute it and/or modify *
6 * it under the terms of the GNU General Public License as published by *
7 * the Free Software Foundation; either version 2 of the License, or *
8 * (at your option) any later version. *
10 * This program is distributed in the hope that it will be useful, *
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
13 * GNU General Public License for more details. *
15 * You should have received a copy of the GNU General Public License *
16 * along with this program; if not, write to the *
17 * Free Software Foundation, Inc., *
18 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
19 ***************************************************************************/
24 #include "replacements.h"
26 #include "target_request.h"
29 #include "configuration.h"
30 #include "binarybuffer.h"
37 #include <sys/types.h>
45 #include <time_support.h>
50 int cli_target_callback_event_handler(struct target_s
*target
, enum target_event event
, void *priv
);
53 int handle_target_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
54 int handle_targets_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
56 int handle_target_script_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
57 int handle_run_and_halt_time_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
);
82 extern target_type_t arm7tdmi_target
;
83 extern target_type_t arm720t_target
;
84 extern target_type_t arm9tdmi_target
;
85 extern target_type_t arm920t_target
;
86 extern target_type_t arm966e_target
;
87 extern target_type_t arm926ejs_target
;
88 extern target_type_t feroceon_target
;
89 extern target_type_t xscale_target
;
90 extern target_type_t cortexm3_target
;
91 extern target_type_t arm11_target
;
93 target_type_t
*target_types
[] =
108 target_t
*targets
= NULL
;
109 target_event_callback_t
*target_event_callbacks
= NULL
;
110 target_timer_callback_t
*target_timer_callbacks
= NULL
;
112 char *target_state_strings
[] =
121 char *target_debug_reason_strings
[] =
123 "debug request", "breakpoint", "watchpoint",
124 "watchpoint and breakpoint", "single step",
125 "target not halted", "undefined"
128 char *target_endianess_strings
[] =
134 static int target_continous_poll
= 1;
136 /* read a u32 from a buffer in target memory endianness */
137 u32
target_buffer_get_u32(target_t
*target
, u8
*buffer
)
139 if (target
->endianness
== TARGET_LITTLE_ENDIAN
)
140 return le_to_h_u32(buffer
);
142 return be_to_h_u32(buffer
);
145 /* read a u16 from a buffer in target memory endianness */
146 u16
target_buffer_get_u16(target_t
*target
, u8
*buffer
)
148 if (target
->endianness
== TARGET_LITTLE_ENDIAN
)
149 return le_to_h_u16(buffer
);
151 return be_to_h_u16(buffer
);
154 /* write a u32 to a buffer in target memory endianness */
155 void target_buffer_set_u32(target_t
*target
, u8
*buffer
, u32 value
)
157 if (target
->endianness
== TARGET_LITTLE_ENDIAN
)
158 h_u32_to_le(buffer
, value
);
160 h_u32_to_be(buffer
, value
);
163 /* write a u16 to a buffer in target memory endianness */
164 void target_buffer_set_u16(target_t
*target
, u8
*buffer
, u16 value
)
166 if (target
->endianness
== TARGET_LITTLE_ENDIAN
)
167 h_u16_to_le(buffer
, value
);
169 h_u16_to_be(buffer
, value
);
172 /* returns a pointer to the n-th configured target */
173 target_t
* get_target_by_num(int num
)
175 target_t
*target
= targets
;
182 target
= target
->next
;
189 int get_num_by_target(target_t
*query_target
)
191 target_t
*target
= targets
;
196 if (target
== query_target
)
198 target
= target
->next
;
205 target_t
* get_current_target(command_context_t
*cmd_ctx
)
207 target_t
*target
= get_target_by_num(cmd_ctx
->current_target
);
211 LOG_ERROR("BUG: current_target out of bounds");
218 /* Process target initialization, when target entered debug out of reset
219 * the handler is unregistered at the end of this function, so it's only called once
221 int target_init_handler(struct target_s
*target
, enum target_event event
, void *priv
)
224 struct command_context_s
*cmd_ctx
= priv
;
226 if ((event
== TARGET_EVENT_HALTED
) && (target
->reset_script
))
228 target_unregister_event_callback(target_init_handler
, priv
);
230 script
= open_file_from_path(target
->reset_script
, "r");
233 LOG_ERROR("couldn't open script file %s", target
->reset_script
);
237 LOG_INFO("executing reset script '%s'", target
->reset_script
);
238 command_run_file(cmd_ctx
, script
, COMMAND_EXEC
);
241 jtag_execute_queue();
247 int target_run_and_halt_handler(void *priv
)
249 target_t
*target
= priv
;
256 int target_poll(struct target_s
*target
)
258 /* We can't poll until after examine */
259 if (!target
->type
->examined
)
261 /* Fail silently lest we pollute the log */
264 return target
->type
->poll(target
);
267 int target_halt(struct target_s
*target
)
269 /* We can't poll until after examine */
270 if (!target
->type
->examined
)
272 LOG_ERROR("Target not examined yet");
275 return target
->type
->halt(target
);
278 int target_resume(struct target_s
*target
, int current
, u32 address
, int handle_breakpoints
, int debug_execution
)
280 /* We can't poll until after examine */
281 if (!target
->type
->examined
)
283 LOG_ERROR("Target not examined yet");
286 return target
->type
->resume(target
, current
, address
, handle_breakpoints
, debug_execution
);
290 int target_process_reset(struct command_context_s
*cmd_ctx
)
292 int retval
= ERROR_OK
;
294 struct timeval timeout
, now
;
296 jtag
->speed(jtag_speed
);
298 if ((retval
= jtag_init_reset(cmd_ctx
)) != ERROR_OK
)
301 if ((retval
= target_examine(cmd_ctx
)) != ERROR_OK
)
304 /* prepare reset_halt where necessary */
308 if (jtag_reset_config
& RESET_SRST_PULLS_TRST
)
310 switch (target
->reset_mode
)
313 command_print(cmd_ctx
, "nSRST pulls nTRST, falling back to \"reset run_and_halt\"");
314 target
->reset_mode
= RESET_RUN_AND_HALT
;
317 command_print(cmd_ctx
, "nSRST pulls nTRST, falling back to \"reset run_and_init\"");
318 target
->reset_mode
= RESET_RUN_AND_INIT
;
324 target
= target
->next
;
330 /* we have no idea what state the target is in, so we
331 * have to drop working areas
333 target_free_all_working_areas_restore(target
, 0);
334 target
->type
->assert_reset(target
);
335 target
= target
->next
;
337 if ((retval
= jtag_execute_queue()) != ERROR_OK
)
339 LOG_WARNING("JTAG communication failed asserting reset.");
343 /* request target halt if necessary, and schedule further action */
347 switch (target
->reset_mode
)
350 /* nothing to do if target just wants to be run */
352 case RESET_RUN_AND_HALT
:
354 target_register_timer_callback(target_run_and_halt_handler
, target
->run_and_halt_time
, 0, target
);
356 case RESET_RUN_AND_INIT
:
358 target_register_timer_callback(target_run_and_halt_handler
, target
->run_and_halt_time
, 0, target
);
359 target_register_event_callback(target_init_handler
, cmd_ctx
);
366 target_register_event_callback(target_init_handler
, cmd_ctx
);
369 LOG_ERROR("BUG: unknown target->reset_mode");
371 target
= target
->next
;
374 if ((retval
= jtag_execute_queue()) != ERROR_OK
)
376 LOG_WARNING("JTAG communication failed while reset was asserted. Consider using srst_only for reset_config.");
383 target
->type
->deassert_reset(target
);
384 target
= target
->next
;
387 if ((retval
= jtag_execute_queue()) != ERROR_OK
)
389 LOG_WARNING("JTAG communication failed while deasserting reset.");
393 LOG_DEBUG("Waiting for halted stated as approperiate");
395 /* Wait for reset to complete, maximum 5 seconds. */
396 gettimeofday(&timeout
, NULL
);
397 timeval_add_time(&timeout
, 5, 0);
400 gettimeofday(&now
, NULL
);
402 target_call_timer_callbacks_now();
407 LOG_DEBUG("Polling target");
409 if ((target
->reset_mode
== RESET_RUN_AND_INIT
) ||
410 (target
->reset_mode
== RESET_RUN_AND_HALT
) ||
411 (target
->reset_mode
== RESET_HALT
) ||
412 (target
->reset_mode
== RESET_INIT
))
414 if (target
->state
!= TARGET_HALTED
)
416 if ((now
.tv_sec
> timeout
.tv_sec
) || ((now
.tv_sec
== timeout
.tv_sec
) && (now
.tv_usec
>= timeout
.tv_usec
)))
418 LOG_USER("Timed out waiting for halt after reset");
421 /* this will send alive messages on e.g. GDB remote protocol. */
423 LOG_USER_N("%s", ""); /* avoid warning about zero length formatting message*/
427 target
= target
->next
;
429 /* All targets we're waiting for are halted */
437 /* We want any events to be processed before the prompt */
438 target_call_timer_callbacks_now();
440 /* if we timed out we need to unregister these handlers */
444 target_unregister_timer_callback(target_run_and_halt_handler
, target
);
445 target
= target
->next
;
447 target_unregister_event_callback(target_init_handler
, cmd_ctx
);
450 jtag
->speed(jtag_speed_post_reset
);
455 static int default_virt2phys(struct target_s
*target
, u32
virtual, u32
*physical
)
461 static int default_mmu(struct target_s
*target
, int *enabled
)
467 static int default_examine(struct command_context_s
*cmd_ctx
, struct target_s
*target
)
469 target
->type
->examined
= 1;
474 /* Targets that correctly implement init+examine, i.e.
475 * no communication with target during init:
479 int target_examine(struct command_context_s
*cmd_ctx
)
481 int retval
= ERROR_OK
;
482 target_t
*target
= targets
;
485 if ((retval
= target
->type
->examine(cmd_ctx
, target
))!=ERROR_OK
)
487 target
= target
->next
;
493 int target_init(struct command_context_s
*cmd_ctx
)
495 target_t
*target
= targets
;
499 target
->type
->examined
= 0;
500 if (target
->type
->examine
== NULL
)
502 target
->type
->examine
= default_examine
;
505 if (target
->type
->init_target(cmd_ctx
, target
) != ERROR_OK
)
507 LOG_ERROR("target '%s' init failed", target
->type
->name
);
511 /* Set up default functions if none are provided by target */
512 if (target
->type
->virt2phys
== NULL
)
514 target
->type
->virt2phys
= default_virt2phys
;
516 if (target
->type
->mmu
== NULL
)
518 target
->type
->mmu
= default_mmu
;
520 target
= target
->next
;
525 target_register_user_commands(cmd_ctx
);
526 target_register_timer_callback(handle_target
, 100, 1, NULL
);
532 int target_register_event_callback(int (*callback
)(struct target_s
*target
, enum target_event event
, void *priv
), void *priv
)
534 target_event_callback_t
**callbacks_p
= &target_event_callbacks
;
536 if (callback
== NULL
)
538 return ERROR_INVALID_ARGUMENTS
;
543 while ((*callbacks_p
)->next
)
544 callbacks_p
= &((*callbacks_p
)->next
);
545 callbacks_p
= &((*callbacks_p
)->next
);
548 (*callbacks_p
) = malloc(sizeof(target_event_callback_t
));
549 (*callbacks_p
)->callback
= callback
;
550 (*callbacks_p
)->priv
= priv
;
551 (*callbacks_p
)->next
= NULL
;
556 int target_register_timer_callback(int (*callback
)(void *priv
), int time_ms
, int periodic
, void *priv
)
558 target_timer_callback_t
**callbacks_p
= &target_timer_callbacks
;
561 if (callback
== NULL
)
563 return ERROR_INVALID_ARGUMENTS
;
568 while ((*callbacks_p
)->next
)
569 callbacks_p
= &((*callbacks_p
)->next
);
570 callbacks_p
= &((*callbacks_p
)->next
);
573 (*callbacks_p
) = malloc(sizeof(target_timer_callback_t
));
574 (*callbacks_p
)->callback
= callback
;
575 (*callbacks_p
)->periodic
= periodic
;
576 (*callbacks_p
)->time_ms
= time_ms
;
578 gettimeofday(&now
, NULL
);
579 (*callbacks_p
)->when
.tv_usec
= now
.tv_usec
+ (time_ms
% 1000) * 1000;
580 time_ms
-= (time_ms
% 1000);
581 (*callbacks_p
)->when
.tv_sec
= now
.tv_sec
+ (time_ms
/ 1000);
582 if ((*callbacks_p
)->when
.tv_usec
> 1000000)
584 (*callbacks_p
)->when
.tv_usec
= (*callbacks_p
)->when
.tv_usec
- 1000000;
585 (*callbacks_p
)->when
.tv_sec
+= 1;
588 (*callbacks_p
)->priv
= priv
;
589 (*callbacks_p
)->next
= NULL
;
594 int target_unregister_event_callback(int (*callback
)(struct target_s
*target
, enum target_event event
, void *priv
), void *priv
)
596 target_event_callback_t
**p
= &target_event_callbacks
;
597 target_event_callback_t
*c
= target_event_callbacks
;
599 if (callback
== NULL
)
601 return ERROR_INVALID_ARGUMENTS
;
606 target_event_callback_t
*next
= c
->next
;
607 if ((c
->callback
== callback
) && (c
->priv
== priv
))
621 int target_unregister_timer_callback(int (*callback
)(void *priv
), void *priv
)
623 target_timer_callback_t
**p
= &target_timer_callbacks
;
624 target_timer_callback_t
*c
= target_timer_callbacks
;
626 if (callback
== NULL
)
628 return ERROR_INVALID_ARGUMENTS
;
633 target_timer_callback_t
*next
= c
->next
;
634 if ((c
->callback
== callback
) && (c
->priv
== priv
))
648 int target_call_event_callbacks(target_t
*target
, enum target_event event
)
650 target_event_callback_t
*callback
= target_event_callbacks
;
651 target_event_callback_t
*next_callback
;
653 LOG_DEBUG("target event %i", event
);
657 next_callback
= callback
->next
;
658 callback
->callback(target
, event
, callback
->priv
);
659 callback
= next_callback
;
665 static int target_call_timer_callbacks_check_time(int checktime
)
667 target_timer_callback_t
*callback
= target_timer_callbacks
;
668 target_timer_callback_t
*next_callback
;
671 gettimeofday(&now
, NULL
);
675 next_callback
= callback
->next
;
677 if ((!checktime
&&callback
->periodic
)||
678 (((now
.tv_sec
>= callback
->when
.tv_sec
) && (now
.tv_usec
>= callback
->when
.tv_usec
))
679 || (now
.tv_sec
> callback
->when
.tv_sec
)))
681 callback
->callback(callback
->priv
);
682 if (callback
->periodic
)
684 int time_ms
= callback
->time_ms
;
685 callback
->when
.tv_usec
= now
.tv_usec
+ (time_ms
% 1000) * 1000;
686 time_ms
-= (time_ms
% 1000);
687 callback
->when
.tv_sec
= now
.tv_sec
+ time_ms
/ 1000;
688 if (callback
->when
.tv_usec
> 1000000)
690 callback
->when
.tv_usec
= callback
->when
.tv_usec
- 1000000;
691 callback
->when
.tv_sec
+= 1;
695 target_unregister_timer_callback(callback
->callback
, callback
->priv
);
698 callback
= next_callback
;
704 int target_call_timer_callbacks()
706 return target_call_timer_callbacks_check_time(1);
709 /* invoke periodic callbacks immediately */
710 int target_call_timer_callbacks_now()
712 return target_call_timer_callbacks(0);
716 int target_alloc_working_area(struct target_s
*target
, u32 size
, working_area_t
**area
)
718 working_area_t
*c
= target
->working_areas
;
719 working_area_t
*new_wa
= NULL
;
721 /* Reevaluate working area address based on MMU state*/
722 if (target
->working_areas
== NULL
)
726 retval
= target
->type
->mmu(target
, &enabled
);
727 if (retval
!= ERROR_OK
)
733 target
->working_area
= target
->working_area_virt
;
737 target
->working_area
= target
->working_area_phys
;
741 /* only allocate multiples of 4 byte */
744 LOG_ERROR("BUG: code tried to allocate unaligned number of bytes, padding");
745 size
= CEIL(size
, 4);
748 /* see if there's already a matching working area */
751 if ((c
->free
) && (c
->size
== size
))
759 /* if not, allocate a new one */
762 working_area_t
**p
= &target
->working_areas
;
763 u32 first_free
= target
->working_area
;
764 u32 free_size
= target
->working_area_size
;
766 LOG_DEBUG("allocating new working area");
768 c
= target
->working_areas
;
771 first_free
+= c
->size
;
772 free_size
-= c
->size
;
777 if (free_size
< size
)
779 LOG_WARNING("not enough working area available(requested %d, free %d)", size
, free_size
);
780 return ERROR_TARGET_RESOURCE_NOT_AVAILABLE
;
783 new_wa
= malloc(sizeof(working_area_t
));
786 new_wa
->address
= first_free
;
788 if (target
->backup_working_area
)
790 new_wa
->backup
= malloc(new_wa
->size
);
791 target
->type
->read_memory(target
, new_wa
->address
, 4, new_wa
->size
/ 4, new_wa
->backup
);
795 new_wa
->backup
= NULL
;
798 /* put new entry in list */
802 /* mark as used, and return the new (reused) area */
812 int target_free_working_area_restore(struct target_s
*target
, working_area_t
*area
, int restore
)
817 if (restore
&&target
->backup_working_area
)
818 target
->type
->write_memory(target
, area
->address
, 4, area
->size
/ 4, area
->backup
);
822 /* mark user pointer invalid */
829 int target_free_working_area(struct target_s
*target
, working_area_t
*area
)
831 return target_free_working_area_restore(target
, area
, 1);
834 int target_free_all_working_areas_restore(struct target_s
*target
, int restore
)
836 working_area_t
*c
= target
->working_areas
;
840 working_area_t
*next
= c
->next
;
841 target_free_working_area_restore(target
, c
, restore
);
851 target
->working_areas
= NULL
;
856 int target_free_all_working_areas(struct target_s
*target
)
858 return target_free_all_working_areas_restore(target
, 1);
861 int target_register_commands(struct command_context_s
*cmd_ctx
)
863 register_command(cmd_ctx
, NULL
, "target", handle_target_command
, COMMAND_CONFIG
, "target <cpu> [reset_init default - DEPRECATED] <chainpos> <endianness> <variant> [cpu type specifc args]");
864 register_command(cmd_ctx
, NULL
, "targets", handle_targets_command
, COMMAND_EXEC
, NULL
);
865 register_command(cmd_ctx
, NULL
, "target_script", handle_target_script_command
, COMMAND_CONFIG
, NULL
);
866 register_command(cmd_ctx
, NULL
, "run_and_halt_time", handle_run_and_halt_time_command
, COMMAND_CONFIG
, "<target> <run time ms>");
867 register_command(cmd_ctx
, NULL
, "working_area", handle_working_area_command
, COMMAND_ANY
, "working_area <target#> <address> <size> <'backup'|'nobackup'> [virtual address]");
868 register_command(cmd_ctx
, NULL
, "virt2phys", handle_virt2phys_command
, COMMAND_ANY
, "virt2phys <virtual address>");
869 register_command(cmd_ctx
, NULL
, "profile", handle_profile_command
, COMMAND_EXEC
, "PRELIMINARY! - profile <seconds> <gmon.out>");
874 int target_arch_state(struct target_s
*target
)
879 LOG_USER("No target has been configured");
883 LOG_USER("target state: %s", target_state_strings
[target
->state
]);
885 if (target
->state
!=TARGET_HALTED
)
888 retval
=target
->type
->arch_state(target
);
892 /* Single aligned words are guaranteed to use 16 or 32 bit access
893 * mode respectively, otherwise data is handled as quickly as
896 int target_write_buffer(struct target_s
*target
, u32 address
, u32 size
, u8
*buffer
)
900 LOG_DEBUG("writing buffer of %i byte at 0x%8.8x", size
, address
);
902 if (((address
% 2) == 0) && (size
== 2))
904 return target
->type
->write_memory(target
, address
, 2, 1, buffer
);
907 /* handle unaligned head bytes */
910 int unaligned
= 4 - (address
% 4);
912 if (unaligned
> size
)
915 if ((retval
= target
->type
->write_memory(target
, address
, 1, unaligned
, buffer
)) != ERROR_OK
)
919 address
+= unaligned
;
923 /* handle aligned words */
926 int aligned
= size
- (size
% 4);
928 /* use bulk writes above a certain limit. This may have to be changed */
931 if ((retval
= target
->type
->bulk_write_memory(target
, address
, aligned
/ 4, buffer
)) != ERROR_OK
)
936 if ((retval
= target
->type
->write_memory(target
, address
, 4, aligned
/ 4, buffer
)) != ERROR_OK
)
945 /* handle tail writes of less than 4 bytes */
948 if ((retval
= target
->type
->write_memory(target
, address
, 1, size
, buffer
)) != ERROR_OK
)
956 /* Single aligned words are guaranteed to use 16 or 32 bit access
957 * mode respectively, otherwise data is handled as quickly as
960 int target_read_buffer(struct target_s
*target
, u32 address
, u32 size
, u8
*buffer
)
964 LOG_DEBUG("reading buffer of %i byte at 0x%8.8x", size
, address
);
966 if (((address
% 2) == 0) && (size
== 2))
968 return target
->type
->read_memory(target
, address
, 2, 1, buffer
);
971 /* handle unaligned head bytes */
974 int unaligned
= 4 - (address
% 4);
976 if (unaligned
> size
)
979 if ((retval
= target
->type
->read_memory(target
, address
, 1, unaligned
, buffer
)) != ERROR_OK
)
983 address
+= unaligned
;
987 /* handle aligned words */
990 int aligned
= size
- (size
% 4);
992 if ((retval
= target
->type
->read_memory(target
, address
, 4, aligned
/ 4, buffer
)) != ERROR_OK
)
1000 /* handle tail writes of less than 4 bytes */
1003 if ((retval
= target
->type
->read_memory(target
, address
, 1, size
, buffer
)) != ERROR_OK
)
1010 int target_checksum_memory(struct target_s
*target
, u32 address
, u32 size
, u32
* crc
)
1017 if ((retval
= target
->type
->checksum_memory(target
, address
,
1018 size
, &checksum
)) == ERROR_TARGET_RESOURCE_NOT_AVAILABLE
)
1020 buffer
= malloc(size
);
1023 LOG_ERROR("error allocating buffer for section (%d bytes)", size
);
1024 return ERROR_INVALID_ARGUMENTS
;
1026 retval
= target_read_buffer(target
, address
, size
, buffer
);
1027 if (retval
!= ERROR_OK
)
1033 /* convert to target endianess */
1034 for (i
= 0; i
< (size
/sizeof(u32
)); i
++)
1037 target_data
= target_buffer_get_u32(target
, &buffer
[i
*sizeof(u32
)]);
1038 target_buffer_set_u32(target
, &buffer
[i
*sizeof(u32
)], target_data
);
1041 retval
= image_calculate_checksum( buffer
, size
, &checksum
);
1050 int target_read_u32(struct target_s
*target
, u32 address
, u32
*value
)
1054 int retval
= target
->type
->read_memory(target
, address
, 4, 1, value_buf
);
1056 if (retval
== ERROR_OK
)
1058 *value
= target_buffer_get_u32(target
, value_buf
);
1059 LOG_DEBUG("address: 0x%8.8x, value: 0x%8.8x", address
, *value
);
1064 LOG_DEBUG("address: 0x%8.8x failed", address
);
1070 int target_read_u16(struct target_s
*target
, u32 address
, u16
*value
)
1074 int retval
= target
->type
->read_memory(target
, address
, 2, 1, value_buf
);
1076 if (retval
== ERROR_OK
)
1078 *value
= target_buffer_get_u16(target
, value_buf
);
1079 LOG_DEBUG("address: 0x%8.8x, value: 0x%4.4x", address
, *value
);
1084 LOG_DEBUG("address: 0x%8.8x failed", address
);
1090 int target_read_u8(struct target_s
*target
, u32 address
, u8
*value
)
1092 int retval
= target
->type
->read_memory(target
, address
, 1, 1, value
);
1094 if (retval
== ERROR_OK
)
1096 LOG_DEBUG("address: 0x%8.8x, value: 0x%2.2x", address
, *value
);
1101 LOG_DEBUG("address: 0x%8.8x failed", address
);
1107 int target_write_u32(struct target_s
*target
, u32 address
, u32 value
)
1112 LOG_DEBUG("address: 0x%8.8x, value: 0x%8.8x", address
, value
);
1114 target_buffer_set_u32(target
, value_buf
, value
);
1115 if ((retval
= target
->type
->write_memory(target
, address
, 4, 1, value_buf
)) != ERROR_OK
)
1117 LOG_DEBUG("failed: %i", retval
);
1123 int target_write_u16(struct target_s
*target
, u32 address
, u16 value
)
1128 LOG_DEBUG("address: 0x%8.8x, value: 0x%8.8x", address
, value
);
1130 target_buffer_set_u16(target
, value_buf
, value
);
1131 if ((retval
= target
->type
->write_memory(target
, address
, 2, 1, value_buf
)) != ERROR_OK
)
1133 LOG_DEBUG("failed: %i", retval
);
1139 int target_write_u8(struct target_s
*target
, u32 address
, u8 value
)
1143 LOG_DEBUG("address: 0x%8.8x, value: 0x%2.2x", address
, value
);
1145 if ((retval
= target
->type
->read_memory(target
, address
, 1, 1, &value
)) != ERROR_OK
)
1147 LOG_DEBUG("failed: %i", retval
);
1153 int target_register_user_commands(struct command_context_s
*cmd_ctx
)
1155 register_command(cmd_ctx
, NULL
, "reg", handle_reg_command
, COMMAND_EXEC
, NULL
);
1156 register_command(cmd_ctx
, NULL
, "poll", handle_poll_command
, COMMAND_EXEC
, "poll target state");
1157 register_command(cmd_ctx
, NULL
, "wait_halt", handle_wait_halt_command
, COMMAND_EXEC
, "wait for target halt [time (s)]");
1158 register_command(cmd_ctx
, NULL
, "halt", handle_halt_command
, COMMAND_EXEC
, "halt target");
1159 register_command(cmd_ctx
, NULL
, "resume", handle_resume_command
, COMMAND_EXEC
, "resume target [addr]");
1160 register_command(cmd_ctx
, NULL
, "step", handle_step_command
, COMMAND_EXEC
, "step one instruction from current PC or [addr]");
1161 register_command(cmd_ctx
, NULL
, "reset", handle_reset_command
, COMMAND_EXEC
, "reset target [run|halt|init|run_and_halt|run_and_init]");
1162 register_command(cmd_ctx
, NULL
, "soft_reset_halt", handle_soft_reset_halt_command
, COMMAND_EXEC
, "halt the target and do a soft reset");
1164 register_command(cmd_ctx
, NULL
, "mdw", handle_md_command
, COMMAND_EXEC
, "display memory words <addr> [count]");
1165 register_command(cmd_ctx
, NULL
, "mdh", handle_md_command
, COMMAND_EXEC
, "display memory half-words <addr> [count]");
1166 register_command(cmd_ctx
, NULL
, "mdb", handle_md_command
, COMMAND_EXEC
, "display memory bytes <addr> [count]");
1168 register_command(cmd_ctx
, NULL
, "mww", handle_mw_command
, COMMAND_EXEC
, "write memory word <addr> <value> [count]");
1169 register_command(cmd_ctx
, NULL
, "mwh", handle_mw_command
, COMMAND_EXEC
, "write memory half-word <addr> <value> [count]");
1170 register_command(cmd_ctx
, NULL
, "mwb", handle_mw_command
, COMMAND_EXEC
, "write memory byte <addr> <value> [count]");
1172 register_command(cmd_ctx
, NULL
, "bp", handle_bp_command
, COMMAND_EXEC
, "set breakpoint <address> <length> [hw]");
1173 register_command(cmd_ctx
, NULL
, "rbp", handle_rbp_command
, COMMAND_EXEC
, "remove breakpoint <adress>");
1174 register_command(cmd_ctx
, NULL
, "wp", handle_wp_command
, COMMAND_EXEC
, "set watchpoint <address> <length> <r/w/a> [value] [mask]");
1175 register_command(cmd_ctx
, NULL
, "rwp", handle_rwp_command
, COMMAND_EXEC
, "remove watchpoint <adress>");
1177 register_command(cmd_ctx
, NULL
, "load_image", handle_load_image_command
, COMMAND_EXEC
, "load_image <file> <address> ['bin'|'ihex'|'elf'|'s19']");
1178 register_command(cmd_ctx
, NULL
, "dump_image", handle_dump_image_command
, COMMAND_EXEC
, "dump_image <file> <address> <size>");
1179 register_command(cmd_ctx
, NULL
, "verify_image", handle_verify_image_command
, COMMAND_EXEC
, "verify_image <file> [offset] [type]");
1180 register_command(cmd_ctx
, NULL
, "load_binary", handle_load_image_command
, COMMAND_EXEC
, "[DEPRECATED] load_binary <file> <address>");
1181 register_command(cmd_ctx
, NULL
, "dump_binary", handle_dump_image_command
, COMMAND_EXEC
, "[DEPRECATED] dump_binary <file> <address> <size>");
1183 target_request_register_commands(cmd_ctx
);
1184 trace_register_commands(cmd_ctx
);
1189 int handle_targets_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1191 target_t
*target
= targets
;
1196 int num
= strtoul(args
[0], NULL
, 0);
1201 target
= target
->next
;
1205 cmd_ctx
->current_target
= num
;
1207 command_print(cmd_ctx
, "%i is out of bounds, only %i targets are configured", num
, count
);
1214 command_print(cmd_ctx
, "%i: %s (%s), state: %s", count
++, target
->type
->name
, target_endianess_strings
[target
->endianness
], target_state_strings
[target
->state
]);
1215 target
= target
->next
;
1221 int handle_target_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1228 return ERROR_COMMAND_SYNTAX_ERROR
;
1231 /* search for the specified target */
1232 if (args
[0] && (args
[0][0] != 0))
1234 for (i
= 0; target_types
[i
]; i
++)
1236 if (strcmp(args
[0], target_types
[i
]->name
) == 0)
1238 target_t
**last_target_p
= &targets
;
1240 /* register target specific commands */
1241 if (target_types
[i
]->register_commands(cmd_ctx
) != ERROR_OK
)
1243 LOG_ERROR("couldn't register '%s' commands", args
[0]);
1249 while ((*last_target_p
)->next
)
1250 last_target_p
= &((*last_target_p
)->next
);
1251 last_target_p
= &((*last_target_p
)->next
);
1254 *last_target_p
= malloc(sizeof(target_t
));
1256 (*last_target_p
)->type
= target_types
[i
];
1258 if (strcmp(args
[1], "big") == 0)
1259 (*last_target_p
)->endianness
= TARGET_BIG_ENDIAN
;
1260 else if (strcmp(args
[1], "little") == 0)
1261 (*last_target_p
)->endianness
= TARGET_LITTLE_ENDIAN
;
1264 LOG_ERROR("endianness must be either 'little' or 'big', not '%s'", args
[1]);
1265 return ERROR_COMMAND_SYNTAX_ERROR
;
1268 /* what to do on a target reset */
1269 (*last_target_p
)->reset_mode
= RESET_INIT
; /* default */
1270 if (strcmp(args
[2], "reset_halt") == 0)
1271 (*last_target_p
)->reset_mode
= RESET_HALT
;
1272 else if (strcmp(args
[2], "reset_run") == 0)
1273 (*last_target_p
)->reset_mode
= RESET_RUN
;
1274 else if (strcmp(args
[2], "reset_init") == 0)
1275 (*last_target_p
)->reset_mode
= RESET_INIT
;
1276 else if (strcmp(args
[2], "run_and_halt") == 0)
1277 (*last_target_p
)->reset_mode
= RESET_RUN_AND_HALT
;
1278 else if (strcmp(args
[2], "run_and_init") == 0)
1279 (*last_target_p
)->reset_mode
= RESET_RUN_AND_INIT
;
1282 /* Kludge! we want to make this reset arg optional while remaining compatible! */
1286 (*last_target_p
)->run_and_halt_time
= 1000; /* default 1s */
1288 (*last_target_p
)->reset_script
= NULL
;
1289 (*last_target_p
)->post_halt_script
= NULL
;
1290 (*last_target_p
)->pre_resume_script
= NULL
;
1291 (*last_target_p
)->gdb_program_script
= NULL
;
1293 (*last_target_p
)->working_area
= 0x0;
1294 (*last_target_p
)->working_area_size
= 0x0;
1295 (*last_target_p
)->working_areas
= NULL
;
1296 (*last_target_p
)->backup_working_area
= 0;
1298 (*last_target_p
)->state
= TARGET_UNKNOWN
;
1299 (*last_target_p
)->debug_reason
= DBG_REASON_UNDEFINED
;
1300 (*last_target_p
)->reg_cache
= NULL
;
1301 (*last_target_p
)->breakpoints
= NULL
;
1302 (*last_target_p
)->watchpoints
= NULL
;
1303 (*last_target_p
)->next
= NULL
;
1304 (*last_target_p
)->arch_info
= NULL
;
1306 /* initialize trace information */
1307 (*last_target_p
)->trace_info
= malloc(sizeof(trace_t
));
1308 (*last_target_p
)->trace_info
->num_trace_points
= 0;
1309 (*last_target_p
)->trace_info
->trace_points_size
= 0;
1310 (*last_target_p
)->trace_info
->trace_points
= NULL
;
1311 (*last_target_p
)->trace_info
->trace_history_size
= 0;
1312 (*last_target_p
)->trace_info
->trace_history
= NULL
;
1313 (*last_target_p
)->trace_info
->trace_history_pos
= 0;
1314 (*last_target_p
)->trace_info
->trace_history_overflowed
= 0;
1316 (*last_target_p
)->dbgmsg
= NULL
;
1317 (*last_target_p
)->dbg_msg_enabled
= 0;
1319 (*last_target_p
)->type
->target_command(cmd_ctx
, cmd
, args
, argc
, *last_target_p
);
1327 /* no matching target found */
1330 LOG_ERROR("target '%s' not found", args
[0]);
1331 return ERROR_COMMAND_SYNTAX_ERROR
;
1337 /* usage: target_script <target#> <event> <script_file> */
1338 int handle_target_script_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1340 target_t
*target
= NULL
;
1344 LOG_ERROR("incomplete target_script command");
1345 return ERROR_COMMAND_SYNTAX_ERROR
;
1348 target
= get_target_by_num(strtoul(args
[0], NULL
, 0));
1352 return ERROR_COMMAND_SYNTAX_ERROR
;
1355 if (strcmp(args
[1], "reset") == 0)
1357 if (target
->reset_script
)
1358 free(target
->reset_script
);
1359 target
->reset_script
= strdup(args
[2]);
1361 else if (strcmp(args
[1], "post_halt") == 0)
1363 if (target
->post_halt_script
)
1364 free(target
->post_halt_script
);
1365 target
->post_halt_script
= strdup(args
[2]);
1367 else if (strcmp(args
[1], "pre_resume") == 0)
1369 if (target
->pre_resume_script
)
1370 free(target
->pre_resume_script
);
1371 target
->pre_resume_script
= strdup(args
[2]);
1373 else if (strcmp(args
[1], "gdb_program_config") == 0)
1375 if (target
->gdb_program_script
)
1376 free(target
->gdb_program_script
);
1377 target
->gdb_program_script
= strdup(args
[2]);
1381 LOG_ERROR("unknown event type: '%s", args
[1]);
1382 return ERROR_COMMAND_SYNTAX_ERROR
;
1388 int handle_run_and_halt_time_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1390 target_t
*target
= NULL
;
1394 return ERROR_COMMAND_SYNTAX_ERROR
;
1397 target
= get_target_by_num(strtoul(args
[0], NULL
, 0));
1400 return ERROR_COMMAND_SYNTAX_ERROR
;
1403 target
->run_and_halt_time
= strtoul(args
[1], NULL
, 0);
1408 int handle_working_area_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1410 target_t
*target
= NULL
;
1412 if ((argc
< 4) || (argc
> 5))
1414 return ERROR_COMMAND_SYNTAX_ERROR
;
1417 target
= get_target_by_num(strtoul(args
[0], NULL
, 0));
1420 return ERROR_COMMAND_SYNTAX_ERROR
;
1422 target_free_all_working_areas(target
);
1424 target
->working_area_phys
= target
->working_area_virt
= strtoul(args
[1], NULL
, 0);
1427 target
->working_area_virt
= strtoul(args
[4], NULL
, 0);
1429 target
->working_area_size
= strtoul(args
[2], NULL
, 0);
1431 if (strcmp(args
[3], "backup") == 0)
1433 target
->backup_working_area
= 1;
1435 else if (strcmp(args
[3], "nobackup") == 0)
1437 target
->backup_working_area
= 0;
1441 LOG_ERROR("unrecognized <backup|nobackup> argument (%s)", args
[3]);
1442 return ERROR_COMMAND_SYNTAX_ERROR
;
1449 /* process target state changes */
1450 int handle_target(void *priv
)
1452 target_t
*target
= targets
;
1456 if (target_continous_poll
)
1458 /* polling may fail silently until the target has been examined */
1459 target_poll(target
);
1462 target
= target
->next
;
1468 int handle_reg_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1477 target
= get_current_target(cmd_ctx
);
1479 /* list all available registers for the current target */
1482 reg_cache_t
*cache
= target
->reg_cache
;
1488 for (i
= 0; i
< cache
->num_regs
; i
++)
1490 value
= buf_to_str(cache
->reg_list
[i
].value
, cache
->reg_list
[i
].size
, 16);
1491 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
);
1494 cache
= cache
->next
;
1500 /* access a single register by its ordinal number */
1501 if ((args
[0][0] >= '0') && (args
[0][0] <= '9'))
1503 int num
= strtoul(args
[0], NULL
, 0);
1504 reg_cache_t
*cache
= target
->reg_cache
;
1510 for (i
= 0; i
< cache
->num_regs
; i
++)
1514 reg
= &cache
->reg_list
[i
];
1520 cache
= cache
->next
;
1525 command_print(cmd_ctx
, "%i is out of bounds, the current target has only %i registers (0 - %i)", num
, count
, count
- 1);
1528 } else /* access a single register by its name */
1530 reg
= register_get_by_name(target
->reg_cache
, args
[0], 1);
1534 command_print(cmd_ctx
, "register %s not found in current target", args
[0]);
1539 /* display a register */
1540 if ((argc
== 1) || ((argc
== 2) && !((args
[1][0] >= '0') && (args
[1][0] <= '9'))))
1542 if ((argc
== 2) && (strcmp(args
[1], "force") == 0))
1545 if (reg
->valid
== 0)
1547 reg_arch_type_t
*arch_type
= register_get_arch_type(reg
->arch_type
);
1548 if (arch_type
== NULL
)
1550 LOG_ERROR("BUG: encountered unregistered arch type");
1553 arch_type
->get(reg
);
1555 value
= buf_to_str(reg
->value
, reg
->size
, 16);
1556 command_print(cmd_ctx
, "%s (/%i): 0x%s", reg
->name
, reg
->size
, value
);
1561 /* set register value */
1564 u8
*buf
= malloc(CEIL(reg
->size
, 8));
1565 str_to_buf(args
[1], strlen(args
[1]), buf
, reg
->size
, 0);
1567 reg_arch_type_t
*arch_type
= register_get_arch_type(reg
->arch_type
);
1568 if (arch_type
== NULL
)
1570 LOG_ERROR("BUG: encountered unregistered arch type");
1574 arch_type
->set(reg
, buf
);
1576 value
= buf_to_str(reg
->value
, reg
->size
, 16);
1577 command_print(cmd_ctx
, "%s (/%i): 0x%s", reg
->name
, reg
->size
, value
);
1585 command_print(cmd_ctx
, "usage: reg <#|name> [value]");
1590 static int wait_state(struct command_context_s
*cmd_ctx
, char *cmd
, enum target_state state
, int ms
);
1592 int handle_poll_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1594 target_t
*target
= get_current_target(cmd_ctx
);
1598 target_poll(target
);
1599 target_arch_state(target
);
1603 if (strcmp(args
[0], "on") == 0)
1605 target_continous_poll
= 1;
1607 else if (strcmp(args
[0], "off") == 0)
1609 target_continous_poll
= 0;
1613 command_print(cmd_ctx
, "arg is \"on\" or \"off\"");
1621 int handle_wait_halt_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1629 ms
= strtoul(args
[0], &end
, 0) * 1000;
1632 command_print(cmd_ctx
, "usage: %s [seconds]", cmd
);
1637 return wait_state(cmd_ctx
, cmd
, TARGET_HALTED
, ms
);
1640 static void target_process_events(struct command_context_s
*cmd_ctx
)
1642 target_t
*target
= get_current_target(cmd_ctx
);
1643 target_poll(target
);
1644 target_call_timer_callbacks_now();
1647 static int wait_state(struct command_context_s
*cmd_ctx
, char *cmd
, enum target_state state
, int ms
)
1650 struct timeval timeout
, now
;
1652 gettimeofday(&timeout
, NULL
);
1653 timeval_add_time(&timeout
, 0, ms
* 1000);
1655 target_t
*target
= get_current_target(cmd_ctx
);
1658 if ((retval
=target_poll(target
))!=ERROR_OK
)
1660 target_call_timer_callbacks_now();
1661 if (target
->state
== state
)
1668 command_print(cmd_ctx
, "waiting for target %s...", target_state_strings
[state
]);
1671 gettimeofday(&now
, NULL
);
1672 if ((now
.tv_sec
> timeout
.tv_sec
) || ((now
.tv_sec
== timeout
.tv_sec
) && (now
.tv_usec
>= timeout
.tv_usec
)))
1674 LOG_ERROR("timed out while waiting for target %s", target_state_strings
[state
]);
1682 int handle_halt_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1685 target_t
*target
= get_current_target(cmd_ctx
);
1689 if ((retval
= target_halt(target
)) != ERROR_OK
)
1694 return handle_wait_halt_command(cmd_ctx
, cmd
, args
, argc
);
1698 int handle_soft_reset_halt_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1700 target_t
*target
= get_current_target(cmd_ctx
);
1702 LOG_USER("requesting target halt and executing a soft reset");
1704 target
->type
->soft_reset_halt(target
);
1709 int handle_reset_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1711 target_t
*target
= get_current_target(cmd_ctx
);
1712 enum target_reset_mode reset_mode
= target
->reset_mode
;
1713 enum target_reset_mode save
= target
->reset_mode
;
1719 if (strcmp("run", args
[0]) == 0)
1720 reset_mode
= RESET_RUN
;
1721 else if (strcmp("halt", args
[0]) == 0)
1722 reset_mode
= RESET_HALT
;
1723 else if (strcmp("init", args
[0]) == 0)
1724 reset_mode
= RESET_INIT
;
1725 else if (strcmp("run_and_halt", args
[0]) == 0)
1727 reset_mode
= RESET_RUN_AND_HALT
;
1730 target
->run_and_halt_time
= strtoul(args
[1], NULL
, 0);
1733 else if (strcmp("run_and_init", args
[0]) == 0)
1735 reset_mode
= RESET_RUN_AND_INIT
;
1738 target
->run_and_halt_time
= strtoul(args
[1], NULL
, 0);
1743 command_print(cmd_ctx
, "usage: reset ['run', 'halt', 'init', 'run_and_halt', 'run_and_init]");
1748 /* temporarily modify mode of current reset target */
1749 target
->reset_mode
= reset_mode
;
1751 /* reset *all* targets */
1752 target_process_reset(cmd_ctx
);
1754 /* Restore default reset mode for this target */
1755 target
->reset_mode
= save
;
1760 int handle_resume_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1763 target_t
*target
= get_current_target(cmd_ctx
);
1766 retval
= target_resume(target
, 1, 0, 1, 0); /* current pc, addr = 0, handle breakpoints, not debugging */
1768 retval
= target_resume(target
, 0, strtoul(args
[0], NULL
, 0), 1, 0); /* addr = args[0], handle breakpoints, not debugging */
1771 return ERROR_COMMAND_SYNTAX_ERROR
;
1774 target_process_events(cmd_ctx
);
1779 int handle_step_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1781 target_t
*target
= get_current_target(cmd_ctx
);
1786 target
->type
->step(target
, 1, 0, 1); /* current pc, addr = 0, handle breakpoints */
1789 target
->type
->step(target
, 0, strtoul(args
[0], NULL
, 0), 1); /* addr = args[0], handle breakpoints */
1794 int handle_md_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1796 const int line_bytecnt
= 32;
1809 target_t
*target
= get_current_target(cmd_ctx
);
1815 count
= strtoul(args
[1], NULL
, 0);
1817 address
= strtoul(args
[0], NULL
, 0);
1823 size
= 4; line_modulo
= line_bytecnt
/ 4;
1826 size
= 2; line_modulo
= line_bytecnt
/ 2;
1829 size
= 1; line_modulo
= line_bytecnt
/ 1;
1835 buffer
= calloc(count
, size
);
1836 retval
= target
->type
->read_memory(target
, address
, size
, count
, buffer
);
1837 if (retval
== ERROR_OK
)
1841 for (i
= 0; i
< count
; i
++)
1843 if (i
%line_modulo
== 0)
1844 output_len
+= snprintf(output
+ output_len
, 128 - output_len
, "0x%8.8x: ", address
+ (i
*size
));
1849 output_len
+= snprintf(output
+ output_len
, 128 - output_len
, "%8.8x ", target_buffer_get_u32(target
, &buffer
[i
*4]));
1852 output_len
+= snprintf(output
+ output_len
, 128 - output_len
, "%4.4x ", target_buffer_get_u16(target
, &buffer
[i
*2]));
1855 output_len
+= snprintf(output
+ output_len
, 128 - output_len
, "%2.2x ", buffer
[i
*1]);
1859 if ((i
%line_modulo
== line_modulo
-1) || (i
== count
- 1))
1861 command_print(cmd_ctx
, output
);
1867 LOG_ERROR("Failure examining memory");
1875 int handle_mw_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1882 target_t
*target
= get_current_target(cmd_ctx
);
1885 if ((argc
< 2) || (argc
> 3))
1886 return ERROR_COMMAND_SYNTAX_ERROR
;
1888 address
= strtoul(args
[0], NULL
, 0);
1889 value
= strtoul(args
[1], NULL
, 0);
1891 count
= strtoul(args
[2], NULL
, 0);
1898 target_buffer_set_u32(target
, value_buf
, value
);
1902 target_buffer_set_u16(target
, value_buf
, value
);
1906 value_buf
[0] = value
;
1909 return ERROR_COMMAND_SYNTAX_ERROR
;
1911 for (i
=0; i
<count
; i
++)
1917 retval
= target
->type
->write_memory(target
, address
+ i
*wordsize
, 4, 1, value_buf
);
1920 retval
= target
->type
->write_memory(target
, address
+ i
*wordsize
, 2, 1, value_buf
);
1923 retval
= target
->type
->write_memory(target
, address
+ i
*wordsize
, 1, 1, value_buf
);
1928 if (retval
!=ERROR_OK
)
1938 int handle_load_image_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1948 duration_t duration
;
1949 char *duration_text
;
1951 target_t
*target
= get_current_target(cmd_ctx
);
1955 command_print(cmd_ctx
, "usage: load_image <filename> [address] [type]");
1959 /* a base address isn't always necessary, default to 0x0 (i.e. don't relocate) */
1962 image
.base_address_set
= 1;
1963 image
.base_address
= strtoul(args
[1], NULL
, 0);
1967 image
.base_address_set
= 0;
1970 image
.start_address_set
= 0;
1972 duration_start_measure(&duration
);
1974 if (image_open(&image
, args
[0], (argc
>= 3) ? args
[2] : NULL
) != ERROR_OK
)
1981 for (i
= 0; i
< image
.num_sections
; i
++)
1983 buffer
= malloc(image
.sections
[i
].size
);
1986 command_print(cmd_ctx
, "error allocating buffer for section (%d bytes)", image
.sections
[i
].size
);
1990 if ((retval
= image_read_section(&image
, i
, 0x0, image
.sections
[i
].size
, buffer
, &buf_cnt
)) != ERROR_OK
)
1995 if ((retval
= target_write_buffer(target
, image
.sections
[i
].base_address
, buf_cnt
, buffer
)) != ERROR_OK
)
2000 image_size
+= buf_cnt
;
2001 command_print(cmd_ctx
, "%u byte written at address 0x%8.8x", buf_cnt
, image
.sections
[i
].base_address
);
2006 duration_stop_measure(&duration
, &duration_text
);
2007 if (retval
==ERROR_OK
)
2009 command_print(cmd_ctx
, "downloaded %u byte in %s", image_size
, duration_text
);
2011 free(duration_text
);
2013 image_close(&image
);
2019 int handle_dump_image_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2026 int retval
=ERROR_OK
;
2028 duration_t duration
;
2029 char *duration_text
;
2031 target_t
*target
= get_current_target(cmd_ctx
);
2035 command_print(cmd_ctx
, "usage: dump_image <filename> <address> <size>");
2039 address
= strtoul(args
[1], NULL
, 0);
2040 size
= strtoul(args
[2], NULL
, 0);
2042 if ((address
& 3) || (size
& 3))
2044 command_print(cmd_ctx
, "only 32-bit aligned address and size are supported");
2048 if (fileio_open(&fileio
, args
[0], FILEIO_WRITE
, FILEIO_BINARY
) != ERROR_OK
)
2053 duration_start_measure(&duration
);
2058 u32 this_run_size
= (size
> 560) ? 560 : size
;
2060 retval
= target
->type
->read_memory(target
, address
, 4, this_run_size
/ 4, buffer
);
2061 if (retval
!= ERROR_OK
)
2066 retval
= fileio_write(&fileio
, this_run_size
, buffer
, &size_written
);
2067 if (retval
!= ERROR_OK
)
2072 size
-= this_run_size
;
2073 address
+= this_run_size
;
2076 fileio_close(&fileio
);
2078 duration_stop_measure(&duration
, &duration_text
);
2079 if (retval
==ERROR_OK
)
2081 command_print(cmd_ctx
, "dumped %"PRIi64
" byte in %s", fileio
.size
, duration_text
);
2083 free(duration_text
);
2088 int handle_verify_image_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2096 u32 mem_checksum
= 0;
2100 duration_t duration
;
2101 char *duration_text
;
2103 target_t
*target
= get_current_target(cmd_ctx
);
2107 return ERROR_COMMAND_SYNTAX_ERROR
;
2112 LOG_ERROR("no target selected");
2116 duration_start_measure(&duration
);
2120 image
.base_address_set
= 1;
2121 image
.base_address
= strtoul(args
[1], NULL
, 0);
2125 image
.base_address_set
= 0;
2126 image
.base_address
= 0x0;
2129 image
.start_address_set
= 0;
2131 if ((retval
=image_open(&image
, args
[0], (argc
== 3) ? args
[2] : NULL
)) != ERROR_OK
)
2138 for (i
= 0; i
< image
.num_sections
; i
++)
2140 buffer
= malloc(image
.sections
[i
].size
);
2143 command_print(cmd_ctx
, "error allocating buffer for section (%d bytes)", image
.sections
[i
].size
);
2146 if ((retval
= image_read_section(&image
, i
, 0x0, image
.sections
[i
].size
, buffer
, &buf_cnt
)) != ERROR_OK
)
2152 /* calculate checksum of image */
2153 image_calculate_checksum( buffer
, buf_cnt
, &checksum
);
2155 retval
= target_checksum_memory(target
, image
.sections
[i
].base_address
, buf_cnt
, &mem_checksum
);
2156 if( retval
!= ERROR_OK
)
2162 if( checksum
!= mem_checksum
)
2164 /* failed crc checksum, fall back to a binary compare */
2167 command_print(cmd_ctx
, "checksum mismatch - attempting binary compare");
2169 data
= (u8
*)malloc(buf_cnt
);
2171 /* Can we use 32bit word accesses? */
2173 int count
= buf_cnt
;
2174 if ((count
% 4) == 0)
2179 retval
= target
->type
->read_memory(target
, image
.sections
[i
].base_address
, size
, count
, data
);
2180 if (retval
== ERROR_OK
)
2183 for (t
= 0; t
< buf_cnt
; t
++)
2185 if (data
[t
] != buffer
[t
])
2187 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
]);
2200 image_size
+= buf_cnt
;
2203 duration_stop_measure(&duration
, &duration_text
);
2204 if (retval
==ERROR_OK
)
2206 command_print(cmd_ctx
, "verified %u bytes in %s", image_size
, duration_text
);
2208 free(duration_text
);
2210 image_close(&image
);
2215 int handle_bp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2218 target_t
*target
= get_current_target(cmd_ctx
);
2222 breakpoint_t
*breakpoint
= target
->breakpoints
;
2226 if (breakpoint
->type
== BKPT_SOFT
)
2228 char* buf
= buf_to_str(breakpoint
->orig_instr
, breakpoint
->length
, 16);
2229 command_print(cmd_ctx
, "0x%8.8x, 0x%x, %i, 0x%s", breakpoint
->address
, breakpoint
->length
, breakpoint
->set
, buf
);
2234 command_print(cmd_ctx
, "0x%8.8x, 0x%x, %i", breakpoint
->address
, breakpoint
->length
, breakpoint
->set
);
2236 breakpoint
= breakpoint
->next
;
2244 length
= strtoul(args
[1], NULL
, 0);
2247 if (strcmp(args
[2], "hw") == 0)
2250 if ((retval
= breakpoint_add(target
, strtoul(args
[0], NULL
, 0), length
, hw
)) != ERROR_OK
)
2252 LOG_ERROR("Failure setting breakpoints");
2256 command_print(cmd_ctx
, "breakpoint added at address 0x%8.8x", strtoul(args
[0], NULL
, 0));
2261 command_print(cmd_ctx
, "usage: bp <address> <length> ['hw']");
2267 int handle_rbp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2269 target_t
*target
= get_current_target(cmd_ctx
);
2272 breakpoint_remove(target
, strtoul(args
[0], NULL
, 0));
2277 int handle_wp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2279 target_t
*target
= get_current_target(cmd_ctx
);
2284 watchpoint_t
*watchpoint
= target
->watchpoints
;
2288 command_print(cmd_ctx
, "address: 0x%8.8x, mask: 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
);
2289 watchpoint
= watchpoint
->next
;
2294 enum watchpoint_rw type
= WPT_ACCESS
;
2295 u32 data_value
= 0x0;
2296 u32 data_mask
= 0xffffffff;
2312 command_print(cmd_ctx
, "usage: wp <address> <length> [r/w/a] [value] [mask]");
2318 data_value
= strtoul(args
[3], NULL
, 0);
2322 data_mask
= strtoul(args
[4], NULL
, 0);
2325 if ((retval
= watchpoint_add(target
, strtoul(args
[0], NULL
, 0),
2326 strtoul(args
[1], NULL
, 0), type
, data_value
, data_mask
)) != ERROR_OK
)
2328 LOG_ERROR("Failure setting breakpoints");
2333 command_print(cmd_ctx
, "usage: wp <address> <length> [r/w/a] [value] [mask]");
2339 int handle_rwp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2341 target_t
*target
= get_current_target(cmd_ctx
);
2344 watchpoint_remove(target
, strtoul(args
[0], NULL
, 0));
2349 int handle_virt2phys_command(command_context_t
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2352 target_t
*target
= get_current_target(cmd_ctx
);
2358 return ERROR_COMMAND_SYNTAX_ERROR
;
2360 va
= strtoul(args
[0], NULL
, 0);
2362 retval
= target
->type
->virt2phys(target
, va
, &pa
);
2363 if (retval
== ERROR_OK
)
2365 command_print(cmd_ctx
, "Physical address 0x%08x", pa
);
2369 /* lower levels will have logged a detailed error which is
2370 * forwarded to telnet/GDB session.
2375 static void writeLong(FILE *f
, int l
)
2380 char c
=(l
>>(i
*8))&0xff;
2381 fwrite(&c
, 1, 1, f
);
2385 static void writeString(FILE *f
, char *s
)
2387 fwrite(s
, 1, strlen(s
), f
);
2392 // Dump a gmon.out histogram file.
2393 static void writeGmon(u32
*samples
, int sampleNum
, char *filename
)
2396 FILE *f
=fopen(filename
, "w");
2399 fwrite("gmon", 1, 4, f
);
2400 writeLong(f
, 0x00000001); // Version
2401 writeLong(f
, 0); // padding
2402 writeLong(f
, 0); // padding
2403 writeLong(f
, 0); // padding
2405 fwrite("", 1, 1, f
); // GMON_TAG_TIME_HIST
2407 // figure out bucket size
2410 for (i
=0; i
<sampleNum
; i
++)
2422 int addressSpace
=(max
-min
+1);
2424 static int const maxBuckets
=256*1024; // maximum buckets.
2425 int length
=addressSpace
;
2426 if (length
> maxBuckets
)
2430 int *buckets
=malloc(sizeof(int)*length
);
2436 memset(buckets
, 0, sizeof(int)*length
);
2437 for (i
=0; i
<sampleNum
;i
++)
2439 u32 address
=samples
[i
];
2440 long long a
=address
-min
;
2441 long long b
=length
-1;
2442 long long c
=addressSpace
-1;
2443 int index
=(a
*b
)/c
; // danger!!!! int32 overflows
2447 // append binary memory gmon.out &profile_hist_hdr ((char*)&profile_hist_hdr + sizeof(struct gmon_hist_hdr))
2448 writeLong(f
, min
); // low_pc
2449 writeLong(f
, max
); // high_pc
2450 writeLong(f
, length
); // # of samples
2451 writeLong(f
, 64000000); // 64MHz
2452 writeString(f
, "seconds");
2453 for (i
=0; i
<(15-strlen("seconds")); i
++)
2455 fwrite("", 1, 1, f
); // padding
2457 writeString(f
, "s");
2459 // append binary memory gmon.out profile_hist_data (profile_hist_data + profile_hist_hdr.hist_size)
2461 char *data
=malloc(2*length
);
2464 for (i
=0; i
<length
;i
++)
2473 data
[i
*2+1]=(val
>>8)&0xff;
2476 fwrite(data
, 1, length
*2, f
);
2486 /* profiling samples the CPU PC as quickly as OpenOCD is able, which will be used as a random sampling of PC */
2487 int handle_profile_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2489 target_t
*target
= get_current_target(cmd_ctx
);
2490 struct timeval timeout
, now
;
2492 gettimeofday(&timeout
, NULL
);
2495 return ERROR_COMMAND_SYNTAX_ERROR
;
2498 timeval_add_time(&timeout
, strtoul(args
[0], &end
, 0), 0);
2504 command_print(cmd_ctx
, "Starting profiling. Halting and resuming the target as often as we can...");
2506 static const int maxSample
=10000;
2507 u32
*samples
=malloc(sizeof(u32
)*maxSample
);
2512 int retval
=ERROR_OK
;
2513 // hopefully it is safe to cache! We want to stop/restart as quickly as possible.
2514 reg_t
*reg
= register_get_by_name(target
->reg_cache
, "pc", 1);
2518 target_poll(target
);
2519 if (target
->state
== TARGET_HALTED
)
2521 u32 t
=*((u32
*)reg
->value
);
2522 samples
[numSamples
++]=t
;
2523 retval
= target_resume(target
, 1, 0, 0, 0); /* current pc, addr = 0, do not handle breakpoints, not debugging */
2524 target_poll(target
);
2525 usleep(10*1000); // sleep 10ms, i.e. <100 samples/second.
2526 } else if (target
->state
== TARGET_RUNNING
)
2528 // We want to quickly sample the PC.
2529 target_halt(target
);
2532 command_print(cmd_ctx
, "Target not halted or running");
2536 if (retval
!=ERROR_OK
)
2541 gettimeofday(&now
, NULL
);
2542 if ((numSamples
>=maxSample
) || ((now
.tv_sec
>= timeout
.tv_sec
) && (now
.tv_usec
>= timeout
.tv_usec
)))
2544 command_print(cmd_ctx
, "Profiling completed. %d samples.", numSamples
);
2545 target_poll(target
);
2546 if (target
->state
== TARGET_HALTED
)
2548 target_resume(target
, 1, 0, 0, 0); /* current pc, addr = 0, do not handle breakpoints, not debugging */
2550 target_poll(target
);
2551 writeGmon(samples
, numSamples
, args
[1]);
2552 command_print(cmd_ctx
, "Wrote %s", args
[1]);
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)