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
);
52 int handle_target_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
53 int handle_targets_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
55 int handle_target_script_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
56 int handle_run_and_halt_time_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
57 int handle_working_area_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
59 int handle_reg_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
60 int handle_poll_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
61 int handle_halt_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
62 int handle_wait_halt_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
63 int handle_reset_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
64 int handle_soft_reset_halt_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
65 int handle_resume_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
66 int handle_step_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
67 int handle_md_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
68 int handle_mw_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
69 int handle_load_image_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
70 int handle_dump_image_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
71 int handle_verify_image_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
72 int handle_bp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
73 int handle_rbp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
74 int handle_wp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
75 int handle_rwp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
76 int handle_virt2phys_command(command_context_t
*cmd_ctx
, char *cmd
, char **args
, int argc
);
77 int handle_profile_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
81 extern target_type_t arm7tdmi_target
;
82 extern target_type_t arm720t_target
;
83 extern target_type_t arm9tdmi_target
;
84 extern target_type_t arm920t_target
;
85 extern target_type_t arm966e_target
;
86 extern target_type_t arm926ejs_target
;
87 extern target_type_t feroceon_target
;
88 extern target_type_t xscale_target
;
89 extern target_type_t cortexm3_target
;
90 extern target_type_t arm11_target
;
92 target_type_t
*target_types
[] =
107 target_t
*targets
= NULL
;
108 target_event_callback_t
*target_event_callbacks
= NULL
;
109 target_timer_callback_t
*target_timer_callbacks
= NULL
;
111 char *target_state_strings
[] =
120 char *target_debug_reason_strings
[] =
122 "debug request", "breakpoint", "watchpoint",
123 "watchpoint and breakpoint", "single step",
124 "target not halted", "undefined"
127 char *target_endianess_strings
[] =
133 static int target_continous_poll
= 1;
135 /* read a u32 from a buffer in target memory endianness */
136 u32
target_buffer_get_u32(target_t
*target
, u8
*buffer
)
138 if (target
->endianness
== TARGET_LITTLE_ENDIAN
)
139 return le_to_h_u32(buffer
);
141 return be_to_h_u32(buffer
);
144 /* read a u16 from a buffer in target memory endianness */
145 u16
target_buffer_get_u16(target_t
*target
, u8
*buffer
)
147 if (target
->endianness
== TARGET_LITTLE_ENDIAN
)
148 return le_to_h_u16(buffer
);
150 return be_to_h_u16(buffer
);
153 /* write a u32 to a buffer in target memory endianness */
154 void target_buffer_set_u32(target_t
*target
, u8
*buffer
, u32 value
)
156 if (target
->endianness
== TARGET_LITTLE_ENDIAN
)
157 h_u32_to_le(buffer
, value
);
159 h_u32_to_be(buffer
, value
);
162 /* write a u16 to a buffer in target memory endianness */
163 void target_buffer_set_u16(target_t
*target
, u8
*buffer
, u16 value
)
165 if (target
->endianness
== TARGET_LITTLE_ENDIAN
)
166 h_u16_to_le(buffer
, value
);
168 h_u16_to_be(buffer
, value
);
171 /* returns a pointer to the n-th configured target */
172 target_t
* get_target_by_num(int num
)
174 target_t
*target
= targets
;
181 target
= target
->next
;
188 int get_num_by_target(target_t
*query_target
)
190 target_t
*target
= targets
;
195 if (target
== query_target
)
197 target
= target
->next
;
204 target_t
* get_current_target(command_context_t
*cmd_ctx
)
206 target_t
*target
= get_target_by_num(cmd_ctx
->current_target
);
210 LOG_ERROR("BUG: current_target out of bounds");
217 /* Process target initialization, when target entered debug out of reset
218 * the handler is unregistered at the end of this function, so it's only called once
220 int target_init_handler(struct target_s
*target
, enum target_event event
, void *priv
)
222 struct command_context_s
*cmd_ctx
= priv
;
224 if (event
== TARGET_EVENT_HALTED
)
226 target_unregister_event_callback(target_init_handler
, priv
);
227 target_invoke_script(cmd_ctx
, target
, "post_reset");
228 jtag_execute_queue();
234 int target_run_and_halt_handler(void *priv
)
236 target_t
*target
= priv
;
243 int target_poll(struct target_s
*target
)
245 /* We can't poll until after examine */
246 if (!target
->type
->examined
)
248 /* Fail silently lest we pollute the log */
251 return target
->type
->poll(target
);
254 int target_halt(struct target_s
*target
)
256 /* We can't poll until after examine */
257 if (!target
->type
->examined
)
259 LOG_ERROR("Target not examined yet");
262 return target
->type
->halt(target
);
265 int target_resume(struct target_s
*target
, int current
, u32 address
, int handle_breakpoints
, int debug_execution
)
267 /* We can't poll until after examine */
268 if (!target
->type
->examined
)
270 LOG_ERROR("Target not examined yet");
274 return target
->type
->resume(target
, current
, address
, handle_breakpoints
, debug_execution
);
277 int target_process_reset(struct command_context_s
*cmd_ctx
)
279 int retval
= ERROR_OK
;
281 struct timeval timeout
, now
;
283 jtag
->speed(jtag_speed
);
288 target_invoke_script(cmd_ctx
, target
, "pre_reset");
289 target
= target
->next
;
292 if ((retval
= jtag_init_reset(cmd_ctx
)) != ERROR_OK
)
295 /* First time this is executed after launching OpenOCD, it will read out
296 * the type of CPU, etc. and init Embedded ICE registers in host
299 * It will also set up ICE registers in the target.
301 * However, if we assert TRST later, we need to set up the registers again.
303 * For the "reset halt/init" case we must only set up the registers here.
305 if ((retval
= target_examine(cmd_ctx
)) != ERROR_OK
)
308 /* prepare reset_halt where necessary */
312 if (jtag_reset_config
& RESET_SRST_PULLS_TRST
)
314 switch (target
->reset_mode
)
317 command_print(cmd_ctx
, "nSRST pulls nTRST, falling back to \"reset run_and_halt\"");
318 target
->reset_mode
= RESET_RUN_AND_HALT
;
321 command_print(cmd_ctx
, "nSRST pulls nTRST, falling back to \"reset run_and_init\"");
322 target
->reset_mode
= RESET_RUN_AND_INIT
;
328 target
= target
->next
;
334 /* we have no idea what state the target is in, so we
335 * have to drop working areas
337 target_free_all_working_areas_restore(target
, 0);
338 target
->type
->assert_reset(target
);
339 target
= target
->next
;
341 if ((retval
= jtag_execute_queue()) != ERROR_OK
)
343 LOG_WARNING("JTAG communication failed asserting reset.");
347 /* request target halt if necessary, and schedule further action */
351 switch (target
->reset_mode
)
354 /* nothing to do if target just wants to be run */
356 case RESET_RUN_AND_HALT
:
358 target_register_timer_callback(target_run_and_halt_handler
, target
->run_and_halt_time
, 0, target
);
360 case RESET_RUN_AND_INIT
:
362 target_register_timer_callback(target_run_and_halt_handler
, target
->run_and_halt_time
, 0, target
);
363 target_register_event_callback(target_init_handler
, cmd_ctx
);
370 target_register_event_callback(target_init_handler
, cmd_ctx
);
373 LOG_ERROR("BUG: unknown target->reset_mode");
375 target
= target
->next
;
378 if ((retval
= jtag_execute_queue()) != ERROR_OK
)
380 LOG_WARNING("JTAG communication failed while reset was asserted. Consider using srst_only for reset_config.");
387 target
->type
->deassert_reset(target
);
388 target
= target
->next
;
391 if ((retval
= jtag_execute_queue()) != ERROR_OK
)
393 LOG_WARNING("JTAG communication failed while deasserting reset.");
397 if (jtag_reset_config
& RESET_SRST_PULLS_TRST
)
399 /* If TRST was asserted we need to set up registers again */
400 if ((retval
= target_examine(cmd_ctx
)) != ERROR_OK
)
405 LOG_DEBUG("Waiting for halted stated as approperiate");
407 /* Wait for reset to complete, maximum 5 seconds. */
408 gettimeofday(&timeout
, NULL
);
409 timeval_add_time(&timeout
, 5, 0);
412 gettimeofday(&now
, NULL
);
414 target_call_timer_callbacks_now();
419 LOG_DEBUG("Polling target");
421 if ((target
->reset_mode
== RESET_RUN_AND_INIT
) ||
422 (target
->reset_mode
== RESET_RUN_AND_HALT
) ||
423 (target
->reset_mode
== RESET_HALT
) ||
424 (target
->reset_mode
== RESET_INIT
))
426 if (target
->state
!= TARGET_HALTED
)
428 if ((now
.tv_sec
> timeout
.tv_sec
) || ((now
.tv_sec
== timeout
.tv_sec
) && (now
.tv_usec
>= timeout
.tv_usec
)))
430 LOG_USER("Timed out waiting for halt after reset");
433 /* this will send alive messages on e.g. GDB remote protocol. */
435 LOG_USER_N("%s", ""); /* avoid warning about zero length formatting message*/
439 target
= target
->next
;
441 /* All targets we're waiting for are halted */
449 /* We want any events to be processed before the prompt */
450 target_call_timer_callbacks_now();
452 /* if we timed out we need to unregister these handlers */
456 target_unregister_timer_callback(target_run_and_halt_handler
, target
);
457 target
= target
->next
;
459 target_unregister_event_callback(target_init_handler
, cmd_ctx
);
461 jtag
->speed(jtag_speed_post_reset
);
466 static int default_virt2phys(struct target_s
*target
, u32
virtual, u32
*physical
)
472 static int default_mmu(struct target_s
*target
, int *enabled
)
478 static int default_examine(struct command_context_s
*cmd_ctx
, struct target_s
*target
)
480 target
->type
->examined
= 1;
485 /* Targets that correctly implement init+examine, i.e.
486 * no communication with target during init:
490 int target_examine(struct command_context_s
*cmd_ctx
)
492 int retval
= ERROR_OK
;
493 target_t
*target
= targets
;
496 if ((retval
= target
->type
->examine(cmd_ctx
, target
))!=ERROR_OK
)
498 target
= target
->next
;
503 static int target_write_memory_imp(struct target_s
*target
, u32 address
, u32 size
, u32 count
, u8
*buffer
)
505 if (!target
->type
->examined
)
507 LOG_ERROR("Target not examined yet");
510 return target
->type
->write_memory_imp(target
, address
, size
, count
, buffer
);
513 static int target_read_memory_imp(struct target_s
*target
, u32 address
, u32 size
, u32 count
, u8
*buffer
)
515 if (!target
->type
->examined
)
517 LOG_ERROR("Target not examined yet");
520 return target
->type
->read_memory_imp(target
, address
, size
, count
, buffer
);
523 static int target_soft_reset_halt_imp(struct target_s
*target
)
525 if (!target
->type
->examined
)
527 LOG_ERROR("Target not examined yet");
530 return target
->type
->soft_reset_halt_imp(target
);
533 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
)
535 if (!target
->type
->examined
)
537 LOG_ERROR("Target not examined yet");
540 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
);
543 int target_init(struct command_context_s
*cmd_ctx
)
545 target_t
*target
= targets
;
549 target
->type
->examined
= 0;
550 if (target
->type
->examine
== NULL
)
552 target
->type
->examine
= default_examine
;
555 if (target
->type
->init_target(cmd_ctx
, target
) != ERROR_OK
)
557 LOG_ERROR("target '%s' init failed", target
->type
->name
);
561 /* Set up default functions if none are provided by target */
562 if (target
->type
->virt2phys
== NULL
)
564 target
->type
->virt2phys
= default_virt2phys
;
566 target
->type
->virt2phys
= default_virt2phys
;
567 /* a non-invasive way(in terms of patches) to add some code that
568 * runs before the type->write/read_memory implementation
570 target
->type
->write_memory_imp
= target
->type
->write_memory
;
571 target
->type
->write_memory
= target_write_memory_imp
;
572 target
->type
->read_memory_imp
= target
->type
->read_memory
;
573 target
->type
->read_memory
= target_read_memory_imp
;
574 target
->type
->soft_reset_halt_imp
= target
->type
->soft_reset_halt
;
575 target
->type
->soft_reset_halt
= target_soft_reset_halt_imp
;
576 target
->type
->run_algorithm_imp
= target
->type
->run_algorithm
;
577 target
->type
->run_algorithm
= target_run_algorithm_imp
;
580 if (target
->type
->mmu
== NULL
)
582 target
->type
->mmu
= default_mmu
;
584 target
= target
->next
;
589 target_register_user_commands(cmd_ctx
);
590 target_register_timer_callback(handle_target
, 100, 1, NULL
);
596 int target_register_event_callback(int (*callback
)(struct target_s
*target
, enum target_event event
, void *priv
), void *priv
)
598 target_event_callback_t
**callbacks_p
= &target_event_callbacks
;
600 if (callback
== NULL
)
602 return ERROR_INVALID_ARGUMENTS
;
607 while ((*callbacks_p
)->next
)
608 callbacks_p
= &((*callbacks_p
)->next
);
609 callbacks_p
= &((*callbacks_p
)->next
);
612 (*callbacks_p
) = malloc(sizeof(target_event_callback_t
));
613 (*callbacks_p
)->callback
= callback
;
614 (*callbacks_p
)->priv
= priv
;
615 (*callbacks_p
)->next
= NULL
;
620 int target_register_timer_callback(int (*callback
)(void *priv
), int time_ms
, int periodic
, void *priv
)
622 target_timer_callback_t
**callbacks_p
= &target_timer_callbacks
;
625 if (callback
== NULL
)
627 return ERROR_INVALID_ARGUMENTS
;
632 while ((*callbacks_p
)->next
)
633 callbacks_p
= &((*callbacks_p
)->next
);
634 callbacks_p
= &((*callbacks_p
)->next
);
637 (*callbacks_p
) = malloc(sizeof(target_timer_callback_t
));
638 (*callbacks_p
)->callback
= callback
;
639 (*callbacks_p
)->periodic
= periodic
;
640 (*callbacks_p
)->time_ms
= time_ms
;
642 gettimeofday(&now
, NULL
);
643 (*callbacks_p
)->when
.tv_usec
= now
.tv_usec
+ (time_ms
% 1000) * 1000;
644 time_ms
-= (time_ms
% 1000);
645 (*callbacks_p
)->when
.tv_sec
= now
.tv_sec
+ (time_ms
/ 1000);
646 if ((*callbacks_p
)->when
.tv_usec
> 1000000)
648 (*callbacks_p
)->when
.tv_usec
= (*callbacks_p
)->when
.tv_usec
- 1000000;
649 (*callbacks_p
)->when
.tv_sec
+= 1;
652 (*callbacks_p
)->priv
= priv
;
653 (*callbacks_p
)->next
= NULL
;
658 int target_unregister_event_callback(int (*callback
)(struct target_s
*target
, enum target_event event
, void *priv
), void *priv
)
660 target_event_callback_t
**p
= &target_event_callbacks
;
661 target_event_callback_t
*c
= target_event_callbacks
;
663 if (callback
== NULL
)
665 return ERROR_INVALID_ARGUMENTS
;
670 target_event_callback_t
*next
= c
->next
;
671 if ((c
->callback
== callback
) && (c
->priv
== priv
))
685 int target_unregister_timer_callback(int (*callback
)(void *priv
), void *priv
)
687 target_timer_callback_t
**p
= &target_timer_callbacks
;
688 target_timer_callback_t
*c
= target_timer_callbacks
;
690 if (callback
== NULL
)
692 return ERROR_INVALID_ARGUMENTS
;
697 target_timer_callback_t
*next
= c
->next
;
698 if ((c
->callback
== callback
) && (c
->priv
== priv
))
712 int target_call_event_callbacks(target_t
*target
, enum target_event event
)
714 target_event_callback_t
*callback
= target_event_callbacks
;
715 target_event_callback_t
*next_callback
;
717 LOG_DEBUG("target event %i", event
);
721 next_callback
= callback
->next
;
722 callback
->callback(target
, event
, callback
->priv
);
723 callback
= next_callback
;
729 static int target_call_timer_callbacks_check_time(int checktime
)
731 target_timer_callback_t
*callback
= target_timer_callbacks
;
732 target_timer_callback_t
*next_callback
;
735 gettimeofday(&now
, NULL
);
739 next_callback
= callback
->next
;
741 if ((!checktime
&&callback
->periodic
)||
742 (((now
.tv_sec
>= callback
->when
.tv_sec
) && (now
.tv_usec
>= callback
->when
.tv_usec
))
743 || (now
.tv_sec
> callback
->when
.tv_sec
)))
745 if(callback
->callback
!= NULL
)
747 callback
->callback(callback
->priv
);
748 if (callback
->periodic
)
750 int time_ms
= callback
->time_ms
;
751 callback
->when
.tv_usec
= now
.tv_usec
+ (time_ms
% 1000) * 1000;
752 time_ms
-= (time_ms
% 1000);
753 callback
->when
.tv_sec
= now
.tv_sec
+ time_ms
/ 1000;
754 if (callback
->when
.tv_usec
> 1000000)
756 callback
->when
.tv_usec
= callback
->when
.tv_usec
- 1000000;
757 callback
->when
.tv_sec
+= 1;
761 target_unregister_timer_callback(callback
->callback
, callback
->priv
);
765 callback
= next_callback
;
771 int target_call_timer_callbacks()
773 return target_call_timer_callbacks_check_time(1);
776 /* invoke periodic callbacks immediately */
777 int target_call_timer_callbacks_now()
779 return target_call_timer_callbacks(0);
782 int target_alloc_working_area(struct target_s
*target
, u32 size
, working_area_t
**area
)
784 working_area_t
*c
= target
->working_areas
;
785 working_area_t
*new_wa
= NULL
;
787 /* Reevaluate working area address based on MMU state*/
788 if (target
->working_areas
== NULL
)
792 retval
= target
->type
->mmu(target
, &enabled
);
793 if (retval
!= ERROR_OK
)
799 target
->working_area
= target
->working_area_virt
;
803 target
->working_area
= target
->working_area_phys
;
807 /* only allocate multiples of 4 byte */
810 LOG_ERROR("BUG: code tried to allocate unaligned number of bytes, padding");
811 size
= CEIL(size
, 4);
814 /* see if there's already a matching working area */
817 if ((c
->free
) && (c
->size
== size
))
825 /* if not, allocate a new one */
828 working_area_t
**p
= &target
->working_areas
;
829 u32 first_free
= target
->working_area
;
830 u32 free_size
= target
->working_area_size
;
832 LOG_DEBUG("allocating new working area");
834 c
= target
->working_areas
;
837 first_free
+= c
->size
;
838 free_size
-= c
->size
;
843 if (free_size
< size
)
845 LOG_WARNING("not enough working area available(requested %d, free %d)", size
, free_size
);
846 return ERROR_TARGET_RESOURCE_NOT_AVAILABLE
;
849 new_wa
= malloc(sizeof(working_area_t
));
852 new_wa
->address
= first_free
;
854 if (target
->backup_working_area
)
856 new_wa
->backup
= malloc(new_wa
->size
);
857 target
->type
->read_memory(target
, new_wa
->address
, 4, new_wa
->size
/ 4, new_wa
->backup
);
861 new_wa
->backup
= NULL
;
864 /* put new entry in list */
868 /* mark as used, and return the new (reused) area */
878 int target_free_working_area_restore(struct target_s
*target
, working_area_t
*area
, int restore
)
883 if (restore
&&target
->backup_working_area
)
884 target
->type
->write_memory(target
, area
->address
, 4, area
->size
/ 4, area
->backup
);
888 /* mark user pointer invalid */
895 int target_free_working_area(struct target_s
*target
, working_area_t
*area
)
897 return target_free_working_area_restore(target
, area
, 1);
900 int target_free_all_working_areas_restore(struct target_s
*target
, int restore
)
902 working_area_t
*c
= target
->working_areas
;
906 working_area_t
*next
= c
->next
;
907 target_free_working_area_restore(target
, c
, restore
);
917 target
->working_areas
= NULL
;
922 int target_free_all_working_areas(struct target_s
*target
)
924 return target_free_all_working_areas_restore(target
, 1);
927 int target_register_commands(struct command_context_s
*cmd_ctx
)
929 register_command(cmd_ctx
, NULL
, "target", handle_target_command
, COMMAND_CONFIG
, "target <cpu> [reset_init default - DEPRECATED] <chainpos> <endianness> <variant> [cpu type specifc args]");
930 register_command(cmd_ctx
, NULL
, "targets", handle_targets_command
, COMMAND_EXEC
, NULL
);
931 register_command(cmd_ctx
, NULL
, "target_script", handle_target_script_command
, COMMAND_CONFIG
,
932 "target_script <target#> <event=reset/pre_reset/post_halt/pre_resume/gdb_program_config> <script_file>");
933 register_command(cmd_ctx
, NULL
, "run_and_halt_time", handle_run_and_halt_time_command
, COMMAND_CONFIG
, "<target> <run time ms>");
934 register_command(cmd_ctx
, NULL
, "working_area", handle_working_area_command
, COMMAND_ANY
, "working_area <target#> <address> <size> <'backup'|'nobackup'> [virtual address]");
935 register_command(cmd_ctx
, NULL
, "virt2phys", handle_virt2phys_command
, COMMAND_ANY
, "virt2phys <virtual address>");
936 register_command(cmd_ctx
, NULL
, "profile", handle_profile_command
, COMMAND_EXEC
, "PRELIMINARY! - profile <seconds> <gmon.out>");
941 int target_arch_state(struct target_s
*target
)
946 LOG_USER("No target has been configured");
950 LOG_USER("target state: %s", target_state_strings
[target
->state
]);
952 if (target
->state
!=TARGET_HALTED
)
955 retval
=target
->type
->arch_state(target
);
959 /* Single aligned words are guaranteed to use 16 or 32 bit access
960 * mode respectively, otherwise data is handled as quickly as
963 int target_write_buffer(struct target_s
*target
, u32 address
, u32 size
, u8
*buffer
)
966 if (!target
->type
->examined
)
968 LOG_ERROR("Target not examined yet");
972 LOG_DEBUG("writing buffer of %i byte at 0x%8.8x", size
, address
);
974 if (((address
% 2) == 0) && (size
== 2))
976 return target
->type
->write_memory(target
, address
, 2, 1, buffer
);
979 /* handle unaligned head bytes */
982 int unaligned
= 4 - (address
% 4);
984 if (unaligned
> size
)
987 if ((retval
= target
->type
->write_memory(target
, address
, 1, unaligned
, buffer
)) != ERROR_OK
)
991 address
+= unaligned
;
995 /* handle aligned words */
998 int aligned
= size
- (size
% 4);
1000 /* use bulk writes above a certain limit. This may have to be changed */
1003 if ((retval
= target
->type
->bulk_write_memory(target
, address
, aligned
/ 4, buffer
)) != ERROR_OK
)
1008 if ((retval
= target
->type
->write_memory(target
, address
, 4, aligned
/ 4, buffer
)) != ERROR_OK
)
1017 /* handle tail writes of less than 4 bytes */
1020 if ((retval
= target
->type
->write_memory(target
, address
, 1, size
, buffer
)) != ERROR_OK
)
1028 /* Single aligned words are guaranteed to use 16 or 32 bit access
1029 * mode respectively, otherwise data is handled as quickly as
1032 int target_read_buffer(struct target_s
*target
, u32 address
, u32 size
, u8
*buffer
)
1035 if (!target
->type
->examined
)
1037 LOG_ERROR("Target not examined yet");
1041 LOG_DEBUG("reading buffer of %i byte at 0x%8.8x", size
, address
);
1043 if (((address
% 2) == 0) && (size
== 2))
1045 return target
->type
->read_memory(target
, address
, 2, 1, buffer
);
1048 /* handle unaligned head bytes */
1051 int unaligned
= 4 - (address
% 4);
1053 if (unaligned
> size
)
1056 if ((retval
= target
->type
->read_memory(target
, address
, 1, unaligned
, buffer
)) != ERROR_OK
)
1059 buffer
+= unaligned
;
1060 address
+= unaligned
;
1064 /* handle aligned words */
1067 int aligned
= size
- (size
% 4);
1069 if ((retval
= target
->type
->read_memory(target
, address
, 4, aligned
/ 4, buffer
)) != ERROR_OK
)
1077 /* handle tail writes of less than 4 bytes */
1080 if ((retval
= target
->type
->read_memory(target
, address
, 1, size
, buffer
)) != ERROR_OK
)
1087 int target_checksum_memory(struct target_s
*target
, u32 address
, u32 size
, u32
* crc
)
1093 if (!target
->type
->examined
)
1095 LOG_ERROR("Target not examined yet");
1099 if ((retval
= target
->type
->checksum_memory(target
, address
,
1100 size
, &checksum
)) == ERROR_TARGET_RESOURCE_NOT_AVAILABLE
)
1102 buffer
= malloc(size
);
1105 LOG_ERROR("error allocating buffer for section (%d bytes)", size
);
1106 return ERROR_INVALID_ARGUMENTS
;
1108 retval
= target_read_buffer(target
, address
, size
, buffer
);
1109 if (retval
!= ERROR_OK
)
1115 /* convert to target endianess */
1116 for (i
= 0; i
< (size
/sizeof(u32
)); i
++)
1119 target_data
= target_buffer_get_u32(target
, &buffer
[i
*sizeof(u32
)]);
1120 target_buffer_set_u32(target
, &buffer
[i
*sizeof(u32
)], target_data
);
1123 retval
= image_calculate_checksum( buffer
, size
, &checksum
);
1132 int target_blank_check_memory(struct target_s
*target
, u32 address
, u32 size
, u32
* blank
)
1135 if (!target
->type
->examined
)
1137 LOG_ERROR("Target not examined yet");
1141 if (target
->type
->blank_check_memory
== 0)
1142 return ERROR_TARGET_RESOURCE_NOT_AVAILABLE
;
1144 retval
= target
->type
->blank_check_memory(target
, address
, size
, blank
);
1149 int target_read_u32(struct target_s
*target
, u32 address
, u32
*value
)
1152 if (!target
->type
->examined
)
1154 LOG_ERROR("Target not examined yet");
1158 int retval
= target
->type
->read_memory(target
, address
, 4, 1, value_buf
);
1160 if (retval
== ERROR_OK
)
1162 *value
= target_buffer_get_u32(target
, value_buf
);
1163 LOG_DEBUG("address: 0x%8.8x, value: 0x%8.8x", address
, *value
);
1168 LOG_DEBUG("address: 0x%8.8x failed", address
);
1174 int target_read_u16(struct target_s
*target
, u32 address
, u16
*value
)
1177 if (!target
->type
->examined
)
1179 LOG_ERROR("Target not examined yet");
1183 int retval
= target
->type
->read_memory(target
, address
, 2, 1, value_buf
);
1185 if (retval
== ERROR_OK
)
1187 *value
= target_buffer_get_u16(target
, value_buf
);
1188 LOG_DEBUG("address: 0x%8.8x, value: 0x%4.4x", address
, *value
);
1193 LOG_DEBUG("address: 0x%8.8x failed", address
);
1199 int target_read_u8(struct target_s
*target
, u32 address
, u8
*value
)
1201 int retval
= target
->type
->read_memory(target
, address
, 1, 1, value
);
1202 if (!target
->type
->examined
)
1204 LOG_ERROR("Target not examined yet");
1208 if (retval
== ERROR_OK
)
1210 LOG_DEBUG("address: 0x%8.8x, value: 0x%2.2x", address
, *value
);
1215 LOG_DEBUG("address: 0x%8.8x failed", address
);
1221 int target_write_u32(struct target_s
*target
, u32 address
, u32 value
)
1225 if (!target
->type
->examined
)
1227 LOG_ERROR("Target not examined yet");
1231 LOG_DEBUG("address: 0x%8.8x, value: 0x%8.8x", address
, value
);
1233 target_buffer_set_u32(target
, value_buf
, value
);
1234 if ((retval
= target
->type
->write_memory(target
, address
, 4, 1, value_buf
)) != ERROR_OK
)
1236 LOG_DEBUG("failed: %i", retval
);
1242 int target_write_u16(struct target_s
*target
, u32 address
, u16 value
)
1246 if (!target
->type
->examined
)
1248 LOG_ERROR("Target not examined yet");
1252 LOG_DEBUG("address: 0x%8.8x, value: 0x%8.8x", address
, value
);
1254 target_buffer_set_u16(target
, value_buf
, value
);
1255 if ((retval
= target
->type
->write_memory(target
, address
, 2, 1, value_buf
)) != ERROR_OK
)
1257 LOG_DEBUG("failed: %i", retval
);
1263 int target_write_u8(struct target_s
*target
, u32 address
, u8 value
)
1266 if (!target
->type
->examined
)
1268 LOG_ERROR("Target not examined yet");
1272 LOG_DEBUG("address: 0x%8.8x, value: 0x%2.2x", address
, value
);
1274 if ((retval
= target
->type
->read_memory(target
, address
, 1, 1, &value
)) != ERROR_OK
)
1276 LOG_DEBUG("failed: %i", retval
);
1282 int target_register_user_commands(struct command_context_s
*cmd_ctx
)
1284 register_command(cmd_ctx
, NULL
, "reg", handle_reg_command
, COMMAND_EXEC
, NULL
);
1285 register_command(cmd_ctx
, NULL
, "poll", handle_poll_command
, COMMAND_EXEC
, "poll target state");
1286 register_command(cmd_ctx
, NULL
, "wait_halt", handle_wait_halt_command
, COMMAND_EXEC
, "wait for target halt [time (s)]");
1287 register_command(cmd_ctx
, NULL
, "halt", handle_halt_command
, COMMAND_EXEC
, "halt target");
1288 register_command(cmd_ctx
, NULL
, "resume", handle_resume_command
, COMMAND_EXEC
, "resume target [addr]");
1289 register_command(cmd_ctx
, NULL
, "step", handle_step_command
, COMMAND_EXEC
, "step one instruction from current PC or [addr]");
1290 register_command(cmd_ctx
, NULL
, "reset", handle_reset_command
, COMMAND_EXEC
, "reset target [run|halt|init|run_and_halt|run_and_init]");
1291 register_command(cmd_ctx
, NULL
, "soft_reset_halt", handle_soft_reset_halt_command
, COMMAND_EXEC
, "halt the target and do a soft reset");
1293 register_command(cmd_ctx
, NULL
, "mdw", handle_md_command
, COMMAND_EXEC
, "display memory words <addr> [count]");
1294 register_command(cmd_ctx
, NULL
, "mdh", handle_md_command
, COMMAND_EXEC
, "display memory half-words <addr> [count]");
1295 register_command(cmd_ctx
, NULL
, "mdb", handle_md_command
, COMMAND_EXEC
, "display memory bytes <addr> [count]");
1297 register_command(cmd_ctx
, NULL
, "mww", handle_mw_command
, COMMAND_EXEC
, "write memory word <addr> <value> [count]");
1298 register_command(cmd_ctx
, NULL
, "mwh", handle_mw_command
, COMMAND_EXEC
, "write memory half-word <addr> <value> [count]");
1299 register_command(cmd_ctx
, NULL
, "mwb", handle_mw_command
, COMMAND_EXEC
, "write memory byte <addr> <value> [count]");
1301 register_command(cmd_ctx
, NULL
, "bp", handle_bp_command
, COMMAND_EXEC
, "set breakpoint <address> <length> [hw]");
1302 register_command(cmd_ctx
, NULL
, "rbp", handle_rbp_command
, COMMAND_EXEC
, "remove breakpoint <adress>");
1303 register_command(cmd_ctx
, NULL
, "wp", handle_wp_command
, COMMAND_EXEC
, "set watchpoint <address> <length> <r/w/a> [value] [mask]");
1304 register_command(cmd_ctx
, NULL
, "rwp", handle_rwp_command
, COMMAND_EXEC
, "remove watchpoint <adress>");
1306 register_command(cmd_ctx
, NULL
, "load_image", handle_load_image_command
, COMMAND_EXEC
, "load_image <file> <address> ['bin'|'ihex'|'elf'|'s19']");
1307 register_command(cmd_ctx
, NULL
, "dump_image", handle_dump_image_command
, COMMAND_EXEC
, "dump_image <file> <address> <size>");
1308 register_command(cmd_ctx
, NULL
, "verify_image", handle_verify_image_command
, COMMAND_EXEC
, "verify_image <file> [offset] [type]");
1309 register_command(cmd_ctx
, NULL
, "load_binary", handle_load_image_command
, COMMAND_EXEC
, "[DEPRECATED] load_binary <file> <address>");
1310 register_command(cmd_ctx
, NULL
, "dump_binary", handle_dump_image_command
, COMMAND_EXEC
, "[DEPRECATED] dump_binary <file> <address> <size>");
1312 target_request_register_commands(cmd_ctx
);
1313 trace_register_commands(cmd_ctx
);
1318 int handle_targets_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1320 target_t
*target
= targets
;
1325 int num
= strtoul(args
[0], NULL
, 0);
1330 target
= target
->next
;
1334 cmd_ctx
->current_target
= num
;
1336 command_print(cmd_ctx
, "%i is out of bounds, only %i targets are configured", num
, count
);
1343 command_print(cmd_ctx
, "%i: %s (%s), state: %s", count
++, target
->type
->name
, target_endianess_strings
[target
->endianness
], target_state_strings
[target
->state
]);
1344 target
= target
->next
;
1350 int handle_target_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1357 return ERROR_COMMAND_SYNTAX_ERROR
;
1360 /* search for the specified target */
1361 if (args
[0] && (args
[0][0] != 0))
1363 for (i
= 0; target_types
[i
]; i
++)
1365 if (strcmp(args
[0], target_types
[i
]->name
) == 0)
1367 target_t
**last_target_p
= &targets
;
1369 /* register target specific commands */
1370 if (target_types
[i
]->register_commands(cmd_ctx
) != ERROR_OK
)
1372 LOG_ERROR("couldn't register '%s' commands", args
[0]);
1378 while ((*last_target_p
)->next
)
1379 last_target_p
= &((*last_target_p
)->next
);
1380 last_target_p
= &((*last_target_p
)->next
);
1383 *last_target_p
= malloc(sizeof(target_t
));
1385 /* allocate memory for each unique target type */
1386 (*last_target_p
)->type
= (target_type_t
*)malloc(sizeof(target_type_t
));
1387 *((*last_target_p
)->type
) = *target_types
[i
];
1389 if (strcmp(args
[1], "big") == 0)
1390 (*last_target_p
)->endianness
= TARGET_BIG_ENDIAN
;
1391 else if (strcmp(args
[1], "little") == 0)
1392 (*last_target_p
)->endianness
= TARGET_LITTLE_ENDIAN
;
1395 LOG_ERROR("endianness must be either 'little' or 'big', not '%s'", args
[1]);
1396 return ERROR_COMMAND_SYNTAX_ERROR
;
1399 /* what to do on a target reset */
1400 (*last_target_p
)->reset_mode
= RESET_INIT
; /* default */
1401 if (strcmp(args
[2], "reset_halt") == 0)
1402 (*last_target_p
)->reset_mode
= RESET_HALT
;
1403 else if (strcmp(args
[2], "reset_run") == 0)
1404 (*last_target_p
)->reset_mode
= RESET_RUN
;
1405 else if (strcmp(args
[2], "reset_init") == 0)
1406 (*last_target_p
)->reset_mode
= RESET_INIT
;
1407 else if (strcmp(args
[2], "run_and_halt") == 0)
1408 (*last_target_p
)->reset_mode
= RESET_RUN_AND_HALT
;
1409 else if (strcmp(args
[2], "run_and_init") == 0)
1410 (*last_target_p
)->reset_mode
= RESET_RUN_AND_INIT
;
1413 /* Kludge! we want to make this reset arg optional while remaining compatible! */
1417 (*last_target_p
)->run_and_halt_time
= 1000; /* default 1s */
1419 (*last_target_p
)->working_area
= 0x0;
1420 (*last_target_p
)->working_area_size
= 0x0;
1421 (*last_target_p
)->working_areas
= NULL
;
1422 (*last_target_p
)->backup_working_area
= 0;
1424 (*last_target_p
)->state
= TARGET_UNKNOWN
;
1425 (*last_target_p
)->debug_reason
= DBG_REASON_UNDEFINED
;
1426 (*last_target_p
)->reg_cache
= NULL
;
1427 (*last_target_p
)->breakpoints
= NULL
;
1428 (*last_target_p
)->watchpoints
= NULL
;
1429 (*last_target_p
)->next
= NULL
;
1430 (*last_target_p
)->arch_info
= NULL
;
1432 /* initialize trace information */
1433 (*last_target_p
)->trace_info
= malloc(sizeof(trace_t
));
1434 (*last_target_p
)->trace_info
->num_trace_points
= 0;
1435 (*last_target_p
)->trace_info
->trace_points_size
= 0;
1436 (*last_target_p
)->trace_info
->trace_points
= NULL
;
1437 (*last_target_p
)->trace_info
->trace_history_size
= 0;
1438 (*last_target_p
)->trace_info
->trace_history
= NULL
;
1439 (*last_target_p
)->trace_info
->trace_history_pos
= 0;
1440 (*last_target_p
)->trace_info
->trace_history_overflowed
= 0;
1442 (*last_target_p
)->dbgmsg
= NULL
;
1443 (*last_target_p
)->dbg_msg_enabled
= 0;
1445 (*last_target_p
)->type
->target_command(cmd_ctx
, cmd
, args
, argc
, *last_target_p
);
1453 /* no matching target found */
1456 LOG_ERROR("target '%s' not found", args
[0]);
1457 return ERROR_COMMAND_SYNTAX_ERROR
;
1463 int target_invoke_script(struct command_context_s
*cmd_ctx
, target_t
*target
, char *name
)
1465 return command_run_linef(cmd_ctx
, " if {[catch {info body target_%s_%d} t]==0} {target_%s_%d}",
1466 name
, get_num_by_target(target
),
1467 name
, get_num_by_target(target
));
1470 int handle_target_script_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1472 target_t
*target
= NULL
;
1476 LOG_ERROR("incomplete target_script command");
1477 return ERROR_COMMAND_SYNTAX_ERROR
;
1480 target
= get_target_by_num(strtoul(args
[0], NULL
, 0));
1484 return ERROR_COMMAND_SYNTAX_ERROR
;
1487 const char *event
=args
[1];
1488 if (strcmp("reset", event
)==0)
1494 /* Define a tcl procedure which we'll invoke upon some event */
1495 command_run_linef(cmd_ctx
,
1496 "proc target_%s_%d {} {"
1497 "openocd {script %s}"
1500 get_num_by_target(target
),
1506 int handle_run_and_halt_time_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1508 target_t
*target
= NULL
;
1512 return ERROR_COMMAND_SYNTAX_ERROR
;
1515 target
= get_target_by_num(strtoul(args
[0], NULL
, 0));
1518 return ERROR_COMMAND_SYNTAX_ERROR
;
1521 target
->run_and_halt_time
= strtoul(args
[1], NULL
, 0);
1526 int handle_working_area_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1528 target_t
*target
= NULL
;
1530 if ((argc
< 4) || (argc
> 5))
1532 return ERROR_COMMAND_SYNTAX_ERROR
;
1535 target
= get_target_by_num(strtoul(args
[0], NULL
, 0));
1538 return ERROR_COMMAND_SYNTAX_ERROR
;
1540 target_free_all_working_areas(target
);
1542 target
->working_area_phys
= target
->working_area_virt
= strtoul(args
[1], NULL
, 0);
1545 target
->working_area_virt
= strtoul(args
[4], NULL
, 0);
1547 target
->working_area_size
= strtoul(args
[2], NULL
, 0);
1549 if (strcmp(args
[3], "backup") == 0)
1551 target
->backup_working_area
= 1;
1553 else if (strcmp(args
[3], "nobackup") == 0)
1555 target
->backup_working_area
= 0;
1559 LOG_ERROR("unrecognized <backup|nobackup> argument (%s)", args
[3]);
1560 return ERROR_COMMAND_SYNTAX_ERROR
;
1567 /* process target state changes */
1568 int handle_target(void *priv
)
1570 target_t
*target
= targets
;
1574 if (target_continous_poll
)
1576 /* polling may fail silently until the target has been examined */
1577 target_poll(target
);
1580 target
= target
->next
;
1586 int handle_reg_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1595 target
= get_current_target(cmd_ctx
);
1597 /* list all available registers for the current target */
1600 reg_cache_t
*cache
= target
->reg_cache
;
1606 for (i
= 0; i
< cache
->num_regs
; i
++)
1608 value
= buf_to_str(cache
->reg_list
[i
].value
, cache
->reg_list
[i
].size
, 16);
1609 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
);
1612 cache
= cache
->next
;
1618 /* access a single register by its ordinal number */
1619 if ((args
[0][0] >= '0') && (args
[0][0] <= '9'))
1621 int num
= strtoul(args
[0], NULL
, 0);
1622 reg_cache_t
*cache
= target
->reg_cache
;
1628 for (i
= 0; i
< cache
->num_regs
; i
++)
1632 reg
= &cache
->reg_list
[i
];
1638 cache
= cache
->next
;
1643 command_print(cmd_ctx
, "%i is out of bounds, the current target has only %i registers (0 - %i)", num
, count
, count
- 1);
1646 } else /* access a single register by its name */
1648 reg
= register_get_by_name(target
->reg_cache
, args
[0], 1);
1652 command_print(cmd_ctx
, "register %s not found in current target", args
[0]);
1657 /* display a register */
1658 if ((argc
== 1) || ((argc
== 2) && !((args
[1][0] >= '0') && (args
[1][0] <= '9'))))
1660 if ((argc
== 2) && (strcmp(args
[1], "force") == 0))
1663 if (reg
->valid
== 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");
1671 arch_type
->get(reg
);
1673 value
= buf_to_str(reg
->value
, reg
->size
, 16);
1674 command_print(cmd_ctx
, "%s (/%i): 0x%s", reg
->name
, reg
->size
, value
);
1679 /* set register value */
1682 u8
*buf
= malloc(CEIL(reg
->size
, 8));
1683 str_to_buf(args
[1], strlen(args
[1]), buf
, reg
->size
, 0);
1685 reg_arch_type_t
*arch_type
= register_get_arch_type(reg
->arch_type
);
1686 if (arch_type
== NULL
)
1688 LOG_ERROR("BUG: encountered unregistered arch type");
1692 arch_type
->set(reg
, buf
);
1694 value
= buf_to_str(reg
->value
, reg
->size
, 16);
1695 command_print(cmd_ctx
, "%s (/%i): 0x%s", reg
->name
, reg
->size
, value
);
1703 command_print(cmd_ctx
, "usage: reg <#|name> [value]");
1708 static int wait_state(struct command_context_s
*cmd_ctx
, char *cmd
, enum target_state state
, int ms
);
1710 int handle_poll_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1712 target_t
*target
= get_current_target(cmd_ctx
);
1716 target_poll(target
);
1717 target_arch_state(target
);
1721 if (strcmp(args
[0], "on") == 0)
1723 target_continous_poll
= 1;
1725 else if (strcmp(args
[0], "off") == 0)
1727 target_continous_poll
= 0;
1731 command_print(cmd_ctx
, "arg is \"on\" or \"off\"");
1739 int handle_wait_halt_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1747 ms
= strtoul(args
[0], &end
, 0) * 1000;
1750 command_print(cmd_ctx
, "usage: %s [seconds]", cmd
);
1755 return wait_state(cmd_ctx
, cmd
, TARGET_HALTED
, ms
);
1758 static void target_process_events(struct command_context_s
*cmd_ctx
)
1760 target_t
*target
= get_current_target(cmd_ctx
);
1761 target_poll(target
);
1762 target_call_timer_callbacks_now();
1765 static int wait_state(struct command_context_s
*cmd_ctx
, char *cmd
, enum target_state state
, int ms
)
1768 struct timeval timeout
, now
;
1770 gettimeofday(&timeout
, NULL
);
1771 timeval_add_time(&timeout
, 0, ms
* 1000);
1773 target_t
*target
= get_current_target(cmd_ctx
);
1776 if ((retval
=target_poll(target
))!=ERROR_OK
)
1778 target_call_timer_callbacks_now();
1779 if (target
->state
== state
)
1786 command_print(cmd_ctx
, "waiting for target %s...", target_state_strings
[state
]);
1789 gettimeofday(&now
, NULL
);
1790 if ((now
.tv_sec
> timeout
.tv_sec
) || ((now
.tv_sec
== timeout
.tv_sec
) && (now
.tv_usec
>= timeout
.tv_usec
)))
1792 LOG_ERROR("timed out while waiting for target %s", target_state_strings
[state
]);
1800 int handle_halt_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1803 target_t
*target
= get_current_target(cmd_ctx
);
1807 if ((retval
= target_halt(target
)) != ERROR_OK
)
1812 return handle_wait_halt_command(cmd_ctx
, cmd
, args
, argc
);
1815 int handle_soft_reset_halt_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1817 target_t
*target
= get_current_target(cmd_ctx
);
1819 LOG_USER("requesting target halt and executing a soft reset");
1821 target
->type
->soft_reset_halt(target
);
1826 int handle_reset_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1828 target_t
*target
= get_current_target(cmd_ctx
);
1829 enum target_reset_mode reset_mode
= target
->reset_mode
;
1830 enum target_reset_mode save
= target
->reset_mode
;
1836 if (strcmp("run", args
[0]) == 0)
1837 reset_mode
= RESET_RUN
;
1838 else if (strcmp("halt", args
[0]) == 0)
1839 reset_mode
= RESET_HALT
;
1840 else if (strcmp("init", args
[0]) == 0)
1841 reset_mode
= RESET_INIT
;
1842 else if (strcmp("run_and_halt", args
[0]) == 0)
1844 reset_mode
= RESET_RUN_AND_HALT
;
1847 target
->run_and_halt_time
= strtoul(args
[1], NULL
, 0);
1850 else if (strcmp("run_and_init", args
[0]) == 0)
1852 reset_mode
= RESET_RUN_AND_INIT
;
1855 target
->run_and_halt_time
= strtoul(args
[1], NULL
, 0);
1860 command_print(cmd_ctx
, "usage: reset ['run', 'halt', 'init', 'run_and_halt', 'run_and_init]");
1865 /* temporarily modify mode of current reset target */
1866 target
->reset_mode
= reset_mode
;
1868 /* reset *all* targets */
1869 target_process_reset(cmd_ctx
);
1871 /* Restore default reset mode for this target */
1872 target
->reset_mode
= save
;
1877 int handle_resume_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1880 target_t
*target
= get_current_target(cmd_ctx
);
1882 target_invoke_script(cmd_ctx
, target
, "pre_resume");
1885 retval
= target_resume(target
, 1, 0, 1, 0); /* current pc, addr = 0, handle breakpoints, not debugging */
1887 retval
= target_resume(target
, 0, strtoul(args
[0], NULL
, 0), 1, 0); /* addr = args[0], handle breakpoints, not debugging */
1890 return ERROR_COMMAND_SYNTAX_ERROR
;
1893 target_process_events(cmd_ctx
);
1898 int handle_step_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1900 target_t
*target
= get_current_target(cmd_ctx
);
1905 target
->type
->step(target
, 1, 0, 1); /* current pc, addr = 0, handle breakpoints */
1908 target
->type
->step(target
, 0, strtoul(args
[0], NULL
, 0), 1); /* addr = args[0], handle breakpoints */
1913 int handle_md_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1915 const int line_bytecnt
= 32;
1928 target_t
*target
= get_current_target(cmd_ctx
);
1934 count
= strtoul(args
[1], NULL
, 0);
1936 address
= strtoul(args
[0], NULL
, 0);
1942 size
= 4; line_modulo
= line_bytecnt
/ 4;
1945 size
= 2; line_modulo
= line_bytecnt
/ 2;
1948 size
= 1; line_modulo
= line_bytecnt
/ 1;
1954 buffer
= calloc(count
, size
);
1955 retval
= target
->type
->read_memory(target
, address
, size
, count
, buffer
);
1956 if (retval
== ERROR_OK
)
1960 for (i
= 0; i
< count
; i
++)
1962 if (i
%line_modulo
== 0)
1963 output_len
+= snprintf(output
+ output_len
, 128 - output_len
, "0x%8.8x: ", address
+ (i
*size
));
1968 output_len
+= snprintf(output
+ output_len
, 128 - output_len
, "%8.8x ", target_buffer_get_u32(target
, &buffer
[i
*4]));
1971 output_len
+= snprintf(output
+ output_len
, 128 - output_len
, "%4.4x ", target_buffer_get_u16(target
, &buffer
[i
*2]));
1974 output_len
+= snprintf(output
+ output_len
, 128 - output_len
, "%2.2x ", buffer
[i
*1]);
1978 if ((i
%line_modulo
== line_modulo
-1) || (i
== count
- 1))
1980 command_print(cmd_ctx
, output
);
1991 int handle_mw_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1998 target_t
*target
= get_current_target(cmd_ctx
);
2001 if ((argc
< 2) || (argc
> 3))
2002 return ERROR_COMMAND_SYNTAX_ERROR
;
2004 address
= strtoul(args
[0], NULL
, 0);
2005 value
= strtoul(args
[1], NULL
, 0);
2007 count
= strtoul(args
[2], NULL
, 0);
2013 target_buffer_set_u32(target
, value_buf
, value
);
2017 target_buffer_set_u16(target
, value_buf
, value
);
2021 value_buf
[0] = value
;
2024 return ERROR_COMMAND_SYNTAX_ERROR
;
2026 for (i
=0; i
<count
; i
++)
2032 retval
= target
->type
->write_memory(target
, address
+ i
*wordsize
, 4, 1, value_buf
);
2035 retval
= target
->type
->write_memory(target
, address
+ i
*wordsize
, 2, 1, value_buf
);
2038 retval
= target
->type
->write_memory(target
, address
+ i
*wordsize
, 1, 1, value_buf
);
2043 if (retval
!=ERROR_OK
)
2053 int handle_load_image_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2063 duration_t duration
;
2064 char *duration_text
;
2066 target_t
*target
= get_current_target(cmd_ctx
);
2070 command_print(cmd_ctx
, "usage: load_image <filename> [address] [type]");
2074 /* a base address isn't always necessary, default to 0x0 (i.e. don't relocate) */
2077 image
.base_address_set
= 1;
2078 image
.base_address
= strtoul(args
[1], NULL
, 0);
2082 image
.base_address_set
= 0;
2085 image
.start_address_set
= 0;
2087 duration_start_measure(&duration
);
2089 if (image_open(&image
, args
[0], (argc
>= 3) ? args
[2] : NULL
) != ERROR_OK
)
2096 for (i
= 0; i
< image
.num_sections
; i
++)
2098 buffer
= malloc(image
.sections
[i
].size
);
2101 command_print(cmd_ctx
, "error allocating buffer for section (%d bytes)", image
.sections
[i
].size
);
2105 if ((retval
= image_read_section(&image
, i
, 0x0, image
.sections
[i
].size
, buffer
, &buf_cnt
)) != ERROR_OK
)
2110 if ((retval
= target_write_buffer(target
, image
.sections
[i
].base_address
, buf_cnt
, buffer
)) != ERROR_OK
)
2115 image_size
+= buf_cnt
;
2116 command_print(cmd_ctx
, "%u byte written at address 0x%8.8x", buf_cnt
, image
.sections
[i
].base_address
);
2121 duration_stop_measure(&duration
, &duration_text
);
2122 if (retval
==ERROR_OK
)
2124 command_print(cmd_ctx
, "downloaded %u byte in %s", image_size
, duration_text
);
2126 free(duration_text
);
2128 image_close(&image
);
2134 int handle_dump_image_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2141 int retval
=ERROR_OK
;
2143 duration_t duration
;
2144 char *duration_text
;
2146 target_t
*target
= get_current_target(cmd_ctx
);
2150 command_print(cmd_ctx
, "usage: dump_image <filename> <address> <size>");
2154 address
= strtoul(args
[1], NULL
, 0);
2155 size
= strtoul(args
[2], NULL
, 0);
2157 if ((address
& 3) || (size
& 3))
2159 command_print(cmd_ctx
, "only 32-bit aligned address and size are supported");
2163 if (fileio_open(&fileio
, args
[0], FILEIO_WRITE
, FILEIO_BINARY
) != ERROR_OK
)
2168 duration_start_measure(&duration
);
2173 u32 this_run_size
= (size
> 560) ? 560 : size
;
2175 retval
= target
->type
->read_memory(target
, address
, 4, this_run_size
/ 4, buffer
);
2176 if (retval
!= ERROR_OK
)
2181 retval
= fileio_write(&fileio
, this_run_size
, buffer
, &size_written
);
2182 if (retval
!= ERROR_OK
)
2187 size
-= this_run_size
;
2188 address
+= this_run_size
;
2191 fileio_close(&fileio
);
2193 duration_stop_measure(&duration
, &duration_text
);
2194 if (retval
==ERROR_OK
)
2196 command_print(cmd_ctx
, "dumped %"PRIi64
" byte in %s", fileio
.size
, duration_text
);
2198 free(duration_text
);
2203 int handle_verify_image_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2211 u32 mem_checksum
= 0;
2215 duration_t duration
;
2216 char *duration_text
;
2218 target_t
*target
= get_current_target(cmd_ctx
);
2222 return ERROR_COMMAND_SYNTAX_ERROR
;
2227 LOG_ERROR("no target selected");
2231 duration_start_measure(&duration
);
2235 image
.base_address_set
= 1;
2236 image
.base_address
= strtoul(args
[1], NULL
, 0);
2240 image
.base_address_set
= 0;
2241 image
.base_address
= 0x0;
2244 image
.start_address_set
= 0;
2246 if ((retval
=image_open(&image
, args
[0], (argc
== 3) ? args
[2] : NULL
)) != ERROR_OK
)
2253 for (i
= 0; i
< image
.num_sections
; i
++)
2255 buffer
= malloc(image
.sections
[i
].size
);
2258 command_print(cmd_ctx
, "error allocating buffer for section (%d bytes)", image
.sections
[i
].size
);
2261 if ((retval
= image_read_section(&image
, i
, 0x0, image
.sections
[i
].size
, buffer
, &buf_cnt
)) != ERROR_OK
)
2267 /* calculate checksum of image */
2268 image_calculate_checksum( buffer
, buf_cnt
, &checksum
);
2270 retval
= target_checksum_memory(target
, image
.sections
[i
].base_address
, buf_cnt
, &mem_checksum
);
2271 if( retval
!= ERROR_OK
)
2277 if( checksum
!= mem_checksum
)
2279 /* failed crc checksum, fall back to a binary compare */
2282 command_print(cmd_ctx
, "checksum mismatch - attempting binary compare");
2284 data
= (u8
*)malloc(buf_cnt
);
2286 /* Can we use 32bit word accesses? */
2288 int count
= buf_cnt
;
2289 if ((count
% 4) == 0)
2294 retval
= target
->type
->read_memory(target
, image
.sections
[i
].base_address
, size
, count
, data
);
2295 if (retval
== ERROR_OK
)
2298 for (t
= 0; t
< buf_cnt
; t
++)
2300 if (data
[t
] != buffer
[t
])
2302 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
]);
2315 image_size
+= buf_cnt
;
2318 duration_stop_measure(&duration
, &duration_text
);
2319 if (retval
==ERROR_OK
)
2321 command_print(cmd_ctx
, "verified %u bytes in %s", image_size
, duration_text
);
2323 free(duration_text
);
2325 image_close(&image
);
2330 int handle_bp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2333 target_t
*target
= get_current_target(cmd_ctx
);
2337 breakpoint_t
*breakpoint
= target
->breakpoints
;
2341 if (breakpoint
->type
== BKPT_SOFT
)
2343 char* buf
= buf_to_str(breakpoint
->orig_instr
, breakpoint
->length
, 16);
2344 command_print(cmd_ctx
, "0x%8.8x, 0x%x, %i, 0x%s", breakpoint
->address
, breakpoint
->length
, breakpoint
->set
, buf
);
2349 command_print(cmd_ctx
, "0x%8.8x, 0x%x, %i", breakpoint
->address
, breakpoint
->length
, breakpoint
->set
);
2351 breakpoint
= breakpoint
->next
;
2359 length
= strtoul(args
[1], NULL
, 0);
2362 if (strcmp(args
[2], "hw") == 0)
2365 if ((retval
= breakpoint_add(target
, strtoul(args
[0], NULL
, 0), length
, hw
)) != ERROR_OK
)
2367 LOG_ERROR("Failure setting breakpoints");
2371 command_print(cmd_ctx
, "breakpoint added at address 0x%8.8x", strtoul(args
[0], NULL
, 0));
2376 command_print(cmd_ctx
, "usage: bp <address> <length> ['hw']");
2382 int handle_rbp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2384 target_t
*target
= get_current_target(cmd_ctx
);
2387 breakpoint_remove(target
, strtoul(args
[0], NULL
, 0));
2392 int handle_wp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2394 target_t
*target
= get_current_target(cmd_ctx
);
2399 watchpoint_t
*watchpoint
= target
->watchpoints
;
2403 command_print(cmd_ctx
, "address: 0x%8.8x, len: 0x%8.8x, r/w/a: %i, value: 0x%8.8x, mask: 0x%8.8x", watchpoint
->address
, watchpoint
->length
, watchpoint
->rw
, watchpoint
->value
, watchpoint
->mask
);
2404 watchpoint
= watchpoint
->next
;
2409 enum watchpoint_rw type
= WPT_ACCESS
;
2410 u32 data_value
= 0x0;
2411 u32 data_mask
= 0xffffffff;
2427 command_print(cmd_ctx
, "usage: wp <address> <length> [r/w/a] [value] [mask]");
2433 data_value
= strtoul(args
[3], NULL
, 0);
2437 data_mask
= strtoul(args
[4], NULL
, 0);
2440 if ((retval
= watchpoint_add(target
, strtoul(args
[0], NULL
, 0),
2441 strtoul(args
[1], NULL
, 0), type
, data_value
, data_mask
)) != ERROR_OK
)
2443 LOG_ERROR("Failure setting breakpoints");
2448 command_print(cmd_ctx
, "usage: wp <address> <length> [r/w/a] [value] [mask]");
2454 int handle_rwp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2456 target_t
*target
= get_current_target(cmd_ctx
);
2459 watchpoint_remove(target
, strtoul(args
[0], NULL
, 0));
2464 int handle_virt2phys_command(command_context_t
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2467 target_t
*target
= get_current_target(cmd_ctx
);
2473 return ERROR_COMMAND_SYNTAX_ERROR
;
2475 va
= strtoul(args
[0], NULL
, 0);
2477 retval
= target
->type
->virt2phys(target
, va
, &pa
);
2478 if (retval
== ERROR_OK
)
2480 command_print(cmd_ctx
, "Physical address 0x%08x", pa
);
2484 /* lower levels will have logged a detailed error which is
2485 * forwarded to telnet/GDB session.
2490 static void writeLong(FILE *f
, int l
)
2495 char c
=(l
>>(i
*8))&0xff;
2496 fwrite(&c
, 1, 1, f
);
2500 static void writeString(FILE *f
, char *s
)
2502 fwrite(s
, 1, strlen(s
), f
);
2507 // Dump a gmon.out histogram file.
2508 static void writeGmon(u32
*samples
, int sampleNum
, char *filename
)
2511 FILE *f
=fopen(filename
, "w");
2514 fwrite("gmon", 1, 4, f
);
2515 writeLong(f
, 0x00000001); // Version
2516 writeLong(f
, 0); // padding
2517 writeLong(f
, 0); // padding
2518 writeLong(f
, 0); // padding
2520 fwrite("", 1, 1, f
); // GMON_TAG_TIME_HIST
2522 // figure out bucket size
2525 for (i
=0; i
<sampleNum
; i
++)
2537 int addressSpace
=(max
-min
+1);
2539 static int const maxBuckets
=256*1024; // maximum buckets.
2540 int length
=addressSpace
;
2541 if (length
> maxBuckets
)
2545 int *buckets
=malloc(sizeof(int)*length
);
2551 memset(buckets
, 0, sizeof(int)*length
);
2552 for (i
=0; i
<sampleNum
;i
++)
2554 u32 address
=samples
[i
];
2555 long long a
=address
-min
;
2556 long long b
=length
-1;
2557 long long c
=addressSpace
-1;
2558 int index
=(a
*b
)/c
; // danger!!!! int32 overflows
2562 // append binary memory gmon.out &profile_hist_hdr ((char*)&profile_hist_hdr + sizeof(struct gmon_hist_hdr))
2563 writeLong(f
, min
); // low_pc
2564 writeLong(f
, max
); // high_pc
2565 writeLong(f
, length
); // # of samples
2566 writeLong(f
, 64000000); // 64MHz
2567 writeString(f
, "seconds");
2568 for (i
=0; i
<(15-strlen("seconds")); i
++)
2570 fwrite("", 1, 1, f
); // padding
2572 writeString(f
, "s");
2574 // append binary memory gmon.out profile_hist_data (profile_hist_data + profile_hist_hdr.hist_size)
2576 char *data
=malloc(2*length
);
2579 for (i
=0; i
<length
;i
++)
2588 data
[i
*2+1]=(val
>>8)&0xff;
2591 fwrite(data
, 1, length
*2, f
);
2601 /* profiling samples the CPU PC as quickly as OpenOCD is able, which will be used as a random sampling of PC */
2602 int handle_profile_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2604 target_t
*target
= get_current_target(cmd_ctx
);
2605 struct timeval timeout
, now
;
2607 gettimeofday(&timeout
, NULL
);
2610 return ERROR_COMMAND_SYNTAX_ERROR
;
2613 timeval_add_time(&timeout
, strtoul(args
[0], &end
, 0), 0);
2619 command_print(cmd_ctx
, "Starting profiling. Halting and resuming the target as often as we can...");
2621 static const int maxSample
=10000;
2622 u32
*samples
=malloc(sizeof(u32
)*maxSample
);
2627 int retval
=ERROR_OK
;
2628 // hopefully it is safe to cache! We want to stop/restart as quickly as possible.
2629 reg_t
*reg
= register_get_by_name(target
->reg_cache
, "pc", 1);
2633 target_poll(target
);
2634 if (target
->state
== TARGET_HALTED
)
2636 u32 t
=*((u32
*)reg
->value
);
2637 samples
[numSamples
++]=t
;
2638 retval
= target_resume(target
, 1, 0, 0, 0); /* current pc, addr = 0, do not handle breakpoints, not debugging */
2639 target_poll(target
);
2640 usleep(10*1000); // sleep 10ms, i.e. <100 samples/second.
2641 } else if (target
->state
== TARGET_RUNNING
)
2643 // We want to quickly sample the PC.
2644 target_halt(target
);
2647 command_print(cmd_ctx
, "Target not halted or running");
2651 if (retval
!=ERROR_OK
)
2656 gettimeofday(&now
, NULL
);
2657 if ((numSamples
>=maxSample
) || ((now
.tv_sec
>= timeout
.tv_sec
) && (now
.tv_usec
>= timeout
.tv_usec
)))
2659 command_print(cmd_ctx
, "Profiling completed. %d samples.", numSamples
);
2660 target_poll(target
);
2661 if (target
->state
== TARGET_HALTED
)
2663 target_resume(target
, 1, 0, 0, 0); /* current pc, addr = 0, do not handle breakpoints, not debugging */
2665 target_poll(target
);
2666 writeGmon(samples
, numSamples
, args
[1]);
2667 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)