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 jtag
->speed(jtag_speed
);
266 /* prepare reset_halt where necessary */
270 if (jtag_reset_config
& RESET_SRST_PULLS_TRST
)
272 switch (target
->reset_mode
)
275 command_print(cmd_ctx
, "nSRST pulls nTRST, falling back to \"reset run_and_halt\"");
276 target
->reset_mode
= RESET_RUN_AND_HALT
;
279 command_print(cmd_ctx
, "nSRST pulls nTRST, falling back to \"reset run_and_init\"");
280 target
->reset_mode
= RESET_RUN_AND_INIT
;
286 switch (target
->reset_mode
)
290 target
->type
->prepare_reset_halt(target
);
295 target
= target
->next
;
301 target
->type
->assert_reset(target
);
302 target
= target
->next
;
304 jtag_execute_queue();
306 /* request target halt if necessary, and schedule further action */
310 switch (target
->reset_mode
)
313 /* nothing to do if target just wants to be run */
315 case RESET_RUN_AND_HALT
:
317 target_register_timer_callback(target_run_and_halt_handler
, target
->run_and_halt_time
, 0, target
);
319 case RESET_RUN_AND_INIT
:
321 target_register_timer_callback(target_run_and_halt_handler
, target
->run_and_halt_time
, 0, target
);
322 target_register_event_callback(target_init_handler
, cmd_ctx
);
325 target
->type
->halt(target
);
328 target
->type
->halt(target
);
329 target_register_event_callback(target_init_handler
, cmd_ctx
);
332 ERROR("BUG: unknown target->reset_mode");
334 target
= target
->next
;
340 target
->type
->deassert_reset(target
);
341 target
= target
->next
;
343 jtag_execute_queue();
345 /* Wait for reset to complete, maximum 5 seconds. */
346 gettimeofday(&timeout
, NULL
);
347 timeval_add_time(&timeout
, 5, 0);
350 gettimeofday(&now
, NULL
);
352 target_call_timer_callbacks_now();
357 target
->type
->poll(target
);
358 if ((target
->reset_mode
== RESET_RUN_AND_INIT
) || (target
->reset_mode
== RESET_RUN_AND_HALT
))
360 if (target
->state
!= TARGET_HALTED
)
362 if ((now
.tv_sec
> timeout
.tv_sec
) || ((now
.tv_sec
== timeout
.tv_sec
) && (now
.tv_usec
>= timeout
.tv_usec
)))
364 USER("Timed out waiting for reset");
367 /* this will send alive messages on e.g. GDB remote protocol. */
369 USER_N("%s", ""); /* avoid warning about zero length formatting message*/
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_now();
386 jtag
->speed(jtag_speed_post_reset
);
391 static int default_virt2phys(struct target_s
*target
, u32
virtual, u32
*physical
)
397 static int default_mmu(struct target_s
*target
, int *enabled
)
403 int target_init(struct command_context_s
*cmd_ctx
)
405 target_t
*target
= targets
;
409 if (target
->type
->init_target(cmd_ctx
, target
) != ERROR_OK
)
411 ERROR("target '%s' init failed", target
->type
->name
);
415 /* Set up default functions if none are provided by target */
416 if (target
->type
->virt2phys
== NULL
)
418 target
->type
->virt2phys
= default_virt2phys
;
420 if (target
->type
->mmu
== NULL
)
422 target
->type
->mmu
= default_mmu
;
424 target
= target
->next
;
429 target_register_user_commands(cmd_ctx
);
430 target_register_timer_callback(handle_target
, 100, 1, NULL
);
436 int target_init_reset(struct command_context_s
*cmd_ctx
)
438 if (startup_mode
== DAEMON_RESET
)
439 target_process_reset(cmd_ctx
);
444 int target_register_event_callback(int (*callback
)(struct target_s
*target
, enum target_event event
, void *priv
), void *priv
)
446 target_event_callback_t
**callbacks_p
= &target_event_callbacks
;
448 if (callback
== NULL
)
450 return ERROR_INVALID_ARGUMENTS
;
455 while ((*callbacks_p
)->next
)
456 callbacks_p
= &((*callbacks_p
)->next
);
457 callbacks_p
= &((*callbacks_p
)->next
);
460 (*callbacks_p
) = malloc(sizeof(target_event_callback_t
));
461 (*callbacks_p
)->callback
= callback
;
462 (*callbacks_p
)->priv
= priv
;
463 (*callbacks_p
)->next
= NULL
;
468 int target_register_timer_callback(int (*callback
)(void *priv
), int time_ms
, int periodic
, void *priv
)
470 target_timer_callback_t
**callbacks_p
= &target_timer_callbacks
;
473 if (callback
== NULL
)
475 return ERROR_INVALID_ARGUMENTS
;
480 while ((*callbacks_p
)->next
)
481 callbacks_p
= &((*callbacks_p
)->next
);
482 callbacks_p
= &((*callbacks_p
)->next
);
485 (*callbacks_p
) = malloc(sizeof(target_timer_callback_t
));
486 (*callbacks_p
)->callback
= callback
;
487 (*callbacks_p
)->periodic
= periodic
;
488 (*callbacks_p
)->time_ms
= time_ms
;
490 gettimeofday(&now
, NULL
);
491 (*callbacks_p
)->when
.tv_usec
= now
.tv_usec
+ (time_ms
% 1000) * 1000;
492 time_ms
-= (time_ms
% 1000);
493 (*callbacks_p
)->when
.tv_sec
= now
.tv_sec
+ (time_ms
/ 1000);
494 if ((*callbacks_p
)->when
.tv_usec
> 1000000)
496 (*callbacks_p
)->when
.tv_usec
= (*callbacks_p
)->when
.tv_usec
- 1000000;
497 (*callbacks_p
)->when
.tv_sec
+= 1;
500 (*callbacks_p
)->priv
= priv
;
501 (*callbacks_p
)->next
= NULL
;
506 int target_unregister_event_callback(int (*callback
)(struct target_s
*target
, enum target_event event
, void *priv
), void *priv
)
508 target_event_callback_t
**p
= &target_event_callbacks
;
509 target_event_callback_t
*c
= target_event_callbacks
;
511 if (callback
== NULL
)
513 return ERROR_INVALID_ARGUMENTS
;
518 target_event_callback_t
*next
= c
->next
;
519 if ((c
->callback
== callback
) && (c
->priv
== priv
))
533 int target_unregister_timer_callback(int (*callback
)(void *priv
), void *priv
)
535 target_timer_callback_t
**p
= &target_timer_callbacks
;
536 target_timer_callback_t
*c
= target_timer_callbacks
;
538 if (callback
== NULL
)
540 return ERROR_INVALID_ARGUMENTS
;
545 target_timer_callback_t
*next
= c
->next
;
546 if ((c
->callback
== callback
) && (c
->priv
== priv
))
560 int target_call_event_callbacks(target_t
*target
, enum target_event event
)
562 target_event_callback_t
*callback
= target_event_callbacks
;
563 target_event_callback_t
*next_callback
;
565 DEBUG("target event %i", event
);
569 next_callback
= callback
->next
;
570 callback
->callback(target
, event
, callback
->priv
);
571 callback
= next_callback
;
577 int target_call_timer_callbacks()
579 target_timer_callback_t
*callback
= target_timer_callbacks
;
580 target_timer_callback_t
*next_callback
;
583 gettimeofday(&now
, NULL
);
587 next_callback
= callback
->next
;
589 if (((now
.tv_sec
>= callback
->when
.tv_sec
) && (now
.tv_usec
>= callback
->when
.tv_usec
))
590 || (now
.tv_sec
> callback
->when
.tv_sec
))
592 callback
->callback(callback
->priv
);
593 if (callback
->periodic
)
595 int time_ms
= callback
->time_ms
;
596 callback
->when
.tv_usec
= now
.tv_usec
+ (time_ms
% 1000) * 1000;
597 time_ms
-= (time_ms
% 1000);
598 callback
->when
.tv_sec
= now
.tv_sec
+ time_ms
/ 1000;
599 if (callback
->when
.tv_usec
> 1000000)
601 callback
->when
.tv_usec
= callback
->when
.tv_usec
- 1000000;
602 callback
->when
.tv_sec
+= 1;
606 target_unregister_timer_callback(callback
->callback
, callback
->priv
);
609 callback
= next_callback
;
615 int target_call_timer_callbacks_now()
617 /* TODO: this should invoke the timer callbacks now. This is used to ensure that
618 * any outstanding polls, etc. are in fact invoked before a synchronous command
621 return target_call_timer_callbacks();
625 int target_alloc_working_area(struct target_s
*target
, u32 size
, working_area_t
**area
)
627 working_area_t
*c
= target
->working_areas
;
628 working_area_t
*new_wa
= NULL
;
630 /* Reevaluate working area address based on MMU state*/
631 if (target
->working_areas
== NULL
)
635 retval
= target
->type
->mmu(target
, &enabled
);
636 if (retval
!= ERROR_OK
)
642 target
->working_area
= target
->working_area_virt
;
646 target
->working_area
= target
->working_area_phys
;
650 /* only allocate multiples of 4 byte */
653 ERROR("BUG: code tried to allocate unaligned number of bytes, padding");
654 size
= CEIL(size
, 4);
657 /* see if there's already a matching working area */
660 if ((c
->free
) && (c
->size
== size
))
668 /* if not, allocate a new one */
671 working_area_t
**p
= &target
->working_areas
;
672 u32 first_free
= target
->working_area
;
673 u32 free_size
= target
->working_area_size
;
675 DEBUG("allocating new working area");
677 c
= target
->working_areas
;
680 first_free
+= c
->size
;
681 free_size
-= c
->size
;
686 if (free_size
< size
)
688 WARNING("not enough working area available(requested %d, free %d)", size
, free_size
);
689 return ERROR_TARGET_RESOURCE_NOT_AVAILABLE
;
692 new_wa
= malloc(sizeof(working_area_t
));
695 new_wa
->address
= first_free
;
697 if (target
->backup_working_area
)
699 new_wa
->backup
= malloc(new_wa
->size
);
700 target
->type
->read_memory(target
, new_wa
->address
, 4, new_wa
->size
/ 4, new_wa
->backup
);
704 new_wa
->backup
= NULL
;
707 /* put new entry in list */
711 /* mark as used, and return the new (reused) area */
721 int target_free_working_area(struct target_s
*target
, working_area_t
*area
)
726 if (target
->backup_working_area
)
727 target
->type
->write_memory(target
, area
->address
, 4, area
->size
/ 4, area
->backup
);
731 /* mark user pointer invalid */
738 int target_free_all_working_areas(struct target_s
*target
)
740 working_area_t
*c
= target
->working_areas
;
744 working_area_t
*next
= c
->next
;
745 target_free_working_area(target
, c
);
755 target
->working_areas
= NULL
;
760 int target_register_commands(struct command_context_s
*cmd_ctx
)
762 register_command(cmd_ctx
, NULL
, "target", handle_target_command
, COMMAND_CONFIG
, NULL
);
763 register_command(cmd_ctx
, NULL
, "targets", handle_targets_command
, COMMAND_EXEC
, NULL
);
764 register_command(cmd_ctx
, NULL
, "daemon_startup", handle_daemon_startup_command
, COMMAND_CONFIG
, NULL
);
765 register_command(cmd_ctx
, NULL
, "target_script", handle_target_script_command
, COMMAND_CONFIG
, NULL
);
766 register_command(cmd_ctx
, NULL
, "run_and_halt_time", handle_run_and_halt_time_command
, COMMAND_CONFIG
, "<target> <run time ms>");
767 register_command(cmd_ctx
, NULL
, "working_area", handle_working_area_command
, COMMAND_ANY
, "working_area <target#> <address> <size> <'backup'|'nobackup'> [virtual address]");
768 register_command(cmd_ctx
, NULL
, "virt2phys", handle_virt2phys_command
, COMMAND_ANY
, "virt2phys <virtual address>");
773 int target_arch_state(struct target_s
*target
)
778 USER("No target has been configured");
782 USER("target state: %s", target_state_strings
[target
->state
]);
784 if (target
->state
!=TARGET_HALTED
)
787 retval
=target
->type
->arch_state(target
);
791 /* Single aligned words are guaranteed to use 16 or 32 bit access
792 * mode respectively, otherwise data is handled as quickly as
795 int target_write_buffer(struct target_s
*target
, u32 address
, u32 size
, u8
*buffer
)
799 DEBUG("writing buffer of %i byte at 0x%8.8x", size
, address
);
801 if (((address
% 2) == 0) && (size
== 2))
803 return target
->type
->write_memory(target
, address
, 2, 1, buffer
);
806 /* handle unaligned head bytes */
809 int unaligned
= 4 - (address
% 4);
811 if (unaligned
> size
)
814 if ((retval
= target
->type
->write_memory(target
, address
, 1, unaligned
, buffer
)) != ERROR_OK
)
818 address
+= unaligned
;
822 /* handle aligned words */
825 int aligned
= size
- (size
% 4);
827 /* use bulk writes above a certain limit. This may have to be changed */
830 if ((retval
= target
->type
->bulk_write_memory(target
, address
, aligned
/ 4, buffer
)) != ERROR_OK
)
835 if ((retval
= target
->type
->write_memory(target
, address
, 4, aligned
/ 4, buffer
)) != ERROR_OK
)
844 /* handle tail writes of less than 4 bytes */
847 if ((retval
= target
->type
->write_memory(target
, address
, 1, size
, buffer
)) != ERROR_OK
)
855 /* Single aligned words are guaranteed to use 16 or 32 bit access
856 * mode respectively, otherwise data is handled as quickly as
859 int target_read_buffer(struct target_s
*target
, u32 address
, u32 size
, u8
*buffer
)
863 DEBUG("reading buffer of %i byte at 0x%8.8x", size
, address
);
865 if (((address
% 2) == 0) && (size
== 2))
867 return target
->type
->read_memory(target
, address
, 2, 1, buffer
);
870 /* handle unaligned head bytes */
873 int unaligned
= 4 - (address
% 4);
875 if (unaligned
> size
)
878 if ((retval
= target
->type
->read_memory(target
, address
, 1, unaligned
, buffer
)) != ERROR_OK
)
882 address
+= unaligned
;
886 /* handle aligned words */
889 int aligned
= size
- (size
% 4);
891 if ((retval
= target
->type
->read_memory(target
, address
, 4, aligned
/ 4, buffer
)) != ERROR_OK
)
899 /* handle tail writes of less than 4 bytes */
902 if ((retval
= target
->type
->read_memory(target
, address
, 1, size
, buffer
)) != ERROR_OK
)
909 int target_checksum_memory(struct target_s
*target
, u32 address
, u32 size
, u32
* crc
)
916 if ((retval
= target
->type
->checksum_memory(target
, address
,
917 size
, &checksum
)) == ERROR_TARGET_RESOURCE_NOT_AVAILABLE
)
919 buffer
= malloc(size
);
922 ERROR("error allocating buffer for section (%d bytes)", size
);
923 return ERROR_INVALID_ARGUMENTS
;
925 retval
= target_read_buffer(target
, address
, size
, buffer
);
926 if (retval
!= ERROR_OK
)
932 /* convert to target endianess */
933 for (i
= 0; i
< (size
/sizeof(u32
)); i
++)
936 target_data
= target_buffer_get_u32(target
, &buffer
[i
*sizeof(u32
)]);
937 target_buffer_set_u32(target
, &buffer
[i
*sizeof(u32
)], target_data
);
940 retval
= image_calculate_checksum( buffer
, size
, &checksum
);
949 int target_read_u32(struct target_s
*target
, u32 address
, u32
*value
)
953 int retval
= target
->type
->read_memory(target
, address
, 4, 1, value_buf
);
955 if (retval
== ERROR_OK
)
957 *value
= target_buffer_get_u32(target
, value_buf
);
958 DEBUG("address: 0x%8.8x, value: 0x%8.8x", address
, *value
);
963 DEBUG("address: 0x%8.8x failed", address
);
969 int target_read_u16(struct target_s
*target
, u32 address
, u16
*value
)
973 int retval
= target
->type
->read_memory(target
, address
, 2, 1, value_buf
);
975 if (retval
== ERROR_OK
)
977 *value
= target_buffer_get_u16(target
, value_buf
);
978 DEBUG("address: 0x%8.8x, value: 0x%4.4x", address
, *value
);
983 DEBUG("address: 0x%8.8x failed", address
);
989 int target_read_u8(struct target_s
*target
, u32 address
, u8
*value
)
991 int retval
= target
->type
->read_memory(target
, address
, 1, 1, value
);
993 if (retval
== ERROR_OK
)
995 DEBUG("address: 0x%8.8x, value: 0x%2.2x", address
, *value
);
1000 DEBUG("address: 0x%8.8x failed", address
);
1006 int target_write_u32(struct target_s
*target
, u32 address
, u32 value
)
1011 DEBUG("address: 0x%8.8x, value: 0x%8.8x", address
, value
);
1013 target_buffer_set_u32(target
, value_buf
, value
);
1014 if ((retval
= target
->type
->write_memory(target
, address
, 4, 1, value_buf
)) != ERROR_OK
)
1016 DEBUG("failed: %i", retval
);
1022 int target_write_u16(struct target_s
*target
, u32 address
, u16 value
)
1027 DEBUG("address: 0x%8.8x, value: 0x%8.8x", address
, value
);
1029 target_buffer_set_u16(target
, value_buf
, value
);
1030 if ((retval
= target
->type
->write_memory(target
, address
, 2, 1, value_buf
)) != ERROR_OK
)
1032 DEBUG("failed: %i", retval
);
1038 int target_write_u8(struct target_s
*target
, u32 address
, u8 value
)
1042 DEBUG("address: 0x%8.8x, value: 0x%2.2x", address
, value
);
1044 if ((retval
= target
->type
->read_memory(target
, address
, 1, 1, &value
)) != ERROR_OK
)
1046 DEBUG("failed: %i", retval
);
1052 int target_register_user_commands(struct command_context_s
*cmd_ctx
)
1054 register_command(cmd_ctx
, NULL
, "reg", handle_reg_command
, COMMAND_EXEC
, NULL
);
1055 register_command(cmd_ctx
, NULL
, "poll", handle_poll_command
, COMMAND_EXEC
, "poll target state");
1056 register_command(cmd_ctx
, NULL
, "wait_halt", handle_wait_halt_command
, COMMAND_EXEC
, "wait for target halt [time (s)]");
1057 register_command(cmd_ctx
, NULL
, "halt", handle_halt_command
, COMMAND_EXEC
, "halt target");
1058 register_command(cmd_ctx
, NULL
, "resume", handle_resume_command
, COMMAND_EXEC
, "resume target [addr]");
1059 register_command(cmd_ctx
, NULL
, "step", handle_step_command
, COMMAND_EXEC
, "step one instruction from current PC or [addr]");
1060 register_command(cmd_ctx
, NULL
, "reset", handle_reset_command
, COMMAND_EXEC
, "reset target [run|halt|init|run_and_halt|run_and_init]");
1061 register_command(cmd_ctx
, NULL
, "soft_reset_halt", handle_soft_reset_halt_command
, COMMAND_EXEC
, "halt the target and do a soft reset");
1063 register_command(cmd_ctx
, NULL
, "mdw", handle_md_command
, COMMAND_EXEC
, "display memory words <addr> [count]");
1064 register_command(cmd_ctx
, NULL
, "mdh", handle_md_command
, COMMAND_EXEC
, "display memory half-words <addr> [count]");
1065 register_command(cmd_ctx
, NULL
, "mdb", handle_md_command
, COMMAND_EXEC
, "display memory bytes <addr> [count]");
1067 register_command(cmd_ctx
, NULL
, "mww", handle_mw_command
, COMMAND_EXEC
, "write memory word <addr> <value>");
1068 register_command(cmd_ctx
, NULL
, "mwh", handle_mw_command
, COMMAND_EXEC
, "write memory half-word <addr> <value>");
1069 register_command(cmd_ctx
, NULL
, "mwb", handle_mw_command
, COMMAND_EXEC
, "write memory byte <addr> <value>");
1071 register_command(cmd_ctx
, NULL
, "bp", handle_bp_command
, COMMAND_EXEC
, "set breakpoint <address> <length> [hw]");
1072 register_command(cmd_ctx
, NULL
, "rbp", handle_rbp_command
, COMMAND_EXEC
, "remove breakpoint <adress>");
1073 register_command(cmd_ctx
, NULL
, "wp", handle_wp_command
, COMMAND_EXEC
, "set watchpoint <address> <length> <r/w/a> [value] [mask]");
1074 register_command(cmd_ctx
, NULL
, "rwp", handle_rwp_command
, COMMAND_EXEC
, "remove watchpoint <adress>");
1076 register_command(cmd_ctx
, NULL
, "load_image", handle_load_image_command
, COMMAND_EXEC
, "load_image <file> <address> ['bin'|'ihex'|'elf'|'s19']");
1077 register_command(cmd_ctx
, NULL
, "dump_image", handle_dump_image_command
, COMMAND_EXEC
, "dump_image <file> <address> <size>");
1078 register_command(cmd_ctx
, NULL
, "verify_image", handle_verify_image_command
, COMMAND_EXEC
, "verify_image <file> [offset] [type]");
1079 register_command(cmd_ctx
, NULL
, "load_binary", handle_load_image_command
, COMMAND_EXEC
, "[DEPRECATED] load_binary <file> <address>");
1080 register_command(cmd_ctx
, NULL
, "dump_binary", handle_dump_image_command
, COMMAND_EXEC
, "[DEPRECATED] dump_binary <file> <address> <size>");
1082 target_request_register_commands(cmd_ctx
);
1083 trace_register_commands(cmd_ctx
);
1088 int handle_targets_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1090 target_t
*target
= targets
;
1095 int num
= strtoul(args
[0], NULL
, 0);
1100 target
= target
->next
;
1104 cmd_ctx
->current_target
= num
;
1106 command_print(cmd_ctx
, "%i is out of bounds, only %i targets are configured", num
, count
);
1113 command_print(cmd_ctx
, "%i: %s (%s), state: %s", count
++, target
->type
->name
, target_endianess_strings
[target
->endianness
], target_state_strings
[target
->state
]);
1114 target
= target
->next
;
1120 int handle_target_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1127 return ERROR_COMMAND_SYNTAX_ERROR
;
1130 /* search for the specified target */
1131 if (args
[0] && (args
[0][0] != 0))
1133 for (i
= 0; target_types
[i
]; i
++)
1135 if (strcmp(args
[0], target_types
[i
]->name
) == 0)
1137 target_t
**last_target_p
= &targets
;
1139 /* register target specific commands */
1140 if (target_types
[i
]->register_commands(cmd_ctx
) != ERROR_OK
)
1142 ERROR("couldn't register '%s' commands", args
[0]);
1148 while ((*last_target_p
)->next
)
1149 last_target_p
= &((*last_target_p
)->next
);
1150 last_target_p
= &((*last_target_p
)->next
);
1153 *last_target_p
= malloc(sizeof(target_t
));
1155 (*last_target_p
)->type
= target_types
[i
];
1157 if (strcmp(args
[1], "big") == 0)
1158 (*last_target_p
)->endianness
= TARGET_BIG_ENDIAN
;
1159 else if (strcmp(args
[1], "little") == 0)
1160 (*last_target_p
)->endianness
= TARGET_LITTLE_ENDIAN
;
1163 ERROR("endianness must be either 'little' or 'big', not '%s'", args
[1]);
1164 return ERROR_COMMAND_SYNTAX_ERROR
;
1167 /* what to do on a target reset */
1168 if (strcmp(args
[2], "reset_halt") == 0)
1169 (*last_target_p
)->reset_mode
= RESET_HALT
;
1170 else if (strcmp(args
[2], "reset_run") == 0)
1171 (*last_target_p
)->reset_mode
= RESET_RUN
;
1172 else if (strcmp(args
[2], "reset_init") == 0)
1173 (*last_target_p
)->reset_mode
= RESET_INIT
;
1174 else if (strcmp(args
[2], "run_and_halt") == 0)
1175 (*last_target_p
)->reset_mode
= RESET_RUN_AND_HALT
;
1176 else if (strcmp(args
[2], "run_and_init") == 0)
1177 (*last_target_p
)->reset_mode
= RESET_RUN_AND_INIT
;
1180 ERROR("unknown target startup mode %s", args
[2]);
1181 return ERROR_COMMAND_SYNTAX_ERROR
;
1183 (*last_target_p
)->run_and_halt_time
= 1000; /* default 1s */
1185 (*last_target_p
)->reset_script
= NULL
;
1186 (*last_target_p
)->post_halt_script
= NULL
;
1187 (*last_target_p
)->pre_resume_script
= NULL
;
1188 (*last_target_p
)->gdb_program_script
= NULL
;
1190 (*last_target_p
)->working_area
= 0x0;
1191 (*last_target_p
)->working_area_size
= 0x0;
1192 (*last_target_p
)->working_areas
= NULL
;
1193 (*last_target_p
)->backup_working_area
= 0;
1195 (*last_target_p
)->state
= TARGET_UNKNOWN
;
1196 (*last_target_p
)->debug_reason
= DBG_REASON_UNDEFINED
;
1197 (*last_target_p
)->reg_cache
= NULL
;
1198 (*last_target_p
)->breakpoints
= NULL
;
1199 (*last_target_p
)->watchpoints
= NULL
;
1200 (*last_target_p
)->next
= NULL
;
1201 (*last_target_p
)->arch_info
= NULL
;
1203 /* initialize trace information */
1204 (*last_target_p
)->trace_info
= malloc(sizeof(trace_t
));
1205 (*last_target_p
)->trace_info
->num_trace_points
= 0;
1206 (*last_target_p
)->trace_info
->trace_points_size
= 0;
1207 (*last_target_p
)->trace_info
->trace_points
= NULL
;
1208 (*last_target_p
)->trace_info
->trace_history_size
= 0;
1209 (*last_target_p
)->trace_info
->trace_history
= NULL
;
1210 (*last_target_p
)->trace_info
->trace_history_pos
= 0;
1211 (*last_target_p
)->trace_info
->trace_history_overflowed
= 0;
1213 (*last_target_p
)->dbgmsg
= NULL
;
1214 (*last_target_p
)->dbg_msg_enabled
= 0;
1216 (*last_target_p
)->type
->target_command(cmd_ctx
, cmd
, args
, argc
, *last_target_p
);
1224 /* no matching target found */
1227 ERROR("target '%s' not found", args
[0]);
1228 return ERROR_COMMAND_SYNTAX_ERROR
;
1234 /* usage: target_script <target#> <event> <script_file> */
1235 int handle_target_script_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1237 target_t
*target
= NULL
;
1241 ERROR("incomplete target_script command");
1242 return ERROR_COMMAND_SYNTAX_ERROR
;
1245 target
= get_target_by_num(strtoul(args
[0], NULL
, 0));
1249 return ERROR_COMMAND_SYNTAX_ERROR
;
1252 if (strcmp(args
[1], "reset") == 0)
1254 if (target
->reset_script
)
1255 free(target
->reset_script
);
1256 target
->reset_script
= strdup(args
[2]);
1258 else if (strcmp(args
[1], "post_halt") == 0)
1260 if (target
->post_halt_script
)
1261 free(target
->post_halt_script
);
1262 target
->post_halt_script
= strdup(args
[2]);
1264 else if (strcmp(args
[1], "pre_resume") == 0)
1266 if (target
->pre_resume_script
)
1267 free(target
->pre_resume_script
);
1268 target
->pre_resume_script
= strdup(args
[2]);
1270 else if (strcmp(args
[1], "gdb_program_config") == 0)
1272 if (target
->gdb_program_script
)
1273 free(target
->gdb_program_script
);
1274 target
->gdb_program_script
= strdup(args
[2]);
1278 ERROR("unknown event type: '%s", args
[1]);
1279 return ERROR_COMMAND_SYNTAX_ERROR
;
1285 int handle_run_and_halt_time_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1287 target_t
*target
= NULL
;
1291 return ERROR_COMMAND_SYNTAX_ERROR
;
1294 target
= get_target_by_num(strtoul(args
[0], NULL
, 0));
1297 return ERROR_COMMAND_SYNTAX_ERROR
;
1300 target
->run_and_halt_time
= strtoul(args
[1], NULL
, 0);
1305 int handle_working_area_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1307 target_t
*target
= NULL
;
1309 if ((argc
< 4) || (argc
> 5))
1311 return ERROR_COMMAND_SYNTAX_ERROR
;
1314 target
= get_target_by_num(strtoul(args
[0], NULL
, 0));
1317 return ERROR_COMMAND_SYNTAX_ERROR
;
1319 target_free_all_working_areas(target
);
1321 target
->working_area_phys
= target
->working_area_virt
= strtoul(args
[1], NULL
, 0);
1324 target
->working_area_virt
= strtoul(args
[4], NULL
, 0);
1326 target
->working_area_size
= strtoul(args
[2], NULL
, 0);
1328 if (strcmp(args
[3], "backup") == 0)
1330 target
->backup_working_area
= 1;
1332 else if (strcmp(args
[3], "nobackup") == 0)
1334 target
->backup_working_area
= 0;
1338 ERROR("unrecognized <backup|nobackup> argument (%s)", args
[3]);
1339 return ERROR_COMMAND_SYNTAX_ERROR
;
1346 /* process target state changes */
1347 int handle_target(void *priv
)
1350 target_t
*target
= targets
;
1354 /* only poll if target isn't already halted */
1355 if (target
->state
!= TARGET_HALTED
)
1357 if (target_continous_poll
)
1358 if ((retval
= target
->type
->poll(target
)) != ERROR_OK
)
1360 ERROR("couldn't poll target(%d). It's due for a reset.", retval
);
1364 target
= target
->next
;
1370 int handle_reg_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1379 target
= get_current_target(cmd_ctx
);
1381 /* list all available registers for the current target */
1384 reg_cache_t
*cache
= target
->reg_cache
;
1390 for (i
= 0; i
< cache
->num_regs
; i
++)
1392 value
= buf_to_str(cache
->reg_list
[i
].value
, cache
->reg_list
[i
].size
, 16);
1393 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
);
1396 cache
= cache
->next
;
1402 /* access a single register by its ordinal number */
1403 if ((args
[0][0] >= '0') && (args
[0][0] <= '9'))
1405 int num
= strtoul(args
[0], NULL
, 0);
1406 reg_cache_t
*cache
= target
->reg_cache
;
1412 for (i
= 0; i
< cache
->num_regs
; i
++)
1416 reg
= &cache
->reg_list
[i
];
1422 cache
= cache
->next
;
1427 command_print(cmd_ctx
, "%i is out of bounds, the current target has only %i registers (0 - %i)", num
, count
, count
- 1);
1430 } else /* access a single register by its name */
1432 reg
= register_get_by_name(target
->reg_cache
, args
[0], 1);
1436 command_print(cmd_ctx
, "register %s not found in current target", args
[0]);
1441 /* display a register */
1442 if ((argc
== 1) || ((argc
== 2) && !((args
[1][0] >= '0') && (args
[1][0] <= '9'))))
1444 if ((argc
== 2) && (strcmp(args
[1], "force") == 0))
1447 if (reg
->valid
== 0)
1449 reg_arch_type_t
*arch_type
= register_get_arch_type(reg
->arch_type
);
1450 if (arch_type
== NULL
)
1452 ERROR("BUG: encountered unregistered arch type");
1455 arch_type
->get(reg
);
1457 value
= buf_to_str(reg
->value
, reg
->size
, 16);
1458 command_print(cmd_ctx
, "%s (/%i): 0x%s", reg
->name
, reg
->size
, value
);
1463 /* set register value */
1466 u8
*buf
= malloc(CEIL(reg
->size
, 8));
1467 str_to_buf(args
[1], strlen(args
[1]), buf
, reg
->size
, 0);
1469 reg_arch_type_t
*arch_type
= register_get_arch_type(reg
->arch_type
);
1470 if (arch_type
== NULL
)
1472 ERROR("BUG: encountered unregistered arch type");
1476 arch_type
->set(reg
, buf
);
1478 value
= buf_to_str(reg
->value
, reg
->size
, 16);
1479 command_print(cmd_ctx
, "%s (/%i): 0x%s", reg
->name
, reg
->size
, value
);
1487 command_print(cmd_ctx
, "usage: reg <#|name> [value]");
1492 static int wait_state(struct command_context_s
*cmd_ctx
, char *cmd
, enum target_state state
, int ms
);
1494 int handle_poll_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1496 target_t
*target
= get_current_target(cmd_ctx
);
1500 target
->type
->poll(target
);
1501 target_arch_state(target
);
1505 if (strcmp(args
[0], "on") == 0)
1507 target_continous_poll
= 1;
1509 else if (strcmp(args
[0], "off") == 0)
1511 target_continous_poll
= 0;
1515 command_print(cmd_ctx
, "arg is \"on\" or \"off\"");
1523 int handle_wait_halt_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1531 ms
= strtoul(args
[0], &end
, 0) * 1000;
1534 command_print(cmd_ctx
, "usage: %s [seconds]", cmd
);
1539 return wait_state(cmd_ctx
, cmd
, TARGET_HALTED
, ms
);
1542 static void target_process_events(struct command_context_s
*cmd_ctx
)
1544 target_t
*target
= get_current_target(cmd_ctx
);
1545 target
->type
->poll(target
);
1546 target_call_timer_callbacks_now();
1549 static int wait_state(struct command_context_s
*cmd_ctx
, char *cmd
, enum target_state state
, int ms
)
1552 struct timeval timeout
, now
;
1554 gettimeofday(&timeout
, NULL
);
1555 timeval_add_time(&timeout
, 0, ms
* 1000);
1557 target_t
*target
= get_current_target(cmd_ctx
);
1560 if ((retval
=target
->type
->poll(target
))!=ERROR_OK
)
1562 target_call_timer_callbacks_now();
1563 if (target
->state
== state
)
1570 command_print(cmd_ctx
, "waiting for target %s...", target_state_strings
[state
]);
1573 gettimeofday(&now
, NULL
);
1574 if ((now
.tv_sec
> timeout
.tv_sec
) || ((now
.tv_sec
== timeout
.tv_sec
) && (now
.tv_usec
>= timeout
.tv_usec
)))
1576 ERROR("timed out while waiting for target %s", target_state_strings
[state
]);
1584 int handle_halt_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1587 target_t
*target
= get_current_target(cmd_ctx
);
1591 if ((retval
= target
->type
->halt(target
)) != ERROR_OK
)
1596 return handle_wait_halt_command(cmd_ctx
, cmd
, args
, argc
);
1599 /* what to do on daemon startup */
1600 int handle_daemon_startup_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1604 if (strcmp(args
[0], "attach") == 0)
1606 startup_mode
= DAEMON_ATTACH
;
1609 else if (strcmp(args
[0], "reset") == 0)
1611 startup_mode
= DAEMON_RESET
;
1616 WARNING("invalid daemon_startup configuration directive: %s", args
[0]);
1621 int handle_soft_reset_halt_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1623 target_t
*target
= get_current_target(cmd_ctx
);
1625 USER("requesting target halt and executing a soft reset");
1627 target
->type
->soft_reset_halt(target
);
1632 int handle_reset_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1634 target_t
*target
= get_current_target(cmd_ctx
);
1635 enum target_reset_mode reset_mode
= target
->reset_mode
;
1636 enum target_reset_mode save
= target
->reset_mode
;
1642 if (strcmp("run", args
[0]) == 0)
1643 reset_mode
= RESET_RUN
;
1644 else if (strcmp("halt", args
[0]) == 0)
1645 reset_mode
= RESET_HALT
;
1646 else if (strcmp("init", args
[0]) == 0)
1647 reset_mode
= RESET_INIT
;
1648 else if (strcmp("run_and_halt", args
[0]) == 0)
1650 reset_mode
= RESET_RUN_AND_HALT
;
1653 target
->run_and_halt_time
= strtoul(args
[1], NULL
, 0);
1656 else if (strcmp("run_and_init", args
[0]) == 0)
1658 reset_mode
= RESET_RUN_AND_INIT
;
1661 target
->run_and_halt_time
= strtoul(args
[1], NULL
, 0);
1666 command_print(cmd_ctx
, "usage: reset ['run', 'halt', 'init', 'run_and_halt', 'run_and_init]");
1671 /* temporarily modify mode of current reset target */
1672 target
->reset_mode
= reset_mode
;
1674 /* reset *all* targets */
1675 target_process_reset(cmd_ctx
);
1677 /* Restore default reset mode for this target */
1678 target
->reset_mode
= save
;
1683 int handle_resume_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1686 target_t
*target
= get_current_target(cmd_ctx
);
1689 retval
= target
->type
->resume(target
, 1, 0, 1, 0); /* current pc, addr = 0, handle breakpoints, not debugging */
1691 retval
= target
->type
->resume(target
, 0, strtoul(args
[0], NULL
, 0), 1, 0); /* addr = args[0], handle breakpoints, not debugging */
1694 return ERROR_COMMAND_SYNTAX_ERROR
;
1697 target_process_events(cmd_ctx
);
1702 int handle_step_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1704 target_t
*target
= get_current_target(cmd_ctx
);
1709 target
->type
->step(target
, 1, 0, 1); /* current pc, addr = 0, handle breakpoints */
1712 target
->type
->step(target
, 0, strtoul(args
[0], NULL
, 0), 1); /* addr = args[0], handle breakpoints */
1717 int handle_md_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1719 const int line_bytecnt
= 32;
1732 target_t
*target
= get_current_target(cmd_ctx
);
1738 count
= strtoul(args
[1], NULL
, 0);
1740 address
= strtoul(args
[0], NULL
, 0);
1746 size
= 4; line_modulo
= line_bytecnt
/ 4;
1749 size
= 2; line_modulo
= line_bytecnt
/ 2;
1752 size
= 1; line_modulo
= line_bytecnt
/ 1;
1758 buffer
= calloc(count
, size
);
1759 retval
= target
->type
->read_memory(target
, address
, size
, count
, buffer
);
1760 if (retval
== ERROR_OK
)
1764 for (i
= 0; i
< count
; i
++)
1766 if (i
%line_modulo
== 0)
1767 output_len
+= snprintf(output
+ output_len
, 128 - output_len
, "0x%8.8x: ", address
+ (i
*size
));
1772 output_len
+= snprintf(output
+ output_len
, 128 - output_len
, "%8.8x ", target_buffer_get_u32(target
, &buffer
[i
*4]));
1775 output_len
+= snprintf(output
+ output_len
, 128 - output_len
, "%4.4x ", target_buffer_get_u16(target
, &buffer
[i
*2]));
1778 output_len
+= snprintf(output
+ output_len
, 128 - output_len
, "%2.2x ", buffer
[i
*1]);
1782 if ((i
%line_modulo
== line_modulo
-1) || (i
== count
- 1))
1784 command_print(cmd_ctx
, output
);
1790 ERROR("Failure examining memory");
1798 int handle_mw_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1803 target_t
*target
= get_current_target(cmd_ctx
);
1809 address
= strtoul(args
[0], NULL
, 0);
1810 value
= strtoul(args
[1], NULL
, 0);
1815 target_buffer_set_u32(target
, value_buf
, value
);
1816 retval
= target
->type
->write_memory(target
, address
, 4, 1, value_buf
);
1819 target_buffer_set_u16(target
, value_buf
, value
);
1820 retval
= target
->type
->write_memory(target
, address
, 2, 1, value_buf
);
1823 value_buf
[0] = value
;
1824 retval
= target
->type
->write_memory(target
, address
, 1, 1, value_buf
);
1829 if (retval
!=ERROR_OK
)
1831 ERROR("Failure examining memory");
1838 int handle_load_image_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1848 duration_t duration
;
1849 char *duration_text
;
1851 target_t
*target
= get_current_target(cmd_ctx
);
1855 command_print(cmd_ctx
, "usage: load_image <filename> [address] [type]");
1859 /* a base address isn't always necessary, default to 0x0 (i.e. don't relocate) */
1862 image
.base_address_set
= 1;
1863 image
.base_address
= strtoul(args
[1], NULL
, 0);
1867 image
.base_address_set
= 0;
1870 image
.start_address_set
= 0;
1872 duration_start_measure(&duration
);
1874 if (image_open(&image
, args
[0], (argc
>= 3) ? args
[2] : NULL
) != ERROR_OK
)
1881 for (i
= 0; i
< image
.num_sections
; i
++)
1883 buffer
= malloc(image
.sections
[i
].size
);
1886 command_print(cmd_ctx
, "error allocating buffer for section (%d bytes)", image
.sections
[i
].size
);
1890 if ((retval
= image_read_section(&image
, i
, 0x0, image
.sections
[i
].size
, buffer
, &buf_cnt
)) != ERROR_OK
)
1895 if ((retval
= target_write_buffer(target
, image
.sections
[i
].base_address
, buf_cnt
, buffer
)) != ERROR_OK
)
1900 image_size
+= buf_cnt
;
1901 command_print(cmd_ctx
, "%u byte written at address 0x%8.8x", buf_cnt
, image
.sections
[i
].base_address
);
1906 duration_stop_measure(&duration
, &duration_text
);
1907 if (retval
==ERROR_OK
)
1909 command_print(cmd_ctx
, "downloaded %u byte in %s", image_size
, duration_text
);
1911 free(duration_text
);
1913 image_close(&image
);
1919 int handle_dump_image_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1926 int retval
=ERROR_OK
;
1928 duration_t duration
;
1929 char *duration_text
;
1931 target_t
*target
= get_current_target(cmd_ctx
);
1935 command_print(cmd_ctx
, "usage: dump_image <filename> <address> <size>");
1939 address
= strtoul(args
[1], NULL
, 0);
1940 size
= strtoul(args
[2], NULL
, 0);
1942 if ((address
& 3) || (size
& 3))
1944 command_print(cmd_ctx
, "only 32-bit aligned address and size are supported");
1948 if (fileio_open(&fileio
, args
[0], FILEIO_WRITE
, FILEIO_BINARY
) != ERROR_OK
)
1953 duration_start_measure(&duration
);
1958 u32 this_run_size
= (size
> 560) ? 560 : size
;
1960 retval
= target
->type
->read_memory(target
, address
, 4, this_run_size
/ 4, buffer
);
1961 if (retval
!= ERROR_OK
)
1966 retval
= fileio_write(&fileio
, this_run_size
, buffer
, &size_written
);
1967 if (retval
!= ERROR_OK
)
1972 size
-= this_run_size
;
1973 address
+= this_run_size
;
1976 fileio_close(&fileio
);
1978 duration_stop_measure(&duration
, &duration_text
);
1979 if (retval
==ERROR_OK
)
1981 command_print(cmd_ctx
, "dumped %"PRIi64
" byte in %s", fileio
.size
, duration_text
);
1983 free(duration_text
);
1988 int handle_verify_image_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1996 u32 mem_checksum
= 0;
2000 duration_t duration
;
2001 char *duration_text
;
2003 target_t
*target
= get_current_target(cmd_ctx
);
2007 command_print(cmd_ctx
, "usage: verify_image <file> [offset] [type]");
2013 ERROR("no target selected");
2017 duration_start_measure(&duration
);
2021 image
.base_address_set
= 1;
2022 image
.base_address
= strtoul(args
[1], NULL
, 0);
2026 image
.base_address_set
= 0;
2027 image
.base_address
= 0x0;
2030 image
.start_address_set
= 0;
2032 if (image_open(&image
, args
[0], (argc
== 3) ? args
[2] : NULL
) != ERROR_OK
)
2039 for (i
= 0; i
< image
.num_sections
; i
++)
2041 buffer
= malloc(image
.sections
[i
].size
);
2044 command_print(cmd_ctx
, "error allocating buffer for section (%d bytes)", image
.sections
[i
].size
);
2047 if ((retval
= image_read_section(&image
, i
, 0x0, image
.sections
[i
].size
, buffer
, &buf_cnt
)) != ERROR_OK
)
2053 /* calculate checksum of image */
2054 image_calculate_checksum( buffer
, buf_cnt
, &checksum
);
2056 retval
= target_checksum_memory(target
, image
.sections
[i
].base_address
, buf_cnt
, &mem_checksum
);
2057 if( retval
!= ERROR_OK
)
2063 if( checksum
!= mem_checksum
)
2065 /* failed crc checksum, fall back to a binary compare */
2068 command_print(cmd_ctx
, "checksum mismatch - attempting binary compare");
2070 data
= (u8
*)malloc(buf_cnt
);
2072 /* Can we use 32bit word accesses? */
2074 int count
= buf_cnt
;
2075 if ((count
% 4) == 0)
2080 retval
= target
->type
->read_memory(target
, image
.sections
[i
].base_address
, size
, count
, data
);
2081 if (retval
== ERROR_OK
)
2084 for (t
= 0; t
< buf_cnt
; t
++)
2086 if (data
[t
] != buffer
[t
])
2088 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
]);
2101 image_size
+= buf_cnt
;
2104 duration_stop_measure(&duration
, &duration_text
);
2105 if (retval
==ERROR_OK
)
2107 command_print(cmd_ctx
, "verified %u bytes in %s", image_size
, duration_text
);
2109 free(duration_text
);
2111 image_close(&image
);
2116 int handle_bp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2119 target_t
*target
= get_current_target(cmd_ctx
);
2123 breakpoint_t
*breakpoint
= target
->breakpoints
;
2127 if (breakpoint
->type
== BKPT_SOFT
)
2129 char* buf
= buf_to_str(breakpoint
->orig_instr
, breakpoint
->length
, 16);
2130 command_print(cmd_ctx
, "0x%8.8x, 0x%x, %i, 0x%s", breakpoint
->address
, breakpoint
->length
, breakpoint
->set
, buf
);
2135 command_print(cmd_ctx
, "0x%8.8x, 0x%x, %i", breakpoint
->address
, breakpoint
->length
, breakpoint
->set
);
2137 breakpoint
= breakpoint
->next
;
2145 length
= strtoul(args
[1], NULL
, 0);
2148 if (strcmp(args
[2], "hw") == 0)
2151 if ((retval
= breakpoint_add(target
, strtoul(args
[0], NULL
, 0), length
, hw
)) != ERROR_OK
)
2153 ERROR("Failure setting breakpoints");
2157 command_print(cmd_ctx
, "breakpoint added at address 0x%8.8x", strtoul(args
[0], NULL
, 0));
2162 command_print(cmd_ctx
, "usage: bp <address> <length> ['hw']");
2168 int handle_rbp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2170 target_t
*target
= get_current_target(cmd_ctx
);
2173 breakpoint_remove(target
, strtoul(args
[0], NULL
, 0));
2178 int handle_wp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2180 target_t
*target
= get_current_target(cmd_ctx
);
2185 watchpoint_t
*watchpoint
= target
->watchpoints
;
2189 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
);
2190 watchpoint
= watchpoint
->next
;
2195 enum watchpoint_rw type
= WPT_ACCESS
;
2196 u32 data_value
= 0x0;
2197 u32 data_mask
= 0xffffffff;
2213 command_print(cmd_ctx
, "usage: wp <address> <length> [r/w/a] [value] [mask]");
2219 data_value
= strtoul(args
[3], NULL
, 0);
2223 data_mask
= strtoul(args
[4], NULL
, 0);
2226 if ((retval
= watchpoint_add(target
, strtoul(args
[0], NULL
, 0),
2227 strtoul(args
[1], NULL
, 0), type
, data_value
, data_mask
)) != ERROR_OK
)
2229 ERROR("Failure setting breakpoints");
2234 command_print(cmd_ctx
, "usage: wp <address> <length> [r/w/a] [value] [mask]");
2240 int handle_rwp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2242 target_t
*target
= get_current_target(cmd_ctx
);
2245 watchpoint_remove(target
, strtoul(args
[0], NULL
, 0));
2250 int handle_virt2phys_command(command_context_t
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2253 target_t
*target
= get_current_target(cmd_ctx
);
2259 return ERROR_COMMAND_SYNTAX_ERROR
;
2261 va
= strtoul(args
[0], NULL
, 0);
2263 retval
= target
->type
->virt2phys(target
, va
, &pa
);
2264 if (retval
== ERROR_OK
)
2266 command_print(cmd_ctx
, "Physical address 0x%08x", pa
);
2270 /* lower levels will have logged a detailed error which is
2271 * 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)