1 /***************************************************************************
2 * Copyright (C) 2005 by Dominic Rath *
3 * Dominic.Rath@gmx.de *
5 * This program is free software; you can redistribute it and/or modify *
6 * it under the terms of the GNU General Public License as published by *
7 * the Free Software Foundation; either version 2 of the License, or *
8 * (at your option) any later version. *
10 * This program is distributed in the hope that it will be useful, *
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
13 * GNU General Public License for more details. *
15 * You should have received a copy of the GNU General Public License *
16 * along with this program; if not, write to the *
17 * Free Software Foundation, Inc., *
18 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
19 ***************************************************************************/
24 #include "replacements.h"
26 #include "target_request.h"
29 #include "configuration.h"
30 #include "binarybuffer.h"
37 #include <sys/types.h>
45 #include <time_support.h>
50 int cli_target_callback_event_handler(struct target_s
*target
, enum target_event event
, void *priv
);
52 int handle_target_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
53 int handle_daemon_startup_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
54 int handle_targets_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
56 int handle_target_script_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
57 int handle_run_and_halt_time_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
58 int handle_working_area_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
60 int handle_reg_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
61 int handle_poll_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
62 int handle_halt_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
63 int handle_wait_halt_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
64 int handle_reset_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
65 int handle_soft_reset_halt_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
66 int handle_resume_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
67 int handle_step_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
68 int handle_md_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
69 int handle_mw_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
70 int handle_load_image_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
71 int handle_dump_image_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
72 int handle_verify_image_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
73 int handle_bp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
74 int handle_rbp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
75 int handle_wp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
76 int handle_rwp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
80 extern target_type_t arm7tdmi_target
;
81 extern target_type_t arm720t_target
;
82 extern target_type_t arm9tdmi_target
;
83 extern target_type_t arm920t_target
;
84 extern target_type_t arm966e_target
;
85 extern target_type_t arm926ejs_target
;
86 extern target_type_t xscale_target
;
87 extern target_type_t cortexm3_target
;
89 target_type_t
*target_types
[] =
102 target_t
*targets
= NULL
;
103 target_event_callback_t
*target_event_callbacks
= NULL
;
104 target_timer_callback_t
*target_timer_callbacks
= NULL
;
106 char *target_state_strings
[] =
115 char *target_debug_reason_strings
[] =
117 "debug request", "breakpoint", "watchpoint",
118 "watchpoint and breakpoint", "single step",
122 char *target_endianess_strings
[] =
128 enum daemon_startup_mode startup_mode
= DAEMON_ATTACH
;
130 static int target_continous_poll
= 1;
132 /* read a u32 from a buffer in target memory endianness */
133 u32
target_buffer_get_u32(target_t
*target
, u8
*buffer
)
135 if (target
->endianness
== TARGET_LITTLE_ENDIAN
)
136 return le_to_h_u32(buffer
);
138 return be_to_h_u32(buffer
);
141 /* read a u16 from a buffer in target memory endianness */
142 u16
target_buffer_get_u16(target_t
*target
, u8
*buffer
)
144 if (target
->endianness
== TARGET_LITTLE_ENDIAN
)
145 return le_to_h_u16(buffer
);
147 return be_to_h_u16(buffer
);
150 /* write a u32 to a buffer in target memory endianness */
151 void target_buffer_set_u32(target_t
*target
, u8
*buffer
, u32 value
)
153 if (target
->endianness
== TARGET_LITTLE_ENDIAN
)
154 h_u32_to_le(buffer
, value
);
156 h_u32_to_be(buffer
, value
);
159 /* write a u16 to a buffer in target memory endianness */
160 void target_buffer_set_u16(target_t
*target
, u8
*buffer
, u16 value
)
162 if (target
->endianness
== TARGET_LITTLE_ENDIAN
)
163 h_u16_to_le(buffer
, value
);
165 h_u16_to_be(buffer
, value
);
168 /* returns a pointer to the n-th configured target */
169 target_t
* get_target_by_num(int num
)
171 target_t
*target
= targets
;
178 target
= target
->next
;
185 int get_num_by_target(target_t
*query_target
)
187 target_t
*target
= targets
;
192 if (target
== query_target
)
194 target
= target
->next
;
201 target_t
* get_current_target(command_context_t
*cmd_ctx
)
203 target_t
*target
= get_target_by_num(cmd_ctx
->current_target
);
207 ERROR("BUG: current_target out of bounds");
214 /* Process target initialization, when target entered debug out of reset
215 * the handler is unregistered at the end of this function, so it's only called once
217 int target_init_handler(struct target_s
*target
, enum target_event event
, void *priv
)
220 struct command_context_s
*cmd_ctx
= priv
;
222 if ((event
== TARGET_EVENT_HALTED
) && (target
->reset_script
))
224 target_unregister_event_callback(target_init_handler
, priv
);
226 script
= fopen(target
->reset_script
, "r");
229 ERROR("couldn't open script file %s", target
->reset_script
);
233 INFO("executing reset script '%s'", target
->reset_script
);
234 command_run_file(cmd_ctx
, script
, COMMAND_EXEC
);
237 jtag_execute_queue();
243 int target_run_and_halt_handler(void *priv
)
245 target_t
*target
= priv
;
247 target
->type
->halt(target
);
252 int target_process_reset(struct command_context_s
*cmd_ctx
)
254 int retval
= ERROR_OK
;
256 struct timeval timeout
, now
;
258 /* prepare reset_halt where necessary */
262 if (jtag_reset_config
& RESET_SRST_PULLS_TRST
)
264 switch (target
->reset_mode
)
267 command_print(cmd_ctx
, "nSRST pulls nTRST, falling back to RESET_RUN_AND_HALT");
268 target
->reset_mode
= RESET_RUN_AND_HALT
;
271 command_print(cmd_ctx
, "nSRST pulls nTRST, falling back to RESET_RUN_AND_INIT");
272 target
->reset_mode
= RESET_RUN_AND_INIT
;
278 switch (target
->reset_mode
)
282 target
->type
->prepare_reset_halt(target
);
287 target
= target
->next
;
293 target
->type
->assert_reset(target
);
294 target
= target
->next
;
296 jtag_execute_queue();
298 /* request target halt if necessary, and schedule further action */
302 switch (target
->reset_mode
)
305 /* nothing to do if target just wants to be run */
307 case RESET_RUN_AND_HALT
:
309 target_register_timer_callback(target_run_and_halt_handler
, target
->run_and_halt_time
, 0, target
);
311 case RESET_RUN_AND_INIT
:
313 target_register_timer_callback(target_run_and_halt_handler
, target
->run_and_halt_time
, 0, target
);
314 target_register_event_callback(target_init_handler
, cmd_ctx
);
317 target
->type
->halt(target
);
320 target
->type
->halt(target
);
321 target_register_event_callback(target_init_handler
, cmd_ctx
);
324 ERROR("BUG: unknown target->reset_mode");
326 target
= target
->next
;
332 target
->type
->deassert_reset(target
);
333 target
= target
->next
;
335 jtag_execute_queue();
337 /* Wait for reset to complete, maximum 5 seconds. */
338 gettimeofday(&timeout
, NULL
);
339 timeval_add_time(&timeout
, 5, 0);
342 gettimeofday(&now
, NULL
);
344 target_call_timer_callbacks();
349 target
->type
->poll(target
);
350 if ((target
->reset_mode
== RESET_RUN_AND_INIT
) || (target
->reset_mode
== RESET_RUN_AND_HALT
))
352 if (target
->state
!= TARGET_HALTED
)
354 if ((now
.tv_sec
> timeout
.tv_sec
) || ((now
.tv_sec
== timeout
.tv_sec
) && (now
.tv_usec
>= timeout
.tv_usec
)))
356 command_print(cmd_ctx
, "Timed out waiting for reset");
359 usleep(100*1000); /* Do not eat all cpu */
363 target
= target
->next
;
365 /* All targets we're waiting for are halted */
373 /* We want any events to be processed before the prompt */
374 target_call_timer_callbacks();
379 int target_init(struct command_context_s
*cmd_ctx
)
381 target_t
*target
= targets
;
385 if (target
->type
->init_target(cmd_ctx
, target
) != ERROR_OK
)
387 ERROR("target '%s' init failed", target
->type
->name
);
390 target
= target
->next
;
395 target_register_user_commands(cmd_ctx
);
396 target_register_timer_callback(handle_target
, 100, 1, NULL
);
402 int target_init_reset(struct command_context_s
*cmd_ctx
)
404 if (startup_mode
== DAEMON_RESET
)
405 target_process_reset(cmd_ctx
);
410 int target_register_event_callback(int (*callback
)(struct target_s
*target
, enum target_event event
, void *priv
), void *priv
)
412 target_event_callback_t
**callbacks_p
= &target_event_callbacks
;
414 if (callback
== NULL
)
416 return ERROR_INVALID_ARGUMENTS
;
421 while ((*callbacks_p
)->next
)
422 callbacks_p
= &((*callbacks_p
)->next
);
423 callbacks_p
= &((*callbacks_p
)->next
);
426 (*callbacks_p
) = malloc(sizeof(target_event_callback_t
));
427 (*callbacks_p
)->callback
= callback
;
428 (*callbacks_p
)->priv
= priv
;
429 (*callbacks_p
)->next
= NULL
;
434 int target_register_timer_callback(int (*callback
)(void *priv
), int time_ms
, int periodic
, void *priv
)
436 target_timer_callback_t
**callbacks_p
= &target_timer_callbacks
;
439 if (callback
== NULL
)
441 return ERROR_INVALID_ARGUMENTS
;
446 while ((*callbacks_p
)->next
)
447 callbacks_p
= &((*callbacks_p
)->next
);
448 callbacks_p
= &((*callbacks_p
)->next
);
451 (*callbacks_p
) = malloc(sizeof(target_timer_callback_t
));
452 (*callbacks_p
)->callback
= callback
;
453 (*callbacks_p
)->periodic
= periodic
;
454 (*callbacks_p
)->time_ms
= time_ms
;
456 gettimeofday(&now
, NULL
);
457 (*callbacks_p
)->when
.tv_usec
= now
.tv_usec
+ (time_ms
% 1000) * 1000;
458 time_ms
-= (time_ms
% 1000);
459 (*callbacks_p
)->when
.tv_sec
= now
.tv_sec
+ (time_ms
/ 1000);
460 if ((*callbacks_p
)->when
.tv_usec
> 1000000)
462 (*callbacks_p
)->when
.tv_usec
= (*callbacks_p
)->when
.tv_usec
- 1000000;
463 (*callbacks_p
)->when
.tv_sec
+= 1;
466 (*callbacks_p
)->priv
= priv
;
467 (*callbacks_p
)->next
= NULL
;
472 int target_unregister_event_callback(int (*callback
)(struct target_s
*target
, enum target_event event
, void *priv
), void *priv
)
474 target_event_callback_t
**p
= &target_event_callbacks
;
475 target_event_callback_t
*c
= target_event_callbacks
;
477 if (callback
== NULL
)
479 return ERROR_INVALID_ARGUMENTS
;
484 target_event_callback_t
*next
= c
->next
;
485 if ((c
->callback
== callback
) && (c
->priv
== priv
))
499 int target_unregister_timer_callback(int (*callback
)(void *priv
), void *priv
)
501 target_timer_callback_t
**p
= &target_timer_callbacks
;
502 target_timer_callback_t
*c
= target_timer_callbacks
;
504 if (callback
== NULL
)
506 return ERROR_INVALID_ARGUMENTS
;
511 target_timer_callback_t
*next
= c
->next
;
512 if ((c
->callback
== callback
) && (c
->priv
== priv
))
526 int target_call_event_callbacks(target_t
*target
, enum target_event event
)
528 target_event_callback_t
*callback
= target_event_callbacks
;
529 target_event_callback_t
*next_callback
;
531 DEBUG("target event %i", event
);
535 next_callback
= callback
->next
;
536 callback
->callback(target
, event
, callback
->priv
);
537 callback
= next_callback
;
543 int target_call_timer_callbacks()
545 target_timer_callback_t
*callback
= target_timer_callbacks
;
546 target_timer_callback_t
*next_callback
;
549 gettimeofday(&now
, NULL
);
553 next_callback
= callback
->next
;
555 if (((now
.tv_sec
>= callback
->when
.tv_sec
) && (now
.tv_usec
>= callback
->when
.tv_usec
))
556 || (now
.tv_sec
> callback
->when
.tv_sec
))
558 callback
->callback(callback
->priv
);
559 if (callback
->periodic
)
561 int time_ms
= callback
->time_ms
;
562 callback
->when
.tv_usec
= now
.tv_usec
+ (time_ms
% 1000) * 1000;
563 time_ms
-= (time_ms
% 1000);
564 callback
->when
.tv_sec
= now
.tv_sec
+ time_ms
/ 1000;
565 if (callback
->when
.tv_usec
> 1000000)
567 callback
->when
.tv_usec
= callback
->when
.tv_usec
- 1000000;
568 callback
->when
.tv_sec
+= 1;
572 target_unregister_timer_callback(callback
->callback
, callback
->priv
);
575 callback
= next_callback
;
581 int target_alloc_working_area(struct target_s
*target
, u32 size
, working_area_t
**area
)
583 working_area_t
*c
= target
->working_areas
;
584 working_area_t
*new_wa
= NULL
;
586 /* only allocate multiples of 4 byte */
589 ERROR("BUG: code tried to allocate unaligned number of bytes, padding");
590 size
= CEIL(size
, 4);
593 /* see if there's already a matching working area */
596 if ((c
->free
) && (c
->size
== size
))
604 /* if not, allocate a new one */
607 working_area_t
**p
= &target
->working_areas
;
608 u32 first_free
= target
->working_area
;
609 u32 free_size
= target
->working_area_size
;
611 DEBUG("allocating new working area");
613 c
= target
->working_areas
;
616 first_free
+= c
->size
;
617 free_size
-= c
->size
;
622 if (free_size
< size
)
624 WARNING("not enough working area available");
625 return ERROR_TARGET_RESOURCE_NOT_AVAILABLE
;
628 new_wa
= malloc(sizeof(working_area_t
));
631 new_wa
->address
= first_free
;
633 if (target
->backup_working_area
)
635 new_wa
->backup
= malloc(new_wa
->size
);
636 target
->type
->read_memory(target
, new_wa
->address
, 4, new_wa
->size
/ 4, new_wa
->backup
);
640 new_wa
->backup
= NULL
;
643 /* put new entry in list */
647 /* mark as used, and return the new (reused) area */
657 int target_free_working_area(struct target_s
*target
, working_area_t
*area
)
662 if (target
->backup_working_area
)
663 target
->type
->write_memory(target
, area
->address
, 4, area
->size
/ 4, area
->backup
);
667 /* mark user pointer invalid */
674 int target_free_all_working_areas(struct target_s
*target
)
676 working_area_t
*c
= target
->working_areas
;
680 working_area_t
*next
= c
->next
;
681 target_free_working_area(target
, c
);
691 target
->working_areas
= NULL
;
696 int target_register_commands(struct command_context_s
*cmd_ctx
)
698 register_command(cmd_ctx
, NULL
, "target", handle_target_command
, COMMAND_CONFIG
, NULL
);
699 register_command(cmd_ctx
, NULL
, "targets", handle_targets_command
, COMMAND_EXEC
, NULL
);
700 register_command(cmd_ctx
, NULL
, "daemon_startup", handle_daemon_startup_command
, COMMAND_CONFIG
, NULL
);
701 register_command(cmd_ctx
, NULL
, "target_script", handle_target_script_command
, COMMAND_CONFIG
, NULL
);
702 register_command(cmd_ctx
, NULL
, "run_and_halt_time", handle_run_and_halt_time_command
, COMMAND_CONFIG
, NULL
);
703 register_command(cmd_ctx
, NULL
, "working_area", handle_working_area_command
, COMMAND_ANY
, NULL
);
708 /* Single aligned words are guaranteed to use 16 or 32 bit access
709 * mode respectively, otherwise data is handled as quickly as
712 int target_write_buffer(struct target_s
*target
, u32 address
, u32 size
, u8
*buffer
)
716 DEBUG("writing buffer of %i byte at 0x%8.8x", size
, address
);
718 if (((address
% 2) == 0) && (size
== 2))
720 return target
->type
->write_memory(target
, address
, 2, 1, buffer
);
723 /* handle unaligned head bytes */
726 int unaligned
= 4 - (address
% 4);
728 if ((retval
= target
->type
->write_memory(target
, address
, 1, unaligned
, buffer
)) != ERROR_OK
)
732 address
+= unaligned
;
736 /* handle aligned words */
739 int aligned
= size
- (size
% 4);
741 /* use bulk writes above a certain limit. This may have to be changed */
744 if ((retval
= target
->type
->bulk_write_memory(target
, address
, aligned
/ 4, buffer
)) != ERROR_OK
)
749 if ((retval
= target
->type
->write_memory(target
, address
, 4, aligned
/ 4, buffer
)) != ERROR_OK
)
758 /* handle tail writes of less than 4 bytes */
761 if ((retval
= target
->type
->write_memory(target
, address
, 1, size
, buffer
)) != ERROR_OK
)
769 /* Single aligned words are guaranteed to use 16 or 32 bit access
770 * mode respectively, otherwise data is handled as quickly as
773 int target_read_buffer(struct target_s
*target
, u32 address
, u32 size
, u8
*buffer
)
777 DEBUG("reading buffer of %i byte at 0x%8.8x", size
, address
);
779 if (((address
% 2) == 0) && (size
== 2))
781 return target
->type
->read_memory(target
, address
, 2, 1, buffer
);
784 /* handle unaligned head bytes */
787 int unaligned
= 4 - (address
% 4);
789 if ((retval
= target
->type
->read_memory(target
, address
, 1, unaligned
, buffer
)) != ERROR_OK
)
793 address
+= unaligned
;
797 /* handle aligned words */
800 int aligned
= size
- (size
% 4);
802 if ((retval
= target
->type
->read_memory(target
, address
, 4, aligned
/ 4, buffer
)) != ERROR_OK
)
810 /* handle tail writes of less than 4 bytes */
813 if ((retval
= target
->type
->read_memory(target
, address
, 1, size
, buffer
)) != ERROR_OK
)
820 int target_checksum_memory(struct target_s
*target
, u32 address
, u32 size
, u32
* crc
)
827 if ((retval
= target
->type
->checksum_memory(target
, address
,
828 size
, &checksum
)) == ERROR_TARGET_RESOURCE_NOT_AVAILABLE
)
830 buffer
= malloc(size
);
833 ERROR("error allocating buffer for section (%d bytes)", size
);
834 return ERROR_INVALID_ARGUMENTS
;
836 retval
= target_read_buffer(target
, address
, size
, buffer
);
837 if (retval
!= ERROR_OK
)
843 /* convert to target endianess */
844 for (i
= 0; i
< (size
/sizeof(u32
)); i
++)
847 target_data
= target_buffer_get_u32(target
, &buffer
[i
*sizeof(u32
)]);
848 target_buffer_set_u32(target
, &buffer
[i
*sizeof(u32
)], target_data
);
851 retval
= image_calculate_checksum( buffer
, size
, &checksum
);
860 int target_read_u32(struct target_s
*target
, u32 address
, u32
*value
)
864 int retval
= target
->type
->read_memory(target
, address
, 4, 1, value_buf
);
866 if (retval
== ERROR_OK
)
868 *value
= target_buffer_get_u32(target
, value_buf
);
869 DEBUG("address: 0x%8.8x, value: 0x%8.8x", address
, *value
);
874 DEBUG("address: 0x%8.8x failed", address
);
880 int target_read_u16(struct target_s
*target
, u32 address
, u16
*value
)
884 int retval
= target
->type
->read_memory(target
, address
, 2, 1, value_buf
);
886 if (retval
== ERROR_OK
)
888 *value
= target_buffer_get_u16(target
, value_buf
);
889 DEBUG("address: 0x%8.8x, value: 0x%4.4x", address
, *value
);
894 DEBUG("address: 0x%8.8x failed", address
);
900 int target_read_u8(struct target_s
*target
, u32 address
, u8
*value
)
902 int retval
= target
->type
->read_memory(target
, address
, 1, 1, value
);
904 if (retval
== ERROR_OK
)
906 DEBUG("address: 0x%8.8x, value: 0x%2.2x", address
, *value
);
911 DEBUG("address: 0x%8.8x failed", address
);
917 int target_write_u32(struct target_s
*target
, u32 address
, u32 value
)
922 DEBUG("address: 0x%8.8x, value: 0x%8.8x", address
, value
);
924 target_buffer_set_u32(target
, value_buf
, value
);
925 if ((retval
= target
->type
->write_memory(target
, address
, 4, 1, value_buf
)) != ERROR_OK
)
927 DEBUG("failed: %i", retval
);
933 int target_write_u16(struct target_s
*target
, u32 address
, u16 value
)
938 DEBUG("address: 0x%8.8x, value: 0x%8.8x", address
, value
);
940 target_buffer_set_u16(target
, value_buf
, value
);
941 if ((retval
= target
->type
->write_memory(target
, address
, 2, 1, value_buf
)) != ERROR_OK
)
943 DEBUG("failed: %i", retval
);
949 int target_write_u8(struct target_s
*target
, u32 address
, u8 value
)
953 DEBUG("address: 0x%8.8x, value: 0x%2.2x", address
, value
);
955 if ((retval
= target
->type
->read_memory(target
, address
, 1, 1, &value
)) != ERROR_OK
)
957 DEBUG("failed: %i", retval
);
963 int target_register_user_commands(struct command_context_s
*cmd_ctx
)
965 register_command(cmd_ctx
, NULL
, "reg", handle_reg_command
, COMMAND_EXEC
, NULL
);
966 register_command(cmd_ctx
, NULL
, "poll", handle_poll_command
, COMMAND_EXEC
, "poll target state");
967 register_command(cmd_ctx
, NULL
, "wait_halt", handle_wait_halt_command
, COMMAND_EXEC
, "wait for target halt [time (s)]");
968 register_command(cmd_ctx
, NULL
, "halt", handle_halt_command
, COMMAND_EXEC
, "halt target");
969 register_command(cmd_ctx
, NULL
, "resume", handle_resume_command
, COMMAND_EXEC
, "resume target [addr]");
970 register_command(cmd_ctx
, NULL
, "step", handle_step_command
, COMMAND_EXEC
, "step one instruction from current PC or [addr]");
971 register_command(cmd_ctx
, NULL
, "reset", handle_reset_command
, COMMAND_EXEC
, "reset target [run|halt|init|run_and_halt|run_and_init]");
972 register_command(cmd_ctx
, NULL
, "soft_reset_halt", handle_soft_reset_halt_command
, COMMAND_EXEC
, "halt the target and do a soft reset");
974 register_command(cmd_ctx
, NULL
, "mdw", handle_md_command
, COMMAND_EXEC
, "display memory words <addr> [count]");
975 register_command(cmd_ctx
, NULL
, "mdh", handle_md_command
, COMMAND_EXEC
, "display memory half-words <addr> [count]");
976 register_command(cmd_ctx
, NULL
, "mdb", handle_md_command
, COMMAND_EXEC
, "display memory bytes <addr> [count]");
978 register_command(cmd_ctx
, NULL
, "mww", handle_mw_command
, COMMAND_EXEC
, "write memory word <addr> <value>");
979 register_command(cmd_ctx
, NULL
, "mwh", handle_mw_command
, COMMAND_EXEC
, "write memory half-word <addr> <value>");
980 register_command(cmd_ctx
, NULL
, "mwb", handle_mw_command
, COMMAND_EXEC
, "write memory byte <addr> <value>");
982 register_command(cmd_ctx
, NULL
, "bp", handle_bp_command
, COMMAND_EXEC
, "set breakpoint <address> <length> [hw]");
983 register_command(cmd_ctx
, NULL
, "rbp", handle_rbp_command
, COMMAND_EXEC
, "remove breakpoint <adress>");
984 register_command(cmd_ctx
, NULL
, "wp", handle_wp_command
, COMMAND_EXEC
, "set watchpoint <address> <length> <r/w/a> [value] [mask]");
985 register_command(cmd_ctx
, NULL
, "rwp", handle_rwp_command
, COMMAND_EXEC
, "remove watchpoint <adress>");
987 register_command(cmd_ctx
, NULL
, "load_image", handle_load_image_command
, COMMAND_EXEC
, "load_image <file> <address> ['bin'|'ihex'|'elf'|'s19']");
988 register_command(cmd_ctx
, NULL
, "dump_image", handle_dump_image_command
, COMMAND_EXEC
, "dump_image <file> <address> <size>");
989 register_command(cmd_ctx
, NULL
, "verify_image", handle_verify_image_command
, COMMAND_EXEC
, "verify_image <file> [offset] [type]");
990 register_command(cmd_ctx
, NULL
, "load_binary", handle_load_image_command
, COMMAND_EXEC
, "[DEPRECATED] load_binary <file> <address>");
991 register_command(cmd_ctx
, NULL
, "dump_binary", handle_dump_image_command
, COMMAND_EXEC
, "[DEPRECATED] dump_binary <file> <address> <size>");
993 target_request_register_commands(cmd_ctx
);
994 trace_register_commands(cmd_ctx
);
999 int handle_targets_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1001 target_t
*target
= targets
;
1006 int num
= strtoul(args
[0], NULL
, 0);
1011 target
= target
->next
;
1015 cmd_ctx
->current_target
= num
;
1017 command_print(cmd_ctx
, "%i is out of bounds, only %i targets are configured", num
, count
);
1024 command_print(cmd_ctx
, "%i: %s (%s), state: %s", count
++, target
->type
->name
, target_endianess_strings
[target
->endianness
], target_state_strings
[target
->state
]);
1025 target
= target
->next
;
1031 int handle_target_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1038 ERROR("target command requires at least three arguments: <type> <endianess> <reset_mode>");
1042 /* search for the specified target */
1043 if (args
[0] && (args
[0][0] != 0))
1045 for (i
= 0; target_types
[i
]; i
++)
1047 if (strcmp(args
[0], target_types
[i
]->name
) == 0)
1049 target_t
**last_target_p
= &targets
;
1051 /* register target specific commands */
1052 if (target_types
[i
]->register_commands(cmd_ctx
) != ERROR_OK
)
1054 ERROR("couldn't register '%s' commands", args
[0]);
1060 while ((*last_target_p
)->next
)
1061 last_target_p
= &((*last_target_p
)->next
);
1062 last_target_p
= &((*last_target_p
)->next
);
1065 *last_target_p
= malloc(sizeof(target_t
));
1067 (*last_target_p
)->type
= target_types
[i
];
1069 if (strcmp(args
[1], "big") == 0)
1070 (*last_target_p
)->endianness
= TARGET_BIG_ENDIAN
;
1071 else if (strcmp(args
[1], "little") == 0)
1072 (*last_target_p
)->endianness
= TARGET_LITTLE_ENDIAN
;
1075 ERROR("endianness must be either 'little' or 'big', not '%s'", args
[1]);
1079 /* what to do on a target reset */
1080 if (strcmp(args
[2], "reset_halt") == 0)
1081 (*last_target_p
)->reset_mode
= RESET_HALT
;
1082 else if (strcmp(args
[2], "reset_run") == 0)
1083 (*last_target_p
)->reset_mode
= RESET_RUN
;
1084 else if (strcmp(args
[2], "reset_init") == 0)
1085 (*last_target_p
)->reset_mode
= RESET_INIT
;
1086 else if (strcmp(args
[2], "run_and_halt") == 0)
1087 (*last_target_p
)->reset_mode
= RESET_RUN_AND_HALT
;
1088 else if (strcmp(args
[2], "run_and_init") == 0)
1089 (*last_target_p
)->reset_mode
= RESET_RUN_AND_INIT
;
1092 ERROR("unknown target startup mode %s", args
[2]);
1095 (*last_target_p
)->run_and_halt_time
= 1000; /* default 1s */
1097 (*last_target_p
)->reset_script
= NULL
;
1098 (*last_target_p
)->post_halt_script
= NULL
;
1099 (*last_target_p
)->pre_resume_script
= NULL
;
1100 (*last_target_p
)->gdb_program_script
= NULL
;
1102 (*last_target_p
)->working_area
= 0x0;
1103 (*last_target_p
)->working_area_size
= 0x0;
1104 (*last_target_p
)->working_areas
= NULL
;
1105 (*last_target_p
)->backup_working_area
= 0;
1107 (*last_target_p
)->state
= TARGET_UNKNOWN
;
1108 (*last_target_p
)->reg_cache
= NULL
;
1109 (*last_target_p
)->breakpoints
= NULL
;
1110 (*last_target_p
)->watchpoints
= NULL
;
1111 (*last_target_p
)->next
= NULL
;
1112 (*last_target_p
)->arch_info
= NULL
;
1114 /* initialize trace information */
1115 (*last_target_p
)->trace_info
= malloc(sizeof(trace_t
));
1116 (*last_target_p
)->trace_info
->num_trace_points
= 0;
1117 (*last_target_p
)->trace_info
->trace_points_size
= 0;
1118 (*last_target_p
)->trace_info
->trace_points
= NULL
;
1119 (*last_target_p
)->trace_info
->trace_history_size
= 0;
1120 (*last_target_p
)->trace_info
->trace_history
= NULL
;
1121 (*last_target_p
)->trace_info
->trace_history_pos
= 0;
1122 (*last_target_p
)->trace_info
->trace_history_overflowed
= 0;
1124 (*last_target_p
)->dbgmsg
= NULL
;
1125 (*last_target_p
)->dbg_msg_enabled
= 0;
1127 (*last_target_p
)->type
->target_command(cmd_ctx
, cmd
, args
, argc
, *last_target_p
);
1135 /* no matching target found */
1138 ERROR("target '%s' not found", args
[0]);
1145 /* usage: target_script <target#> <event> <script_file> */
1146 int handle_target_script_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1148 target_t
*target
= NULL
;
1152 ERROR("incomplete target_script command");
1156 target
= get_target_by_num(strtoul(args
[0], NULL
, 0));
1160 ERROR("target number '%s' not defined", args
[0]);
1164 if (strcmp(args
[1], "reset") == 0)
1166 if (target
->reset_script
)
1167 free(target
->reset_script
);
1168 target
->reset_script
= strdup(args
[2]);
1170 else if (strcmp(args
[1], "post_halt") == 0)
1172 if (target
->post_halt_script
)
1173 free(target
->post_halt_script
);
1174 target
->post_halt_script
= strdup(args
[2]);
1176 else if (strcmp(args
[1], "pre_resume") == 0)
1178 if (target
->pre_resume_script
)
1179 free(target
->pre_resume_script
);
1180 target
->pre_resume_script
= strdup(args
[2]);
1182 else if (strcmp(args
[1], "gdb_program_config") == 0)
1184 if (target
->gdb_program_script
)
1185 free(target
->gdb_program_script
);
1186 target
->gdb_program_script
= strdup(args
[2]);
1190 ERROR("unknown event type: '%s", args
[1]);
1197 int handle_run_and_halt_time_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1199 target_t
*target
= NULL
;
1203 ERROR("incomplete run_and_halt_time command");
1207 target
= get_target_by_num(strtoul(args
[0], NULL
, 0));
1211 ERROR("target number '%s' not defined", args
[0]);
1215 target
->run_and_halt_time
= strtoul(args
[1], NULL
, 0);
1220 int handle_working_area_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1222 target_t
*target
= NULL
;
1226 ERROR("incomplete working_area command. usage: working_area <target#> <address> <size> <'backup'|'nobackup'>");
1230 target
= get_target_by_num(strtoul(args
[0], NULL
, 0));
1234 ERROR("target number '%s' not defined", args
[0]);
1237 target_free_all_working_areas(target
);
1239 target
->working_area
= strtoul(args
[1], NULL
, 0);
1240 target
->working_area_size
= strtoul(args
[2], NULL
, 0);
1242 if (strcmp(args
[3], "backup") == 0)
1244 target
->backup_working_area
= 1;
1246 else if (strcmp(args
[3], "nobackup") == 0)
1248 target
->backup_working_area
= 0;
1252 ERROR("unrecognized <backup|nobackup> argument (%s)", args
[3]);
1260 /* process target state changes */
1261 int handle_target(void *priv
)
1264 target_t
*target
= targets
;
1268 /* only poll if target isn't already halted */
1269 if (target
->state
!= TARGET_HALTED
)
1271 if (target_continous_poll
)
1272 if ((retval
= target
->type
->poll(target
)) < 0)
1274 ERROR("couldn't poll target. It's due for a reset.");
1278 target
= target
->next
;
1284 int handle_reg_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1293 target
= get_current_target(cmd_ctx
);
1295 /* list all available registers for the current target */
1298 reg_cache_t
*cache
= target
->reg_cache
;
1304 for (i
= 0; i
< cache
->num_regs
; i
++)
1306 value
= buf_to_str(cache
->reg_list
[i
].value
, cache
->reg_list
[i
].size
, 16);
1307 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
);
1310 cache
= cache
->next
;
1316 /* access a single register by its ordinal number */
1317 if ((args
[0][0] >= '0') && (args
[0][0] <= '9'))
1319 int num
= strtoul(args
[0], NULL
, 0);
1320 reg_cache_t
*cache
= target
->reg_cache
;
1326 for (i
= 0; i
< cache
->num_regs
; i
++)
1330 reg
= &cache
->reg_list
[i
];
1336 cache
= cache
->next
;
1341 command_print(cmd_ctx
, "%i is out of bounds, the current target has only %i registers (0 - %i)", num
, count
, count
- 1);
1344 } else /* access a single register by its name */
1346 reg
= register_get_by_name(target
->reg_cache
, args
[0], 1);
1350 command_print(cmd_ctx
, "register %s not found in current target", args
[0]);
1355 /* display a register */
1356 if ((argc
== 1) || ((argc
== 2) && !((args
[1][0] >= '0') && (args
[1][0] <= '9'))))
1358 if ((argc
== 2) && (strcmp(args
[1], "force") == 0))
1361 if (reg
->valid
== 0)
1363 reg_arch_type_t
*arch_type
= register_get_arch_type(reg
->arch_type
);
1364 if (arch_type
== NULL
)
1366 ERROR("BUG: encountered unregistered arch type");
1369 arch_type
->get(reg
);
1371 value
= buf_to_str(reg
->value
, reg
->size
, 16);
1372 command_print(cmd_ctx
, "%s (/%i): 0x%s", reg
->name
, reg
->size
, value
);
1377 /* set register value */
1380 u8
*buf
= malloc(CEIL(reg
->size
, 8));
1381 str_to_buf(args
[1], strlen(args
[1]), buf
, reg
->size
, 0);
1383 reg_arch_type_t
*arch_type
= register_get_arch_type(reg
->arch_type
);
1384 if (arch_type
== NULL
)
1386 ERROR("BUG: encountered unregistered arch type");
1390 arch_type
->set(reg
, buf
);
1392 value
= buf_to_str(reg
->value
, reg
->size
, 16);
1393 command_print(cmd_ctx
, "%s (/%i): 0x%s", reg
->name
, reg
->size
, value
);
1401 command_print(cmd_ctx
, "usage: reg <#|name> [value]");
1406 static int wait_state(struct command_context_s
*cmd_ctx
, char *cmd
, enum target_state state
, int ms
);
1408 int handle_poll_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1410 target_t
*target
= get_current_target(cmd_ctx
);
1415 command_print(cmd_ctx
, "target state: %s", target_state_strings
[target
->type
->poll(target
)]);
1416 if (target
->state
== TARGET_HALTED
)
1418 target
->type
->arch_state(target
, buffer
, 512);
1420 command_print(cmd_ctx
, "%s", buffer
);
1425 if (strcmp(args
[0], "on") == 0)
1427 target_continous_poll
= 1;
1429 else if (strcmp(args
[0], "off") == 0)
1431 target_continous_poll
= 0;
1435 command_print(cmd_ctx
, "arg is \"on\" or \"off\"");
1443 int handle_wait_halt_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1451 ms
= strtoul(args
[0], &end
, 0) * 1000;
1454 command_print(cmd_ctx
, "usage: %s [seconds]", cmd
);
1459 return wait_state(cmd_ctx
, cmd
, TARGET_HALTED
, ms
);
1462 static void target_process_events(struct command_context_s
*cmd_ctx
)
1464 target_t
*target
= get_current_target(cmd_ctx
);
1465 target
->type
->poll(target
);
1466 target_call_timer_callbacks();
1469 static int wait_state(struct command_context_s
*cmd_ctx
, char *cmd
, enum target_state state
, int ms
)
1471 struct timeval timeout
, now
;
1473 gettimeofday(&timeout
, NULL
);
1474 timeval_add_time(&timeout
, 0, ms
* 1000);
1475 command_print(cmd_ctx
, "waiting for target %s...", target_state_strings
[state
]);
1477 target_t
*target
= get_current_target(cmd_ctx
);
1478 while (target
->type
->poll(target
))
1480 target_call_timer_callbacks();
1481 if (target
->state
== state
)
1483 command_print(cmd_ctx
, "target %s", target_state_strings
[state
]);
1487 gettimeofday(&now
, NULL
);
1488 if ((now
.tv_sec
> timeout
.tv_sec
) || ((now
.tv_sec
== timeout
.tv_sec
) && (now
.tv_usec
>= timeout
.tv_usec
)))
1490 command_print(cmd_ctx
, "timed out while waiting for target %s", target_state_strings
[state
]);
1491 ERROR("timed out while waiting for target %s", target_state_strings
[state
]);
1499 int handle_halt_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1502 target_t
*target
= get_current_target(cmd_ctx
);
1506 command_print(cmd_ctx
, "requesting target halt...");
1508 if ((retval
= target
->type
->halt(target
)) != ERROR_OK
)
1512 case ERROR_TARGET_ALREADY_HALTED
:
1513 command_print(cmd_ctx
, "target already halted");
1515 case ERROR_TARGET_TIMEOUT
:
1516 command_print(cmd_ctx
, "target timed out... shutting down");
1519 command_print(cmd_ctx
, "unknown error... shutting down");
1524 return handle_wait_halt_command(cmd_ctx
, cmd
, args
, argc
);
1527 /* what to do on daemon startup */
1528 int handle_daemon_startup_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1532 if (strcmp(args
[0], "attach") == 0)
1534 startup_mode
= DAEMON_ATTACH
;
1537 else if (strcmp(args
[0], "reset") == 0)
1539 startup_mode
= DAEMON_RESET
;
1544 WARNING("invalid daemon_startup configuration directive: %s", args
[0]);
1549 int handle_soft_reset_halt_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1551 target_t
*target
= get_current_target(cmd_ctx
);
1554 command_print(cmd_ctx
, "requesting target halt and executing a soft reset");
1556 if ((retval
= target
->type
->soft_reset_halt(target
)) != ERROR_OK
)
1560 case ERROR_TARGET_TIMEOUT
:
1561 command_print(cmd_ctx
, "target timed out... shutting down");
1564 command_print(cmd_ctx
, "unknown error... shutting down");
1572 int handle_reset_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1574 target_t
*target
= get_current_target(cmd_ctx
);
1575 enum target_reset_mode reset_mode
= target
->reset_mode
;
1576 enum target_reset_mode save
= target
->reset_mode
;
1582 if (strcmp("run", args
[0]) == 0)
1583 reset_mode
= RESET_RUN
;
1584 else if (strcmp("halt", args
[0]) == 0)
1585 reset_mode
= RESET_HALT
;
1586 else if (strcmp("init", args
[0]) == 0)
1587 reset_mode
= RESET_INIT
;
1588 else if (strcmp("run_and_halt", args
[0]) == 0)
1590 reset_mode
= RESET_RUN_AND_HALT
;
1593 target
->run_and_halt_time
= strtoul(args
[1], NULL
, 0);
1596 else if (strcmp("run_and_init", args
[0]) == 0)
1598 reset_mode
= RESET_RUN_AND_INIT
;
1601 target
->run_and_halt_time
= strtoul(args
[1], NULL
, 0);
1606 command_print(cmd_ctx
, "usage: reset ['run', 'halt', 'init', 'run_and_halt', 'run_and_init]");
1611 /* temporarily modify mode of current reset target */
1612 target
->reset_mode
= reset_mode
;
1614 /* reset *all* targets */
1615 target_process_reset(cmd_ctx
);
1617 /* Restore default reset mode for this target */
1618 target
->reset_mode
= save
;
1623 int handle_resume_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1626 target_t
*target
= get_current_target(cmd_ctx
);
1631 retval
= target
->type
->resume(target
, 1, 0, 1, 0); /* current pc, addr = 0, handle breakpoints, not debugging */
1633 retval
= target
->type
->resume(target
, 0, strtoul(args
[0], NULL
, 0), 1, 0); /* addr = args[0], handle breakpoints, not debugging */
1636 command_print(cmd_ctx
, "usage: resume [address]");
1640 if (retval
!= ERROR_OK
)
1644 case ERROR_TARGET_NOT_HALTED
:
1645 command_print(cmd_ctx
, "target not halted");
1648 command_print(cmd_ctx
, "unknown error... shutting down");
1653 target_process_events(cmd_ctx
);
1658 int handle_step_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1660 target_t
*target
= get_current_target(cmd_ctx
);
1665 target
->type
->step(target
, 1, 0, 1); /* current pc, addr = 0, handle breakpoints */
1668 target
->type
->step(target
, 0, strtoul(args
[0], NULL
, 0), 1); /* addr = args[0], handle breakpoints */
1673 int handle_md_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1675 const int line_bytecnt
= 32;
1688 target_t
*target
= get_current_target(cmd_ctx
);
1694 count
= strtoul(args
[1], NULL
, 0);
1696 address
= strtoul(args
[0], NULL
, 0);
1702 size
= 4; line_modulo
= line_bytecnt
/ 4;
1705 size
= 2; line_modulo
= line_bytecnt
/ 2;
1708 size
= 1; line_modulo
= line_bytecnt
/ 1;
1714 buffer
= calloc(count
, size
);
1715 retval
= target
->type
->read_memory(target
, address
, size
, count
, buffer
);
1716 if (retval
!= ERROR_OK
)
1720 case ERROR_TARGET_UNALIGNED_ACCESS
:
1721 command_print(cmd_ctx
, "error: address not aligned");
1723 case ERROR_TARGET_NOT_HALTED
:
1724 command_print(cmd_ctx
, "error: target must be halted for memory accesses");
1726 case ERROR_TARGET_DATA_ABORT
:
1727 command_print(cmd_ctx
, "error: access caused data abort, system possibly corrupted");
1730 command_print(cmd_ctx
, "error: unknown error");
1738 for (i
= 0; i
< count
; i
++)
1740 if (i
%line_modulo
== 0)
1741 output_len
+= snprintf(output
+ output_len
, 128 - output_len
, "0x%8.8x: ", address
+ (i
*size
));
1746 output_len
+= snprintf(output
+ output_len
, 128 - output_len
, "%8.8x ", target_buffer_get_u32(target
, &buffer
[i
*4]));
1749 output_len
+= snprintf(output
+ output_len
, 128 - output_len
, "%4.4x ", target_buffer_get_u16(target
, &buffer
[i
*2]));
1752 output_len
+= snprintf(output
+ output_len
, 128 - output_len
, "%2.2x ", buffer
[i
*1]);
1756 if ((i
%line_modulo
== line_modulo
-1) || (i
== count
- 1))
1758 command_print(cmd_ctx
, output
);
1768 int handle_mw_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1773 target_t
*target
= get_current_target(cmd_ctx
);
1779 address
= strtoul(args
[0], NULL
, 0);
1780 value
= strtoul(args
[1], NULL
, 0);
1785 target_buffer_set_u32(target
, value_buf
, value
);
1786 retval
= target
->type
->write_memory(target
, address
, 4, 1, value_buf
);
1789 target_buffer_set_u16(target
, value_buf
, value
);
1790 retval
= target
->type
->write_memory(target
, address
, 2, 1, value_buf
);
1793 value_buf
[0] = value
;
1794 retval
= target
->type
->write_memory(target
, address
, 1, 1, value_buf
);
1802 case ERROR_TARGET_UNALIGNED_ACCESS
:
1803 command_print(cmd_ctx
, "error: address not aligned");
1805 case ERROR_TARGET_DATA_ABORT
:
1806 command_print(cmd_ctx
, "error: access caused data abort, system possibly corrupted");
1808 case ERROR_TARGET_NOT_HALTED
:
1809 command_print(cmd_ctx
, "error: target must be halted for memory accesses");
1814 command_print(cmd_ctx
, "error: unknown error");
1822 int handle_load_image_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1832 duration_t duration
;
1833 char *duration_text
;
1835 target_t
*target
= get_current_target(cmd_ctx
);
1839 command_print(cmd_ctx
, "usage: load_image <filename> [address] [type]");
1843 /* a base address isn't always necessary, default to 0x0 (i.e. don't relocate) */
1846 image
.base_address_set
= 1;
1847 image
.base_address
= strtoul(args
[1], NULL
, 0);
1851 image
.base_address_set
= 0;
1854 image
.start_address_set
= 0;
1856 duration_start_measure(&duration
);
1858 if (image_open(&image
, args
[0], (argc
>= 3) ? args
[2] : NULL
) != ERROR_OK
)
1860 command_print(cmd_ctx
, "load_image error: %s", image
.error_str
);
1865 for (i
= 0; i
< image
.num_sections
; i
++)
1867 buffer
= malloc(image
.sections
[i
].size
);
1870 command_print(cmd_ctx
, "error allocating buffer for section (%d bytes)", image
.sections
[i
].size
);
1874 if ((retval
= image_read_section(&image
, i
, 0x0, image
.sections
[i
].size
, buffer
, &buf_cnt
)) != ERROR_OK
)
1876 ERROR("image_read_section failed with error code: %i", retval
);
1877 command_print(cmd_ctx
, "image reading failed, download aborted");
1879 image_close(&image
);
1882 target_write_buffer(target
, image
.sections
[i
].base_address
, buf_cnt
, buffer
);
1883 image_size
+= buf_cnt
;
1884 command_print(cmd_ctx
, "%u byte written at address 0x%8.8x", buf_cnt
, image
.sections
[i
].base_address
);
1889 duration_stop_measure(&duration
, &duration_text
);
1890 command_print(cmd_ctx
, "downloaded %u byte in %s", image_size
, duration_text
);
1891 free(duration_text
);
1893 image_close(&image
);
1899 int handle_dump_image_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1908 duration_t duration
;
1909 char *duration_text
;
1911 target_t
*target
= get_current_target(cmd_ctx
);
1915 command_print(cmd_ctx
, "usage: dump_image <filename> <address> <size>");
1919 address
= strtoul(args
[1], NULL
, 0);
1920 size
= strtoul(args
[2], NULL
, 0);
1922 if ((address
& 3) || (size
& 3))
1924 command_print(cmd_ctx
, "only 32-bit aligned address and size are supported");
1928 if (fileio_open(&fileio
, args
[0], FILEIO_WRITE
, FILEIO_BINARY
) != ERROR_OK
)
1930 command_print(cmd_ctx
, "dump_image error: %s", fileio
.error_str
);
1934 duration_start_measure(&duration
);
1939 u32 this_run_size
= (size
> 560) ? 560 : size
;
1941 retval
= target
->type
->read_memory(target
, address
, 4, this_run_size
/ 4, buffer
);
1942 if (retval
!= ERROR_OK
)
1944 command_print(cmd_ctx
, "Reading memory failed %d", retval
);
1948 fileio_write(&fileio
, this_run_size
, buffer
, &size_written
);
1950 size
-= this_run_size
;
1951 address
+= this_run_size
;
1954 fileio_close(&fileio
);
1956 duration_stop_measure(&duration
, &duration_text
);
1957 command_print(cmd_ctx
, "dumped %"PRIi64
" byte in %s", fileio
.size
, duration_text
);
1958 free(duration_text
);
1963 int handle_verify_image_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1971 u32 mem_checksum
= 0;
1975 duration_t duration
;
1976 char *duration_text
;
1978 target_t
*target
= get_current_target(cmd_ctx
);
1982 command_print(cmd_ctx
, "usage: verify_image <file> [offset] [type]");
1988 ERROR("no target selected");
1992 duration_start_measure(&duration
);
1996 image
.base_address_set
= 1;
1997 image
.base_address
= strtoul(args
[1], NULL
, 0);
2001 image
.base_address_set
= 0;
2002 image
.base_address
= 0x0;
2005 image
.start_address_set
= 0;
2007 if (image_open(&image
, args
[0], (argc
== 3) ? args
[2] : NULL
) != ERROR_OK
)
2009 command_print(cmd_ctx
, "verify_image error: %s", image
.error_str
);
2014 for (i
= 0; i
< image
.num_sections
; i
++)
2016 buffer
= malloc(image
.sections
[i
].size
);
2019 command_print(cmd_ctx
, "error allocating buffer for section (%d bytes)", image
.sections
[i
].size
);
2022 if ((retval
= image_read_section(&image
, i
, 0x0, image
.sections
[i
].size
, buffer
, &buf_cnt
)) != ERROR_OK
)
2024 ERROR("image_read_section failed with error code: %i", retval
);
2025 command_print(cmd_ctx
, "image reading failed, verify aborted");
2027 image_close(&image
);
2031 /* calculate checksum of image */
2032 image_calculate_checksum( buffer
, buf_cnt
, &checksum
);
2034 retval
= target_checksum_memory(target
, image
.sections
[i
].base_address
, buf_cnt
, &mem_checksum
);
2036 if( retval
!= ERROR_OK
)
2038 command_print(cmd_ctx
, "could not calculate checksum, verify aborted");
2040 image_close(&image
);
2044 if( checksum
!= mem_checksum
)
2046 /* failed crc checksum, fall back to a binary compare */
2049 command_print(cmd_ctx
, "checksum mismatch - attempting binary compare");
2051 data
= (u8
*)malloc(buf_cnt
);
2053 /* Can we use 32bit word accesses? */
2055 int count
= buf_cnt
;
2056 if ((count
% 4) == 0)
2061 retval
= target
->type
->read_memory(target
, image
.sections
[i
].base_address
, size
, count
, data
);
2063 if (retval
== ERROR_OK
)
2066 for (t
= 0; t
< buf_cnt
; t
++)
2068 if (data
[t
] != buffer
[t
])
2070 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
]);
2073 image_close(&image
);
2083 image_size
+= buf_cnt
;
2086 duration_stop_measure(&duration
, &duration_text
);
2087 command_print(cmd_ctx
, "verified %u bytes in %s", image_size
, duration_text
);
2088 free(duration_text
);
2090 image_close(&image
);
2095 int handle_bp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2098 target_t
*target
= get_current_target(cmd_ctx
);
2102 breakpoint_t
*breakpoint
= target
->breakpoints
;
2106 if (breakpoint
->type
== BKPT_SOFT
)
2108 char* buf
= buf_to_str(breakpoint
->orig_instr
, breakpoint
->length
, 16);
2109 command_print(cmd_ctx
, "0x%8.8x, 0x%x, %i, 0x%s", breakpoint
->address
, breakpoint
->length
, breakpoint
->set
, buf
);
2114 command_print(cmd_ctx
, "0x%8.8x, 0x%x, %i", breakpoint
->address
, breakpoint
->length
, breakpoint
->set
);
2116 breakpoint
= breakpoint
->next
;
2124 length
= strtoul(args
[1], NULL
, 0);
2127 if (strcmp(args
[2], "hw") == 0)
2130 if ((retval
= breakpoint_add(target
, strtoul(args
[0], NULL
, 0), length
, hw
)) != ERROR_OK
)
2134 case ERROR_TARGET_NOT_HALTED
:
2135 command_print(cmd_ctx
, "target must be halted to set breakpoints");
2137 case ERROR_TARGET_RESOURCE_NOT_AVAILABLE
:
2138 command_print(cmd_ctx
, "no more breakpoints available");
2141 command_print(cmd_ctx
, "unknown error, breakpoint not set");
2147 command_print(cmd_ctx
, "breakpoint added at address 0x%8.8x", strtoul(args
[0], NULL
, 0));
2152 command_print(cmd_ctx
, "usage: bp <address> <length> ['hw']");
2158 int handle_rbp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2160 target_t
*target
= get_current_target(cmd_ctx
);
2163 breakpoint_remove(target
, strtoul(args
[0], NULL
, 0));
2168 int handle_wp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2170 target_t
*target
= get_current_target(cmd_ctx
);
2175 watchpoint_t
*watchpoint
= target
->watchpoints
;
2179 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
);
2180 watchpoint
= watchpoint
->next
;
2185 enum watchpoint_rw type
= WPT_ACCESS
;
2186 u32 data_value
= 0x0;
2187 u32 data_mask
= 0xffffffff;
2203 command_print(cmd_ctx
, "usage: wp <address> <length> [r/w/a] [value] [mask]");
2209 data_value
= strtoul(args
[3], NULL
, 0);
2213 data_mask
= strtoul(args
[4], NULL
, 0);
2216 if ((retval
= watchpoint_add(target
, strtoul(args
[0], NULL
, 0),
2217 strtoul(args
[1], NULL
, 0), type
, data_value
, data_mask
)) != ERROR_OK
)
2221 case ERROR_TARGET_NOT_HALTED
:
2222 command_print(cmd_ctx
, "target must be halted to set watchpoints");
2224 case ERROR_TARGET_RESOURCE_NOT_AVAILABLE
:
2225 command_print(cmd_ctx
, "no more watchpoints available");
2228 command_print(cmd_ctx
, "unknown error, watchpoint not set");
2235 command_print(cmd_ctx
, "usage: wp <address> <length> [r/w/a] [value] [mask]");
2241 int handle_rwp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2243 target_t
*target
= get_current_target(cmd_ctx
);
2246 watchpoint_remove(target
, strtoul(args
[0], NULL
, 0));
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)