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
)
473 /* Targets that correctly implement init+examine, i.e.
474 * no communication with target during init:
478 int target_examine(struct command_context_s
*cmd_ctx
)
480 int retval
= ERROR_OK
;
481 target_t
*target
= targets
;
484 if ((retval
= target
->type
->examine(cmd_ctx
, target
))!=ERROR_OK
)
486 target
= target
->next
;
492 int target_init(struct command_context_s
*cmd_ctx
)
494 target_t
*target
= targets
;
498 target
->type
->examined
= 0;
499 if (target
->type
->examine
== NULL
)
501 target
->type
->examine
= default_examine
;
504 if (target
->type
->init_target(cmd_ctx
, target
) != ERROR_OK
)
506 LOG_ERROR("target '%s' init failed", target
->type
->name
);
510 /* Set up default functions if none are provided by target */
511 if (target
->type
->virt2phys
== NULL
)
513 target
->type
->virt2phys
= default_virt2phys
;
515 if (target
->type
->mmu
== NULL
)
517 target
->type
->mmu
= default_mmu
;
519 target
= target
->next
;
524 target_register_user_commands(cmd_ctx
);
525 target_register_timer_callback(handle_target
, 100, 1, NULL
);
531 int target_register_event_callback(int (*callback
)(struct target_s
*target
, enum target_event event
, void *priv
), void *priv
)
533 target_event_callback_t
**callbacks_p
= &target_event_callbacks
;
535 if (callback
== NULL
)
537 return ERROR_INVALID_ARGUMENTS
;
542 while ((*callbacks_p
)->next
)
543 callbacks_p
= &((*callbacks_p
)->next
);
544 callbacks_p
= &((*callbacks_p
)->next
);
547 (*callbacks_p
) = malloc(sizeof(target_event_callback_t
));
548 (*callbacks_p
)->callback
= callback
;
549 (*callbacks_p
)->priv
= priv
;
550 (*callbacks_p
)->next
= NULL
;
555 int target_register_timer_callback(int (*callback
)(void *priv
), int time_ms
, int periodic
, void *priv
)
557 target_timer_callback_t
**callbacks_p
= &target_timer_callbacks
;
560 if (callback
== NULL
)
562 return ERROR_INVALID_ARGUMENTS
;
567 while ((*callbacks_p
)->next
)
568 callbacks_p
= &((*callbacks_p
)->next
);
569 callbacks_p
= &((*callbacks_p
)->next
);
572 (*callbacks_p
) = malloc(sizeof(target_timer_callback_t
));
573 (*callbacks_p
)->callback
= callback
;
574 (*callbacks_p
)->periodic
= periodic
;
575 (*callbacks_p
)->time_ms
= time_ms
;
577 gettimeofday(&now
, NULL
);
578 (*callbacks_p
)->when
.tv_usec
= now
.tv_usec
+ (time_ms
% 1000) * 1000;
579 time_ms
-= (time_ms
% 1000);
580 (*callbacks_p
)->when
.tv_sec
= now
.tv_sec
+ (time_ms
/ 1000);
581 if ((*callbacks_p
)->when
.tv_usec
> 1000000)
583 (*callbacks_p
)->when
.tv_usec
= (*callbacks_p
)->when
.tv_usec
- 1000000;
584 (*callbacks_p
)->when
.tv_sec
+= 1;
587 (*callbacks_p
)->priv
= priv
;
588 (*callbacks_p
)->next
= NULL
;
593 int target_unregister_event_callback(int (*callback
)(struct target_s
*target
, enum target_event event
, void *priv
), void *priv
)
595 target_event_callback_t
**p
= &target_event_callbacks
;
596 target_event_callback_t
*c
= target_event_callbacks
;
598 if (callback
== NULL
)
600 return ERROR_INVALID_ARGUMENTS
;
605 target_event_callback_t
*next
= c
->next
;
606 if ((c
->callback
== callback
) && (c
->priv
== priv
))
620 int target_unregister_timer_callback(int (*callback
)(void *priv
), void *priv
)
622 target_timer_callback_t
**p
= &target_timer_callbacks
;
623 target_timer_callback_t
*c
= target_timer_callbacks
;
625 if (callback
== NULL
)
627 return ERROR_INVALID_ARGUMENTS
;
632 target_timer_callback_t
*next
= c
->next
;
633 if ((c
->callback
== callback
) && (c
->priv
== priv
))
647 int target_call_event_callbacks(target_t
*target
, enum target_event event
)
649 target_event_callback_t
*callback
= target_event_callbacks
;
650 target_event_callback_t
*next_callback
;
652 LOG_DEBUG("target event %i", event
);
656 next_callback
= callback
->next
;
657 callback
->callback(target
, event
, callback
->priv
);
658 callback
= next_callback
;
664 static int target_call_timer_callbacks_check_time(int checktime
)
666 target_timer_callback_t
*callback
= target_timer_callbacks
;
667 target_timer_callback_t
*next_callback
;
670 gettimeofday(&now
, NULL
);
674 next_callback
= callback
->next
;
676 if ((!checktime
&&callback
->periodic
)||
677 (((now
.tv_sec
>= callback
->when
.tv_sec
) && (now
.tv_usec
>= callback
->when
.tv_usec
))
678 || (now
.tv_sec
> callback
->when
.tv_sec
)))
680 callback
->callback(callback
->priv
);
681 if (callback
->periodic
)
683 int time_ms
= callback
->time_ms
;
684 callback
->when
.tv_usec
= now
.tv_usec
+ (time_ms
% 1000) * 1000;
685 time_ms
-= (time_ms
% 1000);
686 callback
->when
.tv_sec
= now
.tv_sec
+ time_ms
/ 1000;
687 if (callback
->when
.tv_usec
> 1000000)
689 callback
->when
.tv_usec
= callback
->when
.tv_usec
- 1000000;
690 callback
->when
.tv_sec
+= 1;
694 target_unregister_timer_callback(callback
->callback
, callback
->priv
);
697 callback
= next_callback
;
703 int target_call_timer_callbacks()
705 return target_call_timer_callbacks_check_time(1);
708 /* invoke periodic callbacks immediately */
709 int target_call_timer_callbacks_now()
711 return target_call_timer_callbacks(0);
715 int target_alloc_working_area(struct target_s
*target
, u32 size
, working_area_t
**area
)
717 working_area_t
*c
= target
->working_areas
;
718 working_area_t
*new_wa
= NULL
;
720 /* Reevaluate working area address based on MMU state*/
721 if (target
->working_areas
== NULL
)
725 retval
= target
->type
->mmu(target
, &enabled
);
726 if (retval
!= ERROR_OK
)
732 target
->working_area
= target
->working_area_virt
;
736 target
->working_area
= target
->working_area_phys
;
740 /* only allocate multiples of 4 byte */
743 LOG_ERROR("BUG: code tried to allocate unaligned number of bytes, padding");
744 size
= CEIL(size
, 4);
747 /* see if there's already a matching working area */
750 if ((c
->free
) && (c
->size
== size
))
758 /* if not, allocate a new one */
761 working_area_t
**p
= &target
->working_areas
;
762 u32 first_free
= target
->working_area
;
763 u32 free_size
= target
->working_area_size
;
765 LOG_DEBUG("allocating new working area");
767 c
= target
->working_areas
;
770 first_free
+= c
->size
;
771 free_size
-= c
->size
;
776 if (free_size
< size
)
778 LOG_WARNING("not enough working area available(requested %d, free %d)", size
, free_size
);
779 return ERROR_TARGET_RESOURCE_NOT_AVAILABLE
;
782 new_wa
= malloc(sizeof(working_area_t
));
785 new_wa
->address
= first_free
;
787 if (target
->backup_working_area
)
789 new_wa
->backup
= malloc(new_wa
->size
);
790 target
->type
->read_memory(target
, new_wa
->address
, 4, new_wa
->size
/ 4, new_wa
->backup
);
794 new_wa
->backup
= NULL
;
797 /* put new entry in list */
801 /* mark as used, and return the new (reused) area */
811 int target_free_working_area_restore(struct target_s
*target
, working_area_t
*area
, int restore
)
816 if (restore
&&target
->backup_working_area
)
817 target
->type
->write_memory(target
, area
->address
, 4, area
->size
/ 4, area
->backup
);
821 /* mark user pointer invalid */
828 int target_free_working_area(struct target_s
*target
, working_area_t
*area
)
830 return target_free_working_area_restore(target
, area
, 1);
833 int target_free_all_working_areas_restore(struct target_s
*target
, int restore
)
835 working_area_t
*c
= target
->working_areas
;
839 working_area_t
*next
= c
->next
;
840 target_free_working_area_restore(target
, c
, restore
);
850 target
->working_areas
= NULL
;
855 int target_free_all_working_areas(struct target_s
*target
)
857 return target_free_all_working_areas_restore(target
, 1);
860 int target_register_commands(struct command_context_s
*cmd_ctx
)
862 register_command(cmd_ctx
, NULL
, "target", handle_target_command
, COMMAND_CONFIG
, "target <cpu> [reset_init default - DEPRECATED] <chainpos> <endianness> <variant> [cpu type specifc args]");
863 register_command(cmd_ctx
, NULL
, "targets", handle_targets_command
, COMMAND_EXEC
, NULL
);
864 register_command(cmd_ctx
, NULL
, "target_script", handle_target_script_command
, COMMAND_CONFIG
, NULL
);
865 register_command(cmd_ctx
, NULL
, "run_and_halt_time", handle_run_and_halt_time_command
, COMMAND_CONFIG
, "<target> <run time ms>");
866 register_command(cmd_ctx
, NULL
, "working_area", handle_working_area_command
, COMMAND_ANY
, "working_area <target#> <address> <size> <'backup'|'nobackup'> [virtual address]");
867 register_command(cmd_ctx
, NULL
, "virt2phys", handle_virt2phys_command
, COMMAND_ANY
, "virt2phys <virtual address>");
868 register_command(cmd_ctx
, NULL
, "profile", handle_profile_command
, COMMAND_EXEC
, "PRELIMINARY! - profile <seconds> <gmon.out>");
873 int target_arch_state(struct target_s
*target
)
878 LOG_USER("No target has been configured");
882 LOG_USER("target state: %s", target_state_strings
[target
->state
]);
884 if (target
->state
!=TARGET_HALTED
)
887 retval
=target
->type
->arch_state(target
);
891 /* Single aligned words are guaranteed to use 16 or 32 bit access
892 * mode respectively, otherwise data is handled as quickly as
895 int target_write_buffer(struct target_s
*target
, u32 address
, u32 size
, u8
*buffer
)
899 LOG_DEBUG("writing buffer of %i byte at 0x%8.8x", size
, address
);
901 if (((address
% 2) == 0) && (size
== 2))
903 return target
->type
->write_memory(target
, address
, 2, 1, buffer
);
906 /* handle unaligned head bytes */
909 int unaligned
= 4 - (address
% 4);
911 if (unaligned
> size
)
914 if ((retval
= target
->type
->write_memory(target
, address
, 1, unaligned
, buffer
)) != ERROR_OK
)
918 address
+= unaligned
;
922 /* handle aligned words */
925 int aligned
= size
- (size
% 4);
927 /* use bulk writes above a certain limit. This may have to be changed */
930 if ((retval
= target
->type
->bulk_write_memory(target
, address
, aligned
/ 4, buffer
)) != ERROR_OK
)
935 if ((retval
= target
->type
->write_memory(target
, address
, 4, aligned
/ 4, buffer
)) != ERROR_OK
)
944 /* handle tail writes of less than 4 bytes */
947 if ((retval
= target
->type
->write_memory(target
, address
, 1, size
, buffer
)) != ERROR_OK
)
955 /* Single aligned words are guaranteed to use 16 or 32 bit access
956 * mode respectively, otherwise data is handled as quickly as
959 int target_read_buffer(struct target_s
*target
, u32 address
, u32 size
, u8
*buffer
)
963 LOG_DEBUG("reading buffer of %i byte at 0x%8.8x", size
, address
);
965 if (((address
% 2) == 0) && (size
== 2))
967 return target
->type
->read_memory(target
, address
, 2, 1, buffer
);
970 /* handle unaligned head bytes */
973 int unaligned
= 4 - (address
% 4);
975 if (unaligned
> size
)
978 if ((retval
= target
->type
->read_memory(target
, address
, 1, unaligned
, buffer
)) != ERROR_OK
)
982 address
+= unaligned
;
986 /* handle aligned words */
989 int aligned
= size
- (size
% 4);
991 if ((retval
= target
->type
->read_memory(target
, address
, 4, aligned
/ 4, buffer
)) != ERROR_OK
)
999 /* handle tail writes of less than 4 bytes */
1002 if ((retval
= target
->type
->read_memory(target
, address
, 1, size
, buffer
)) != ERROR_OK
)
1009 int target_checksum_memory(struct target_s
*target
, u32 address
, u32 size
, u32
* crc
)
1016 if ((retval
= target
->type
->checksum_memory(target
, address
,
1017 size
, &checksum
)) == ERROR_TARGET_RESOURCE_NOT_AVAILABLE
)
1019 buffer
= malloc(size
);
1022 LOG_ERROR("error allocating buffer for section (%d bytes)", size
);
1023 return ERROR_INVALID_ARGUMENTS
;
1025 retval
= target_read_buffer(target
, address
, size
, buffer
);
1026 if (retval
!= ERROR_OK
)
1032 /* convert to target endianess */
1033 for (i
= 0; i
< (size
/sizeof(u32
)); i
++)
1036 target_data
= target_buffer_get_u32(target
, &buffer
[i
*sizeof(u32
)]);
1037 target_buffer_set_u32(target
, &buffer
[i
*sizeof(u32
)], target_data
);
1040 retval
= image_calculate_checksum( buffer
, size
, &checksum
);
1049 int target_read_u32(struct target_s
*target
, u32 address
, u32
*value
)
1053 int retval
= target
->type
->read_memory(target
, address
, 4, 1, value_buf
);
1055 if (retval
== ERROR_OK
)
1057 *value
= target_buffer_get_u32(target
, value_buf
);
1058 LOG_DEBUG("address: 0x%8.8x, value: 0x%8.8x", address
, *value
);
1063 LOG_DEBUG("address: 0x%8.8x failed", address
);
1069 int target_read_u16(struct target_s
*target
, u32 address
, u16
*value
)
1073 int retval
= target
->type
->read_memory(target
, address
, 2, 1, value_buf
);
1075 if (retval
== ERROR_OK
)
1077 *value
= target_buffer_get_u16(target
, value_buf
);
1078 LOG_DEBUG("address: 0x%8.8x, value: 0x%4.4x", address
, *value
);
1083 LOG_DEBUG("address: 0x%8.8x failed", address
);
1089 int target_read_u8(struct target_s
*target
, u32 address
, u8
*value
)
1091 int retval
= target
->type
->read_memory(target
, address
, 1, 1, value
);
1093 if (retval
== ERROR_OK
)
1095 LOG_DEBUG("address: 0x%8.8x, value: 0x%2.2x", address
, *value
);
1100 LOG_DEBUG("address: 0x%8.8x failed", address
);
1106 int target_write_u32(struct target_s
*target
, u32 address
, u32 value
)
1111 LOG_DEBUG("address: 0x%8.8x, value: 0x%8.8x", address
, value
);
1113 target_buffer_set_u32(target
, value_buf
, value
);
1114 if ((retval
= target
->type
->write_memory(target
, address
, 4, 1, value_buf
)) != ERROR_OK
)
1116 LOG_DEBUG("failed: %i", retval
);
1122 int target_write_u16(struct target_s
*target
, u32 address
, u16 value
)
1127 LOG_DEBUG("address: 0x%8.8x, value: 0x%8.8x", address
, value
);
1129 target_buffer_set_u16(target
, value_buf
, value
);
1130 if ((retval
= target
->type
->write_memory(target
, address
, 2, 1, value_buf
)) != ERROR_OK
)
1132 LOG_DEBUG("failed: %i", retval
);
1138 int target_write_u8(struct target_s
*target
, u32 address
, u8 value
)
1142 LOG_DEBUG("address: 0x%8.8x, value: 0x%2.2x", address
, value
);
1144 if ((retval
= target
->type
->read_memory(target
, address
, 1, 1, &value
)) != ERROR_OK
)
1146 LOG_DEBUG("failed: %i", retval
);
1152 int target_register_user_commands(struct command_context_s
*cmd_ctx
)
1154 register_command(cmd_ctx
, NULL
, "reg", handle_reg_command
, COMMAND_EXEC
, NULL
);
1155 register_command(cmd_ctx
, NULL
, "poll", handle_poll_command
, COMMAND_EXEC
, "poll target state");
1156 register_command(cmd_ctx
, NULL
, "wait_halt", handle_wait_halt_command
, COMMAND_EXEC
, "wait for target halt [time (s)]");
1157 register_command(cmd_ctx
, NULL
, "halt", handle_halt_command
, COMMAND_EXEC
, "halt target");
1158 register_command(cmd_ctx
, NULL
, "resume", handle_resume_command
, COMMAND_EXEC
, "resume target [addr]");
1159 register_command(cmd_ctx
, NULL
, "step", handle_step_command
, COMMAND_EXEC
, "step one instruction from current PC or [addr]");
1160 register_command(cmd_ctx
, NULL
, "reset", handle_reset_command
, COMMAND_EXEC
, "reset target [run|halt|init|run_and_halt|run_and_init]");
1161 register_command(cmd_ctx
, NULL
, "soft_reset_halt", handle_soft_reset_halt_command
, COMMAND_EXEC
, "halt the target and do a soft reset");
1163 register_command(cmd_ctx
, NULL
, "mdw", handle_md_command
, COMMAND_EXEC
, "display memory words <addr> [count]");
1164 register_command(cmd_ctx
, NULL
, "mdh", handle_md_command
, COMMAND_EXEC
, "display memory half-words <addr> [count]");
1165 register_command(cmd_ctx
, NULL
, "mdb", handle_md_command
, COMMAND_EXEC
, "display memory bytes <addr> [count]");
1167 register_command(cmd_ctx
, NULL
, "mww", handle_mw_command
, COMMAND_EXEC
, "write memory word <addr> <value> [count]");
1168 register_command(cmd_ctx
, NULL
, "mwh", handle_mw_command
, COMMAND_EXEC
, "write memory half-word <addr> <value> [count]");
1169 register_command(cmd_ctx
, NULL
, "mwb", handle_mw_command
, COMMAND_EXEC
, "write memory byte <addr> <value> [count]");
1171 register_command(cmd_ctx
, NULL
, "bp", handle_bp_command
, COMMAND_EXEC
, "set breakpoint <address> <length> [hw]");
1172 register_command(cmd_ctx
, NULL
, "rbp", handle_rbp_command
, COMMAND_EXEC
, "remove breakpoint <adress>");
1173 register_command(cmd_ctx
, NULL
, "wp", handle_wp_command
, COMMAND_EXEC
, "set watchpoint <address> <length> <r/w/a> [value] [mask]");
1174 register_command(cmd_ctx
, NULL
, "rwp", handle_rwp_command
, COMMAND_EXEC
, "remove watchpoint <adress>");
1176 register_command(cmd_ctx
, NULL
, "load_image", handle_load_image_command
, COMMAND_EXEC
, "load_image <file> <address> ['bin'|'ihex'|'elf'|'s19']");
1177 register_command(cmd_ctx
, NULL
, "dump_image", handle_dump_image_command
, COMMAND_EXEC
, "dump_image <file> <address> <size>");
1178 register_command(cmd_ctx
, NULL
, "verify_image", handle_verify_image_command
, COMMAND_EXEC
, "verify_image <file> [offset] [type]");
1179 register_command(cmd_ctx
, NULL
, "load_binary", handle_load_image_command
, COMMAND_EXEC
, "[DEPRECATED] load_binary <file> <address>");
1180 register_command(cmd_ctx
, NULL
, "dump_binary", handle_dump_image_command
, COMMAND_EXEC
, "[DEPRECATED] dump_binary <file> <address> <size>");
1182 target_request_register_commands(cmd_ctx
);
1183 trace_register_commands(cmd_ctx
);
1188 int handle_targets_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1190 target_t
*target
= targets
;
1195 int num
= strtoul(args
[0], NULL
, 0);
1200 target
= target
->next
;
1204 cmd_ctx
->current_target
= num
;
1206 command_print(cmd_ctx
, "%i is out of bounds, only %i targets are configured", num
, count
);
1213 command_print(cmd_ctx
, "%i: %s (%s), state: %s", count
++, target
->type
->name
, target_endianess_strings
[target
->endianness
], target_state_strings
[target
->state
]);
1214 target
= target
->next
;
1220 int handle_target_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1227 return ERROR_COMMAND_SYNTAX_ERROR
;
1230 /* search for the specified target */
1231 if (args
[0] && (args
[0][0] != 0))
1233 for (i
= 0; target_types
[i
]; i
++)
1235 if (strcmp(args
[0], target_types
[i
]->name
) == 0)
1237 target_t
**last_target_p
= &targets
;
1239 /* register target specific commands */
1240 if (target_types
[i
]->register_commands(cmd_ctx
) != ERROR_OK
)
1242 LOG_ERROR("couldn't register '%s' commands", args
[0]);
1248 while ((*last_target_p
)->next
)
1249 last_target_p
= &((*last_target_p
)->next
);
1250 last_target_p
= &((*last_target_p
)->next
);
1253 *last_target_p
= malloc(sizeof(target_t
));
1255 (*last_target_p
)->type
= target_types
[i
];
1257 if (strcmp(args
[1], "big") == 0)
1258 (*last_target_p
)->endianness
= TARGET_BIG_ENDIAN
;
1259 else if (strcmp(args
[1], "little") == 0)
1260 (*last_target_p
)->endianness
= TARGET_LITTLE_ENDIAN
;
1263 LOG_ERROR("endianness must be either 'little' or 'big', not '%s'", args
[1]);
1264 return ERROR_COMMAND_SYNTAX_ERROR
;
1267 /* what to do on a target reset */
1268 (*last_target_p
)->reset_mode
= RESET_INIT
; /* default */
1269 if (strcmp(args
[2], "reset_halt") == 0)
1270 (*last_target_p
)->reset_mode
= RESET_HALT
;
1271 else if (strcmp(args
[2], "reset_run") == 0)
1272 (*last_target_p
)->reset_mode
= RESET_RUN
;
1273 else if (strcmp(args
[2], "reset_init") == 0)
1274 (*last_target_p
)->reset_mode
= RESET_INIT
;
1275 else if (strcmp(args
[2], "run_and_halt") == 0)
1276 (*last_target_p
)->reset_mode
= RESET_RUN_AND_HALT
;
1277 else if (strcmp(args
[2], "run_and_init") == 0)
1278 (*last_target_p
)->reset_mode
= RESET_RUN_AND_INIT
;
1281 /* Kludge! we want to make this reset arg optional while remaining compatible! */
1285 (*last_target_p
)->run_and_halt_time
= 1000; /* default 1s */
1287 (*last_target_p
)->reset_script
= NULL
;
1288 (*last_target_p
)->post_halt_script
= NULL
;
1289 (*last_target_p
)->pre_resume_script
= NULL
;
1290 (*last_target_p
)->gdb_program_script
= NULL
;
1292 (*last_target_p
)->working_area
= 0x0;
1293 (*last_target_p
)->working_area_size
= 0x0;
1294 (*last_target_p
)->working_areas
= NULL
;
1295 (*last_target_p
)->backup_working_area
= 0;
1297 (*last_target_p
)->state
= TARGET_UNKNOWN
;
1298 (*last_target_p
)->debug_reason
= DBG_REASON_UNDEFINED
;
1299 (*last_target_p
)->reg_cache
= NULL
;
1300 (*last_target_p
)->breakpoints
= NULL
;
1301 (*last_target_p
)->watchpoints
= NULL
;
1302 (*last_target_p
)->next
= NULL
;
1303 (*last_target_p
)->arch_info
= NULL
;
1305 /* initialize trace information */
1306 (*last_target_p
)->trace_info
= malloc(sizeof(trace_t
));
1307 (*last_target_p
)->trace_info
->num_trace_points
= 0;
1308 (*last_target_p
)->trace_info
->trace_points_size
= 0;
1309 (*last_target_p
)->trace_info
->trace_points
= NULL
;
1310 (*last_target_p
)->trace_info
->trace_history_size
= 0;
1311 (*last_target_p
)->trace_info
->trace_history
= NULL
;
1312 (*last_target_p
)->trace_info
->trace_history_pos
= 0;
1313 (*last_target_p
)->trace_info
->trace_history_overflowed
= 0;
1315 (*last_target_p
)->dbgmsg
= NULL
;
1316 (*last_target_p
)->dbg_msg_enabled
= 0;
1318 (*last_target_p
)->type
->target_command(cmd_ctx
, cmd
, args
, argc
, *last_target_p
);
1326 /* no matching target found */
1329 LOG_ERROR("target '%s' not found", args
[0]);
1330 return ERROR_COMMAND_SYNTAX_ERROR
;
1336 /* usage: target_script <target#> <event> <script_file> */
1337 int handle_target_script_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1339 target_t
*target
= NULL
;
1343 LOG_ERROR("incomplete target_script command");
1344 return ERROR_COMMAND_SYNTAX_ERROR
;
1347 target
= get_target_by_num(strtoul(args
[0], NULL
, 0));
1351 return ERROR_COMMAND_SYNTAX_ERROR
;
1354 if (strcmp(args
[1], "reset") == 0)
1356 if (target
->reset_script
)
1357 free(target
->reset_script
);
1358 target
->reset_script
= strdup(args
[2]);
1360 else if (strcmp(args
[1], "post_halt") == 0)
1362 if (target
->post_halt_script
)
1363 free(target
->post_halt_script
);
1364 target
->post_halt_script
= strdup(args
[2]);
1366 else if (strcmp(args
[1], "pre_resume") == 0)
1368 if (target
->pre_resume_script
)
1369 free(target
->pre_resume_script
);
1370 target
->pre_resume_script
= strdup(args
[2]);
1372 else if (strcmp(args
[1], "gdb_program_config") == 0)
1374 if (target
->gdb_program_script
)
1375 free(target
->gdb_program_script
);
1376 target
->gdb_program_script
= strdup(args
[2]);
1380 LOG_ERROR("unknown event type: '%s", args
[1]);
1381 return ERROR_COMMAND_SYNTAX_ERROR
;
1387 int handle_run_and_halt_time_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1389 target_t
*target
= NULL
;
1393 return ERROR_COMMAND_SYNTAX_ERROR
;
1396 target
= get_target_by_num(strtoul(args
[0], NULL
, 0));
1399 return ERROR_COMMAND_SYNTAX_ERROR
;
1402 target
->run_and_halt_time
= strtoul(args
[1], NULL
, 0);
1407 int handle_working_area_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1409 target_t
*target
= NULL
;
1411 if ((argc
< 4) || (argc
> 5))
1413 return ERROR_COMMAND_SYNTAX_ERROR
;
1416 target
= get_target_by_num(strtoul(args
[0], NULL
, 0));
1419 return ERROR_COMMAND_SYNTAX_ERROR
;
1421 target_free_all_working_areas(target
);
1423 target
->working_area_phys
= target
->working_area_virt
= strtoul(args
[1], NULL
, 0);
1426 target
->working_area_virt
= strtoul(args
[4], NULL
, 0);
1428 target
->working_area_size
= strtoul(args
[2], NULL
, 0);
1430 if (strcmp(args
[3], "backup") == 0)
1432 target
->backup_working_area
= 1;
1434 else if (strcmp(args
[3], "nobackup") == 0)
1436 target
->backup_working_area
= 0;
1440 LOG_ERROR("unrecognized <backup|nobackup> argument (%s)", args
[3]);
1441 return ERROR_COMMAND_SYNTAX_ERROR
;
1448 /* process target state changes */
1449 int handle_target(void *priv
)
1451 target_t
*target
= targets
;
1455 if (target_continous_poll
)
1457 /* polling may fail silently until the target has been examined */
1458 target_poll(target
);
1461 target
= target
->next
;
1467 int handle_reg_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1476 target
= get_current_target(cmd_ctx
);
1478 /* list all available registers for the current target */
1481 reg_cache_t
*cache
= target
->reg_cache
;
1487 for (i
= 0; i
< cache
->num_regs
; i
++)
1489 value
= buf_to_str(cache
->reg_list
[i
].value
, cache
->reg_list
[i
].size
, 16);
1490 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
);
1493 cache
= cache
->next
;
1499 /* access a single register by its ordinal number */
1500 if ((args
[0][0] >= '0') && (args
[0][0] <= '9'))
1502 int num
= strtoul(args
[0], NULL
, 0);
1503 reg_cache_t
*cache
= target
->reg_cache
;
1509 for (i
= 0; i
< cache
->num_regs
; i
++)
1513 reg
= &cache
->reg_list
[i
];
1519 cache
= cache
->next
;
1524 command_print(cmd_ctx
, "%i is out of bounds, the current target has only %i registers (0 - %i)", num
, count
, count
- 1);
1527 } else /* access a single register by its name */
1529 reg
= register_get_by_name(target
->reg_cache
, args
[0], 1);
1533 command_print(cmd_ctx
, "register %s not found in current target", args
[0]);
1538 /* display a register */
1539 if ((argc
== 1) || ((argc
== 2) && !((args
[1][0] >= '0') && (args
[1][0] <= '9'))))
1541 if ((argc
== 2) && (strcmp(args
[1], "force") == 0))
1544 if (reg
->valid
== 0)
1546 reg_arch_type_t
*arch_type
= register_get_arch_type(reg
->arch_type
);
1547 if (arch_type
== NULL
)
1549 LOG_ERROR("BUG: encountered unregistered arch type");
1552 arch_type
->get(reg
);
1554 value
= buf_to_str(reg
->value
, reg
->size
, 16);
1555 command_print(cmd_ctx
, "%s (/%i): 0x%s", reg
->name
, reg
->size
, value
);
1560 /* set register value */
1563 u8
*buf
= malloc(CEIL(reg
->size
, 8));
1564 str_to_buf(args
[1], strlen(args
[1]), buf
, reg
->size
, 0);
1566 reg_arch_type_t
*arch_type
= register_get_arch_type(reg
->arch_type
);
1567 if (arch_type
== NULL
)
1569 LOG_ERROR("BUG: encountered unregistered arch type");
1573 arch_type
->set(reg
, buf
);
1575 value
= buf_to_str(reg
->value
, reg
->size
, 16);
1576 command_print(cmd_ctx
, "%s (/%i): 0x%s", reg
->name
, reg
->size
, value
);
1584 command_print(cmd_ctx
, "usage: reg <#|name> [value]");
1589 static int wait_state(struct command_context_s
*cmd_ctx
, char *cmd
, enum target_state state
, int ms
);
1591 int handle_poll_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1593 target_t
*target
= get_current_target(cmd_ctx
);
1597 target_poll(target
);
1598 target_arch_state(target
);
1602 if (strcmp(args
[0], "on") == 0)
1604 target_continous_poll
= 1;
1606 else if (strcmp(args
[0], "off") == 0)
1608 target_continous_poll
= 0;
1612 command_print(cmd_ctx
, "arg is \"on\" or \"off\"");
1620 int handle_wait_halt_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1628 ms
= strtoul(args
[0], &end
, 0) * 1000;
1631 command_print(cmd_ctx
, "usage: %s [seconds]", cmd
);
1636 return wait_state(cmd_ctx
, cmd
, TARGET_HALTED
, ms
);
1639 static void target_process_events(struct command_context_s
*cmd_ctx
)
1641 target_t
*target
= get_current_target(cmd_ctx
);
1642 target_poll(target
);
1643 target_call_timer_callbacks_now();
1646 static int wait_state(struct command_context_s
*cmd_ctx
, char *cmd
, enum target_state state
, int ms
)
1649 struct timeval timeout
, now
;
1651 gettimeofday(&timeout
, NULL
);
1652 timeval_add_time(&timeout
, 0, ms
* 1000);
1654 target_t
*target
= get_current_target(cmd_ctx
);
1657 if ((retval
=target_poll(target
))!=ERROR_OK
)
1659 target_call_timer_callbacks_now();
1660 if (target
->state
== state
)
1667 command_print(cmd_ctx
, "waiting for target %s...", target_state_strings
[state
]);
1670 gettimeofday(&now
, NULL
);
1671 if ((now
.tv_sec
> timeout
.tv_sec
) || ((now
.tv_sec
== timeout
.tv_sec
) && (now
.tv_usec
>= timeout
.tv_usec
)))
1673 LOG_ERROR("timed out while waiting for target %s", target_state_strings
[state
]);
1681 int handle_halt_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1684 target_t
*target
= get_current_target(cmd_ctx
);
1688 if ((retval
= target_halt(target
)) != ERROR_OK
)
1693 return handle_wait_halt_command(cmd_ctx
, cmd
, args
, argc
);
1697 int handle_soft_reset_halt_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1699 target_t
*target
= get_current_target(cmd_ctx
);
1701 LOG_USER("requesting target halt and executing a soft reset");
1703 target
->type
->soft_reset_halt(target
);
1708 int handle_reset_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1710 target_t
*target
= get_current_target(cmd_ctx
);
1711 enum target_reset_mode reset_mode
= target
->reset_mode
;
1712 enum target_reset_mode save
= target
->reset_mode
;
1718 if (strcmp("run", args
[0]) == 0)
1719 reset_mode
= RESET_RUN
;
1720 else if (strcmp("halt", args
[0]) == 0)
1721 reset_mode
= RESET_HALT
;
1722 else if (strcmp("init", args
[0]) == 0)
1723 reset_mode
= RESET_INIT
;
1724 else if (strcmp("run_and_halt", args
[0]) == 0)
1726 reset_mode
= RESET_RUN_AND_HALT
;
1729 target
->run_and_halt_time
= strtoul(args
[1], NULL
, 0);
1732 else if (strcmp("run_and_init", args
[0]) == 0)
1734 reset_mode
= RESET_RUN_AND_INIT
;
1737 target
->run_and_halt_time
= strtoul(args
[1], NULL
, 0);
1742 command_print(cmd_ctx
, "usage: reset ['run', 'halt', 'init', 'run_and_halt', 'run_and_init]");
1747 /* temporarily modify mode of current reset target */
1748 target
->reset_mode
= reset_mode
;
1750 /* reset *all* targets */
1751 target_process_reset(cmd_ctx
);
1753 /* Restore default reset mode for this target */
1754 target
->reset_mode
= save
;
1759 int handle_resume_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1762 target_t
*target
= get_current_target(cmd_ctx
);
1765 retval
= target_resume(target
, 1, 0, 1, 0); /* current pc, addr = 0, handle breakpoints, not debugging */
1767 retval
= target_resume(target
, 0, strtoul(args
[0], NULL
, 0), 1, 0); /* addr = args[0], handle breakpoints, not debugging */
1770 return ERROR_COMMAND_SYNTAX_ERROR
;
1773 target_process_events(cmd_ctx
);
1778 int handle_step_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1780 target_t
*target
= get_current_target(cmd_ctx
);
1785 target
->type
->step(target
, 1, 0, 1); /* current pc, addr = 0, handle breakpoints */
1788 target
->type
->step(target
, 0, strtoul(args
[0], NULL
, 0), 1); /* addr = args[0], handle breakpoints */
1793 int handle_md_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1795 const int line_bytecnt
= 32;
1808 target_t
*target
= get_current_target(cmd_ctx
);
1814 count
= strtoul(args
[1], NULL
, 0);
1816 address
= strtoul(args
[0], NULL
, 0);
1822 size
= 4; line_modulo
= line_bytecnt
/ 4;
1825 size
= 2; line_modulo
= line_bytecnt
/ 2;
1828 size
= 1; line_modulo
= line_bytecnt
/ 1;
1834 buffer
= calloc(count
, size
);
1835 retval
= target
->type
->read_memory(target
, address
, size
, count
, buffer
);
1836 if (retval
== ERROR_OK
)
1840 for (i
= 0; i
< count
; i
++)
1842 if (i
%line_modulo
== 0)
1843 output_len
+= snprintf(output
+ output_len
, 128 - output_len
, "0x%8.8x: ", address
+ (i
*size
));
1848 output_len
+= snprintf(output
+ output_len
, 128 - output_len
, "%8.8x ", target_buffer_get_u32(target
, &buffer
[i
*4]));
1851 output_len
+= snprintf(output
+ output_len
, 128 - output_len
, "%4.4x ", target_buffer_get_u16(target
, &buffer
[i
*2]));
1854 output_len
+= snprintf(output
+ output_len
, 128 - output_len
, "%2.2x ", buffer
[i
*1]);
1858 if ((i
%line_modulo
== line_modulo
-1) || (i
== count
- 1))
1860 command_print(cmd_ctx
, output
);
1866 LOG_ERROR("Failure examining memory");
1874 int handle_mw_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1881 target_t
*target
= get_current_target(cmd_ctx
);
1884 if ((argc
< 2) || (argc
> 3))
1885 return ERROR_COMMAND_SYNTAX_ERROR
;
1887 address
= strtoul(args
[0], NULL
, 0);
1888 value
= strtoul(args
[1], NULL
, 0);
1890 count
= strtoul(args
[2], NULL
, 0);
1897 target_buffer_set_u32(target
, value_buf
, value
);
1901 target_buffer_set_u16(target
, value_buf
, value
);
1905 value_buf
[0] = value
;
1908 return ERROR_COMMAND_SYNTAX_ERROR
;
1910 for (i
=0; i
<count
; i
++)
1916 retval
= target
->type
->write_memory(target
, address
+ i
*wordsize
, 4, 1, value_buf
);
1919 retval
= target
->type
->write_memory(target
, address
+ i
*wordsize
, 2, 1, value_buf
);
1922 retval
= target
->type
->write_memory(target
, address
+ i
*wordsize
, 1, 1, value_buf
);
1927 if (retval
!=ERROR_OK
)
1937 int handle_load_image_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1947 duration_t duration
;
1948 char *duration_text
;
1950 target_t
*target
= get_current_target(cmd_ctx
);
1954 command_print(cmd_ctx
, "usage: load_image <filename> [address] [type]");
1958 /* a base address isn't always necessary, default to 0x0 (i.e. don't relocate) */
1961 image
.base_address_set
= 1;
1962 image
.base_address
= strtoul(args
[1], NULL
, 0);
1966 image
.base_address_set
= 0;
1969 image
.start_address_set
= 0;
1971 duration_start_measure(&duration
);
1973 if (image_open(&image
, args
[0], (argc
>= 3) ? args
[2] : NULL
) != ERROR_OK
)
1980 for (i
= 0; i
< image
.num_sections
; i
++)
1982 buffer
= malloc(image
.sections
[i
].size
);
1985 command_print(cmd_ctx
, "error allocating buffer for section (%d bytes)", image
.sections
[i
].size
);
1989 if ((retval
= image_read_section(&image
, i
, 0x0, image
.sections
[i
].size
, buffer
, &buf_cnt
)) != ERROR_OK
)
1994 if ((retval
= target_write_buffer(target
, image
.sections
[i
].base_address
, buf_cnt
, buffer
)) != ERROR_OK
)
1999 image_size
+= buf_cnt
;
2000 command_print(cmd_ctx
, "%u byte written at address 0x%8.8x", buf_cnt
, image
.sections
[i
].base_address
);
2005 duration_stop_measure(&duration
, &duration_text
);
2006 if (retval
==ERROR_OK
)
2008 command_print(cmd_ctx
, "downloaded %u byte in %s", image_size
, duration_text
);
2010 free(duration_text
);
2012 image_close(&image
);
2018 int handle_dump_image_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2025 int retval
=ERROR_OK
;
2027 duration_t duration
;
2028 char *duration_text
;
2030 target_t
*target
= get_current_target(cmd_ctx
);
2034 command_print(cmd_ctx
, "usage: dump_image <filename> <address> <size>");
2038 address
= strtoul(args
[1], NULL
, 0);
2039 size
= strtoul(args
[2], NULL
, 0);
2041 if ((address
& 3) || (size
& 3))
2043 command_print(cmd_ctx
, "only 32-bit aligned address and size are supported");
2047 if (fileio_open(&fileio
, args
[0], FILEIO_WRITE
, FILEIO_BINARY
) != ERROR_OK
)
2052 duration_start_measure(&duration
);
2057 u32 this_run_size
= (size
> 560) ? 560 : size
;
2059 retval
= target
->type
->read_memory(target
, address
, 4, this_run_size
/ 4, buffer
);
2060 if (retval
!= ERROR_OK
)
2065 retval
= fileio_write(&fileio
, this_run_size
, buffer
, &size_written
);
2066 if (retval
!= ERROR_OK
)
2071 size
-= this_run_size
;
2072 address
+= this_run_size
;
2075 fileio_close(&fileio
);
2077 duration_stop_measure(&duration
, &duration_text
);
2078 if (retval
==ERROR_OK
)
2080 command_print(cmd_ctx
, "dumped %"PRIi64
" byte in %s", fileio
.size
, duration_text
);
2082 free(duration_text
);
2087 int handle_verify_image_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2095 u32 mem_checksum
= 0;
2099 duration_t duration
;
2100 char *duration_text
;
2102 target_t
*target
= get_current_target(cmd_ctx
);
2106 return ERROR_COMMAND_SYNTAX_ERROR
;
2111 LOG_ERROR("no target selected");
2115 duration_start_measure(&duration
);
2119 image
.base_address_set
= 1;
2120 image
.base_address
= strtoul(args
[1], NULL
, 0);
2124 image
.base_address_set
= 0;
2125 image
.base_address
= 0x0;
2128 image
.start_address_set
= 0;
2130 if ((retval
=image_open(&image
, args
[0], (argc
== 3) ? args
[2] : NULL
)) != ERROR_OK
)
2137 for (i
= 0; i
< image
.num_sections
; i
++)
2139 buffer
= malloc(image
.sections
[i
].size
);
2142 command_print(cmd_ctx
, "error allocating buffer for section (%d bytes)", image
.sections
[i
].size
);
2145 if ((retval
= image_read_section(&image
, i
, 0x0, image
.sections
[i
].size
, buffer
, &buf_cnt
)) != ERROR_OK
)
2151 /* calculate checksum of image */
2152 image_calculate_checksum( buffer
, buf_cnt
, &checksum
);
2154 retval
= target_checksum_memory(target
, image
.sections
[i
].base_address
, buf_cnt
, &mem_checksum
);
2155 if( retval
!= ERROR_OK
)
2161 if( checksum
!= mem_checksum
)
2163 /* failed crc checksum, fall back to a binary compare */
2166 command_print(cmd_ctx
, "checksum mismatch - attempting binary compare");
2168 data
= (u8
*)malloc(buf_cnt
);
2170 /* Can we use 32bit word accesses? */
2172 int count
= buf_cnt
;
2173 if ((count
% 4) == 0)
2178 retval
= target
->type
->read_memory(target
, image
.sections
[i
].base_address
, size
, count
, data
);
2179 if (retval
== ERROR_OK
)
2182 for (t
= 0; t
< buf_cnt
; t
++)
2184 if (data
[t
] != buffer
[t
])
2186 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
]);
2199 image_size
+= buf_cnt
;
2202 duration_stop_measure(&duration
, &duration_text
);
2203 if (retval
==ERROR_OK
)
2205 command_print(cmd_ctx
, "verified %u bytes in %s", image_size
, duration_text
);
2207 free(duration_text
);
2209 image_close(&image
);
2214 int handle_bp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2217 target_t
*target
= get_current_target(cmd_ctx
);
2221 breakpoint_t
*breakpoint
= target
->breakpoints
;
2225 if (breakpoint
->type
== BKPT_SOFT
)
2227 char* buf
= buf_to_str(breakpoint
->orig_instr
, breakpoint
->length
, 16);
2228 command_print(cmd_ctx
, "0x%8.8x, 0x%x, %i, 0x%s", breakpoint
->address
, breakpoint
->length
, breakpoint
->set
, buf
);
2233 command_print(cmd_ctx
, "0x%8.8x, 0x%x, %i", breakpoint
->address
, breakpoint
->length
, breakpoint
->set
);
2235 breakpoint
= breakpoint
->next
;
2243 length
= strtoul(args
[1], NULL
, 0);
2246 if (strcmp(args
[2], "hw") == 0)
2249 if ((retval
= breakpoint_add(target
, strtoul(args
[0], NULL
, 0), length
, hw
)) != ERROR_OK
)
2251 LOG_ERROR("Failure setting breakpoints");
2255 command_print(cmd_ctx
, "breakpoint added at address 0x%8.8x", strtoul(args
[0], NULL
, 0));
2260 command_print(cmd_ctx
, "usage: bp <address> <length> ['hw']");
2266 int handle_rbp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2268 target_t
*target
= get_current_target(cmd_ctx
);
2271 breakpoint_remove(target
, strtoul(args
[0], NULL
, 0));
2276 int handle_wp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2278 target_t
*target
= get_current_target(cmd_ctx
);
2283 watchpoint_t
*watchpoint
= target
->watchpoints
;
2287 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
);
2288 watchpoint
= watchpoint
->next
;
2293 enum watchpoint_rw type
= WPT_ACCESS
;
2294 u32 data_value
= 0x0;
2295 u32 data_mask
= 0xffffffff;
2311 command_print(cmd_ctx
, "usage: wp <address> <length> [r/w/a] [value] [mask]");
2317 data_value
= strtoul(args
[3], NULL
, 0);
2321 data_mask
= strtoul(args
[4], NULL
, 0);
2324 if ((retval
= watchpoint_add(target
, strtoul(args
[0], NULL
, 0),
2325 strtoul(args
[1], NULL
, 0), type
, data_value
, data_mask
)) != ERROR_OK
)
2327 LOG_ERROR("Failure setting breakpoints");
2332 command_print(cmd_ctx
, "usage: wp <address> <length> [r/w/a] [value] [mask]");
2338 int handle_rwp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2340 target_t
*target
= get_current_target(cmd_ctx
);
2343 watchpoint_remove(target
, strtoul(args
[0], NULL
, 0));
2348 int handle_virt2phys_command(command_context_t
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2351 target_t
*target
= get_current_target(cmd_ctx
);
2357 return ERROR_COMMAND_SYNTAX_ERROR
;
2359 va
= strtoul(args
[0], NULL
, 0);
2361 retval
= target
->type
->virt2phys(target
, va
, &pa
);
2362 if (retval
== ERROR_OK
)
2364 command_print(cmd_ctx
, "Physical address 0x%08x", pa
);
2368 /* lower levels will have logged a detailed error which is
2369 * forwarded to telnet/GDB session.
2374 static void writeLong(FILE *f
, int l
)
2379 char c
=(l
>>(i
*8))&0xff;
2380 fwrite(&c
, 1, 1, f
);
2384 static void writeString(FILE *f
, char *s
)
2386 fwrite(s
, 1, strlen(s
), f
);
2391 // Dump a gmon.out histogram file.
2392 static void writeGmon(u32
*samples
, int sampleNum
, char *filename
)
2395 FILE *f
=fopen(filename
, "w");
2398 fwrite("gmon", 1, 4, f
);
2399 writeLong(f
, 0x00000001); // Version
2400 writeLong(f
, 0); // padding
2401 writeLong(f
, 0); // padding
2402 writeLong(f
, 0); // padding
2404 fwrite("", 1, 1, f
); // GMON_TAG_TIME_HIST
2406 // figure out bucket size
2409 for (i
=0; i
<sampleNum
; i
++)
2421 int addressSpace
=(max
-min
+1);
2423 static int const maxBuckets
=256*1024; // maximum buckets.
2424 int length
=addressSpace
;
2425 if (length
> maxBuckets
)
2429 int *buckets
=malloc(sizeof(int)*length
);
2435 memset(buckets
, 0, sizeof(int)*length
);
2436 for (i
=0; i
<sampleNum
;i
++)
2438 u32 address
=samples
[i
];
2439 long long a
=address
-min
;
2440 long long b
=length
-1;
2441 long long c
=addressSpace
-1;
2442 int index
=(a
*b
)/c
; // danger!!!! int32 overflows
2446 // append binary memory gmon.out &profile_hist_hdr ((char*)&profile_hist_hdr + sizeof(struct gmon_hist_hdr))
2447 writeLong(f
, min
); // low_pc
2448 writeLong(f
, max
); // high_pc
2449 writeLong(f
, length
); // # of samples
2450 writeLong(f
, 64000000); // 64MHz
2451 writeString(f
, "seconds");
2452 for (i
=0; i
<(15-strlen("seconds")); i
++)
2454 fwrite("", 1, 1, f
); // padding
2456 writeString(f
, "s");
2458 // append binary memory gmon.out profile_hist_data (profile_hist_data + profile_hist_hdr.hist_size)
2460 char *data
=malloc(2*length
);
2463 for (i
=0; i
<length
;i
++)
2472 data
[i
*2+1]=(val
>>8)&0xff;
2475 fwrite(data
, 1, length
*2, f
);
2485 /* profiling samples the CPU PC as quickly as OpenOCD is able, which will be used as a random sampling of PC */
2486 int handle_profile_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2488 target_t
*target
= get_current_target(cmd_ctx
);
2489 struct timeval timeout
, now
;
2491 gettimeofday(&timeout
, NULL
);
2494 return ERROR_COMMAND_SYNTAX_ERROR
;
2497 timeval_add_time(&timeout
, strtoul(args
[0], &end
, 0), 0);
2503 command_print(cmd_ctx
, "Starting profiling. Halting and resuming the target as often as we can...");
2505 static const int maxSample
=10000;
2506 u32
*samples
=malloc(sizeof(u32
)*maxSample
);
2511 int retval
=ERROR_OK
;
2512 // hopefully it is safe to cache! We want to stop/restart as quickly as possible.
2513 reg_t
*reg
= register_get_by_name(target
->reg_cache
, "pc", 1);
2517 target_poll(target
);
2518 if (target
->state
== TARGET_HALTED
)
2520 u32 t
=*((u32
*)reg
->value
);
2521 samples
[numSamples
++]=t
;
2522 retval
= target_resume(target
, 1, 0, 0, 0); /* current pc, addr = 0, do not handle breakpoints, not debugging */
2523 target_poll(target
);
2524 usleep(10*1000); // sleep 10ms, i.e. <100 samples/second.
2525 } else if (target
->state
== TARGET_RUNNING
)
2527 // We want to quickly sample the PC.
2528 target_halt(target
);
2531 command_print(cmd_ctx
, "Target not halted or running");
2535 if (retval
!=ERROR_OK
)
2540 gettimeofday(&now
, NULL
);
2541 if ((numSamples
>=maxSample
) || ((now
.tv_sec
>= timeout
.tv_sec
) && (now
.tv_usec
>= timeout
.tv_usec
)))
2543 command_print(cmd_ctx
, "Profiling completed. %d samples.", numSamples
);
2544 target_poll(target
);
2545 if (target
->state
== TARGET_HALTED
)
2547 target_resume(target
, 1, 0, 0, 0); /* current pc, addr = 0, do not handle breakpoints, not debugging */
2549 target_poll(target
);
2550 writeGmon(samples
, numSamples
, args
[1]);
2551 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)