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_CONFIG
, NULL
);
708 int target_write_buffer(struct target_s
*target
, u32 address
, u32 size
, u8
*buffer
)
712 DEBUG("writing buffer of %i byte at 0x%8.8x", size
, address
);
714 /* handle writes of less than 4 byte */
717 if ((retval
= target
->type
->write_memory(target
, address
, 1, size
, buffer
)) != ERROR_OK
)
722 /* handle unaligned head bytes */
725 int unaligned
= 4 - (address
% 4);
727 if ((retval
= target
->type
->write_memory(target
, address
, 1, unaligned
, buffer
)) != ERROR_OK
)
731 address
+= unaligned
;
735 /* handle aligned words */
738 int aligned
= size
- (size
% 4);
740 /* use bulk writes above a certain limit. This may have to be changed */
743 if ((retval
= target
->type
->bulk_write_memory(target
, address
, aligned
/ 4, buffer
)) != ERROR_OK
)
748 if ((retval
= target
->type
->write_memory(target
, address
, 4, aligned
/ 4, buffer
)) != ERROR_OK
)
757 /* handle tail writes of less than 4 bytes */
760 if ((retval
= target
->type
->write_memory(target
, address
, 1, size
, buffer
)) != ERROR_OK
)
767 int target_read_buffer(struct target_s
*target
, u32 address
, u32 size
, u8
*buffer
)
771 DEBUG("reading buffer of %i byte at 0x%8.8x", size
, address
);
773 /* handle reads of less than 4 byte */
776 if ((retval
= target
->type
->read_memory(target
, address
, 1, size
, buffer
)) != ERROR_OK
)
781 /* handle unaligned head bytes */
784 int unaligned
= 4 - (address
% 4);
786 if ((retval
= target
->type
->read_memory(target
, address
, 1, unaligned
, buffer
)) != ERROR_OK
)
790 address
+= unaligned
;
794 /* handle aligned words */
797 int aligned
= size
- (size
% 4);
799 if ((retval
= target
->type
->read_memory(target
, address
, 4, aligned
/ 4, buffer
)) != ERROR_OK
)
807 /* handle tail writes of less than 4 bytes */
810 if ((retval
= target
->type
->read_memory(target
, address
, 1, size
, buffer
)) != ERROR_OK
)
817 int target_checksum_memory(struct target_s
*target
, u32 address
, u32 size
, u32
* crc
)
824 if ((retval
= target
->type
->checksum_memory(target
, address
,
825 size
, &checksum
)) == ERROR_TARGET_RESOURCE_NOT_AVAILABLE
)
827 buffer
= malloc(size
);
830 ERROR("error allocating buffer for section (%d bytes)", size
);
833 target_read_buffer(target
, address
, size
, buffer
);
835 /* convert to target endianess */
836 for (i
= 0; i
< (size
/sizeof(u32
)); i
++)
839 target_data
= target_buffer_get_u32(target
, &buffer
[i
*sizeof(u32
)]);
840 target_buffer_set_u32(target
, &buffer
[i
*sizeof(u32
)], target_data
);
843 retval
= image_calculate_checksum( buffer
, size
, &checksum
);
852 int target_read_u32(struct target_s
*target
, u32 address
, u32
*value
)
856 int retval
= target
->type
->read_memory(target
, address
, 4, 1, value_buf
);
858 if (retval
== ERROR_OK
)
860 *value
= target_buffer_get_u32(target
, value_buf
);
861 DEBUG("address: 0x%8.8x, value: 0x%8.8x", address
, *value
);
866 DEBUG("address: 0x%8.8x failed", address
);
872 int target_read_u16(struct target_s
*target
, u32 address
, u16
*value
)
876 int retval
= target
->type
->read_memory(target
, address
, 2, 1, value_buf
);
878 if (retval
== ERROR_OK
)
880 *value
= target_buffer_get_u16(target
, value_buf
);
881 DEBUG("address: 0x%8.8x, value: 0x%4.4x", address
, *value
);
886 DEBUG("address: 0x%8.8x failed", address
);
892 int target_read_u8(struct target_s
*target
, u32 address
, u8
*value
)
894 int retval
= target
->type
->read_memory(target
, address
, 1, 1, value
);
896 if (retval
== ERROR_OK
)
898 DEBUG("address: 0x%8.8x, value: 0x%2.2x", address
, *value
);
903 DEBUG("address: 0x%8.8x failed", address
);
909 int target_write_u32(struct target_s
*target
, u32 address
, u32 value
)
914 DEBUG("address: 0x%8.8x, value: 0x%8.8x", address
, value
);
916 target_buffer_set_u32(target
, value_buf
, value
);
917 if ((retval
= target
->type
->write_memory(target
, address
, 4, 1, value_buf
)) != ERROR_OK
)
919 DEBUG("failed: %i", retval
);
925 int target_write_u16(struct target_s
*target
, u32 address
, u16 value
)
930 DEBUG("address: 0x%8.8x, value: 0x%8.8x", address
, value
);
932 target_buffer_set_u16(target
, value_buf
, value
);
933 if ((retval
= target
->type
->write_memory(target
, address
, 2, 1, value_buf
)) != ERROR_OK
)
935 DEBUG("failed: %i", retval
);
941 int target_write_u8(struct target_s
*target
, u32 address
, u8 value
)
945 DEBUG("address: 0x%8.8x, value: 0x%2.2x", address
, value
);
947 if ((retval
= target
->type
->read_memory(target
, address
, 1, 1, &value
)) != ERROR_OK
)
949 DEBUG("failed: %i", retval
);
955 int target_register_user_commands(struct command_context_s
*cmd_ctx
)
957 register_command(cmd_ctx
, NULL
, "reg", handle_reg_command
, COMMAND_EXEC
, NULL
);
958 register_command(cmd_ctx
, NULL
, "poll", handle_poll_command
, COMMAND_EXEC
, "poll target state");
959 register_command(cmd_ctx
, NULL
, "wait_halt", handle_wait_halt_command
, COMMAND_EXEC
, "wait for target halt [time (s)]");
960 register_command(cmd_ctx
, NULL
, "halt", handle_halt_command
, COMMAND_EXEC
, "halt target");
961 register_command(cmd_ctx
, NULL
, "resume", handle_resume_command
, COMMAND_EXEC
, "resume target [addr]");
962 register_command(cmd_ctx
, NULL
, "step", handle_step_command
, COMMAND_EXEC
, "step one instruction from current PC or [addr]");
963 register_command(cmd_ctx
, NULL
, "reset", handle_reset_command
, COMMAND_EXEC
, "reset target [run|halt|init|run_and_halt|run_and_init]");
964 register_command(cmd_ctx
, NULL
, "soft_reset_halt", handle_soft_reset_halt_command
, COMMAND_EXEC
, "halt the target and do a soft reset");
966 register_command(cmd_ctx
, NULL
, "mdw", handle_md_command
, COMMAND_EXEC
, "display memory words <addr> [count]");
967 register_command(cmd_ctx
, NULL
, "mdh", handle_md_command
, COMMAND_EXEC
, "display memory half-words <addr> [count]");
968 register_command(cmd_ctx
, NULL
, "mdb", handle_md_command
, COMMAND_EXEC
, "display memory bytes <addr> [count]");
970 register_command(cmd_ctx
, NULL
, "mww", handle_mw_command
, COMMAND_EXEC
, "write memory word <addr> <value>");
971 register_command(cmd_ctx
, NULL
, "mwh", handle_mw_command
, COMMAND_EXEC
, "write memory half-word <addr> <value>");
972 register_command(cmd_ctx
, NULL
, "mwb", handle_mw_command
, COMMAND_EXEC
, "write memory byte <addr> <value>");
974 register_command(cmd_ctx
, NULL
, "bp", handle_bp_command
, COMMAND_EXEC
, "set breakpoint <address> <length> [hw]");
975 register_command(cmd_ctx
, NULL
, "rbp", handle_rbp_command
, COMMAND_EXEC
, "remove breakpoint <adress>");
976 register_command(cmd_ctx
, NULL
, "wp", handle_wp_command
, COMMAND_EXEC
, "set watchpoint <address> <length> <r/w/a> [value] [mask]");
977 register_command(cmd_ctx
, NULL
, "rwp", handle_rwp_command
, COMMAND_EXEC
, "remove watchpoint <adress>");
979 register_command(cmd_ctx
, NULL
, "load_image", handle_load_image_command
, COMMAND_EXEC
, "load_image <file> <address> ['bin'|'ihex'|'elf'|'s19']");
980 register_command(cmd_ctx
, NULL
, "dump_image", handle_dump_image_command
, COMMAND_EXEC
, "dump_image <file> <address> <size>");
981 register_command(cmd_ctx
, NULL
, "verify_image", handle_verify_image_command
, COMMAND_EXEC
, "verify_image <file> [offset] [type]");
982 register_command(cmd_ctx
, NULL
, "load_binary", handle_load_image_command
, COMMAND_EXEC
, "[DEPRECATED] load_binary <file> <address>");
983 register_command(cmd_ctx
, NULL
, "dump_binary", handle_dump_image_command
, COMMAND_EXEC
, "[DEPRECATED] dump_binary <file> <address> <size>");
985 target_request_register_commands(cmd_ctx
);
986 trace_register_commands(cmd_ctx
);
991 int handle_targets_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
993 target_t
*target
= targets
;
998 int num
= strtoul(args
[0], NULL
, 0);
1003 target
= target
->next
;
1007 cmd_ctx
->current_target
= num
;
1009 command_print(cmd_ctx
, "%i is out of bounds, only %i targets are configured", num
, count
);
1016 command_print(cmd_ctx
, "%i: %s (%s), state: %s", count
++, target
->type
->name
, target_endianess_strings
[target
->endianness
], target_state_strings
[target
->state
]);
1017 target
= target
->next
;
1023 int handle_target_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1030 ERROR("target command requires at least three arguments: <type> <endianess> <reset_mode>");
1034 /* search for the specified target */
1035 if (args
[0] && (args
[0][0] != 0))
1037 for (i
= 0; target_types
[i
]; i
++)
1039 if (strcmp(args
[0], target_types
[i
]->name
) == 0)
1041 target_t
**last_target_p
= &targets
;
1043 /* register target specific commands */
1044 if (target_types
[i
]->register_commands(cmd_ctx
) != ERROR_OK
)
1046 ERROR("couldn't register '%s' commands", args
[0]);
1052 while ((*last_target_p
)->next
)
1053 last_target_p
= &((*last_target_p
)->next
);
1054 last_target_p
= &((*last_target_p
)->next
);
1057 *last_target_p
= malloc(sizeof(target_t
));
1059 (*last_target_p
)->type
= target_types
[i
];
1061 if (strcmp(args
[1], "big") == 0)
1062 (*last_target_p
)->endianness
= TARGET_BIG_ENDIAN
;
1063 else if (strcmp(args
[1], "little") == 0)
1064 (*last_target_p
)->endianness
= TARGET_LITTLE_ENDIAN
;
1067 ERROR("endianness must be either 'little' or 'big', not '%s'", args
[1]);
1071 /* what to do on a target reset */
1072 if (strcmp(args
[2], "reset_halt") == 0)
1073 (*last_target_p
)->reset_mode
= RESET_HALT
;
1074 else if (strcmp(args
[2], "reset_run") == 0)
1075 (*last_target_p
)->reset_mode
= RESET_RUN
;
1076 else if (strcmp(args
[2], "reset_init") == 0)
1077 (*last_target_p
)->reset_mode
= RESET_INIT
;
1078 else if (strcmp(args
[2], "run_and_halt") == 0)
1079 (*last_target_p
)->reset_mode
= RESET_RUN_AND_HALT
;
1080 else if (strcmp(args
[2], "run_and_init") == 0)
1081 (*last_target_p
)->reset_mode
= RESET_RUN_AND_INIT
;
1084 ERROR("unknown target startup mode %s", args
[2]);
1087 (*last_target_p
)->run_and_halt_time
= 1000; /* default 1s */
1089 (*last_target_p
)->reset_script
= NULL
;
1090 (*last_target_p
)->post_halt_script
= NULL
;
1091 (*last_target_p
)->pre_resume_script
= NULL
;
1092 (*last_target_p
)->gdb_program_script
= NULL
;
1094 (*last_target_p
)->working_area
= 0x0;
1095 (*last_target_p
)->working_area_size
= 0x0;
1096 (*last_target_p
)->working_areas
= NULL
;
1097 (*last_target_p
)->backup_working_area
= 0;
1099 (*last_target_p
)->state
= TARGET_UNKNOWN
;
1100 (*last_target_p
)->reg_cache
= NULL
;
1101 (*last_target_p
)->breakpoints
= NULL
;
1102 (*last_target_p
)->watchpoints
= NULL
;
1103 (*last_target_p
)->next
= NULL
;
1104 (*last_target_p
)->arch_info
= NULL
;
1106 /* initialize trace information */
1107 (*last_target_p
)->trace_info
= malloc(sizeof(trace_t
));
1108 (*last_target_p
)->trace_info
->num_trace_points
= 0;
1109 (*last_target_p
)->trace_info
->trace_points_size
= 0;
1110 (*last_target_p
)->trace_info
->trace_points
= NULL
;
1111 (*last_target_p
)->trace_info
->trace_history_size
= 0;
1112 (*last_target_p
)->trace_info
->trace_history
= NULL
;
1113 (*last_target_p
)->trace_info
->trace_history_pos
= 0;
1114 (*last_target_p
)->trace_info
->trace_history_overflowed
= 0;
1116 (*last_target_p
)->dbgmsg
= NULL
;
1117 (*last_target_p
)->dbg_msg_enabled
= 0;
1119 (*last_target_p
)->type
->target_command(cmd_ctx
, cmd
, args
, argc
, *last_target_p
);
1127 /* no matching target found */
1130 ERROR("target '%s' not found", args
[0]);
1137 /* usage: target_script <target#> <event> <script_file> */
1138 int handle_target_script_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1140 target_t
*target
= NULL
;
1144 ERROR("incomplete target_script command");
1148 target
= get_target_by_num(strtoul(args
[0], NULL
, 0));
1152 ERROR("target number '%s' not defined", args
[0]);
1156 if (strcmp(args
[1], "reset") == 0)
1158 if (target
->reset_script
)
1159 free(target
->reset_script
);
1160 target
->reset_script
= strdup(args
[2]);
1162 else if (strcmp(args
[1], "post_halt") == 0)
1164 if (target
->post_halt_script
)
1165 free(target
->post_halt_script
);
1166 target
->post_halt_script
= strdup(args
[2]);
1168 else if (strcmp(args
[1], "pre_resume") == 0)
1170 if (target
->pre_resume_script
)
1171 free(target
->pre_resume_script
);
1172 target
->pre_resume_script
= strdup(args
[2]);
1174 else if (strcmp(args
[1], "gdb_program_config") == 0)
1176 if (target
->gdb_program_script
)
1177 free(target
->gdb_program_script
);
1178 target
->gdb_program_script
= strdup(args
[2]);
1182 ERROR("unknown event type: '%s", args
[1]);
1189 int handle_run_and_halt_time_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1191 target_t
*target
= NULL
;
1195 ERROR("incomplete run_and_halt_time command");
1199 target
= get_target_by_num(strtoul(args
[0], NULL
, 0));
1203 ERROR("target number '%s' not defined", args
[0]);
1207 target
->run_and_halt_time
= strtoul(args
[1], NULL
, 0);
1212 int handle_working_area_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1214 target_t
*target
= NULL
;
1218 ERROR("incomplete working_area command. usage: working_area <target#> <address> <size> <'backup'|'nobackup'>");
1222 target
= get_target_by_num(strtoul(args
[0], NULL
, 0));
1226 ERROR("target number '%s' not defined", args
[0]);
1230 target
->working_area
= strtoul(args
[1], NULL
, 0);
1231 target
->working_area_size
= strtoul(args
[2], NULL
, 0);
1233 if (strcmp(args
[3], "backup") == 0)
1235 target
->backup_working_area
= 1;
1237 else if (strcmp(args
[3], "nobackup") == 0)
1239 target
->backup_working_area
= 0;
1243 ERROR("unrecognized <backup|nobackup> argument (%s)", args
[3]);
1251 /* process target state changes */
1252 int handle_target(void *priv
)
1255 target_t
*target
= targets
;
1259 /* only poll if target isn't already halted */
1260 if (target
->state
!= TARGET_HALTED
)
1262 if (target_continous_poll
)
1263 if ((retval
= target
->type
->poll(target
)) < 0)
1265 ERROR("couldn't poll target. It's due for a reset.");
1269 target
= target
->next
;
1275 int handle_reg_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1284 target
= get_current_target(cmd_ctx
);
1286 /* list all available registers for the current target */
1289 reg_cache_t
*cache
= target
->reg_cache
;
1295 for (i
= 0; i
< cache
->num_regs
; i
++)
1297 value
= buf_to_str(cache
->reg_list
[i
].value
, cache
->reg_list
[i
].size
, 16);
1298 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
);
1301 cache
= cache
->next
;
1307 /* access a single register by its ordinal number */
1308 if ((args
[0][0] >= '0') && (args
[0][0] <= '9'))
1310 int num
= strtoul(args
[0], NULL
, 0);
1311 reg_cache_t
*cache
= target
->reg_cache
;
1317 for (i
= 0; i
< cache
->num_regs
; i
++)
1321 reg
= &cache
->reg_list
[i
];
1327 cache
= cache
->next
;
1332 command_print(cmd_ctx
, "%i is out of bounds, the current target has only %i registers (0 - %i)", num
, count
, count
- 1);
1335 } else /* access a single register by its name */
1337 reg
= register_get_by_name(target
->reg_cache
, args
[0], 1);
1341 command_print(cmd_ctx
, "register %s not found in current target", args
[0]);
1346 /* display a register */
1347 if ((argc
== 1) || ((argc
== 2) && !((args
[1][0] >= '0') && (args
[1][0] <= '9'))))
1349 if ((argc
== 2) && (strcmp(args
[1], "force") == 0))
1352 if (reg
->valid
== 0)
1354 reg_arch_type_t
*arch_type
= register_get_arch_type(reg
->arch_type
);
1355 if (arch_type
== NULL
)
1357 ERROR("BUG: encountered unregistered arch type");
1360 arch_type
->get(reg
);
1362 value
= buf_to_str(reg
->value
, reg
->size
, 16);
1363 command_print(cmd_ctx
, "%s (/%i): 0x%s", reg
->name
, reg
->size
, value
);
1368 /* set register value */
1371 u8
*buf
= malloc(CEIL(reg
->size
, 8));
1372 str_to_buf(args
[1], strlen(args
[1]), buf
, reg
->size
, 0);
1374 reg_arch_type_t
*arch_type
= register_get_arch_type(reg
->arch_type
);
1375 if (arch_type
== NULL
)
1377 ERROR("BUG: encountered unregistered arch type");
1381 arch_type
->set(reg
, buf
);
1383 value
= buf_to_str(reg
->value
, reg
->size
, 16);
1384 command_print(cmd_ctx
, "%s (/%i): 0x%s", reg
->name
, reg
->size
, value
);
1392 command_print(cmd_ctx
, "usage: reg <#|name> [value]");
1397 static int wait_state(struct command_context_s
*cmd_ctx
, char *cmd
, enum target_state state
, int ms
);
1399 int handle_poll_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1401 target_t
*target
= get_current_target(cmd_ctx
);
1406 command_print(cmd_ctx
, "target state: %s", target_state_strings
[target
->type
->poll(target
)]);
1407 if (target
->state
== TARGET_HALTED
)
1409 target
->type
->arch_state(target
, buffer
, 512);
1411 command_print(cmd_ctx
, "%s", buffer
);
1416 if (strcmp(args
[0], "on") == 0)
1418 target_continous_poll
= 1;
1420 else if (strcmp(args
[0], "off") == 0)
1422 target_continous_poll
= 0;
1426 command_print(cmd_ctx
, "arg is \"on\" or \"off\"");
1434 int handle_wait_halt_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1442 ms
= strtoul(args
[0], &end
, 0) * 1000;
1445 command_print(cmd_ctx
, "usage: %s [seconds]", cmd
);
1450 return wait_state(cmd_ctx
, cmd
, TARGET_HALTED
, ms
);
1453 static int wait_state(struct command_context_s
*cmd_ctx
, char *cmd
, enum target_state state
, int ms
)
1455 struct timeval timeout
, now
;
1457 gettimeofday(&timeout
, NULL
);
1458 timeval_add_time(&timeout
, 0, ms
* 1000);
1459 command_print(cmd_ctx
, "waiting for target %s...", target_state_strings
[state
]);
1461 target_t
*target
= get_current_target(cmd_ctx
);
1462 while (target
->type
->poll(target
))
1464 target_call_timer_callbacks();
1465 if (target
->state
== state
)
1467 command_print(cmd_ctx
, "target %s", target_state_strings
[state
]);
1471 gettimeofday(&now
, NULL
);
1472 if ((now
.tv_sec
> timeout
.tv_sec
) || ((now
.tv_sec
== timeout
.tv_sec
) && (now
.tv_usec
>= timeout
.tv_usec
)))
1474 command_print(cmd_ctx
, "timed out while waiting for target %s", target_state_strings
[state
]);
1475 ERROR("timed out while waiting for target %s", target_state_strings
[state
]);
1483 int handle_halt_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1486 target_t
*target
= get_current_target(cmd_ctx
);
1490 command_print(cmd_ctx
, "requesting target halt...");
1492 if ((retval
= target
->type
->halt(target
)) != ERROR_OK
)
1496 case ERROR_TARGET_ALREADY_HALTED
:
1497 command_print(cmd_ctx
, "target already halted");
1499 case ERROR_TARGET_TIMEOUT
:
1500 command_print(cmd_ctx
, "target timed out... shutting down");
1503 command_print(cmd_ctx
, "unknown error... shutting down");
1508 return handle_wait_halt_command(cmd_ctx
, cmd
, args
, argc
);
1511 /* what to do on daemon startup */
1512 int handle_daemon_startup_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1516 if (strcmp(args
[0], "attach") == 0)
1518 startup_mode
= DAEMON_ATTACH
;
1521 else if (strcmp(args
[0], "reset") == 0)
1523 startup_mode
= DAEMON_RESET
;
1528 WARNING("invalid daemon_startup configuration directive: %s", args
[0]);
1533 int handle_soft_reset_halt_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1535 target_t
*target
= get_current_target(cmd_ctx
);
1538 command_print(cmd_ctx
, "requesting target halt and executing a soft reset");
1540 if ((retval
= target
->type
->soft_reset_halt(target
)) != ERROR_OK
)
1544 case ERROR_TARGET_TIMEOUT
:
1545 command_print(cmd_ctx
, "target timed out... shutting down");
1548 command_print(cmd_ctx
, "unknown error... shutting down");
1556 int handle_reset_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1558 target_t
*target
= get_current_target(cmd_ctx
);
1559 enum target_reset_mode reset_mode
= target
->reset_mode
;
1560 enum target_reset_mode save
= target
->reset_mode
;
1566 if (strcmp("run", args
[0]) == 0)
1567 reset_mode
= RESET_RUN
;
1568 else if (strcmp("halt", args
[0]) == 0)
1569 reset_mode
= RESET_HALT
;
1570 else if (strcmp("init", args
[0]) == 0)
1571 reset_mode
= RESET_INIT
;
1572 else if (strcmp("run_and_halt", args
[0]) == 0)
1574 reset_mode
= RESET_RUN_AND_HALT
;
1577 target
->run_and_halt_time
= strtoul(args
[1], NULL
, 0);
1580 else if (strcmp("run_and_init", args
[0]) == 0)
1582 reset_mode
= RESET_RUN_AND_INIT
;
1585 target
->run_and_halt_time
= strtoul(args
[1], NULL
, 0);
1590 command_print(cmd_ctx
, "usage: reset ['run', 'halt', 'init', 'run_and_halt', 'run_and_init]");
1595 /* temporarily modify mode of current reset target */
1596 target
->reset_mode
= reset_mode
;
1598 /* reset *all* targets */
1599 target_process_reset(cmd_ctx
);
1601 /* Restore default reset mode for this target */
1602 target
->reset_mode
= save
;
1607 int handle_resume_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1610 target_t
*target
= get_current_target(cmd_ctx
);
1615 retval
= target
->type
->resume(target
, 1, 0, 1, 0); /* current pc, addr = 0, handle breakpoints, not debugging */
1617 retval
= target
->type
->resume(target
, 0, strtoul(args
[0], NULL
, 0), 1, 0); /* addr = args[0], handle breakpoints, not debugging */
1620 command_print(cmd_ctx
, "usage: resume [address]");
1624 if (retval
!= ERROR_OK
)
1628 case ERROR_TARGET_NOT_HALTED
:
1629 command_print(cmd_ctx
, "target not halted");
1632 command_print(cmd_ctx
, "unknown error... shutting down");
1637 return wait_state(cmd_ctx
, cmd
, TARGET_RUNNING
, 5000);
1640 int handle_step_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1642 target_t
*target
= get_current_target(cmd_ctx
);
1647 target
->type
->step(target
, 1, 0, 1); /* current pc, addr = 0, handle breakpoints */
1650 target
->type
->step(target
, 0, strtoul(args
[0], NULL
, 0), 1); /* addr = args[0], handle breakpoints */
1655 int handle_md_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1657 const int line_bytecnt
= 32;
1670 target_t
*target
= get_current_target(cmd_ctx
);
1676 count
= strtoul(args
[1], NULL
, 0);
1678 address
= strtoul(args
[0], NULL
, 0);
1684 size
= 4; line_modulo
= line_bytecnt
/ 4;
1687 size
= 2; line_modulo
= line_bytecnt
/ 2;
1690 size
= 1; line_modulo
= line_bytecnt
/ 1;
1696 buffer
= calloc(count
, size
);
1697 retval
= target
->type
->read_memory(target
, address
, size
, count
, buffer
);
1698 if (retval
!= ERROR_OK
)
1702 case ERROR_TARGET_UNALIGNED_ACCESS
:
1703 command_print(cmd_ctx
, "error: address not aligned");
1705 case ERROR_TARGET_NOT_HALTED
:
1706 command_print(cmd_ctx
, "error: target must be halted for memory accesses");
1708 case ERROR_TARGET_DATA_ABORT
:
1709 command_print(cmd_ctx
, "error: access caused data abort, system possibly corrupted");
1712 command_print(cmd_ctx
, "error: unknown error");
1720 for (i
= 0; i
< count
; i
++)
1722 if (i
%line_modulo
== 0)
1723 output_len
+= snprintf(output
+ output_len
, 128 - output_len
, "0x%8.8x: ", address
+ (i
*size
));
1728 output_len
+= snprintf(output
+ output_len
, 128 - output_len
, "%8.8x ", target_buffer_get_u32(target
, &buffer
[i
*4]));
1731 output_len
+= snprintf(output
+ output_len
, 128 - output_len
, "%4.4x ", target_buffer_get_u16(target
, &buffer
[i
*2]));
1734 output_len
+= snprintf(output
+ output_len
, 128 - output_len
, "%2.2x ", buffer
[i
*1]);
1738 if ((i
%line_modulo
== line_modulo
-1) || (i
== count
- 1))
1740 command_print(cmd_ctx
, output
);
1750 int handle_mw_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1755 target_t
*target
= get_current_target(cmd_ctx
);
1761 address
= strtoul(args
[0], NULL
, 0);
1762 value
= strtoul(args
[1], NULL
, 0);
1767 target_buffer_set_u32(target
, value_buf
, value
);
1768 retval
= target
->type
->write_memory(target
, address
, 4, 1, value_buf
);
1771 target_buffer_set_u16(target
, value_buf
, value
);
1772 retval
= target
->type
->write_memory(target
, address
, 2, 1, value_buf
);
1775 value_buf
[0] = value
;
1776 retval
= target
->type
->write_memory(target
, address
, 1, 1, value_buf
);
1784 case ERROR_TARGET_UNALIGNED_ACCESS
:
1785 command_print(cmd_ctx
, "error: address not aligned");
1787 case ERROR_TARGET_DATA_ABORT
:
1788 command_print(cmd_ctx
, "error: access caused data abort, system possibly corrupted");
1790 case ERROR_TARGET_NOT_HALTED
:
1791 command_print(cmd_ctx
, "error: target must be halted for memory accesses");
1796 command_print(cmd_ctx
, "error: unknown error");
1804 int handle_load_image_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1814 duration_t duration
;
1815 char *duration_text
;
1817 target_t
*target
= get_current_target(cmd_ctx
);
1821 command_print(cmd_ctx
, "usage: load_image <filename> [address] [type]");
1825 /* a base address isn't always necessary, default to 0x0 (i.e. don't relocate) */
1828 image
.base_address_set
= 1;
1829 image
.base_address
= strtoul(args
[1], NULL
, 0);
1833 image
.base_address_set
= 0;
1836 image
.start_address_set
= 0;
1838 duration_start_measure(&duration
);
1840 if (image_open(&image
, args
[0], (argc
>= 3) ? args
[2] : NULL
) != ERROR_OK
)
1842 command_print(cmd_ctx
, "load_image error: %s", image
.error_str
);
1847 for (i
= 0; i
< image
.num_sections
; i
++)
1849 buffer
= malloc(image
.sections
[i
].size
);
1852 command_print(cmd_ctx
, "error allocating buffer for section (%d bytes)", image
.sections
[i
].size
);
1856 if ((retval
= image_read_section(&image
, i
, 0x0, image
.sections
[i
].size
, buffer
, &buf_cnt
)) != ERROR_OK
)
1858 ERROR("image_read_section failed with error code: %i", retval
);
1859 command_print(cmd_ctx
, "image reading failed, download aborted");
1861 image_close(&image
);
1864 target_write_buffer(target
, image
.sections
[i
].base_address
, buf_cnt
, buffer
);
1865 image_size
+= buf_cnt
;
1866 command_print(cmd_ctx
, "%u byte written at address 0x%8.8x", buf_cnt
, image
.sections
[i
].base_address
);
1871 duration_stop_measure(&duration
, &duration_text
);
1872 command_print(cmd_ctx
, "downloaded %u byte in %s", image_size
, duration_text
);
1873 free(duration_text
);
1875 image_close(&image
);
1881 int handle_dump_image_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1890 duration_t duration
;
1891 char *duration_text
;
1893 target_t
*target
= get_current_target(cmd_ctx
);
1897 command_print(cmd_ctx
, "usage: dump_image <filename> <address> <size>");
1901 address
= strtoul(args
[1], NULL
, 0);
1902 size
= strtoul(args
[2], NULL
, 0);
1904 if ((address
& 3) || (size
& 3))
1906 command_print(cmd_ctx
, "only 32-bit aligned address and size are supported");
1910 if (fileio_open(&fileio
, args
[0], FILEIO_WRITE
, FILEIO_BINARY
) != ERROR_OK
)
1912 command_print(cmd_ctx
, "dump_image error: %s", fileio
.error_str
);
1916 duration_start_measure(&duration
);
1921 u32 this_run_size
= (size
> 560) ? 560 : size
;
1923 retval
= target
->type
->read_memory(target
, address
, 4, this_run_size
/ 4, buffer
);
1924 if (retval
!= ERROR_OK
)
1926 command_print(cmd_ctx
, "Reading memory failed %d", retval
);
1930 fileio_write(&fileio
, this_run_size
, buffer
, &size_written
);
1932 size
-= this_run_size
;
1933 address
+= this_run_size
;
1936 fileio_close(&fileio
);
1938 duration_stop_measure(&duration
, &duration_text
);
1939 command_print(cmd_ctx
, "dumped %"PRIi64
" byte in %s", fileio
.size
, duration_text
);
1940 free(duration_text
);
1945 int handle_verify_image_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1953 u32 mem_checksum
= 0;
1957 duration_t duration
;
1958 char *duration_text
;
1960 target_t
*target
= get_current_target(cmd_ctx
);
1964 command_print(cmd_ctx
, "usage: verify_image <file> [offset] [type]");
1970 ERROR("no target selected");
1974 duration_start_measure(&duration
);
1978 image
.base_address_set
= 1;
1979 image
.base_address
= strtoul(args
[1], NULL
, 0);
1983 image
.base_address_set
= 0;
1984 image
.base_address
= 0x0;
1987 image
.start_address_set
= 0;
1989 if (image_open(&image
, args
[0], (argc
== 3) ? args
[2] : NULL
) != ERROR_OK
)
1991 command_print(cmd_ctx
, "verify_image error: %s", image
.error_str
);
1996 for (i
= 0; i
< image
.num_sections
; i
++)
1998 buffer
= malloc(image
.sections
[i
].size
);
2001 command_print(cmd_ctx
, "error allocating buffer for section (%d bytes)", image
.sections
[i
].size
);
2004 if ((retval
= image_read_section(&image
, i
, 0x0, image
.sections
[i
].size
, buffer
, &buf_cnt
)) != ERROR_OK
)
2006 ERROR("image_read_section failed with error code: %i", retval
);
2007 command_print(cmd_ctx
, "image reading failed, verify aborted");
2009 image_close(&image
);
2013 /* calculate checksum of image */
2014 image_calculate_checksum( buffer
, buf_cnt
, &checksum
);
2016 retval
= target_checksum_memory(target
, image
.sections
[i
].base_address
, buf_cnt
, &mem_checksum
);
2018 if( retval
!= ERROR_OK
)
2020 command_print(cmd_ctx
, "image verify failed, verify aborted");
2022 image_close(&image
);
2026 if( checksum
!= mem_checksum
)
2028 /* failed crc checksum, fall back to a binary compare */
2031 command_print(cmd_ctx
, "image verify checksum failed - attempting binary compare");
2033 data
= (u8
*)malloc(buf_cnt
);
2035 /* Can we use 32bit word accesses? */
2037 int count
= buf_cnt
;
2038 if ((count
% 4) == 0)
2043 retval
= target
->type
->read_memory(target
, image
.sections
[i
].base_address
, size
, count
, data
);
2045 if (retval
== ERROR_OK
)
2048 for (t
= 0; t
< buf_cnt
; t
++)
2050 if (data
[t
] != buffer
[t
])
2052 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
]);
2055 image_close(&image
);
2065 image_size
+= buf_cnt
;
2068 duration_stop_measure(&duration
, &duration_text
);
2069 command_print(cmd_ctx
, "verified %u bytes in %s", image_size
, duration_text
);
2070 free(duration_text
);
2072 image_close(&image
);
2077 int handle_bp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2080 target_t
*target
= get_current_target(cmd_ctx
);
2084 breakpoint_t
*breakpoint
= target
->breakpoints
;
2088 if (breakpoint
->type
== BKPT_SOFT
)
2090 char* buf
= buf_to_str(breakpoint
->orig_instr
, breakpoint
->length
, 16);
2091 command_print(cmd_ctx
, "0x%8.8x, 0x%x, %i, 0x%s", breakpoint
->address
, breakpoint
->length
, breakpoint
->set
, buf
);
2096 command_print(cmd_ctx
, "0x%8.8x, 0x%x, %i", breakpoint
->address
, breakpoint
->length
, breakpoint
->set
);
2098 breakpoint
= breakpoint
->next
;
2106 length
= strtoul(args
[1], NULL
, 0);
2109 if (strcmp(args
[2], "hw") == 0)
2112 if ((retval
= breakpoint_add(target
, strtoul(args
[0], NULL
, 0), length
, hw
)) != ERROR_OK
)
2116 case ERROR_TARGET_NOT_HALTED
:
2117 command_print(cmd_ctx
, "target must be halted to set breakpoints");
2119 case ERROR_TARGET_RESOURCE_NOT_AVAILABLE
:
2120 command_print(cmd_ctx
, "no more breakpoints available");
2123 command_print(cmd_ctx
, "unknown error, breakpoint not set");
2129 command_print(cmd_ctx
, "breakpoint added at address 0x%8.8x", strtoul(args
[0], NULL
, 0));
2134 command_print(cmd_ctx
, "usage: bp <address> <length> ['hw']");
2140 int handle_rbp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2142 target_t
*target
= get_current_target(cmd_ctx
);
2145 breakpoint_remove(target
, strtoul(args
[0], NULL
, 0));
2150 int handle_wp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2152 target_t
*target
= get_current_target(cmd_ctx
);
2157 watchpoint_t
*watchpoint
= target
->watchpoints
;
2161 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
);
2162 watchpoint
= watchpoint
->next
;
2167 enum watchpoint_rw type
= WPT_ACCESS
;
2168 u32 data_value
= 0x0;
2169 u32 data_mask
= 0xffffffff;
2185 command_print(cmd_ctx
, "usage: wp <address> <length> [r/w/a] [value] [mask]");
2191 data_value
= strtoul(args
[3], NULL
, 0);
2195 data_mask
= strtoul(args
[4], NULL
, 0);
2198 if ((retval
= watchpoint_add(target
, strtoul(args
[0], NULL
, 0),
2199 strtoul(args
[1], NULL
, 0), type
, data_value
, data_mask
)) != ERROR_OK
)
2203 case ERROR_TARGET_NOT_HALTED
:
2204 command_print(cmd_ctx
, "target must be halted to set watchpoints");
2206 case ERROR_TARGET_RESOURCE_NOT_AVAILABLE
:
2207 command_print(cmd_ctx
, "no more watchpoints available");
2210 command_print(cmd_ctx
, "unknown error, watchpoint not set");
2217 command_print(cmd_ctx
, "usage: wp <address> <length> [r/w/a] [value] [mask]");
2223 int handle_rwp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2225 target_t
*target
= get_current_target(cmd_ctx
);
2228 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)