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
;
492 static int target_write_memory_imp(struct target_s
*target
, u32 address
, u32 size
, u32 count
, u8
*buffer
)
494 if (!target
->type
->examined
)
496 LOG_ERROR("Target not examined yet");
499 return target
->type
->write_memory_imp(target
, address
, size
, count
, buffer
);
502 static int target_read_memory_imp(struct target_s
*target
, u32 address
, u32 size
, u32 count
, u8
*buffer
)
504 if (!target
->type
->examined
)
506 LOG_ERROR("Target not examined yet");
509 return target
->type
->read_memory_imp(target
, address
, size
, count
, buffer
);
512 static int target_soft_reset_halt_imp(struct target_s
*target
)
514 if (!target
->type
->examined
)
516 LOG_ERROR("Target not examined yet");
519 return target
->type
->soft_reset_halt_imp(target
);
522 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
)
524 if (!target
->type
->examined
)
526 LOG_ERROR("Target not examined yet");
529 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
);
532 int target_init(struct command_context_s
*cmd_ctx
)
534 target_t
*target
= targets
;
538 target
->type
->examined
= 0;
539 if (target
->type
->examine
== NULL
)
541 target
->type
->examine
= default_examine
;
544 if (target
->type
->init_target(cmd_ctx
, target
) != ERROR_OK
)
546 LOG_ERROR("target '%s' init failed", target
->type
->name
);
550 /* Set up default functions if none are provided by target */
551 if (target
->type
->virt2phys
== NULL
)
553 target
->type
->virt2phys
= default_virt2phys
;
555 target
->type
->virt2phys
= default_virt2phys
;
556 /* a non-invasive way(in terms of patches) to add some code that
557 * runs before the type->write/read_memory implementation
559 target
->type
->write_memory_imp
= target
->type
->write_memory
;
560 target
->type
->write_memory
= target_write_memory_imp
;
561 target
->type
->read_memory_imp
= target
->type
->read_memory
;
562 target
->type
->read_memory
= target_read_memory_imp
;
563 target
->type
->soft_reset_halt_imp
= target
->type
->soft_reset_halt
;
564 target
->type
->soft_reset_halt
= target_soft_reset_halt_imp
;
565 target
->type
->run_algorithm_imp
= target
->type
->run_algorithm
;
566 target
->type
->run_algorithm
= target_run_algorithm_imp
;
569 if (target
->type
->mmu
== NULL
)
571 target
->type
->mmu
= default_mmu
;
573 target
= target
->next
;
578 target_register_user_commands(cmd_ctx
);
579 target_register_timer_callback(handle_target
, 100, 1, NULL
);
585 int target_register_event_callback(int (*callback
)(struct target_s
*target
, enum target_event event
, void *priv
), void *priv
)
587 target_event_callback_t
**callbacks_p
= &target_event_callbacks
;
589 if (callback
== NULL
)
591 return ERROR_INVALID_ARGUMENTS
;
596 while ((*callbacks_p
)->next
)
597 callbacks_p
= &((*callbacks_p
)->next
);
598 callbacks_p
= &((*callbacks_p
)->next
);
601 (*callbacks_p
) = malloc(sizeof(target_event_callback_t
));
602 (*callbacks_p
)->callback
= callback
;
603 (*callbacks_p
)->priv
= priv
;
604 (*callbacks_p
)->next
= NULL
;
609 int target_register_timer_callback(int (*callback
)(void *priv
), int time_ms
, int periodic
, void *priv
)
611 target_timer_callback_t
**callbacks_p
= &target_timer_callbacks
;
614 if (callback
== NULL
)
616 return ERROR_INVALID_ARGUMENTS
;
621 while ((*callbacks_p
)->next
)
622 callbacks_p
= &((*callbacks_p
)->next
);
623 callbacks_p
= &((*callbacks_p
)->next
);
626 (*callbacks_p
) = malloc(sizeof(target_timer_callback_t
));
627 (*callbacks_p
)->callback
= callback
;
628 (*callbacks_p
)->periodic
= periodic
;
629 (*callbacks_p
)->time_ms
= time_ms
;
631 gettimeofday(&now
, NULL
);
632 (*callbacks_p
)->when
.tv_usec
= now
.tv_usec
+ (time_ms
% 1000) * 1000;
633 time_ms
-= (time_ms
% 1000);
634 (*callbacks_p
)->when
.tv_sec
= now
.tv_sec
+ (time_ms
/ 1000);
635 if ((*callbacks_p
)->when
.tv_usec
> 1000000)
637 (*callbacks_p
)->when
.tv_usec
= (*callbacks_p
)->when
.tv_usec
- 1000000;
638 (*callbacks_p
)->when
.tv_sec
+= 1;
641 (*callbacks_p
)->priv
= priv
;
642 (*callbacks_p
)->next
= NULL
;
647 int target_unregister_event_callback(int (*callback
)(struct target_s
*target
, enum target_event event
, void *priv
), void *priv
)
649 target_event_callback_t
**p
= &target_event_callbacks
;
650 target_event_callback_t
*c
= target_event_callbacks
;
652 if (callback
== NULL
)
654 return ERROR_INVALID_ARGUMENTS
;
659 target_event_callback_t
*next
= c
->next
;
660 if ((c
->callback
== callback
) && (c
->priv
== priv
))
674 int target_unregister_timer_callback(int (*callback
)(void *priv
), void *priv
)
676 target_timer_callback_t
**p
= &target_timer_callbacks
;
677 target_timer_callback_t
*c
= target_timer_callbacks
;
679 if (callback
== NULL
)
681 return ERROR_INVALID_ARGUMENTS
;
686 target_timer_callback_t
*next
= c
->next
;
687 if ((c
->callback
== callback
) && (c
->priv
== priv
))
701 int target_call_event_callbacks(target_t
*target
, enum target_event event
)
703 target_event_callback_t
*callback
= target_event_callbacks
;
704 target_event_callback_t
*next_callback
;
706 LOG_DEBUG("target event %i", event
);
710 next_callback
= callback
->next
;
711 callback
->callback(target
, event
, callback
->priv
);
712 callback
= next_callback
;
718 static int target_call_timer_callbacks_check_time(int checktime
)
720 target_timer_callback_t
*callback
= target_timer_callbacks
;
721 target_timer_callback_t
*next_callback
;
724 gettimeofday(&now
, NULL
);
728 next_callback
= callback
->next
;
730 if ((!checktime
&&callback
->periodic
)||
731 (((now
.tv_sec
>= callback
->when
.tv_sec
) && (now
.tv_usec
>= callback
->when
.tv_usec
))
732 || (now
.tv_sec
> callback
->when
.tv_sec
)))
734 callback
->callback(callback
->priv
);
735 if (callback
->periodic
)
737 int time_ms
= callback
->time_ms
;
738 callback
->when
.tv_usec
= now
.tv_usec
+ (time_ms
% 1000) * 1000;
739 time_ms
-= (time_ms
% 1000);
740 callback
->when
.tv_sec
= now
.tv_sec
+ time_ms
/ 1000;
741 if (callback
->when
.tv_usec
> 1000000)
743 callback
->when
.tv_usec
= callback
->when
.tv_usec
- 1000000;
744 callback
->when
.tv_sec
+= 1;
748 target_unregister_timer_callback(callback
->callback
, callback
->priv
);
751 callback
= next_callback
;
757 int target_call_timer_callbacks()
759 return target_call_timer_callbacks_check_time(1);
762 /* invoke periodic callbacks immediately */
763 int target_call_timer_callbacks_now()
765 return target_call_timer_callbacks(0);
769 int target_alloc_working_area(struct target_s
*target
, u32 size
, working_area_t
**area
)
771 working_area_t
*c
= target
->working_areas
;
772 working_area_t
*new_wa
= NULL
;
774 /* Reevaluate working area address based on MMU state*/
775 if (target
->working_areas
== NULL
)
779 retval
= target
->type
->mmu(target
, &enabled
);
780 if (retval
!= ERROR_OK
)
786 target
->working_area
= target
->working_area_virt
;
790 target
->working_area
= target
->working_area_phys
;
794 /* only allocate multiples of 4 byte */
797 LOG_ERROR("BUG: code tried to allocate unaligned number of bytes, padding");
798 size
= CEIL(size
, 4);
801 /* see if there's already a matching working area */
804 if ((c
->free
) && (c
->size
== size
))
812 /* if not, allocate a new one */
815 working_area_t
**p
= &target
->working_areas
;
816 u32 first_free
= target
->working_area
;
817 u32 free_size
= target
->working_area_size
;
819 LOG_DEBUG("allocating new working area");
821 c
= target
->working_areas
;
824 first_free
+= c
->size
;
825 free_size
-= c
->size
;
830 if (free_size
< size
)
832 LOG_WARNING("not enough working area available(requested %d, free %d)", size
, free_size
);
833 return ERROR_TARGET_RESOURCE_NOT_AVAILABLE
;
836 new_wa
= malloc(sizeof(working_area_t
));
839 new_wa
->address
= first_free
;
841 if (target
->backup_working_area
)
843 new_wa
->backup
= malloc(new_wa
->size
);
844 target
->type
->read_memory(target
, new_wa
->address
, 4, new_wa
->size
/ 4, new_wa
->backup
);
848 new_wa
->backup
= NULL
;
851 /* put new entry in list */
855 /* mark as used, and return the new (reused) area */
865 int target_free_working_area_restore(struct target_s
*target
, working_area_t
*area
, int restore
)
870 if (restore
&&target
->backup_working_area
)
871 target
->type
->write_memory(target
, area
->address
, 4, area
->size
/ 4, area
->backup
);
875 /* mark user pointer invalid */
882 int target_free_working_area(struct target_s
*target
, working_area_t
*area
)
884 return target_free_working_area_restore(target
, area
, 1);
887 int target_free_all_working_areas_restore(struct target_s
*target
, int restore
)
889 working_area_t
*c
= target
->working_areas
;
893 working_area_t
*next
= c
->next
;
894 target_free_working_area_restore(target
, c
, restore
);
904 target
->working_areas
= NULL
;
909 int target_free_all_working_areas(struct target_s
*target
)
911 return target_free_all_working_areas_restore(target
, 1);
914 int target_register_commands(struct command_context_s
*cmd_ctx
)
916 register_command(cmd_ctx
, NULL
, "target", handle_target_command
, COMMAND_CONFIG
, "target <cpu> [reset_init default - DEPRECATED] <chainpos> <endianness> <variant> [cpu type specifc args]");
917 register_command(cmd_ctx
, NULL
, "targets", handle_targets_command
, COMMAND_EXEC
, NULL
);
918 register_command(cmd_ctx
, NULL
, "target_script", handle_target_script_command
, COMMAND_CONFIG
, NULL
);
919 register_command(cmd_ctx
, NULL
, "run_and_halt_time", handle_run_and_halt_time_command
, COMMAND_CONFIG
, "<target> <run time ms>");
920 register_command(cmd_ctx
, NULL
, "working_area", handle_working_area_command
, COMMAND_ANY
, "working_area <target#> <address> <size> <'backup'|'nobackup'> [virtual address]");
921 register_command(cmd_ctx
, NULL
, "virt2phys", handle_virt2phys_command
, COMMAND_ANY
, "virt2phys <virtual address>");
922 register_command(cmd_ctx
, NULL
, "profile", handle_profile_command
, COMMAND_EXEC
, "PRELIMINARY! - profile <seconds> <gmon.out>");
927 int target_arch_state(struct target_s
*target
)
932 LOG_USER("No target has been configured");
936 LOG_USER("target state: %s", target_state_strings
[target
->state
]);
938 if (target
->state
!=TARGET_HALTED
)
941 retval
=target
->type
->arch_state(target
);
945 /* Single aligned words are guaranteed to use 16 or 32 bit access
946 * mode respectively, otherwise data is handled as quickly as
949 int target_write_buffer(struct target_s
*target
, u32 address
, u32 size
, u8
*buffer
)
952 if (!target
->type
->examined
)
954 LOG_ERROR("Target not examined yet");
958 LOG_DEBUG("writing buffer of %i byte at 0x%8.8x", size
, address
);
960 if (((address
% 2) == 0) && (size
== 2))
962 return target
->type
->write_memory(target
, address
, 2, 1, buffer
);
965 /* handle unaligned head bytes */
968 int unaligned
= 4 - (address
% 4);
970 if (unaligned
> size
)
973 if ((retval
= target
->type
->write_memory(target
, address
, 1, unaligned
, buffer
)) != ERROR_OK
)
977 address
+= unaligned
;
981 /* handle aligned words */
984 int aligned
= size
- (size
% 4);
986 /* use bulk writes above a certain limit. This may have to be changed */
989 if ((retval
= target
->type
->bulk_write_memory(target
, address
, aligned
/ 4, buffer
)) != ERROR_OK
)
994 if ((retval
= target
->type
->write_memory(target
, address
, 4, aligned
/ 4, buffer
)) != ERROR_OK
)
1003 /* handle tail writes of less than 4 bytes */
1006 if ((retval
= target
->type
->write_memory(target
, address
, 1, size
, buffer
)) != ERROR_OK
)
1014 /* Single aligned words are guaranteed to use 16 or 32 bit access
1015 * mode respectively, otherwise data is handled as quickly as
1018 int target_read_buffer(struct target_s
*target
, u32 address
, u32 size
, u8
*buffer
)
1021 if (!target
->type
->examined
)
1023 LOG_ERROR("Target not examined yet");
1027 LOG_DEBUG("reading buffer of %i byte at 0x%8.8x", size
, address
);
1029 if (((address
% 2) == 0) && (size
== 2))
1031 return target
->type
->read_memory(target
, address
, 2, 1, buffer
);
1034 /* handle unaligned head bytes */
1037 int unaligned
= 4 - (address
% 4);
1039 if (unaligned
> size
)
1042 if ((retval
= target
->type
->read_memory(target
, address
, 1, unaligned
, buffer
)) != ERROR_OK
)
1045 buffer
+= unaligned
;
1046 address
+= unaligned
;
1050 /* handle aligned words */
1053 int aligned
= size
- (size
% 4);
1055 if ((retval
= target
->type
->read_memory(target
, address
, 4, aligned
/ 4, buffer
)) != ERROR_OK
)
1063 /* handle tail writes of less than 4 bytes */
1066 if ((retval
= target
->type
->read_memory(target
, address
, 1, size
, buffer
)) != ERROR_OK
)
1073 int target_checksum_memory(struct target_s
*target
, u32 address
, u32 size
, u32
* crc
)
1079 if (!target
->type
->examined
)
1081 LOG_ERROR("Target not examined yet");
1085 if ((retval
= target
->type
->checksum_memory(target
, address
,
1086 size
, &checksum
)) == ERROR_TARGET_RESOURCE_NOT_AVAILABLE
)
1088 buffer
= malloc(size
);
1091 LOG_ERROR("error allocating buffer for section (%d bytes)", size
);
1092 return ERROR_INVALID_ARGUMENTS
;
1094 retval
= target_read_buffer(target
, address
, size
, buffer
);
1095 if (retval
!= ERROR_OK
)
1101 /* convert to target endianess */
1102 for (i
= 0; i
< (size
/sizeof(u32
)); i
++)
1105 target_data
= target_buffer_get_u32(target
, &buffer
[i
*sizeof(u32
)]);
1106 target_buffer_set_u32(target
, &buffer
[i
*sizeof(u32
)], target_data
);
1109 retval
= image_calculate_checksum( buffer
, size
, &checksum
);
1118 int target_read_u32(struct target_s
*target
, u32 address
, u32
*value
)
1121 if (!target
->type
->examined
)
1123 LOG_ERROR("Target not examined yet");
1127 int retval
= target
->type
->read_memory(target
, address
, 4, 1, value_buf
);
1129 if (retval
== ERROR_OK
)
1131 *value
= target_buffer_get_u32(target
, value_buf
);
1132 LOG_DEBUG("address: 0x%8.8x, value: 0x%8.8x", address
, *value
);
1137 LOG_DEBUG("address: 0x%8.8x failed", address
);
1143 int target_read_u16(struct target_s
*target
, u32 address
, u16
*value
)
1146 if (!target
->type
->examined
)
1148 LOG_ERROR("Target not examined yet");
1152 int retval
= target
->type
->read_memory(target
, address
, 2, 1, value_buf
);
1154 if (retval
== ERROR_OK
)
1156 *value
= target_buffer_get_u16(target
, value_buf
);
1157 LOG_DEBUG("address: 0x%8.8x, value: 0x%4.4x", address
, *value
);
1162 LOG_DEBUG("address: 0x%8.8x failed", address
);
1168 int target_read_u8(struct target_s
*target
, u32 address
, u8
*value
)
1170 int retval
= target
->type
->read_memory(target
, address
, 1, 1, value
);
1171 if (!target
->type
->examined
)
1173 LOG_ERROR("Target not examined yet");
1177 if (retval
== ERROR_OK
)
1179 LOG_DEBUG("address: 0x%8.8x, value: 0x%2.2x", address
, *value
);
1184 LOG_DEBUG("address: 0x%8.8x failed", address
);
1190 int target_write_u32(struct target_s
*target
, u32 address
, u32 value
)
1194 if (!target
->type
->examined
)
1196 LOG_ERROR("Target not examined yet");
1200 LOG_DEBUG("address: 0x%8.8x, value: 0x%8.8x", address
, value
);
1202 target_buffer_set_u32(target
, value_buf
, value
);
1203 if ((retval
= target
->type
->write_memory(target
, address
, 4, 1, value_buf
)) != ERROR_OK
)
1205 LOG_DEBUG("failed: %i", retval
);
1211 int target_write_u16(struct target_s
*target
, u32 address
, u16 value
)
1215 if (!target
->type
->examined
)
1217 LOG_ERROR("Target not examined yet");
1221 LOG_DEBUG("address: 0x%8.8x, value: 0x%8.8x", address
, value
);
1223 target_buffer_set_u16(target
, value_buf
, value
);
1224 if ((retval
= target
->type
->write_memory(target
, address
, 2, 1, value_buf
)) != ERROR_OK
)
1226 LOG_DEBUG("failed: %i", retval
);
1232 int target_write_u8(struct target_s
*target
, u32 address
, u8 value
)
1235 if (!target
->type
->examined
)
1237 LOG_ERROR("Target not examined yet");
1241 LOG_DEBUG("address: 0x%8.8x, value: 0x%2.2x", address
, value
);
1243 if ((retval
= target
->type
->read_memory(target
, address
, 1, 1, &value
)) != ERROR_OK
)
1245 LOG_DEBUG("failed: %i", retval
);
1251 int target_register_user_commands(struct command_context_s
*cmd_ctx
)
1253 register_command(cmd_ctx
, NULL
, "reg", handle_reg_command
, COMMAND_EXEC
, NULL
);
1254 register_command(cmd_ctx
, NULL
, "poll", handle_poll_command
, COMMAND_EXEC
, "poll target state");
1255 register_command(cmd_ctx
, NULL
, "wait_halt", handle_wait_halt_command
, COMMAND_EXEC
, "wait for target halt [time (s)]");
1256 register_command(cmd_ctx
, NULL
, "halt", handle_halt_command
, COMMAND_EXEC
, "halt target");
1257 register_command(cmd_ctx
, NULL
, "resume", handle_resume_command
, COMMAND_EXEC
, "resume target [addr]");
1258 register_command(cmd_ctx
, NULL
, "step", handle_step_command
, COMMAND_EXEC
, "step one instruction from current PC or [addr]");
1259 register_command(cmd_ctx
, NULL
, "reset", handle_reset_command
, COMMAND_EXEC
, "reset target [run|halt|init|run_and_halt|run_and_init]");
1260 register_command(cmd_ctx
, NULL
, "soft_reset_halt", handle_soft_reset_halt_command
, COMMAND_EXEC
, "halt the target and do a soft reset");
1262 register_command(cmd_ctx
, NULL
, "mdw", handle_md_command
, COMMAND_EXEC
, "display memory words <addr> [count]");
1263 register_command(cmd_ctx
, NULL
, "mdh", handle_md_command
, COMMAND_EXEC
, "display memory half-words <addr> [count]");
1264 register_command(cmd_ctx
, NULL
, "mdb", handle_md_command
, COMMAND_EXEC
, "display memory bytes <addr> [count]");
1266 register_command(cmd_ctx
, NULL
, "mww", handle_mw_command
, COMMAND_EXEC
, "write memory word <addr> <value> [count]");
1267 register_command(cmd_ctx
, NULL
, "mwh", handle_mw_command
, COMMAND_EXEC
, "write memory half-word <addr> <value> [count]");
1268 register_command(cmd_ctx
, NULL
, "mwb", handle_mw_command
, COMMAND_EXEC
, "write memory byte <addr> <value> [count]");
1270 register_command(cmd_ctx
, NULL
, "bp", handle_bp_command
, COMMAND_EXEC
, "set breakpoint <address> <length> [hw]");
1271 register_command(cmd_ctx
, NULL
, "rbp", handle_rbp_command
, COMMAND_EXEC
, "remove breakpoint <adress>");
1272 register_command(cmd_ctx
, NULL
, "wp", handle_wp_command
, COMMAND_EXEC
, "set watchpoint <address> <length> <r/w/a> [value] [mask]");
1273 register_command(cmd_ctx
, NULL
, "rwp", handle_rwp_command
, COMMAND_EXEC
, "remove watchpoint <adress>");
1275 register_command(cmd_ctx
, NULL
, "load_image", handle_load_image_command
, COMMAND_EXEC
, "load_image <file> <address> ['bin'|'ihex'|'elf'|'s19']");
1276 register_command(cmd_ctx
, NULL
, "dump_image", handle_dump_image_command
, COMMAND_EXEC
, "dump_image <file> <address> <size>");
1277 register_command(cmd_ctx
, NULL
, "verify_image", handle_verify_image_command
, COMMAND_EXEC
, "verify_image <file> [offset] [type]");
1278 register_command(cmd_ctx
, NULL
, "load_binary", handle_load_image_command
, COMMAND_EXEC
, "[DEPRECATED] load_binary <file> <address>");
1279 register_command(cmd_ctx
, NULL
, "dump_binary", handle_dump_image_command
, COMMAND_EXEC
, "[DEPRECATED] dump_binary <file> <address> <size>");
1281 target_request_register_commands(cmd_ctx
);
1282 trace_register_commands(cmd_ctx
);
1287 int handle_targets_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1289 target_t
*target
= targets
;
1294 int num
= strtoul(args
[0], NULL
, 0);
1299 target
= target
->next
;
1303 cmd_ctx
->current_target
= num
;
1305 command_print(cmd_ctx
, "%i is out of bounds, only %i targets are configured", num
, count
);
1312 command_print(cmd_ctx
, "%i: %s (%s), state: %s", count
++, target
->type
->name
, target_endianess_strings
[target
->endianness
], target_state_strings
[target
->state
]);
1313 target
= target
->next
;
1319 int handle_target_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1326 return ERROR_COMMAND_SYNTAX_ERROR
;
1329 /* search for the specified target */
1330 if (args
[0] && (args
[0][0] != 0))
1332 for (i
= 0; target_types
[i
]; i
++)
1334 if (strcmp(args
[0], target_types
[i
]->name
) == 0)
1336 target_t
**last_target_p
= &targets
;
1338 /* register target specific commands */
1339 if (target_types
[i
]->register_commands(cmd_ctx
) != ERROR_OK
)
1341 LOG_ERROR("couldn't register '%s' commands", args
[0]);
1347 while ((*last_target_p
)->next
)
1348 last_target_p
= &((*last_target_p
)->next
);
1349 last_target_p
= &((*last_target_p
)->next
);
1352 *last_target_p
= malloc(sizeof(target_t
));
1354 (*last_target_p
)->type
= target_types
[i
];
1356 if (strcmp(args
[1], "big") == 0)
1357 (*last_target_p
)->endianness
= TARGET_BIG_ENDIAN
;
1358 else if (strcmp(args
[1], "little") == 0)
1359 (*last_target_p
)->endianness
= TARGET_LITTLE_ENDIAN
;
1362 LOG_ERROR("endianness must be either 'little' or 'big', not '%s'", args
[1]);
1363 return ERROR_COMMAND_SYNTAX_ERROR
;
1366 /* what to do on a target reset */
1367 (*last_target_p
)->reset_mode
= RESET_INIT
; /* default */
1368 if (strcmp(args
[2], "reset_halt") == 0)
1369 (*last_target_p
)->reset_mode
= RESET_HALT
;
1370 else if (strcmp(args
[2], "reset_run") == 0)
1371 (*last_target_p
)->reset_mode
= RESET_RUN
;
1372 else if (strcmp(args
[2], "reset_init") == 0)
1373 (*last_target_p
)->reset_mode
= RESET_INIT
;
1374 else if (strcmp(args
[2], "run_and_halt") == 0)
1375 (*last_target_p
)->reset_mode
= RESET_RUN_AND_HALT
;
1376 else if (strcmp(args
[2], "run_and_init") == 0)
1377 (*last_target_p
)->reset_mode
= RESET_RUN_AND_INIT
;
1380 /* Kludge! we want to make this reset arg optional while remaining compatible! */
1384 (*last_target_p
)->run_and_halt_time
= 1000; /* default 1s */
1386 (*last_target_p
)->reset_script
= NULL
;
1387 (*last_target_p
)->post_halt_script
= NULL
;
1388 (*last_target_p
)->pre_resume_script
= NULL
;
1389 (*last_target_p
)->gdb_program_script
= NULL
;
1391 (*last_target_p
)->working_area
= 0x0;
1392 (*last_target_p
)->working_area_size
= 0x0;
1393 (*last_target_p
)->working_areas
= NULL
;
1394 (*last_target_p
)->backup_working_area
= 0;
1396 (*last_target_p
)->state
= TARGET_UNKNOWN
;
1397 (*last_target_p
)->debug_reason
= DBG_REASON_UNDEFINED
;
1398 (*last_target_p
)->reg_cache
= NULL
;
1399 (*last_target_p
)->breakpoints
= NULL
;
1400 (*last_target_p
)->watchpoints
= NULL
;
1401 (*last_target_p
)->next
= NULL
;
1402 (*last_target_p
)->arch_info
= NULL
;
1404 /* initialize trace information */
1405 (*last_target_p
)->trace_info
= malloc(sizeof(trace_t
));
1406 (*last_target_p
)->trace_info
->num_trace_points
= 0;
1407 (*last_target_p
)->trace_info
->trace_points_size
= 0;
1408 (*last_target_p
)->trace_info
->trace_points
= NULL
;
1409 (*last_target_p
)->trace_info
->trace_history_size
= 0;
1410 (*last_target_p
)->trace_info
->trace_history
= NULL
;
1411 (*last_target_p
)->trace_info
->trace_history_pos
= 0;
1412 (*last_target_p
)->trace_info
->trace_history_overflowed
= 0;
1414 (*last_target_p
)->dbgmsg
= NULL
;
1415 (*last_target_p
)->dbg_msg_enabled
= 0;
1417 (*last_target_p
)->type
->target_command(cmd_ctx
, cmd
, args
, argc
, *last_target_p
);
1425 /* no matching target found */
1428 LOG_ERROR("target '%s' not found", args
[0]);
1429 return ERROR_COMMAND_SYNTAX_ERROR
;
1435 /* usage: target_script <target#> <event> <script_file> */
1436 int handle_target_script_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1438 target_t
*target
= NULL
;
1442 LOG_ERROR("incomplete target_script command");
1443 return ERROR_COMMAND_SYNTAX_ERROR
;
1446 target
= get_target_by_num(strtoul(args
[0], NULL
, 0));
1450 return ERROR_COMMAND_SYNTAX_ERROR
;
1453 if (strcmp(args
[1], "reset") == 0)
1455 if (target
->reset_script
)
1456 free(target
->reset_script
);
1457 target
->reset_script
= strdup(args
[2]);
1459 else if (strcmp(args
[1], "post_halt") == 0)
1461 if (target
->post_halt_script
)
1462 free(target
->post_halt_script
);
1463 target
->post_halt_script
= strdup(args
[2]);
1465 else if (strcmp(args
[1], "pre_resume") == 0)
1467 if (target
->pre_resume_script
)
1468 free(target
->pre_resume_script
);
1469 target
->pre_resume_script
= strdup(args
[2]);
1471 else if (strcmp(args
[1], "gdb_program_config") == 0)
1473 if (target
->gdb_program_script
)
1474 free(target
->gdb_program_script
);
1475 target
->gdb_program_script
= strdup(args
[2]);
1479 LOG_ERROR("unknown event type: '%s", args
[1]);
1480 return ERROR_COMMAND_SYNTAX_ERROR
;
1486 int handle_run_and_halt_time_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1488 target_t
*target
= NULL
;
1492 return ERROR_COMMAND_SYNTAX_ERROR
;
1495 target
= get_target_by_num(strtoul(args
[0], NULL
, 0));
1498 return ERROR_COMMAND_SYNTAX_ERROR
;
1501 target
->run_and_halt_time
= strtoul(args
[1], NULL
, 0);
1506 int handle_working_area_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1508 target_t
*target
= NULL
;
1510 if ((argc
< 4) || (argc
> 5))
1512 return ERROR_COMMAND_SYNTAX_ERROR
;
1515 target
= get_target_by_num(strtoul(args
[0], NULL
, 0));
1518 return ERROR_COMMAND_SYNTAX_ERROR
;
1520 target_free_all_working_areas(target
);
1522 target
->working_area_phys
= target
->working_area_virt
= strtoul(args
[1], NULL
, 0);
1525 target
->working_area_virt
= strtoul(args
[4], NULL
, 0);
1527 target
->working_area_size
= strtoul(args
[2], NULL
, 0);
1529 if (strcmp(args
[3], "backup") == 0)
1531 target
->backup_working_area
= 1;
1533 else if (strcmp(args
[3], "nobackup") == 0)
1535 target
->backup_working_area
= 0;
1539 LOG_ERROR("unrecognized <backup|nobackup> argument (%s)", args
[3]);
1540 return ERROR_COMMAND_SYNTAX_ERROR
;
1547 /* process target state changes */
1548 int handle_target(void *priv
)
1550 target_t
*target
= targets
;
1554 if (target_continous_poll
)
1556 /* polling may fail silently until the target has been examined */
1557 target_poll(target
);
1560 target
= target
->next
;
1566 int handle_reg_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1575 target
= get_current_target(cmd_ctx
);
1577 /* list all available registers for the current target */
1580 reg_cache_t
*cache
= target
->reg_cache
;
1586 for (i
= 0; i
< cache
->num_regs
; i
++)
1588 value
= buf_to_str(cache
->reg_list
[i
].value
, cache
->reg_list
[i
].size
, 16);
1589 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
);
1592 cache
= cache
->next
;
1598 /* access a single register by its ordinal number */
1599 if ((args
[0][0] >= '0') && (args
[0][0] <= '9'))
1601 int num
= strtoul(args
[0], NULL
, 0);
1602 reg_cache_t
*cache
= target
->reg_cache
;
1608 for (i
= 0; i
< cache
->num_regs
; i
++)
1612 reg
= &cache
->reg_list
[i
];
1618 cache
= cache
->next
;
1623 command_print(cmd_ctx
, "%i is out of bounds, the current target has only %i registers (0 - %i)", num
, count
, count
- 1);
1626 } else /* access a single register by its name */
1628 reg
= register_get_by_name(target
->reg_cache
, args
[0], 1);
1632 command_print(cmd_ctx
, "register %s not found in current target", args
[0]);
1637 /* display a register */
1638 if ((argc
== 1) || ((argc
== 2) && !((args
[1][0] >= '0') && (args
[1][0] <= '9'))))
1640 if ((argc
== 2) && (strcmp(args
[1], "force") == 0))
1643 if (reg
->valid
== 0)
1645 reg_arch_type_t
*arch_type
= register_get_arch_type(reg
->arch_type
);
1646 if (arch_type
== NULL
)
1648 LOG_ERROR("BUG: encountered unregistered arch type");
1651 arch_type
->get(reg
);
1653 value
= buf_to_str(reg
->value
, reg
->size
, 16);
1654 command_print(cmd_ctx
, "%s (/%i): 0x%s", reg
->name
, reg
->size
, value
);
1659 /* set register value */
1662 u8
*buf
= malloc(CEIL(reg
->size
, 8));
1663 str_to_buf(args
[1], strlen(args
[1]), buf
, reg
->size
, 0);
1665 reg_arch_type_t
*arch_type
= register_get_arch_type(reg
->arch_type
);
1666 if (arch_type
== NULL
)
1668 LOG_ERROR("BUG: encountered unregistered arch type");
1672 arch_type
->set(reg
, buf
);
1674 value
= buf_to_str(reg
->value
, reg
->size
, 16);
1675 command_print(cmd_ctx
, "%s (/%i): 0x%s", reg
->name
, reg
->size
, value
);
1683 command_print(cmd_ctx
, "usage: reg <#|name> [value]");
1688 static int wait_state(struct command_context_s
*cmd_ctx
, char *cmd
, enum target_state state
, int ms
);
1690 int handle_poll_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1692 target_t
*target
= get_current_target(cmd_ctx
);
1696 target_poll(target
);
1697 target_arch_state(target
);
1701 if (strcmp(args
[0], "on") == 0)
1703 target_continous_poll
= 1;
1705 else if (strcmp(args
[0], "off") == 0)
1707 target_continous_poll
= 0;
1711 command_print(cmd_ctx
, "arg is \"on\" or \"off\"");
1719 int handle_wait_halt_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1727 ms
= strtoul(args
[0], &end
, 0) * 1000;
1730 command_print(cmd_ctx
, "usage: %s [seconds]", cmd
);
1735 return wait_state(cmd_ctx
, cmd
, TARGET_HALTED
, ms
);
1738 static void target_process_events(struct command_context_s
*cmd_ctx
)
1740 target_t
*target
= get_current_target(cmd_ctx
);
1741 target_poll(target
);
1742 target_call_timer_callbacks_now();
1745 static int wait_state(struct command_context_s
*cmd_ctx
, char *cmd
, enum target_state state
, int ms
)
1748 struct timeval timeout
, now
;
1750 gettimeofday(&timeout
, NULL
);
1751 timeval_add_time(&timeout
, 0, ms
* 1000);
1753 target_t
*target
= get_current_target(cmd_ctx
);
1756 if ((retval
=target_poll(target
))!=ERROR_OK
)
1758 target_call_timer_callbacks_now();
1759 if (target
->state
== state
)
1766 command_print(cmd_ctx
, "waiting for target %s...", target_state_strings
[state
]);
1769 gettimeofday(&now
, NULL
);
1770 if ((now
.tv_sec
> timeout
.tv_sec
) || ((now
.tv_sec
== timeout
.tv_sec
) && (now
.tv_usec
>= timeout
.tv_usec
)))
1772 LOG_ERROR("timed out while waiting for target %s", target_state_strings
[state
]);
1780 int handle_halt_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1783 target_t
*target
= get_current_target(cmd_ctx
);
1787 if ((retval
= target_halt(target
)) != ERROR_OK
)
1792 return handle_wait_halt_command(cmd_ctx
, cmd
, args
, argc
);
1796 int handle_soft_reset_halt_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1798 target_t
*target
= get_current_target(cmd_ctx
);
1800 LOG_USER("requesting target halt and executing a soft reset");
1802 target
->type
->soft_reset_halt(target
);
1807 int handle_reset_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1809 target_t
*target
= get_current_target(cmd_ctx
);
1810 enum target_reset_mode reset_mode
= target
->reset_mode
;
1811 enum target_reset_mode save
= target
->reset_mode
;
1817 if (strcmp("run", args
[0]) == 0)
1818 reset_mode
= RESET_RUN
;
1819 else if (strcmp("halt", args
[0]) == 0)
1820 reset_mode
= RESET_HALT
;
1821 else if (strcmp("init", args
[0]) == 0)
1822 reset_mode
= RESET_INIT
;
1823 else if (strcmp("run_and_halt", args
[0]) == 0)
1825 reset_mode
= RESET_RUN_AND_HALT
;
1828 target
->run_and_halt_time
= strtoul(args
[1], NULL
, 0);
1831 else if (strcmp("run_and_init", args
[0]) == 0)
1833 reset_mode
= RESET_RUN_AND_INIT
;
1836 target
->run_and_halt_time
= strtoul(args
[1], NULL
, 0);
1841 command_print(cmd_ctx
, "usage: reset ['run', 'halt', 'init', 'run_and_halt', 'run_and_init]");
1846 /* temporarily modify mode of current reset target */
1847 target
->reset_mode
= reset_mode
;
1849 /* reset *all* targets */
1850 target_process_reset(cmd_ctx
);
1852 /* Restore default reset mode for this target */
1853 target
->reset_mode
= save
;
1858 int handle_resume_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1861 target_t
*target
= get_current_target(cmd_ctx
);
1864 retval
= target_resume(target
, 1, 0, 1, 0); /* current pc, addr = 0, handle breakpoints, not debugging */
1866 retval
= target_resume(target
, 0, strtoul(args
[0], NULL
, 0), 1, 0); /* addr = args[0], handle breakpoints, not debugging */
1869 return ERROR_COMMAND_SYNTAX_ERROR
;
1872 target_process_events(cmd_ctx
);
1877 int handle_step_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1879 target_t
*target
= get_current_target(cmd_ctx
);
1884 target
->type
->step(target
, 1, 0, 1); /* current pc, addr = 0, handle breakpoints */
1887 target
->type
->step(target
, 0, strtoul(args
[0], NULL
, 0), 1); /* addr = args[0], handle breakpoints */
1892 int handle_md_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1894 const int line_bytecnt
= 32;
1907 target_t
*target
= get_current_target(cmd_ctx
);
1913 count
= strtoul(args
[1], NULL
, 0);
1915 address
= strtoul(args
[0], NULL
, 0);
1921 size
= 4; line_modulo
= line_bytecnt
/ 4;
1924 size
= 2; line_modulo
= line_bytecnt
/ 2;
1927 size
= 1; line_modulo
= line_bytecnt
/ 1;
1933 buffer
= calloc(count
, size
);
1934 retval
= target
->type
->read_memory(target
, address
, size
, count
, buffer
);
1935 if (retval
== ERROR_OK
)
1939 for (i
= 0; i
< count
; i
++)
1941 if (i
%line_modulo
== 0)
1942 output_len
+= snprintf(output
+ output_len
, 128 - output_len
, "0x%8.8x: ", address
+ (i
*size
));
1947 output_len
+= snprintf(output
+ output_len
, 128 - output_len
, "%8.8x ", target_buffer_get_u32(target
, &buffer
[i
*4]));
1950 output_len
+= snprintf(output
+ output_len
, 128 - output_len
, "%4.4x ", target_buffer_get_u16(target
, &buffer
[i
*2]));
1953 output_len
+= snprintf(output
+ output_len
, 128 - output_len
, "%2.2x ", buffer
[i
*1]);
1957 if ((i
%line_modulo
== line_modulo
-1) || (i
== count
- 1))
1959 command_print(cmd_ctx
, output
);
1965 LOG_ERROR("Failure examining memory");
1973 int handle_mw_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1980 target_t
*target
= get_current_target(cmd_ctx
);
1983 if ((argc
< 2) || (argc
> 3))
1984 return ERROR_COMMAND_SYNTAX_ERROR
;
1986 address
= strtoul(args
[0], NULL
, 0);
1987 value
= strtoul(args
[1], NULL
, 0);
1989 count
= strtoul(args
[2], NULL
, 0);
1996 target_buffer_set_u32(target
, value_buf
, value
);
2000 target_buffer_set_u16(target
, value_buf
, value
);
2004 value_buf
[0] = value
;
2007 return ERROR_COMMAND_SYNTAX_ERROR
;
2009 for (i
=0; i
<count
; i
++)
2015 retval
= target
->type
->write_memory(target
, address
+ i
*wordsize
, 4, 1, value_buf
);
2018 retval
= target
->type
->write_memory(target
, address
+ i
*wordsize
, 2, 1, value_buf
);
2021 retval
= target
->type
->write_memory(target
, address
+ i
*wordsize
, 1, 1, value_buf
);
2026 if (retval
!=ERROR_OK
)
2036 int handle_load_image_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2046 duration_t duration
;
2047 char *duration_text
;
2049 target_t
*target
= get_current_target(cmd_ctx
);
2053 command_print(cmd_ctx
, "usage: load_image <filename> [address] [type]");
2057 /* a base address isn't always necessary, default to 0x0 (i.e. don't relocate) */
2060 image
.base_address_set
= 1;
2061 image
.base_address
= strtoul(args
[1], NULL
, 0);
2065 image
.base_address_set
= 0;
2068 image
.start_address_set
= 0;
2070 duration_start_measure(&duration
);
2072 if (image_open(&image
, args
[0], (argc
>= 3) ? args
[2] : NULL
) != ERROR_OK
)
2079 for (i
= 0; i
< image
.num_sections
; i
++)
2081 buffer
= malloc(image
.sections
[i
].size
);
2084 command_print(cmd_ctx
, "error allocating buffer for section (%d bytes)", image
.sections
[i
].size
);
2088 if ((retval
= image_read_section(&image
, i
, 0x0, image
.sections
[i
].size
, buffer
, &buf_cnt
)) != ERROR_OK
)
2093 if ((retval
= target_write_buffer(target
, image
.sections
[i
].base_address
, buf_cnt
, buffer
)) != ERROR_OK
)
2098 image_size
+= buf_cnt
;
2099 command_print(cmd_ctx
, "%u byte written at address 0x%8.8x", buf_cnt
, image
.sections
[i
].base_address
);
2104 duration_stop_measure(&duration
, &duration_text
);
2105 if (retval
==ERROR_OK
)
2107 command_print(cmd_ctx
, "downloaded %u byte in %s", image_size
, duration_text
);
2109 free(duration_text
);
2111 image_close(&image
);
2117 int handle_dump_image_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2124 int retval
=ERROR_OK
;
2126 duration_t duration
;
2127 char *duration_text
;
2129 target_t
*target
= get_current_target(cmd_ctx
);
2133 command_print(cmd_ctx
, "usage: dump_image <filename> <address> <size>");
2137 address
= strtoul(args
[1], NULL
, 0);
2138 size
= strtoul(args
[2], NULL
, 0);
2140 if ((address
& 3) || (size
& 3))
2142 command_print(cmd_ctx
, "only 32-bit aligned address and size are supported");
2146 if (fileio_open(&fileio
, args
[0], FILEIO_WRITE
, FILEIO_BINARY
) != ERROR_OK
)
2151 duration_start_measure(&duration
);
2156 u32 this_run_size
= (size
> 560) ? 560 : size
;
2158 retval
= target
->type
->read_memory(target
, address
, 4, this_run_size
/ 4, buffer
);
2159 if (retval
!= ERROR_OK
)
2164 retval
= fileio_write(&fileio
, this_run_size
, buffer
, &size_written
);
2165 if (retval
!= ERROR_OK
)
2170 size
-= this_run_size
;
2171 address
+= this_run_size
;
2174 fileio_close(&fileio
);
2176 duration_stop_measure(&duration
, &duration_text
);
2177 if (retval
==ERROR_OK
)
2179 command_print(cmd_ctx
, "dumped %"PRIi64
" byte in %s", fileio
.size
, duration_text
);
2181 free(duration_text
);
2186 int handle_verify_image_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2194 u32 mem_checksum
= 0;
2198 duration_t duration
;
2199 char *duration_text
;
2201 target_t
*target
= get_current_target(cmd_ctx
);
2205 return ERROR_COMMAND_SYNTAX_ERROR
;
2210 LOG_ERROR("no target selected");
2214 duration_start_measure(&duration
);
2218 image
.base_address_set
= 1;
2219 image
.base_address
= strtoul(args
[1], NULL
, 0);
2223 image
.base_address_set
= 0;
2224 image
.base_address
= 0x0;
2227 image
.start_address_set
= 0;
2229 if ((retval
=image_open(&image
, args
[0], (argc
== 3) ? args
[2] : NULL
)) != ERROR_OK
)
2236 for (i
= 0; i
< image
.num_sections
; i
++)
2238 buffer
= malloc(image
.sections
[i
].size
);
2241 command_print(cmd_ctx
, "error allocating buffer for section (%d bytes)", image
.sections
[i
].size
);
2244 if ((retval
= image_read_section(&image
, i
, 0x0, image
.sections
[i
].size
, buffer
, &buf_cnt
)) != ERROR_OK
)
2250 /* calculate checksum of image */
2251 image_calculate_checksum( buffer
, buf_cnt
, &checksum
);
2253 retval
= target_checksum_memory(target
, image
.sections
[i
].base_address
, buf_cnt
, &mem_checksum
);
2254 if( retval
!= ERROR_OK
)
2260 if( checksum
!= mem_checksum
)
2262 /* failed crc checksum, fall back to a binary compare */
2265 command_print(cmd_ctx
, "checksum mismatch - attempting binary compare");
2267 data
= (u8
*)malloc(buf_cnt
);
2269 /* Can we use 32bit word accesses? */
2271 int count
= buf_cnt
;
2272 if ((count
% 4) == 0)
2277 retval
= target
->type
->read_memory(target
, image
.sections
[i
].base_address
, size
, count
, data
);
2278 if (retval
== ERROR_OK
)
2281 for (t
= 0; t
< buf_cnt
; t
++)
2283 if (data
[t
] != buffer
[t
])
2285 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
]);
2298 image_size
+= buf_cnt
;
2301 duration_stop_measure(&duration
, &duration_text
);
2302 if (retval
==ERROR_OK
)
2304 command_print(cmd_ctx
, "verified %u bytes in %s", image_size
, duration_text
);
2306 free(duration_text
);
2308 image_close(&image
);
2313 int handle_bp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2316 target_t
*target
= get_current_target(cmd_ctx
);
2320 breakpoint_t
*breakpoint
= target
->breakpoints
;
2324 if (breakpoint
->type
== BKPT_SOFT
)
2326 char* buf
= buf_to_str(breakpoint
->orig_instr
, breakpoint
->length
, 16);
2327 command_print(cmd_ctx
, "0x%8.8x, 0x%x, %i, 0x%s", breakpoint
->address
, breakpoint
->length
, breakpoint
->set
, buf
);
2332 command_print(cmd_ctx
, "0x%8.8x, 0x%x, %i", breakpoint
->address
, breakpoint
->length
, breakpoint
->set
);
2334 breakpoint
= breakpoint
->next
;
2342 length
= strtoul(args
[1], NULL
, 0);
2345 if (strcmp(args
[2], "hw") == 0)
2348 if ((retval
= breakpoint_add(target
, strtoul(args
[0], NULL
, 0), length
, hw
)) != ERROR_OK
)
2350 LOG_ERROR("Failure setting breakpoints");
2354 command_print(cmd_ctx
, "breakpoint added at address 0x%8.8x", strtoul(args
[0], NULL
, 0));
2359 command_print(cmd_ctx
, "usage: bp <address> <length> ['hw']");
2365 int handle_rbp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2367 target_t
*target
= get_current_target(cmd_ctx
);
2370 breakpoint_remove(target
, strtoul(args
[0], NULL
, 0));
2375 int handle_wp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2377 target_t
*target
= get_current_target(cmd_ctx
);
2382 watchpoint_t
*watchpoint
= target
->watchpoints
;
2386 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
);
2387 watchpoint
= watchpoint
->next
;
2392 enum watchpoint_rw type
= WPT_ACCESS
;
2393 u32 data_value
= 0x0;
2394 u32 data_mask
= 0xffffffff;
2410 command_print(cmd_ctx
, "usage: wp <address> <length> [r/w/a] [value] [mask]");
2416 data_value
= strtoul(args
[3], NULL
, 0);
2420 data_mask
= strtoul(args
[4], NULL
, 0);
2423 if ((retval
= watchpoint_add(target
, strtoul(args
[0], NULL
, 0),
2424 strtoul(args
[1], NULL
, 0), type
, data_value
, data_mask
)) != ERROR_OK
)
2426 LOG_ERROR("Failure setting breakpoints");
2431 command_print(cmd_ctx
, "usage: wp <address> <length> [r/w/a] [value] [mask]");
2437 int handle_rwp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2439 target_t
*target
= get_current_target(cmd_ctx
);
2442 watchpoint_remove(target
, strtoul(args
[0], NULL
, 0));
2447 int handle_virt2phys_command(command_context_t
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2450 target_t
*target
= get_current_target(cmd_ctx
);
2456 return ERROR_COMMAND_SYNTAX_ERROR
;
2458 va
= strtoul(args
[0], NULL
, 0);
2460 retval
= target
->type
->virt2phys(target
, va
, &pa
);
2461 if (retval
== ERROR_OK
)
2463 command_print(cmd_ctx
, "Physical address 0x%08x", pa
);
2467 /* lower levels will have logged a detailed error which is
2468 * forwarded to telnet/GDB session.
2473 static void writeLong(FILE *f
, int l
)
2478 char c
=(l
>>(i
*8))&0xff;
2479 fwrite(&c
, 1, 1, f
);
2483 static void writeString(FILE *f
, char *s
)
2485 fwrite(s
, 1, strlen(s
), f
);
2490 // Dump a gmon.out histogram file.
2491 static void writeGmon(u32
*samples
, int sampleNum
, char *filename
)
2494 FILE *f
=fopen(filename
, "w");
2497 fwrite("gmon", 1, 4, f
);
2498 writeLong(f
, 0x00000001); // Version
2499 writeLong(f
, 0); // padding
2500 writeLong(f
, 0); // padding
2501 writeLong(f
, 0); // padding
2503 fwrite("", 1, 1, f
); // GMON_TAG_TIME_HIST
2505 // figure out bucket size
2508 for (i
=0; i
<sampleNum
; i
++)
2520 int addressSpace
=(max
-min
+1);
2522 static int const maxBuckets
=256*1024; // maximum buckets.
2523 int length
=addressSpace
;
2524 if (length
> maxBuckets
)
2528 int *buckets
=malloc(sizeof(int)*length
);
2534 memset(buckets
, 0, sizeof(int)*length
);
2535 for (i
=0; i
<sampleNum
;i
++)
2537 u32 address
=samples
[i
];
2538 long long a
=address
-min
;
2539 long long b
=length
-1;
2540 long long c
=addressSpace
-1;
2541 int index
=(a
*b
)/c
; // danger!!!! int32 overflows
2545 // append binary memory gmon.out &profile_hist_hdr ((char*)&profile_hist_hdr + sizeof(struct gmon_hist_hdr))
2546 writeLong(f
, min
); // low_pc
2547 writeLong(f
, max
); // high_pc
2548 writeLong(f
, length
); // # of samples
2549 writeLong(f
, 64000000); // 64MHz
2550 writeString(f
, "seconds");
2551 for (i
=0; i
<(15-strlen("seconds")); i
++)
2553 fwrite("", 1, 1, f
); // padding
2555 writeString(f
, "s");
2557 // append binary memory gmon.out profile_hist_data (profile_hist_data + profile_hist_hdr.hist_size)
2559 char *data
=malloc(2*length
);
2562 for (i
=0; i
<length
;i
++)
2571 data
[i
*2+1]=(val
>>8)&0xff;
2574 fwrite(data
, 1, length
*2, f
);
2584 /* profiling samples the CPU PC as quickly as OpenOCD is able, which will be used as a random sampling of PC */
2585 int handle_profile_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2587 target_t
*target
= get_current_target(cmd_ctx
);
2588 struct timeval timeout
, now
;
2590 gettimeofday(&timeout
, NULL
);
2593 return ERROR_COMMAND_SYNTAX_ERROR
;
2596 timeval_add_time(&timeout
, strtoul(args
[0], &end
, 0), 0);
2602 command_print(cmd_ctx
, "Starting profiling. Halting and resuming the target as often as we can...");
2604 static const int maxSample
=10000;
2605 u32
*samples
=malloc(sizeof(u32
)*maxSample
);
2610 int retval
=ERROR_OK
;
2611 // hopefully it is safe to cache! We want to stop/restart as quickly as possible.
2612 reg_t
*reg
= register_get_by_name(target
->reg_cache
, "pc", 1);
2616 target_poll(target
);
2617 if (target
->state
== TARGET_HALTED
)
2619 u32 t
=*((u32
*)reg
->value
);
2620 samples
[numSamples
++]=t
;
2621 retval
= target_resume(target
, 1, 0, 0, 0); /* current pc, addr = 0, do not handle breakpoints, not debugging */
2622 target_poll(target
);
2623 usleep(10*1000); // sleep 10ms, i.e. <100 samples/second.
2624 } else if (target
->state
== TARGET_RUNNING
)
2626 // We want to quickly sample the PC.
2627 target_halt(target
);
2630 command_print(cmd_ctx
, "Target not halted or running");
2634 if (retval
!=ERROR_OK
)
2639 gettimeofday(&now
, NULL
);
2640 if ((numSamples
>=maxSample
) || ((now
.tv_sec
>= timeout
.tv_sec
) && (now
.tv_usec
>= timeout
.tv_usec
)))
2642 command_print(cmd_ctx
, "Profiling completed. %d samples.", numSamples
);
2643 target_poll(target
);
2644 if (target
->state
== TARGET_HALTED
)
2646 target_resume(target
, 1, 0, 0, 0); /* current pc, addr = 0, do not handle breakpoints, not debugging */
2648 target_poll(target
);
2649 writeGmon(samples
, numSamples
, args
[1]);
2650 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)