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_daemon_startup_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
55 int handle_targets_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
57 int handle_target_script_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
58 int handle_run_and_halt_time_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
59 int handle_working_area_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
61 int handle_reg_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
62 int handle_poll_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
63 int handle_halt_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
64 int handle_wait_halt_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
65 int handle_reset_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
66 int handle_soft_reset_halt_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
67 int handle_resume_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
68 int handle_step_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
69 int handle_md_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
70 int handle_mw_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
71 int handle_load_image_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
72 int handle_dump_image_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
73 int handle_verify_image_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
74 int handle_bp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
75 int handle_rbp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
76 int handle_wp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
77 int handle_rwp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
78 int handle_virt2phys_command(command_context_t
*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 enum daemon_startup_mode startup_mode
= DAEMON_ATTACH
;
136 static int target_continous_poll
= 1;
138 /* read a u32 from a buffer in target memory endianness */
139 u32
target_buffer_get_u32(target_t
*target
, u8
*buffer
)
141 if (target
->endianness
== TARGET_LITTLE_ENDIAN
)
142 return le_to_h_u32(buffer
);
144 return be_to_h_u32(buffer
);
147 /* read a u16 from a buffer in target memory endianness */
148 u16
target_buffer_get_u16(target_t
*target
, u8
*buffer
)
150 if (target
->endianness
== TARGET_LITTLE_ENDIAN
)
151 return le_to_h_u16(buffer
);
153 return be_to_h_u16(buffer
);
156 /* write a u32 to a buffer in target memory endianness */
157 void target_buffer_set_u32(target_t
*target
, u8
*buffer
, u32 value
)
159 if (target
->endianness
== TARGET_LITTLE_ENDIAN
)
160 h_u32_to_le(buffer
, value
);
162 h_u32_to_be(buffer
, value
);
165 /* write a u16 to a buffer in target memory endianness */
166 void target_buffer_set_u16(target_t
*target
, u8
*buffer
, u16 value
)
168 if (target
->endianness
== TARGET_LITTLE_ENDIAN
)
169 h_u16_to_le(buffer
, value
);
171 h_u16_to_be(buffer
, value
);
174 /* returns a pointer to the n-th configured target */
175 target_t
* get_target_by_num(int num
)
177 target_t
*target
= targets
;
184 target
= target
->next
;
191 int get_num_by_target(target_t
*query_target
)
193 target_t
*target
= targets
;
198 if (target
== query_target
)
200 target
= target
->next
;
207 target_t
* get_current_target(command_context_t
*cmd_ctx
)
209 target_t
*target
= get_target_by_num(cmd_ctx
->current_target
);
213 ERROR("BUG: current_target out of bounds");
220 /* Process target initialization, when target entered debug out of reset
221 * the handler is unregistered at the end of this function, so it's only called once
223 int target_init_handler(struct target_s
*target
, enum target_event event
, void *priv
)
226 struct command_context_s
*cmd_ctx
= priv
;
228 if ((event
== TARGET_EVENT_HALTED
) && (target
->reset_script
))
230 target_unregister_event_callback(target_init_handler
, priv
);
232 script
= open_file_from_path(target
->reset_script
, "r");
235 ERROR("couldn't open script file %s", target
->reset_script
);
239 INFO("executing reset script '%s'", target
->reset_script
);
240 command_run_file(cmd_ctx
, script
, COMMAND_EXEC
);
243 jtag_execute_queue();
249 int target_run_and_halt_handler(void *priv
)
251 target_t
*target
= priv
;
253 target
->type
->halt(target
);
258 int target_process_reset(struct command_context_s
*cmd_ctx
)
260 int retval
= ERROR_OK
;
262 struct timeval timeout
, now
;
264 /* prepare reset_halt where necessary */
268 if (jtag_reset_config
& RESET_SRST_PULLS_TRST
)
270 switch (target
->reset_mode
)
273 command_print(cmd_ctx
, "nSRST pulls nTRST, falling back to \"reset run_and_halt\"");
274 target
->reset_mode
= RESET_RUN_AND_HALT
;
277 command_print(cmd_ctx
, "nSRST pulls nTRST, falling back to \"reset run_and_init\"");
278 target
->reset_mode
= RESET_RUN_AND_INIT
;
284 switch (target
->reset_mode
)
288 target
->type
->prepare_reset_halt(target
);
293 target
= target
->next
;
299 target
->type
->assert_reset(target
);
300 target
= target
->next
;
302 jtag_execute_queue();
304 /* request target halt if necessary, and schedule further action */
308 switch (target
->reset_mode
)
311 /* nothing to do if target just wants to be run */
313 case RESET_RUN_AND_HALT
:
315 target_register_timer_callback(target_run_and_halt_handler
, target
->run_and_halt_time
, 0, target
);
317 case RESET_RUN_AND_INIT
:
319 target_register_timer_callback(target_run_and_halt_handler
, target
->run_and_halt_time
, 0, target
);
320 target_register_event_callback(target_init_handler
, cmd_ctx
);
323 target
->type
->halt(target
);
326 target
->type
->halt(target
);
327 target_register_event_callback(target_init_handler
, cmd_ctx
);
330 ERROR("BUG: unknown target->reset_mode");
332 target
= target
->next
;
338 target
->type
->deassert_reset(target
);
339 target
= target
->next
;
341 jtag_execute_queue();
343 /* Wait for reset to complete, maximum 5 seconds. */
344 gettimeofday(&timeout
, NULL
);
345 timeval_add_time(&timeout
, 5, 0);
348 gettimeofday(&now
, NULL
);
350 target_call_timer_callbacks();
355 target
->type
->poll(target
);
356 if ((target
->reset_mode
== RESET_RUN_AND_INIT
) || (target
->reset_mode
== RESET_RUN_AND_HALT
))
358 if (target
->state
!= TARGET_HALTED
)
360 if ((now
.tv_sec
> timeout
.tv_sec
) || ((now
.tv_sec
== timeout
.tv_sec
) && (now
.tv_usec
>= timeout
.tv_usec
)))
362 command_print(cmd_ctx
, "Timed out waiting for reset");
365 /* this will send alive messages on e.g. GDB remote protocol.
366 * GDB warns me that I'm sending a zero length formatting message,
367 * which is strange, but in fact what is intended here. */
373 target
= target
->next
;
375 /* All targets we're waiting for are halted */
383 /* We want any events to be processed before the prompt */
384 target_call_timer_callbacks();
389 static int default_virt2phys(struct target_s
*target
, u32
virtual, u32
*physical
)
395 static int default_mmu(struct target_s
*target
, int *enabled
)
401 int target_init(struct command_context_s
*cmd_ctx
)
403 target_t
*target
= targets
;
407 if (target
->type
->init_target(cmd_ctx
, target
) != ERROR_OK
)
409 ERROR("target '%s' init failed", target
->type
->name
);
413 /* Set up default functions if none are provided by target */
414 if (target
->type
->virt2phys
== NULL
)
416 target
->type
->virt2phys
= default_virt2phys
;
418 if (target
->type
->mmu
== NULL
)
420 target
->type
->mmu
= default_mmu
;
422 target
= target
->next
;
427 target_register_user_commands(cmd_ctx
);
428 target_register_timer_callback(handle_target
, 100, 1, NULL
);
434 int target_init_reset(struct command_context_s
*cmd_ctx
)
436 if (startup_mode
== DAEMON_RESET
)
437 target_process_reset(cmd_ctx
);
442 int target_register_event_callback(int (*callback
)(struct target_s
*target
, enum target_event event
, void *priv
), void *priv
)
444 target_event_callback_t
**callbacks_p
= &target_event_callbacks
;
446 if (callback
== NULL
)
448 return ERROR_INVALID_ARGUMENTS
;
453 while ((*callbacks_p
)->next
)
454 callbacks_p
= &((*callbacks_p
)->next
);
455 callbacks_p
= &((*callbacks_p
)->next
);
458 (*callbacks_p
) = malloc(sizeof(target_event_callback_t
));
459 (*callbacks_p
)->callback
= callback
;
460 (*callbacks_p
)->priv
= priv
;
461 (*callbacks_p
)->next
= NULL
;
466 int target_register_timer_callback(int (*callback
)(void *priv
), int time_ms
, int periodic
, void *priv
)
468 target_timer_callback_t
**callbacks_p
= &target_timer_callbacks
;
471 if (callback
== NULL
)
473 return ERROR_INVALID_ARGUMENTS
;
478 while ((*callbacks_p
)->next
)
479 callbacks_p
= &((*callbacks_p
)->next
);
480 callbacks_p
= &((*callbacks_p
)->next
);
483 (*callbacks_p
) = malloc(sizeof(target_timer_callback_t
));
484 (*callbacks_p
)->callback
= callback
;
485 (*callbacks_p
)->periodic
= periodic
;
486 (*callbacks_p
)->time_ms
= time_ms
;
488 gettimeofday(&now
, NULL
);
489 (*callbacks_p
)->when
.tv_usec
= now
.tv_usec
+ (time_ms
% 1000) * 1000;
490 time_ms
-= (time_ms
% 1000);
491 (*callbacks_p
)->when
.tv_sec
= now
.tv_sec
+ (time_ms
/ 1000);
492 if ((*callbacks_p
)->when
.tv_usec
> 1000000)
494 (*callbacks_p
)->when
.tv_usec
= (*callbacks_p
)->when
.tv_usec
- 1000000;
495 (*callbacks_p
)->when
.tv_sec
+= 1;
498 (*callbacks_p
)->priv
= priv
;
499 (*callbacks_p
)->next
= NULL
;
504 int target_unregister_event_callback(int (*callback
)(struct target_s
*target
, enum target_event event
, void *priv
), void *priv
)
506 target_event_callback_t
**p
= &target_event_callbacks
;
507 target_event_callback_t
*c
= target_event_callbacks
;
509 if (callback
== NULL
)
511 return ERROR_INVALID_ARGUMENTS
;
516 target_event_callback_t
*next
= c
->next
;
517 if ((c
->callback
== callback
) && (c
->priv
== priv
))
531 int target_unregister_timer_callback(int (*callback
)(void *priv
), void *priv
)
533 target_timer_callback_t
**p
= &target_timer_callbacks
;
534 target_timer_callback_t
*c
= target_timer_callbacks
;
536 if (callback
== NULL
)
538 return ERROR_INVALID_ARGUMENTS
;
543 target_timer_callback_t
*next
= c
->next
;
544 if ((c
->callback
== callback
) && (c
->priv
== priv
))
558 int target_call_event_callbacks(target_t
*target
, enum target_event event
)
560 target_event_callback_t
*callback
= target_event_callbacks
;
561 target_event_callback_t
*next_callback
;
563 DEBUG("target event %i", event
);
567 next_callback
= callback
->next
;
568 callback
->callback(target
, event
, callback
->priv
);
569 callback
= next_callback
;
575 int target_call_timer_callbacks()
577 target_timer_callback_t
*callback
= target_timer_callbacks
;
578 target_timer_callback_t
*next_callback
;
581 gettimeofday(&now
, NULL
);
585 next_callback
= callback
->next
;
587 if (((now
.tv_sec
>= callback
->when
.tv_sec
) && (now
.tv_usec
>= callback
->when
.tv_usec
))
588 || (now
.tv_sec
> callback
->when
.tv_sec
))
590 callback
->callback(callback
->priv
);
591 if (callback
->periodic
)
593 int time_ms
= callback
->time_ms
;
594 callback
->when
.tv_usec
= now
.tv_usec
+ (time_ms
% 1000) * 1000;
595 time_ms
-= (time_ms
% 1000);
596 callback
->when
.tv_sec
= now
.tv_sec
+ time_ms
/ 1000;
597 if (callback
->when
.tv_usec
> 1000000)
599 callback
->when
.tv_usec
= callback
->when
.tv_usec
- 1000000;
600 callback
->when
.tv_sec
+= 1;
604 target_unregister_timer_callback(callback
->callback
, callback
->priv
);
607 callback
= next_callback
;
613 int target_alloc_working_area(struct target_s
*target
, u32 size
, working_area_t
**area
)
615 working_area_t
*c
= target
->working_areas
;
616 working_area_t
*new_wa
= NULL
;
618 /* Reevaluate working area address based on MMU state*/
619 if (target
->working_areas
== NULL
)
623 retval
= target
->type
->mmu(target
, &enabled
);
624 if (retval
!= ERROR_OK
)
630 target
->working_area
= target
->working_area_virt
;
634 target
->working_area
= target
->working_area_phys
;
638 /* only allocate multiples of 4 byte */
641 ERROR("BUG: code tried to allocate unaligned number of bytes, padding");
642 size
= CEIL(size
, 4);
645 /* see if there's already a matching working area */
648 if ((c
->free
) && (c
->size
== size
))
656 /* if not, allocate a new one */
659 working_area_t
**p
= &target
->working_areas
;
660 u32 first_free
= target
->working_area
;
661 u32 free_size
= target
->working_area_size
;
663 DEBUG("allocating new working area");
665 c
= target
->working_areas
;
668 first_free
+= c
->size
;
669 free_size
-= c
->size
;
674 if (free_size
< size
)
676 WARNING("not enough working area available(requested %d, free %d)", size
, free_size
);
677 return ERROR_TARGET_RESOURCE_NOT_AVAILABLE
;
680 new_wa
= malloc(sizeof(working_area_t
));
683 new_wa
->address
= first_free
;
685 if (target
->backup_working_area
)
687 new_wa
->backup
= malloc(new_wa
->size
);
688 target
->type
->read_memory(target
, new_wa
->address
, 4, new_wa
->size
/ 4, new_wa
->backup
);
692 new_wa
->backup
= NULL
;
695 /* put new entry in list */
699 /* mark as used, and return the new (reused) area */
709 int target_free_working_area(struct target_s
*target
, working_area_t
*area
)
714 if (target
->backup_working_area
)
715 target
->type
->write_memory(target
, area
->address
, 4, area
->size
/ 4, area
->backup
);
719 /* mark user pointer invalid */
726 int target_free_all_working_areas(struct target_s
*target
)
728 working_area_t
*c
= target
->working_areas
;
732 working_area_t
*next
= c
->next
;
733 target_free_working_area(target
, c
);
743 target
->working_areas
= NULL
;
748 int target_register_commands(struct command_context_s
*cmd_ctx
)
750 register_command(cmd_ctx
, NULL
, "target", handle_target_command
, COMMAND_CONFIG
, NULL
);
751 register_command(cmd_ctx
, NULL
, "targets", handle_targets_command
, COMMAND_EXEC
, NULL
);
752 register_command(cmd_ctx
, NULL
, "daemon_startup", handle_daemon_startup_command
, COMMAND_CONFIG
, NULL
);
753 register_command(cmd_ctx
, NULL
, "target_script", handle_target_script_command
, COMMAND_CONFIG
, NULL
);
754 register_command(cmd_ctx
, NULL
, "run_and_halt_time", handle_run_and_halt_time_command
, COMMAND_CONFIG
, NULL
);
755 register_command(cmd_ctx
, NULL
, "working_area", handle_working_area_command
, COMMAND_ANY
, "working_area <target#> <address> <size> <'backup'|'nobackup'> [virtual address]");
756 register_command(cmd_ctx
, NULL
, "virt2phys", handle_virt2phys_command
, COMMAND_ANY
, "virt2phys <virtual address>");
761 int target_arch_state(struct target_s
*target
)
766 USER("No target has been configured");
770 USER("target state: %s", target_state_strings
[target
->state
]);
772 if (target
->state
!=TARGET_HALTED
)
775 retval
=target
->type
->arch_state(target
);
779 /* Single aligned words are guaranteed to use 16 or 32 bit access
780 * mode respectively, otherwise data is handled as quickly as
783 int target_write_buffer(struct target_s
*target
, u32 address
, u32 size
, u8
*buffer
)
787 DEBUG("writing buffer of %i byte at 0x%8.8x", size
, address
);
789 if (((address
% 2) == 0) && (size
== 2))
791 return target
->type
->write_memory(target
, address
, 2, 1, buffer
);
794 /* handle unaligned head bytes */
797 int unaligned
= 4 - (address
% 4);
799 if (unaligned
> size
)
802 if ((retval
= target
->type
->write_memory(target
, address
, 1, unaligned
, buffer
)) != ERROR_OK
)
806 address
+= unaligned
;
810 /* handle aligned words */
813 int aligned
= size
- (size
% 4);
815 /* use bulk writes above a certain limit. This may have to be changed */
818 if ((retval
= target
->type
->bulk_write_memory(target
, address
, aligned
/ 4, buffer
)) != ERROR_OK
)
823 if ((retval
= target
->type
->write_memory(target
, address
, 4, aligned
/ 4, buffer
)) != ERROR_OK
)
832 /* handle tail writes of less than 4 bytes */
835 if ((retval
= target
->type
->write_memory(target
, address
, 1, size
, buffer
)) != ERROR_OK
)
843 /* Single aligned words are guaranteed to use 16 or 32 bit access
844 * mode respectively, otherwise data is handled as quickly as
847 int target_read_buffer(struct target_s
*target
, u32 address
, u32 size
, u8
*buffer
)
851 DEBUG("reading buffer of %i byte at 0x%8.8x", size
, address
);
853 if (((address
% 2) == 0) && (size
== 2))
855 return target
->type
->read_memory(target
, address
, 2, 1, buffer
);
858 /* handle unaligned head bytes */
861 int unaligned
= 4 - (address
% 4);
863 if (unaligned
> size
)
866 if ((retval
= target
->type
->read_memory(target
, address
, 1, unaligned
, buffer
)) != ERROR_OK
)
870 address
+= unaligned
;
874 /* handle aligned words */
877 int aligned
= size
- (size
% 4);
879 if ((retval
= target
->type
->read_memory(target
, address
, 4, aligned
/ 4, buffer
)) != ERROR_OK
)
887 /* handle tail writes of less than 4 bytes */
890 if ((retval
= target
->type
->read_memory(target
, address
, 1, size
, buffer
)) != ERROR_OK
)
897 int target_checksum_memory(struct target_s
*target
, u32 address
, u32 size
, u32
* crc
)
904 if ((retval
= target
->type
->checksum_memory(target
, address
,
905 size
, &checksum
)) == ERROR_TARGET_RESOURCE_NOT_AVAILABLE
)
907 buffer
= malloc(size
);
910 ERROR("error allocating buffer for section (%d bytes)", size
);
911 return ERROR_INVALID_ARGUMENTS
;
913 retval
= target_read_buffer(target
, address
, size
, buffer
);
914 if (retval
!= ERROR_OK
)
920 /* convert to target endianess */
921 for (i
= 0; i
< (size
/sizeof(u32
)); i
++)
924 target_data
= target_buffer_get_u32(target
, &buffer
[i
*sizeof(u32
)]);
925 target_buffer_set_u32(target
, &buffer
[i
*sizeof(u32
)], target_data
);
928 retval
= image_calculate_checksum( buffer
, size
, &checksum
);
937 int target_read_u32(struct target_s
*target
, u32 address
, u32
*value
)
941 int retval
= target
->type
->read_memory(target
, address
, 4, 1, value_buf
);
943 if (retval
== ERROR_OK
)
945 *value
= target_buffer_get_u32(target
, value_buf
);
946 DEBUG("address: 0x%8.8x, value: 0x%8.8x", address
, *value
);
951 DEBUG("address: 0x%8.8x failed", address
);
957 int target_read_u16(struct target_s
*target
, u32 address
, u16
*value
)
961 int retval
= target
->type
->read_memory(target
, address
, 2, 1, value_buf
);
963 if (retval
== ERROR_OK
)
965 *value
= target_buffer_get_u16(target
, value_buf
);
966 DEBUG("address: 0x%8.8x, value: 0x%4.4x", address
, *value
);
971 DEBUG("address: 0x%8.8x failed", address
);
977 int target_read_u8(struct target_s
*target
, u32 address
, u8
*value
)
979 int retval
= target
->type
->read_memory(target
, address
, 1, 1, value
);
981 if (retval
== ERROR_OK
)
983 DEBUG("address: 0x%8.8x, value: 0x%2.2x", address
, *value
);
988 DEBUG("address: 0x%8.8x failed", address
);
994 int target_write_u32(struct target_s
*target
, u32 address
, u32 value
)
999 DEBUG("address: 0x%8.8x, value: 0x%8.8x", address
, value
);
1001 target_buffer_set_u32(target
, value_buf
, value
);
1002 if ((retval
= target
->type
->write_memory(target
, address
, 4, 1, value_buf
)) != ERROR_OK
)
1004 DEBUG("failed: %i", retval
);
1010 int target_write_u16(struct target_s
*target
, u32 address
, u16 value
)
1015 DEBUG("address: 0x%8.8x, value: 0x%8.8x", address
, value
);
1017 target_buffer_set_u16(target
, value_buf
, value
);
1018 if ((retval
= target
->type
->write_memory(target
, address
, 2, 1, value_buf
)) != ERROR_OK
)
1020 DEBUG("failed: %i", retval
);
1026 int target_write_u8(struct target_s
*target
, u32 address
, u8 value
)
1030 DEBUG("address: 0x%8.8x, value: 0x%2.2x", address
, value
);
1032 if ((retval
= target
->type
->read_memory(target
, address
, 1, 1, &value
)) != ERROR_OK
)
1034 DEBUG("failed: %i", retval
);
1040 int target_register_user_commands(struct command_context_s
*cmd_ctx
)
1042 register_command(cmd_ctx
, NULL
, "reg", handle_reg_command
, COMMAND_EXEC
, NULL
);
1043 register_command(cmd_ctx
, NULL
, "poll", handle_poll_command
, COMMAND_EXEC
, "poll target state");
1044 register_command(cmd_ctx
, NULL
, "wait_halt", handle_wait_halt_command
, COMMAND_EXEC
, "wait for target halt [time (s)]");
1045 register_command(cmd_ctx
, NULL
, "halt", handle_halt_command
, COMMAND_EXEC
, "halt target");
1046 register_command(cmd_ctx
, NULL
, "resume", handle_resume_command
, COMMAND_EXEC
, "resume target [addr]");
1047 register_command(cmd_ctx
, NULL
, "step", handle_step_command
, COMMAND_EXEC
, "step one instruction from current PC or [addr]");
1048 register_command(cmd_ctx
, NULL
, "reset", handle_reset_command
, COMMAND_EXEC
, "reset target [run|halt|init|run_and_halt|run_and_init]");
1049 register_command(cmd_ctx
, NULL
, "soft_reset_halt", handle_soft_reset_halt_command
, COMMAND_EXEC
, "halt the target and do a soft reset");
1051 register_command(cmd_ctx
, NULL
, "mdw", handle_md_command
, COMMAND_EXEC
, "display memory words <addr> [count]");
1052 register_command(cmd_ctx
, NULL
, "mdh", handle_md_command
, COMMAND_EXEC
, "display memory half-words <addr> [count]");
1053 register_command(cmd_ctx
, NULL
, "mdb", handle_md_command
, COMMAND_EXEC
, "display memory bytes <addr> [count]");
1055 register_command(cmd_ctx
, NULL
, "mww", handle_mw_command
, COMMAND_EXEC
, "write memory word <addr> <value>");
1056 register_command(cmd_ctx
, NULL
, "mwh", handle_mw_command
, COMMAND_EXEC
, "write memory half-word <addr> <value>");
1057 register_command(cmd_ctx
, NULL
, "mwb", handle_mw_command
, COMMAND_EXEC
, "write memory byte <addr> <value>");
1059 register_command(cmd_ctx
, NULL
, "bp", handle_bp_command
, COMMAND_EXEC
, "set breakpoint <address> <length> [hw]");
1060 register_command(cmd_ctx
, NULL
, "rbp", handle_rbp_command
, COMMAND_EXEC
, "remove breakpoint <adress>");
1061 register_command(cmd_ctx
, NULL
, "wp", handle_wp_command
, COMMAND_EXEC
, "set watchpoint <address> <length> <r/w/a> [value] [mask]");
1062 register_command(cmd_ctx
, NULL
, "rwp", handle_rwp_command
, COMMAND_EXEC
, "remove watchpoint <adress>");
1064 register_command(cmd_ctx
, NULL
, "load_image", handle_load_image_command
, COMMAND_EXEC
, "load_image <file> <address> ['bin'|'ihex'|'elf'|'s19']");
1065 register_command(cmd_ctx
, NULL
, "dump_image", handle_dump_image_command
, COMMAND_EXEC
, "dump_image <file> <address> <size>");
1066 register_command(cmd_ctx
, NULL
, "verify_image", handle_verify_image_command
, COMMAND_EXEC
, "verify_image <file> [offset] [type]");
1067 register_command(cmd_ctx
, NULL
, "load_binary", handle_load_image_command
, COMMAND_EXEC
, "[DEPRECATED] load_binary <file> <address>");
1068 register_command(cmd_ctx
, NULL
, "dump_binary", handle_dump_image_command
, COMMAND_EXEC
, "[DEPRECATED] dump_binary <file> <address> <size>");
1070 target_request_register_commands(cmd_ctx
);
1071 trace_register_commands(cmd_ctx
);
1076 int handle_targets_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1078 target_t
*target
= targets
;
1083 int num
= strtoul(args
[0], NULL
, 0);
1088 target
= target
->next
;
1092 cmd_ctx
->current_target
= num
;
1094 command_print(cmd_ctx
, "%i is out of bounds, only %i targets are configured", num
, count
);
1101 command_print(cmd_ctx
, "%i: %s (%s), state: %s", count
++, target
->type
->name
, target_endianess_strings
[target
->endianness
], target_state_strings
[target
->state
]);
1102 target
= target
->next
;
1108 int handle_target_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1115 ERROR("target command requires at least three arguments: <type> <endianess> <reset_mode>");
1119 /* search for the specified target */
1120 if (args
[0] && (args
[0][0] != 0))
1122 for (i
= 0; target_types
[i
]; i
++)
1124 if (strcmp(args
[0], target_types
[i
]->name
) == 0)
1126 target_t
**last_target_p
= &targets
;
1128 /* register target specific commands */
1129 if (target_types
[i
]->register_commands(cmd_ctx
) != ERROR_OK
)
1131 ERROR("couldn't register '%s' commands", args
[0]);
1137 while ((*last_target_p
)->next
)
1138 last_target_p
= &((*last_target_p
)->next
);
1139 last_target_p
= &((*last_target_p
)->next
);
1142 *last_target_p
= malloc(sizeof(target_t
));
1144 (*last_target_p
)->type
= target_types
[i
];
1146 if (strcmp(args
[1], "big") == 0)
1147 (*last_target_p
)->endianness
= TARGET_BIG_ENDIAN
;
1148 else if (strcmp(args
[1], "little") == 0)
1149 (*last_target_p
)->endianness
= TARGET_LITTLE_ENDIAN
;
1152 ERROR("endianness must be either 'little' or 'big', not '%s'", args
[1]);
1156 /* what to do on a target reset */
1157 if (strcmp(args
[2], "reset_halt") == 0)
1158 (*last_target_p
)->reset_mode
= RESET_HALT
;
1159 else if (strcmp(args
[2], "reset_run") == 0)
1160 (*last_target_p
)->reset_mode
= RESET_RUN
;
1161 else if (strcmp(args
[2], "reset_init") == 0)
1162 (*last_target_p
)->reset_mode
= RESET_INIT
;
1163 else if (strcmp(args
[2], "run_and_halt") == 0)
1164 (*last_target_p
)->reset_mode
= RESET_RUN_AND_HALT
;
1165 else if (strcmp(args
[2], "run_and_init") == 0)
1166 (*last_target_p
)->reset_mode
= RESET_RUN_AND_INIT
;
1169 ERROR("unknown target startup mode %s", args
[2]);
1172 (*last_target_p
)->run_and_halt_time
= 1000; /* default 1s */
1174 (*last_target_p
)->reset_script
= NULL
;
1175 (*last_target_p
)->post_halt_script
= NULL
;
1176 (*last_target_p
)->pre_resume_script
= NULL
;
1177 (*last_target_p
)->gdb_program_script
= NULL
;
1179 (*last_target_p
)->working_area
= 0x0;
1180 (*last_target_p
)->working_area_size
= 0x0;
1181 (*last_target_p
)->working_areas
= NULL
;
1182 (*last_target_p
)->backup_working_area
= 0;
1184 (*last_target_p
)->state
= TARGET_UNKNOWN
;
1185 (*last_target_p
)->debug_reason
= DBG_REASON_UNDEFINED
;
1186 (*last_target_p
)->reg_cache
= NULL
;
1187 (*last_target_p
)->breakpoints
= NULL
;
1188 (*last_target_p
)->watchpoints
= NULL
;
1189 (*last_target_p
)->next
= NULL
;
1190 (*last_target_p
)->arch_info
= NULL
;
1192 /* initialize trace information */
1193 (*last_target_p
)->trace_info
= malloc(sizeof(trace_t
));
1194 (*last_target_p
)->trace_info
->num_trace_points
= 0;
1195 (*last_target_p
)->trace_info
->trace_points_size
= 0;
1196 (*last_target_p
)->trace_info
->trace_points
= NULL
;
1197 (*last_target_p
)->trace_info
->trace_history_size
= 0;
1198 (*last_target_p
)->trace_info
->trace_history
= NULL
;
1199 (*last_target_p
)->trace_info
->trace_history_pos
= 0;
1200 (*last_target_p
)->trace_info
->trace_history_overflowed
= 0;
1202 (*last_target_p
)->dbgmsg
= NULL
;
1203 (*last_target_p
)->dbg_msg_enabled
= 0;
1205 (*last_target_p
)->type
->target_command(cmd_ctx
, cmd
, args
, argc
, *last_target_p
);
1213 /* no matching target found */
1216 ERROR("target '%s' not found", args
[0]);
1223 /* usage: target_script <target#> <event> <script_file> */
1224 int handle_target_script_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1226 target_t
*target
= NULL
;
1230 ERROR("incomplete target_script command");
1234 target
= get_target_by_num(strtoul(args
[0], NULL
, 0));
1238 ERROR("target number '%s' not defined", args
[0]);
1242 if (strcmp(args
[1], "reset") == 0)
1244 if (target
->reset_script
)
1245 free(target
->reset_script
);
1246 target
->reset_script
= strdup(args
[2]);
1248 else if (strcmp(args
[1], "post_halt") == 0)
1250 if (target
->post_halt_script
)
1251 free(target
->post_halt_script
);
1252 target
->post_halt_script
= strdup(args
[2]);
1254 else if (strcmp(args
[1], "pre_resume") == 0)
1256 if (target
->pre_resume_script
)
1257 free(target
->pre_resume_script
);
1258 target
->pre_resume_script
= strdup(args
[2]);
1260 else if (strcmp(args
[1], "gdb_program_config") == 0)
1262 if (target
->gdb_program_script
)
1263 free(target
->gdb_program_script
);
1264 target
->gdb_program_script
= strdup(args
[2]);
1268 ERROR("unknown event type: '%s", args
[1]);
1275 int handle_run_and_halt_time_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1277 target_t
*target
= NULL
;
1281 ERROR("incomplete run_and_halt_time command");
1285 target
= get_target_by_num(strtoul(args
[0], NULL
, 0));
1289 ERROR("target number '%s' not defined", args
[0]);
1293 target
->run_and_halt_time
= strtoul(args
[1], NULL
, 0);
1298 int handle_working_area_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1300 target_t
*target
= NULL
;
1302 if ((argc
< 4) || (argc
> 5))
1304 return ERROR_COMMAND_SYNTAX_ERROR
;
1307 target
= get_target_by_num(strtoul(args
[0], NULL
, 0));
1311 ERROR("target number '%s' not defined", args
[0]);
1314 target_free_all_working_areas(target
);
1316 target
->working_area_phys
= target
->working_area_virt
= strtoul(args
[1], NULL
, 0);
1319 target
->working_area_virt
= strtoul(args
[4], NULL
, 0);
1321 target
->working_area_size
= strtoul(args
[2], NULL
, 0);
1323 if (strcmp(args
[3], "backup") == 0)
1325 target
->backup_working_area
= 1;
1327 else if (strcmp(args
[3], "nobackup") == 0)
1329 target
->backup_working_area
= 0;
1333 ERROR("unrecognized <backup|nobackup> argument (%s)", args
[3]);
1334 return ERROR_COMMAND_SYNTAX_ERROR
;
1341 /* process target state changes */
1342 int handle_target(void *priv
)
1345 target_t
*target
= targets
;
1349 /* only poll if target isn't already halted */
1350 if (target
->state
!= TARGET_HALTED
)
1352 if (target_continous_poll
)
1353 if ((retval
= target
->type
->poll(target
)) != ERROR_OK
)
1355 ERROR("couldn't poll target(%d). It's due for a reset.", retval
);
1359 target
= target
->next
;
1365 int handle_reg_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1374 target
= get_current_target(cmd_ctx
);
1376 /* list all available registers for the current target */
1379 reg_cache_t
*cache
= target
->reg_cache
;
1385 for (i
= 0; i
< cache
->num_regs
; i
++)
1387 value
= buf_to_str(cache
->reg_list
[i
].value
, cache
->reg_list
[i
].size
, 16);
1388 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
);
1391 cache
= cache
->next
;
1397 /* access a single register by its ordinal number */
1398 if ((args
[0][0] >= '0') && (args
[0][0] <= '9'))
1400 int num
= strtoul(args
[0], NULL
, 0);
1401 reg_cache_t
*cache
= target
->reg_cache
;
1407 for (i
= 0; i
< cache
->num_regs
; i
++)
1411 reg
= &cache
->reg_list
[i
];
1417 cache
= cache
->next
;
1422 command_print(cmd_ctx
, "%i is out of bounds, the current target has only %i registers (0 - %i)", num
, count
, count
- 1);
1425 } else /* access a single register by its name */
1427 reg
= register_get_by_name(target
->reg_cache
, args
[0], 1);
1431 command_print(cmd_ctx
, "register %s not found in current target", args
[0]);
1436 /* display a register */
1437 if ((argc
== 1) || ((argc
== 2) && !((args
[1][0] >= '0') && (args
[1][0] <= '9'))))
1439 if ((argc
== 2) && (strcmp(args
[1], "force") == 0))
1442 if (reg
->valid
== 0)
1444 reg_arch_type_t
*arch_type
= register_get_arch_type(reg
->arch_type
);
1445 if (arch_type
== NULL
)
1447 ERROR("BUG: encountered unregistered arch type");
1450 arch_type
->get(reg
);
1452 value
= buf_to_str(reg
->value
, reg
->size
, 16);
1453 command_print(cmd_ctx
, "%s (/%i): 0x%s", reg
->name
, reg
->size
, value
);
1458 /* set register value */
1461 u8
*buf
= malloc(CEIL(reg
->size
, 8));
1462 str_to_buf(args
[1], strlen(args
[1]), buf
, reg
->size
, 0);
1464 reg_arch_type_t
*arch_type
= register_get_arch_type(reg
->arch_type
);
1465 if (arch_type
== NULL
)
1467 ERROR("BUG: encountered unregistered arch type");
1471 arch_type
->set(reg
, buf
);
1473 value
= buf_to_str(reg
->value
, reg
->size
, 16);
1474 command_print(cmd_ctx
, "%s (/%i): 0x%s", reg
->name
, reg
->size
, value
);
1482 command_print(cmd_ctx
, "usage: reg <#|name> [value]");
1487 static int wait_state(struct command_context_s
*cmd_ctx
, char *cmd
, enum target_state state
, int ms
);
1489 int handle_poll_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1491 target_t
*target
= get_current_target(cmd_ctx
);
1495 target
->type
->poll(target
);
1496 target_arch_state(target
);
1500 if (strcmp(args
[0], "on") == 0)
1502 target_continous_poll
= 1;
1504 else if (strcmp(args
[0], "off") == 0)
1506 target_continous_poll
= 0;
1510 command_print(cmd_ctx
, "arg is \"on\" or \"off\"");
1518 int handle_wait_halt_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1526 ms
= strtoul(args
[0], &end
, 0) * 1000;
1529 command_print(cmd_ctx
, "usage: %s [seconds]", cmd
);
1534 return wait_state(cmd_ctx
, cmd
, TARGET_HALTED
, ms
);
1537 static void target_process_events(struct command_context_s
*cmd_ctx
)
1539 target_t
*target
= get_current_target(cmd_ctx
);
1540 target
->type
->poll(target
);
1541 target_call_timer_callbacks();
1544 static int wait_state(struct command_context_s
*cmd_ctx
, char *cmd
, enum target_state state
, int ms
)
1547 struct timeval timeout
, now
;
1549 gettimeofday(&timeout
, NULL
);
1550 timeval_add_time(&timeout
, 0, ms
* 1000);
1552 target_t
*target
= get_current_target(cmd_ctx
);
1555 if ((retval
=target
->type
->poll(target
))!=ERROR_OK
)
1557 target_call_timer_callbacks();
1558 if (target
->state
== state
)
1565 command_print(cmd_ctx
, "waiting for target %s...", target_state_strings
[state
]);
1568 gettimeofday(&now
, NULL
);
1569 if ((now
.tv_sec
> timeout
.tv_sec
) || ((now
.tv_sec
== timeout
.tv_sec
) && (now
.tv_usec
>= timeout
.tv_usec
)))
1571 ERROR("timed out while waiting for target %s", target_state_strings
[state
]);
1579 int handle_halt_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1582 target_t
*target
= get_current_target(cmd_ctx
);
1586 if ((retval
= target
->type
->halt(target
)) != ERROR_OK
)
1591 return handle_wait_halt_command(cmd_ctx
, cmd
, args
, argc
);
1594 /* what to do on daemon startup */
1595 int handle_daemon_startup_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1599 if (strcmp(args
[0], "attach") == 0)
1601 startup_mode
= DAEMON_ATTACH
;
1604 else if (strcmp(args
[0], "reset") == 0)
1606 startup_mode
= DAEMON_RESET
;
1611 WARNING("invalid daemon_startup configuration directive: %s", args
[0]);
1616 int handle_soft_reset_halt_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1618 target_t
*target
= get_current_target(cmd_ctx
);
1621 command_print(cmd_ctx
, "requesting target halt and executing a soft reset");
1623 if ((retval
= target
->type
->soft_reset_halt(target
)) != ERROR_OK
)
1627 case ERROR_TARGET_TIMEOUT
:
1628 command_print(cmd_ctx
, "target timed out... shutting down");
1631 command_print(cmd_ctx
, "unknown error... shutting down");
1639 int handle_reset_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1641 target_t
*target
= get_current_target(cmd_ctx
);
1642 enum target_reset_mode reset_mode
= target
->reset_mode
;
1643 enum target_reset_mode save
= target
->reset_mode
;
1649 if (strcmp("run", args
[0]) == 0)
1650 reset_mode
= RESET_RUN
;
1651 else if (strcmp("halt", args
[0]) == 0)
1652 reset_mode
= RESET_HALT
;
1653 else if (strcmp("init", args
[0]) == 0)
1654 reset_mode
= RESET_INIT
;
1655 else if (strcmp("run_and_halt", args
[0]) == 0)
1657 reset_mode
= RESET_RUN_AND_HALT
;
1660 target
->run_and_halt_time
= strtoul(args
[1], NULL
, 0);
1663 else if (strcmp("run_and_init", args
[0]) == 0)
1665 reset_mode
= RESET_RUN_AND_INIT
;
1668 target
->run_and_halt_time
= strtoul(args
[1], NULL
, 0);
1673 command_print(cmd_ctx
, "usage: reset ['run', 'halt', 'init', 'run_and_halt', 'run_and_init]");
1678 /* temporarily modify mode of current reset target */
1679 target
->reset_mode
= reset_mode
;
1681 /* reset *all* targets */
1682 target_process_reset(cmd_ctx
);
1684 /* Restore default reset mode for this target */
1685 target
->reset_mode
= save
;
1690 int handle_resume_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1693 target_t
*target
= get_current_target(cmd_ctx
);
1696 retval
= target
->type
->resume(target
, 1, 0, 1, 0); /* current pc, addr = 0, handle breakpoints, not debugging */
1698 retval
= target
->type
->resume(target
, 0, strtoul(args
[0], NULL
, 0), 1, 0); /* addr = args[0], handle breakpoints, not debugging */
1701 return ERROR_COMMAND_SYNTAX_ERROR
;
1704 target_process_events(cmd_ctx
);
1709 int handle_step_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1711 target_t
*target
= get_current_target(cmd_ctx
);
1716 target
->type
->step(target
, 1, 0, 1); /* current pc, addr = 0, handle breakpoints */
1719 target
->type
->step(target
, 0, strtoul(args
[0], NULL
, 0), 1); /* addr = args[0], handle breakpoints */
1724 int handle_md_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1726 const int line_bytecnt
= 32;
1739 target_t
*target
= get_current_target(cmd_ctx
);
1745 count
= strtoul(args
[1], NULL
, 0);
1747 address
= strtoul(args
[0], NULL
, 0);
1753 size
= 4; line_modulo
= line_bytecnt
/ 4;
1756 size
= 2; line_modulo
= line_bytecnt
/ 2;
1759 size
= 1; line_modulo
= line_bytecnt
/ 1;
1765 buffer
= calloc(count
, size
);
1766 retval
= target
->type
->read_memory(target
, address
, size
, count
, buffer
);
1767 if (retval
!= ERROR_OK
)
1771 case ERROR_TARGET_UNALIGNED_ACCESS
:
1772 command_print(cmd_ctx
, "error: address not aligned");
1774 case ERROR_TARGET_NOT_HALTED
:
1775 command_print(cmd_ctx
, "error: target must be halted for memory accesses");
1777 case ERROR_TARGET_DATA_ABORT
:
1778 command_print(cmd_ctx
, "error: access caused data abort, system possibly corrupted");
1781 command_print(cmd_ctx
, "error: unknown error");
1789 for (i
= 0; i
< count
; i
++)
1791 if (i
%line_modulo
== 0)
1792 output_len
+= snprintf(output
+ output_len
, 128 - output_len
, "0x%8.8x: ", address
+ (i
*size
));
1797 output_len
+= snprintf(output
+ output_len
, 128 - output_len
, "%8.8x ", target_buffer_get_u32(target
, &buffer
[i
*4]));
1800 output_len
+= snprintf(output
+ output_len
, 128 - output_len
, "%4.4x ", target_buffer_get_u16(target
, &buffer
[i
*2]));
1803 output_len
+= snprintf(output
+ output_len
, 128 - output_len
, "%2.2x ", buffer
[i
*1]);
1807 if ((i
%line_modulo
== line_modulo
-1) || (i
== count
- 1))
1809 command_print(cmd_ctx
, output
);
1819 int handle_mw_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1824 target_t
*target
= get_current_target(cmd_ctx
);
1830 address
= strtoul(args
[0], NULL
, 0);
1831 value
= strtoul(args
[1], NULL
, 0);
1836 target_buffer_set_u32(target
, value_buf
, value
);
1837 retval
= target
->type
->write_memory(target
, address
, 4, 1, value_buf
);
1840 target_buffer_set_u16(target
, value_buf
, value
);
1841 retval
= target
->type
->write_memory(target
, address
, 2, 1, value_buf
);
1844 value_buf
[0] = value
;
1845 retval
= target
->type
->write_memory(target
, address
, 1, 1, value_buf
);
1853 case ERROR_TARGET_UNALIGNED_ACCESS
:
1854 command_print(cmd_ctx
, "error: address not aligned");
1856 case ERROR_TARGET_DATA_ABORT
:
1857 command_print(cmd_ctx
, "error: access caused data abort, system possibly corrupted");
1859 case ERROR_TARGET_NOT_HALTED
:
1860 command_print(cmd_ctx
, "error: target must be halted for memory accesses");
1865 command_print(cmd_ctx
, "error: unknown error");
1873 int handle_load_image_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1883 duration_t duration
;
1884 char *duration_text
;
1886 target_t
*target
= get_current_target(cmd_ctx
);
1890 command_print(cmd_ctx
, "usage: load_image <filename> [address] [type]");
1894 /* a base address isn't always necessary, default to 0x0 (i.e. don't relocate) */
1897 image
.base_address_set
= 1;
1898 image
.base_address
= strtoul(args
[1], NULL
, 0);
1902 image
.base_address_set
= 0;
1905 image
.start_address_set
= 0;
1907 duration_start_measure(&duration
);
1909 if (image_open(&image
, args
[0], (argc
>= 3) ? args
[2] : NULL
) != ERROR_OK
)
1915 for (i
= 0; i
< image
.num_sections
; i
++)
1917 buffer
= malloc(image
.sections
[i
].size
);
1920 command_print(cmd_ctx
, "error allocating buffer for section (%d bytes)", image
.sections
[i
].size
);
1924 if ((retval
= image_read_section(&image
, i
, 0x0, image
.sections
[i
].size
, buffer
, &buf_cnt
)) != ERROR_OK
)
1926 ERROR("image_read_section failed with error code: %i", retval
);
1927 command_print(cmd_ctx
, "image reading failed, download aborted");
1929 image_close(&image
);
1932 target_write_buffer(target
, image
.sections
[i
].base_address
, buf_cnt
, buffer
);
1933 image_size
+= buf_cnt
;
1934 command_print(cmd_ctx
, "%u byte written at address 0x%8.8x", buf_cnt
, image
.sections
[i
].base_address
);
1939 duration_stop_measure(&duration
, &duration_text
);
1940 command_print(cmd_ctx
, "downloaded %u byte in %s", image_size
, duration_text
);
1941 free(duration_text
);
1943 image_close(&image
);
1949 int handle_dump_image_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1958 duration_t duration
;
1959 char *duration_text
;
1961 target_t
*target
= get_current_target(cmd_ctx
);
1965 command_print(cmd_ctx
, "usage: dump_image <filename> <address> <size>");
1969 address
= strtoul(args
[1], NULL
, 0);
1970 size
= strtoul(args
[2], NULL
, 0);
1972 if ((address
& 3) || (size
& 3))
1974 command_print(cmd_ctx
, "only 32-bit aligned address and size are supported");
1978 if (fileio_open(&fileio
, args
[0], FILEIO_WRITE
, FILEIO_BINARY
) != ERROR_OK
)
1983 duration_start_measure(&duration
);
1988 u32 this_run_size
= (size
> 560) ? 560 : size
;
1990 retval
= target
->type
->read_memory(target
, address
, 4, this_run_size
/ 4, buffer
);
1991 if (retval
!= ERROR_OK
)
1993 command_print(cmd_ctx
, "Reading memory failed %d", retval
);
1997 fileio_write(&fileio
, this_run_size
, buffer
, &size_written
);
1999 size
-= this_run_size
;
2000 address
+= this_run_size
;
2003 fileio_close(&fileio
);
2005 duration_stop_measure(&duration
, &duration_text
);
2006 command_print(cmd_ctx
, "dumped %"PRIi64
" byte in %s", fileio
.size
, duration_text
);
2007 free(duration_text
);
2012 int handle_verify_image_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2020 u32 mem_checksum
= 0;
2024 duration_t duration
;
2025 char *duration_text
;
2027 target_t
*target
= get_current_target(cmd_ctx
);
2031 command_print(cmd_ctx
, "usage: verify_image <file> [offset] [type]");
2037 ERROR("no target selected");
2041 duration_start_measure(&duration
);
2045 image
.base_address_set
= 1;
2046 image
.base_address
= strtoul(args
[1], NULL
, 0);
2050 image
.base_address_set
= 0;
2051 image
.base_address
= 0x0;
2054 image
.start_address_set
= 0;
2056 if (image_open(&image
, args
[0], (argc
== 3) ? args
[2] : NULL
) != ERROR_OK
)
2062 for (i
= 0; i
< image
.num_sections
; i
++)
2064 buffer
= malloc(image
.sections
[i
].size
);
2067 command_print(cmd_ctx
, "error allocating buffer for section (%d bytes)", image
.sections
[i
].size
);
2070 if ((retval
= image_read_section(&image
, i
, 0x0, image
.sections
[i
].size
, buffer
, &buf_cnt
)) != ERROR_OK
)
2072 ERROR("image_read_section failed with error code: %i", retval
);
2073 command_print(cmd_ctx
, "image reading failed, verify aborted");
2075 image_close(&image
);
2079 /* calculate checksum of image */
2080 image_calculate_checksum( buffer
, buf_cnt
, &checksum
);
2082 retval
= target_checksum_memory(target
, image
.sections
[i
].base_address
, buf_cnt
, &mem_checksum
);
2084 if( retval
!= ERROR_OK
)
2086 command_print(cmd_ctx
, "could not calculate checksum, verify aborted");
2088 image_close(&image
);
2092 if( checksum
!= mem_checksum
)
2094 /* failed crc checksum, fall back to a binary compare */
2097 command_print(cmd_ctx
, "checksum mismatch - attempting binary compare");
2099 data
= (u8
*)malloc(buf_cnt
);
2101 /* Can we use 32bit word accesses? */
2103 int count
= buf_cnt
;
2104 if ((count
% 4) == 0)
2109 retval
= target
->type
->read_memory(target
, image
.sections
[i
].base_address
, size
, count
, data
);
2111 if (retval
== ERROR_OK
)
2114 for (t
= 0; t
< buf_cnt
; t
++)
2116 if (data
[t
] != buffer
[t
])
2118 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
]);
2121 image_close(&image
);
2131 image_size
+= buf_cnt
;
2134 duration_stop_measure(&duration
, &duration_text
);
2135 command_print(cmd_ctx
, "verified %u bytes in %s", image_size
, duration_text
);
2136 free(duration_text
);
2138 image_close(&image
);
2143 int handle_bp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2146 target_t
*target
= get_current_target(cmd_ctx
);
2150 breakpoint_t
*breakpoint
= target
->breakpoints
;
2154 if (breakpoint
->type
== BKPT_SOFT
)
2156 char* buf
= buf_to_str(breakpoint
->orig_instr
, breakpoint
->length
, 16);
2157 command_print(cmd_ctx
, "0x%8.8x, 0x%x, %i, 0x%s", breakpoint
->address
, breakpoint
->length
, breakpoint
->set
, buf
);
2162 command_print(cmd_ctx
, "0x%8.8x, 0x%x, %i", breakpoint
->address
, breakpoint
->length
, breakpoint
->set
);
2164 breakpoint
= breakpoint
->next
;
2172 length
= strtoul(args
[1], NULL
, 0);
2175 if (strcmp(args
[2], "hw") == 0)
2178 if ((retval
= breakpoint_add(target
, strtoul(args
[0], NULL
, 0), length
, hw
)) != ERROR_OK
)
2182 case ERROR_TARGET_NOT_HALTED
:
2183 command_print(cmd_ctx
, "target must be halted to set breakpoints");
2185 case ERROR_TARGET_RESOURCE_NOT_AVAILABLE
:
2186 command_print(cmd_ctx
, "no more breakpoints available");
2189 command_print(cmd_ctx
, "unknown error, breakpoint not set");
2195 command_print(cmd_ctx
, "breakpoint added at address 0x%8.8x", strtoul(args
[0], NULL
, 0));
2200 command_print(cmd_ctx
, "usage: bp <address> <length> ['hw']");
2206 int handle_rbp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2208 target_t
*target
= get_current_target(cmd_ctx
);
2211 breakpoint_remove(target
, strtoul(args
[0], NULL
, 0));
2216 int handle_wp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2218 target_t
*target
= get_current_target(cmd_ctx
);
2223 watchpoint_t
*watchpoint
= target
->watchpoints
;
2227 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
);
2228 watchpoint
= watchpoint
->next
;
2233 enum watchpoint_rw type
= WPT_ACCESS
;
2234 u32 data_value
= 0x0;
2235 u32 data_mask
= 0xffffffff;
2251 command_print(cmd_ctx
, "usage: wp <address> <length> [r/w/a] [value] [mask]");
2257 data_value
= strtoul(args
[3], NULL
, 0);
2261 data_mask
= strtoul(args
[4], NULL
, 0);
2264 if ((retval
= watchpoint_add(target
, strtoul(args
[0], NULL
, 0),
2265 strtoul(args
[1], NULL
, 0), type
, data_value
, data_mask
)) != ERROR_OK
)
2269 case ERROR_TARGET_NOT_HALTED
:
2270 command_print(cmd_ctx
, "target must be halted to set watchpoints");
2272 case ERROR_TARGET_RESOURCE_NOT_AVAILABLE
:
2273 command_print(cmd_ctx
, "no more watchpoints available");
2276 command_print(cmd_ctx
, "unknown error, watchpoint not set");
2283 command_print(cmd_ctx
, "usage: wp <address> <length> [r/w/a] [value] [mask]");
2289 int handle_rwp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2291 target_t
*target
= get_current_target(cmd_ctx
);
2294 watchpoint_remove(target
, strtoul(args
[0], NULL
, 0));
2299 int handle_virt2phys_command(command_context_t
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2302 target_t
*target
= get_current_target(cmd_ctx
);
2308 return ERROR_COMMAND_SYNTAX_ERROR
;
2310 va
= strtoul(args
[0], NULL
, 0);
2312 retval
= target
->type
->virt2phys(target
, va
, &pa
);
2313 if (retval
== ERROR_OK
)
2315 command_print(cmd_ctx
, "Physical address 0x%08x", pa
);
2319 /* lower levels will have logged a detailed error which is
2320 * forwarded to telnet/GDB session.
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)