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
;
257 /* prepare reset_halt where necessary */
261 switch (target
->reset_mode
)
265 target
->type
->prepare_reset_halt(target
);
270 target
= target
->next
;
276 target
->type
->assert_reset(target
);
277 target
= target
->next
;
279 jtag_execute_queue();
281 /* request target halt if necessary, and schedule further action */
285 switch (target
->reset_mode
)
288 /* nothing to do if target just wants to be run */
290 case RESET_RUN_AND_HALT
:
292 target_register_timer_callback(target_run_and_halt_handler
, target
->run_and_halt_time
, 0, target
);
294 case RESET_RUN_AND_INIT
:
296 target_register_timer_callback(target_run_and_halt_handler
, target
->run_and_halt_time
, 0, target
);
297 target_register_event_callback(target_init_handler
, cmd_ctx
);
300 target
->type
->halt(target
);
303 target
->type
->halt(target
);
304 target_register_event_callback(target_init_handler
, cmd_ctx
);
307 ERROR("BUG: unknown target->reset_mode");
309 target
= target
->next
;
315 target
->type
->deassert_reset(target
);
317 switch (target
->reset_mode
)
321 // If we're already halted, then this is harmless(reducing # of execution paths here)
322 // If nSRST & nTRST are tied together then the halt during reset failed(logged) and
323 // we use this as fallback(there is no other output to tell the user that reset halt
325 target
->type
->poll(target
);
326 target
->type
->halt(target
);
333 target
= target
->next
;
335 jtag_execute_queue();
340 int target_init(struct command_context_s
*cmd_ctx
)
342 target_t
*target
= targets
;
346 if (target
->type
->init_target(cmd_ctx
, target
) != ERROR_OK
)
348 ERROR("target '%s' init failed", target
->type
->name
);
351 target
= target
->next
;
356 target_register_user_commands(cmd_ctx
);
357 target_register_timer_callback(handle_target
, 100, 1, NULL
);
360 if (startup_mode
== DAEMON_RESET
)
361 target_process_reset(cmd_ctx
);
366 int target_register_event_callback(int (*callback
)(struct target_s
*target
, enum target_event event
, void *priv
), void *priv
)
368 target_event_callback_t
**callbacks_p
= &target_event_callbacks
;
370 if (callback
== NULL
)
372 return ERROR_INVALID_ARGUMENTS
;
377 while ((*callbacks_p
)->next
)
378 callbacks_p
= &((*callbacks_p
)->next
);
379 callbacks_p
= &((*callbacks_p
)->next
);
382 (*callbacks_p
) = malloc(sizeof(target_event_callback_t
));
383 (*callbacks_p
)->callback
= callback
;
384 (*callbacks_p
)->priv
= priv
;
385 (*callbacks_p
)->next
= NULL
;
390 int target_register_timer_callback(int (*callback
)(void *priv
), int time_ms
, int periodic
, void *priv
)
392 target_timer_callback_t
**callbacks_p
= &target_timer_callbacks
;
395 if (callback
== NULL
)
397 return ERROR_INVALID_ARGUMENTS
;
402 while ((*callbacks_p
)->next
)
403 callbacks_p
= &((*callbacks_p
)->next
);
404 callbacks_p
= &((*callbacks_p
)->next
);
407 (*callbacks_p
) = malloc(sizeof(target_timer_callback_t
));
408 (*callbacks_p
)->callback
= callback
;
409 (*callbacks_p
)->periodic
= periodic
;
410 (*callbacks_p
)->time_ms
= time_ms
;
412 gettimeofday(&now
, NULL
);
413 (*callbacks_p
)->when
.tv_usec
= now
.tv_usec
+ (time_ms
% 1000) * 1000;
414 time_ms
-= (time_ms
% 1000);
415 (*callbacks_p
)->when
.tv_sec
= now
.tv_sec
+ (time_ms
/ 1000);
416 if ((*callbacks_p
)->when
.tv_usec
> 1000000)
418 (*callbacks_p
)->when
.tv_usec
= (*callbacks_p
)->when
.tv_usec
- 1000000;
419 (*callbacks_p
)->when
.tv_sec
+= 1;
422 (*callbacks_p
)->priv
= priv
;
423 (*callbacks_p
)->next
= NULL
;
428 int target_unregister_event_callback(int (*callback
)(struct target_s
*target
, enum target_event event
, void *priv
), void *priv
)
430 target_event_callback_t
**p
= &target_event_callbacks
;
431 target_event_callback_t
*c
= target_event_callbacks
;
433 if (callback
== NULL
)
435 return ERROR_INVALID_ARGUMENTS
;
440 target_event_callback_t
*next
= c
->next
;
441 if ((c
->callback
== callback
) && (c
->priv
== priv
))
455 int target_unregister_timer_callback(int (*callback
)(void *priv
), void *priv
)
457 target_timer_callback_t
**p
= &target_timer_callbacks
;
458 target_timer_callback_t
*c
= target_timer_callbacks
;
460 if (callback
== NULL
)
462 return ERROR_INVALID_ARGUMENTS
;
467 target_timer_callback_t
*next
= c
->next
;
468 if ((c
->callback
== callback
) && (c
->priv
== priv
))
482 int target_call_event_callbacks(target_t
*target
, enum target_event event
)
484 target_event_callback_t
*callback
= target_event_callbacks
;
485 target_event_callback_t
*next_callback
;
487 DEBUG("target event %i", event
);
491 next_callback
= callback
->next
;
492 callback
->callback(target
, event
, callback
->priv
);
493 callback
= next_callback
;
499 int target_call_timer_callbacks()
501 target_timer_callback_t
*callback
= target_timer_callbacks
;
502 target_timer_callback_t
*next_callback
;
505 gettimeofday(&now
, NULL
);
509 next_callback
= callback
->next
;
511 if (((now
.tv_sec
>= callback
->when
.tv_sec
) && (now
.tv_usec
>= callback
->when
.tv_usec
))
512 || (now
.tv_sec
> callback
->when
.tv_sec
))
514 callback
->callback(callback
->priv
);
515 if (callback
->periodic
)
517 int time_ms
= callback
->time_ms
;
518 callback
->when
.tv_usec
= now
.tv_usec
+ (time_ms
% 1000) * 1000;
519 time_ms
-= (time_ms
% 1000);
520 callback
->when
.tv_sec
= now
.tv_sec
+ time_ms
/ 1000;
521 if (callback
->when
.tv_usec
> 1000000)
523 callback
->when
.tv_usec
= callback
->when
.tv_usec
- 1000000;
524 callback
->when
.tv_sec
+= 1;
528 target_unregister_timer_callback(callback
->callback
, callback
->priv
);
531 callback
= next_callback
;
537 int target_alloc_working_area(struct target_s
*target
, u32 size
, working_area_t
**area
)
539 working_area_t
*c
= target
->working_areas
;
540 working_area_t
*new_wa
= NULL
;
542 /* only allocate multiples of 4 byte */
545 ERROR("BUG: code tried to allocate unaligned number of bytes, padding");
546 size
= CEIL(size
, 4);
549 /* see if there's already a matching working area */
552 if ((c
->free
) && (c
->size
== size
))
560 /* if not, allocate a new one */
563 working_area_t
**p
= &target
->working_areas
;
564 u32 first_free
= target
->working_area
;
565 u32 free_size
= target
->working_area_size
;
567 DEBUG("allocating new working area");
569 c
= target
->working_areas
;
572 first_free
+= c
->size
;
573 free_size
-= c
->size
;
578 if (free_size
< size
)
580 WARNING("not enough working area available");
581 return ERROR_TARGET_RESOURCE_NOT_AVAILABLE
;
584 new_wa
= malloc(sizeof(working_area_t
));
587 new_wa
->address
= first_free
;
589 if (target
->backup_working_area
)
591 new_wa
->backup
= malloc(new_wa
->size
);
592 target
->type
->read_memory(target
, new_wa
->address
, 4, new_wa
->size
/ 4, new_wa
->backup
);
596 new_wa
->backup
= NULL
;
599 /* put new entry in list */
603 /* mark as used, and return the new (reused) area */
613 int target_free_working_area(struct target_s
*target
, working_area_t
*area
)
618 if (target
->backup_working_area
)
619 target
->type
->write_memory(target
, area
->address
, 4, area
->size
/ 4, area
->backup
);
623 /* mark user pointer invalid */
630 int target_free_all_working_areas(struct target_s
*target
)
632 working_area_t
*c
= target
->working_areas
;
636 working_area_t
*next
= c
->next
;
637 target_free_working_area(target
, c
);
647 target
->working_areas
= NULL
;
652 int target_register_commands(struct command_context_s
*cmd_ctx
)
654 register_command(cmd_ctx
, NULL
, "target", handle_target_command
, COMMAND_CONFIG
, NULL
);
655 register_command(cmd_ctx
, NULL
, "targets", handle_targets_command
, COMMAND_EXEC
, NULL
);
656 register_command(cmd_ctx
, NULL
, "daemon_startup", handle_daemon_startup_command
, COMMAND_CONFIG
, NULL
);
657 register_command(cmd_ctx
, NULL
, "target_script", handle_target_script_command
, COMMAND_CONFIG
, NULL
);
658 register_command(cmd_ctx
, NULL
, "run_and_halt_time", handle_run_and_halt_time_command
, COMMAND_CONFIG
, NULL
);
659 register_command(cmd_ctx
, NULL
, "working_area", handle_working_area_command
, COMMAND_CONFIG
, NULL
);
664 int target_write_buffer(struct target_s
*target
, u32 address
, u32 size
, u8
*buffer
)
668 DEBUG("writing buffer of %i byte at 0x%8.8x", size
, address
);
670 /* handle writes of less than 4 byte */
673 if ((retval
= target
->type
->write_memory(target
, address
, 1, size
, buffer
)) != ERROR_OK
)
678 /* handle unaligned head bytes */
681 int unaligned
= 4 - (address
% 4);
683 if ((retval
= target
->type
->write_memory(target
, address
, 1, unaligned
, buffer
)) != ERROR_OK
)
687 address
+= unaligned
;
691 /* handle aligned words */
694 int aligned
= size
- (size
% 4);
696 /* use bulk writes above a certain limit. This may have to be changed */
699 if ((retval
= target
->type
->bulk_write_memory(target
, address
, aligned
/ 4, buffer
)) != ERROR_OK
)
704 if ((retval
= target
->type
->write_memory(target
, address
, 4, aligned
/ 4, buffer
)) != ERROR_OK
)
713 /* handle tail writes of less than 4 bytes */
716 if ((retval
= target
->type
->write_memory(target
, address
, 1, size
, buffer
)) != ERROR_OK
)
723 int target_read_buffer(struct target_s
*target
, u32 address
, u32 size
, u8
*buffer
)
727 DEBUG("reading buffer of %i byte at 0x%8.8x", size
, address
);
729 /* handle reads of less than 4 byte */
732 if ((retval
= target
->type
->read_memory(target
, address
, 1, size
, buffer
)) != ERROR_OK
)
737 /* handle unaligned head bytes */
740 int unaligned
= 4 - (address
% 4);
742 if ((retval
= target
->type
->read_memory(target
, address
, 1, unaligned
, buffer
)) != ERROR_OK
)
746 address
+= unaligned
;
750 /* handle aligned words */
753 int aligned
= size
- (size
% 4);
755 if ((retval
= target
->type
->read_memory(target
, address
, 4, aligned
/ 4, buffer
)) != ERROR_OK
)
763 /* handle tail writes of less than 4 bytes */
766 if ((retval
= target
->type
->read_memory(target
, address
, 1, size
, buffer
)) != ERROR_OK
)
773 int target_checksum_memory(struct target_s
*target
, u32 address
, u32 size
, u32
* crc
)
780 if ((retval
= target
->type
->checksum_memory(target
, address
,
781 size
, &checksum
)) == ERROR_TARGET_RESOURCE_NOT_AVAILABLE
)
783 buffer
= malloc(size
);
786 ERROR("error allocating buffer for section (%d bytes)", size
);
789 target_read_buffer(target
, address
, size
, buffer
);
791 /* convert to target endianess */
792 for (i
= 0; i
< (size
/sizeof(u32
)); i
++)
795 target_data
= target_buffer_get_u32(target
, &buffer
[i
*sizeof(u32
)]);
796 target_buffer_set_u32(target
, &buffer
[i
*sizeof(u32
)], target_data
);
799 retval
= image_calculate_checksum( buffer
, size
, &checksum
);
808 int target_read_u32(struct target_s
*target
, u32 address
, u32
*value
)
812 int retval
= target
->type
->read_memory(target
, address
, 4, 1, value_buf
);
814 if (retval
== ERROR_OK
)
816 *value
= target_buffer_get_u32(target
, value_buf
);
817 DEBUG("address: 0x%8.8x, value: 0x%8.8x", address
, *value
);
822 DEBUG("address: 0x%8.8x failed", address
);
828 int target_read_u16(struct target_s
*target
, u32 address
, u16
*value
)
832 int retval
= target
->type
->read_memory(target
, address
, 2, 1, value_buf
);
834 if (retval
== ERROR_OK
)
836 *value
= target_buffer_get_u16(target
, value_buf
);
837 DEBUG("address: 0x%8.8x, value: 0x%4.4x", address
, *value
);
842 DEBUG("address: 0x%8.8x failed", address
);
848 int target_read_u8(struct target_s
*target
, u32 address
, u8
*value
)
850 int retval
= target
->type
->read_memory(target
, address
, 1, 1, value
);
852 if (retval
== ERROR_OK
)
854 DEBUG("address: 0x%8.8x, value: 0x%2.2x", address
, *value
);
859 DEBUG("address: 0x%8.8x failed", address
);
865 int target_write_u32(struct target_s
*target
, u32 address
, u32 value
)
870 DEBUG("address: 0x%8.8x, value: 0x%8.8x", address
, value
);
872 target_buffer_set_u32(target
, value_buf
, value
);
873 if ((retval
= target
->type
->write_memory(target
, address
, 4, 1, value_buf
)) != ERROR_OK
)
875 DEBUG("failed: %i", retval
);
881 int target_write_u16(struct target_s
*target
, u32 address
, u16 value
)
886 DEBUG("address: 0x%8.8x, value: 0x%8.8x", address
, value
);
888 target_buffer_set_u16(target
, value_buf
, value
);
889 if ((retval
= target
->type
->write_memory(target
, address
, 2, 1, value_buf
)) != ERROR_OK
)
891 DEBUG("failed: %i", retval
);
897 int target_write_u8(struct target_s
*target
, u32 address
, u8 value
)
901 DEBUG("address: 0x%8.8x, value: 0x%2.2x", address
, value
);
903 if ((retval
= target
->type
->read_memory(target
, address
, 1, 1, &value
)) != ERROR_OK
)
905 DEBUG("failed: %i", retval
);
911 int target_register_user_commands(struct command_context_s
*cmd_ctx
)
913 register_command(cmd_ctx
, NULL
, "reg", handle_reg_command
, COMMAND_EXEC
, NULL
);
914 register_command(cmd_ctx
, NULL
, "poll", handle_poll_command
, COMMAND_EXEC
, "poll target state");
915 register_command(cmd_ctx
, NULL
, "wait_halt", handle_wait_halt_command
, COMMAND_EXEC
, "wait for target halt [time (s)]");
916 register_command(cmd_ctx
, NULL
, "halt", handle_halt_command
, COMMAND_EXEC
, "halt target");
917 register_command(cmd_ctx
, NULL
, "resume", handle_resume_command
, COMMAND_EXEC
, "resume target [addr]");
918 register_command(cmd_ctx
, NULL
, "step", handle_step_command
, COMMAND_EXEC
, "step one instruction from current PC or [addr]");
919 register_command(cmd_ctx
, NULL
, "reset", handle_reset_command
, COMMAND_EXEC
, "reset target [run|halt|init|run_and_halt|run_and_init]");
920 register_command(cmd_ctx
, NULL
, "soft_reset_halt", handle_soft_reset_halt_command
, COMMAND_EXEC
, "halt the target and do a soft reset");
922 register_command(cmd_ctx
, NULL
, "mdw", handle_md_command
, COMMAND_EXEC
, "display memory words <addr> [count]");
923 register_command(cmd_ctx
, NULL
, "mdh", handle_md_command
, COMMAND_EXEC
, "display memory half-words <addr> [count]");
924 register_command(cmd_ctx
, NULL
, "mdb", handle_md_command
, COMMAND_EXEC
, "display memory bytes <addr> [count]");
926 register_command(cmd_ctx
, NULL
, "mww", handle_mw_command
, COMMAND_EXEC
, "write memory word <addr> <value>");
927 register_command(cmd_ctx
, NULL
, "mwh", handle_mw_command
, COMMAND_EXEC
, "write memory half-word <addr> <value>");
928 register_command(cmd_ctx
, NULL
, "mwb", handle_mw_command
, COMMAND_EXEC
, "write memory byte <addr> <value>");
930 register_command(cmd_ctx
, NULL
, "bp", handle_bp_command
, COMMAND_EXEC
, "set breakpoint <address> <length> [hw]");
931 register_command(cmd_ctx
, NULL
, "rbp", handle_rbp_command
, COMMAND_EXEC
, "remove breakpoint <adress>");
932 register_command(cmd_ctx
, NULL
, "wp", handle_wp_command
, COMMAND_EXEC
, "set watchpoint <address> <length> <r/w/a> [value] [mask]");
933 register_command(cmd_ctx
, NULL
, "rwp", handle_rwp_command
, COMMAND_EXEC
, "remove watchpoint <adress>");
935 register_command(cmd_ctx
, NULL
, "load_image", handle_load_image_command
, COMMAND_EXEC
, "load_image <file> <address> ['bin'|'ihex'|'elf'|'s19']");
936 register_command(cmd_ctx
, NULL
, "dump_image", handle_dump_image_command
, COMMAND_EXEC
, "dump_image <file> <address> <size>");
937 register_command(cmd_ctx
, NULL
, "verify_image", handle_verify_image_command
, COMMAND_EXEC
, "verify_image <file> [offset] [type]");
938 register_command(cmd_ctx
, NULL
, "load_binary", handle_load_image_command
, COMMAND_EXEC
, "[DEPRECATED] load_binary <file> <address>");
939 register_command(cmd_ctx
, NULL
, "dump_binary", handle_dump_image_command
, COMMAND_EXEC
, "[DEPRECATED] dump_binary <file> <address> <size>");
941 target_request_register_commands(cmd_ctx
);
942 trace_register_commands(cmd_ctx
);
947 int handle_targets_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
949 target_t
*target
= targets
;
954 int num
= strtoul(args
[0], NULL
, 0);
959 target
= target
->next
;
963 cmd_ctx
->current_target
= num
;
965 command_print(cmd_ctx
, "%i is out of bounds, only %i targets are configured", num
, count
);
972 command_print(cmd_ctx
, "%i: %s (%s), state: %s", count
++, target
->type
->name
, target_endianess_strings
[target
->endianness
], target_state_strings
[target
->state
]);
973 target
= target
->next
;
979 int handle_target_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
986 ERROR("target command requires at least three arguments: <type> <endianess> <reset_mode>");
990 /* search for the specified target */
991 if (args
[0] && (args
[0][0] != 0))
993 for (i
= 0; target_types
[i
]; i
++)
995 if (strcmp(args
[0], target_types
[i
]->name
) == 0)
997 target_t
**last_target_p
= &targets
;
999 /* register target specific commands */
1000 if (target_types
[i
]->register_commands(cmd_ctx
) != ERROR_OK
)
1002 ERROR("couldn't register '%s' commands", args
[0]);
1008 while ((*last_target_p
)->next
)
1009 last_target_p
= &((*last_target_p
)->next
);
1010 last_target_p
= &((*last_target_p
)->next
);
1013 *last_target_p
= malloc(sizeof(target_t
));
1015 (*last_target_p
)->type
= target_types
[i
];
1017 if (strcmp(args
[1], "big") == 0)
1018 (*last_target_p
)->endianness
= TARGET_BIG_ENDIAN
;
1019 else if (strcmp(args
[1], "little") == 0)
1020 (*last_target_p
)->endianness
= TARGET_LITTLE_ENDIAN
;
1023 ERROR("endianness must be either 'little' or 'big', not '%s'", args
[1]);
1027 /* what to do on a target reset */
1028 if (strcmp(args
[2], "reset_halt") == 0)
1029 (*last_target_p
)->reset_mode
= RESET_HALT
;
1030 else if (strcmp(args
[2], "reset_run") == 0)
1031 (*last_target_p
)->reset_mode
= RESET_RUN
;
1032 else if (strcmp(args
[2], "reset_init") == 0)
1033 (*last_target_p
)->reset_mode
= RESET_INIT
;
1034 else if (strcmp(args
[2], "run_and_halt") == 0)
1035 (*last_target_p
)->reset_mode
= RESET_RUN_AND_HALT
;
1036 else if (strcmp(args
[2], "run_and_init") == 0)
1037 (*last_target_p
)->reset_mode
= RESET_RUN_AND_INIT
;
1040 ERROR("unknown target startup mode %s", args
[2]);
1043 (*last_target_p
)->run_and_halt_time
= 1000; /* default 1s */
1045 (*last_target_p
)->reset_script
= NULL
;
1046 (*last_target_p
)->post_halt_script
= NULL
;
1047 (*last_target_p
)->pre_resume_script
= NULL
;
1048 (*last_target_p
)->gdb_program_script
= NULL
;
1050 (*last_target_p
)->working_area
= 0x0;
1051 (*last_target_p
)->working_area_size
= 0x0;
1052 (*last_target_p
)->working_areas
= NULL
;
1053 (*last_target_p
)->backup_working_area
= 0;
1055 (*last_target_p
)->state
= TARGET_UNKNOWN
;
1056 (*last_target_p
)->reg_cache
= NULL
;
1057 (*last_target_p
)->breakpoints
= NULL
;
1058 (*last_target_p
)->watchpoints
= NULL
;
1059 (*last_target_p
)->next
= NULL
;
1060 (*last_target_p
)->arch_info
= NULL
;
1062 /* initialize trace information */
1063 (*last_target_p
)->trace_info
= malloc(sizeof(trace_t
));
1064 (*last_target_p
)->trace_info
->num_trace_points
= 0;
1065 (*last_target_p
)->trace_info
->trace_points_size
= 0;
1066 (*last_target_p
)->trace_info
->trace_points
= NULL
;
1067 (*last_target_p
)->trace_info
->trace_history_size
= 0;
1068 (*last_target_p
)->trace_info
->trace_history
= NULL
;
1069 (*last_target_p
)->trace_info
->trace_history_pos
= 0;
1070 (*last_target_p
)->trace_info
->trace_history_overflowed
= 0;
1072 (*last_target_p
)->dbgmsg
= NULL
;
1073 (*last_target_p
)->dbg_msg_enabled
= 0;
1075 (*last_target_p
)->type
->target_command(cmd_ctx
, cmd
, args
, argc
, *last_target_p
);
1083 /* no matching target found */
1086 ERROR("target '%s' not found", args
[0]);
1093 /* usage: target_script <target#> <event> <script_file> */
1094 int handle_target_script_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1096 target_t
*target
= NULL
;
1100 ERROR("incomplete target_script command");
1104 target
= get_target_by_num(strtoul(args
[0], NULL
, 0));
1108 ERROR("target number '%s' not defined", args
[0]);
1112 if (strcmp(args
[1], "reset") == 0)
1114 if (target
->reset_script
)
1115 free(target
->reset_script
);
1116 target
->reset_script
= strdup(args
[2]);
1118 else if (strcmp(args
[1], "post_halt") == 0)
1120 if (target
->post_halt_script
)
1121 free(target
->post_halt_script
);
1122 target
->post_halt_script
= strdup(args
[2]);
1124 else if (strcmp(args
[1], "pre_resume") == 0)
1126 if (target
->pre_resume_script
)
1127 free(target
->pre_resume_script
);
1128 target
->pre_resume_script
= strdup(args
[2]);
1130 else if (strcmp(args
[1], "gdb_program_config") == 0)
1132 if (target
->gdb_program_script
)
1133 free(target
->gdb_program_script
);
1134 target
->gdb_program_script
= strdup(args
[2]);
1138 ERROR("unknown event type: '%s", args
[1]);
1145 int handle_run_and_halt_time_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1147 target_t
*target
= NULL
;
1151 ERROR("incomplete run_and_halt_time command");
1155 target
= get_target_by_num(strtoul(args
[0], NULL
, 0));
1159 ERROR("target number '%s' not defined", args
[0]);
1163 target
->run_and_halt_time
= strtoul(args
[1], NULL
, 0);
1168 int handle_working_area_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1170 target_t
*target
= NULL
;
1174 ERROR("incomplete working_area command. usage: working_area <target#> <address> <size> <'backup'|'nobackup'>");
1178 target
= get_target_by_num(strtoul(args
[0], NULL
, 0));
1182 ERROR("target number '%s' not defined", args
[0]);
1186 target
->working_area
= strtoul(args
[1], NULL
, 0);
1187 target
->working_area_size
= strtoul(args
[2], NULL
, 0);
1189 if (strcmp(args
[3], "backup") == 0)
1191 target
->backup_working_area
= 1;
1193 else if (strcmp(args
[3], "nobackup") == 0)
1195 target
->backup_working_area
= 0;
1199 ERROR("unrecognized <backup|nobackup> argument (%s)", args
[3]);
1207 /* process target state changes */
1208 int handle_target(void *priv
)
1211 target_t
*target
= targets
;
1215 /* only poll if target isn't already halted */
1216 if (target
->state
!= TARGET_HALTED
)
1218 if (target_continous_poll
)
1219 if ((retval
= target
->type
->poll(target
)) < 0)
1221 ERROR("couldn't poll target. It's due for a reset.");
1225 target
= target
->next
;
1231 int handle_reg_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1240 target
= get_current_target(cmd_ctx
);
1242 /* list all available registers for the current target */
1245 reg_cache_t
*cache
= target
->reg_cache
;
1251 for (i
= 0; i
< cache
->num_regs
; i
++)
1253 value
= buf_to_str(cache
->reg_list
[i
].value
, cache
->reg_list
[i
].size
, 16);
1254 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
);
1257 cache
= cache
->next
;
1263 /* access a single register by its ordinal number */
1264 if ((args
[0][0] >= '0') && (args
[0][0] <= '9'))
1266 int num
= strtoul(args
[0], NULL
, 0);
1267 reg_cache_t
*cache
= target
->reg_cache
;
1273 for (i
= 0; i
< cache
->num_regs
; i
++)
1277 reg
= &cache
->reg_list
[i
];
1283 cache
= cache
->next
;
1288 command_print(cmd_ctx
, "%i is out of bounds, the current target has only %i registers (0 - %i)", num
, count
, count
- 1);
1291 } else /* access a single register by its name */
1293 reg
= register_get_by_name(target
->reg_cache
, args
[0], 1);
1297 command_print(cmd_ctx
, "register %s not found in current target", args
[0]);
1302 /* display a register */
1303 if ((argc
== 1) || ((argc
== 2) && !((args
[1][0] >= '0') && (args
[1][0] <= '9'))))
1305 if ((argc
== 2) && (strcmp(args
[1], "force") == 0))
1308 if (reg
->valid
== 0)
1310 reg_arch_type_t
*arch_type
= register_get_arch_type(reg
->arch_type
);
1311 if (arch_type
== NULL
)
1313 ERROR("BUG: encountered unregistered arch type");
1316 arch_type
->get(reg
);
1318 value
= buf_to_str(reg
->value
, reg
->size
, 16);
1319 command_print(cmd_ctx
, "%s (/%i): 0x%s", reg
->name
, reg
->size
, value
);
1324 /* set register value */
1327 u8
*buf
= malloc(CEIL(reg
->size
, 8));
1328 str_to_buf(args
[1], strlen(args
[1]), buf
, reg
->size
, 0);
1330 reg_arch_type_t
*arch_type
= register_get_arch_type(reg
->arch_type
);
1331 if (arch_type
== NULL
)
1333 ERROR("BUG: encountered unregistered arch type");
1337 arch_type
->set(reg
, buf
);
1339 value
= buf_to_str(reg
->value
, reg
->size
, 16);
1340 command_print(cmd_ctx
, "%s (/%i): 0x%s", reg
->name
, reg
->size
, value
);
1348 command_print(cmd_ctx
, "usage: reg <#|name> [value]");
1353 int handle_poll_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1355 target_t
*target
= get_current_target(cmd_ctx
);
1360 command_print(cmd_ctx
, "target state: %s", target_state_strings
[target
->type
->poll(target
)]);
1361 if (target
->state
== TARGET_HALTED
)
1363 target
->type
->arch_state(target
, buffer
, 512);
1365 command_print(cmd_ctx
, "%s", buffer
);
1370 if (strcmp(args
[0], "on") == 0)
1372 target_continous_poll
= 1;
1374 else if (strcmp(args
[0], "off") == 0)
1376 target_continous_poll
= 0;
1384 int handle_wait_halt_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1386 target_t
*target
= get_current_target(cmd_ctx
);
1387 struct timeval timeout
, now
;
1389 gettimeofday(&timeout
, NULL
);
1391 timeval_add_time(&timeout
, 5, 0);
1395 timeval_add_time(&timeout
, strtoul(args
[0], &end
, 0), 0);
1397 command_print(cmd_ctx
, "usage: wait_halt [seconds]");
1402 command_print(cmd_ctx
, "waiting for target halted...");
1404 while(target
->type
->poll(target
))
1406 if (target
->state
== TARGET_HALTED
)
1408 command_print(cmd_ctx
, "target halted");
1411 target_call_timer_callbacks();
1413 gettimeofday(&now
, NULL
);
1414 if ((now
.tv_sec
>= timeout
.tv_sec
) && (now
.tv_usec
>= timeout
.tv_usec
))
1416 command_print(cmd_ctx
, "timed out while waiting for target halt");
1417 ERROR("timed out while waiting for target halt");
1425 int handle_halt_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1428 target_t
*target
= get_current_target(cmd_ctx
);
1432 command_print(cmd_ctx
, "requesting target halt...");
1434 if ((retval
= target
->type
->halt(target
)) != ERROR_OK
)
1438 case ERROR_TARGET_ALREADY_HALTED
:
1439 command_print(cmd_ctx
, "target already halted");
1441 case ERROR_TARGET_TIMEOUT
:
1442 command_print(cmd_ctx
, "target timed out... shutting down");
1445 command_print(cmd_ctx
, "unknown error... shutting down");
1454 /* what to do on daemon startup */
1455 int handle_daemon_startup_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1459 if (strcmp(args
[0], "attach") == 0)
1461 startup_mode
= DAEMON_ATTACH
;
1464 else if (strcmp(args
[0], "reset") == 0)
1466 startup_mode
= DAEMON_RESET
;
1471 WARNING("invalid daemon_startup configuration directive: %s", args
[0]);
1476 int handle_soft_reset_halt_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1478 target_t
*target
= get_current_target(cmd_ctx
);
1481 command_print(cmd_ctx
, "requesting target halt and executing a soft reset");
1483 if ((retval
= target
->type
->soft_reset_halt(target
)) != ERROR_OK
)
1487 case ERROR_TARGET_TIMEOUT
:
1488 command_print(cmd_ctx
, "target timed out... shutting down");
1491 command_print(cmd_ctx
, "unknown error... shutting down");
1499 int handle_reset_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1501 target_t
*target
= get_current_target(cmd_ctx
);
1502 enum target_reset_mode reset_mode
= RESET_RUN
;
1508 if (strcmp("run", args
[0]) == 0)
1509 reset_mode
= RESET_RUN
;
1510 else if (strcmp("halt", args
[0]) == 0)
1511 reset_mode
= RESET_HALT
;
1512 else if (strcmp("init", args
[0]) == 0)
1513 reset_mode
= RESET_INIT
;
1514 else if (strcmp("run_and_halt", args
[0]) == 0)
1516 reset_mode
= RESET_RUN_AND_HALT
;
1519 target
->run_and_halt_time
= strtoul(args
[1], NULL
, 0);
1522 else if (strcmp("run_and_init", args
[0]) == 0)
1524 reset_mode
= RESET_RUN_AND_INIT
;
1527 target
->run_and_halt_time
= strtoul(args
[1], NULL
, 0);
1532 command_print(cmd_ctx
, "usage: reset ['run', 'halt', 'init', 'run_and_halt', 'run_and_init]");
1535 target
->reset_mode
= reset_mode
;
1538 target_process_reset(cmd_ctx
);
1543 int handle_resume_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1546 target_t
*target
= get_current_target(cmd_ctx
);
1551 retval
= target
->type
->resume(target
, 1, 0, 1, 0); /* current pc, addr = 0, handle breakpoints, not debugging */
1553 retval
= target
->type
->resume(target
, 0, strtoul(args
[0], NULL
, 0), 1, 0); /* addr = args[0], handle breakpoints, not debugging */
1556 command_print(cmd_ctx
, "usage: resume [address]");
1560 if (retval
!= ERROR_OK
)
1564 case ERROR_TARGET_NOT_HALTED
:
1565 command_print(cmd_ctx
, "target not halted");
1568 command_print(cmd_ctx
, "unknown error... shutting down");
1576 int handle_step_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1578 target_t
*target
= get_current_target(cmd_ctx
);
1583 target
->type
->step(target
, 1, 0, 1); /* current pc, addr = 0, handle breakpoints */
1586 target
->type
->step(target
, 0, strtoul(args
[0], NULL
, 0), 1); /* addr = args[0], handle breakpoints */
1591 int handle_md_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1593 const int line_bytecnt
= 32;
1606 target_t
*target
= get_current_target(cmd_ctx
);
1612 count
= strtoul(args
[1], NULL
, 0);
1614 address
= strtoul(args
[0], NULL
, 0);
1620 size
= 4; line_modulo
= line_bytecnt
/ 4;
1623 size
= 2; line_modulo
= line_bytecnt
/ 2;
1626 size
= 1; line_modulo
= line_bytecnt
/ 1;
1632 buffer
= calloc(count
, size
);
1633 retval
= target
->type
->read_memory(target
, address
, size
, count
, buffer
);
1634 if (retval
!= ERROR_OK
)
1638 case ERROR_TARGET_UNALIGNED_ACCESS
:
1639 command_print(cmd_ctx
, "error: address not aligned");
1641 case ERROR_TARGET_NOT_HALTED
:
1642 command_print(cmd_ctx
, "error: target must be halted for memory accesses");
1644 case ERROR_TARGET_DATA_ABORT
:
1645 command_print(cmd_ctx
, "error: access caused data abort, system possibly corrupted");
1648 command_print(cmd_ctx
, "error: unknown error");
1656 for (i
= 0; i
< count
; i
++)
1658 if (i
%line_modulo
== 0)
1659 output_len
+= snprintf(output
+ output_len
, 128 - output_len
, "0x%8.8x: ", address
+ (i
*size
));
1664 output_len
+= snprintf(output
+ output_len
, 128 - output_len
, "%8.8x ", target_buffer_get_u32(target
, &buffer
[i
*4]));
1667 output_len
+= snprintf(output
+ output_len
, 128 - output_len
, "%4.4x ", target_buffer_get_u16(target
, &buffer
[i
*2]));
1670 output_len
+= snprintf(output
+ output_len
, 128 - output_len
, "%2.2x ", buffer
[i
*1]);
1674 if ((i
%line_modulo
== line_modulo
-1) || (i
== count
- 1))
1676 command_print(cmd_ctx
, output
);
1686 int handle_mw_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1691 target_t
*target
= get_current_target(cmd_ctx
);
1697 address
= strtoul(args
[0], NULL
, 0);
1698 value
= strtoul(args
[1], NULL
, 0);
1703 target_buffer_set_u32(target
, value_buf
, value
);
1704 retval
= target
->type
->write_memory(target
, address
, 4, 1, value_buf
);
1707 target_buffer_set_u16(target
, value_buf
, value
);
1708 retval
= target
->type
->write_memory(target
, address
, 2, 1, value_buf
);
1711 value_buf
[0] = value
;
1712 retval
= target
->type
->write_memory(target
, address
, 1, 1, value_buf
);
1720 case ERROR_TARGET_UNALIGNED_ACCESS
:
1721 command_print(cmd_ctx
, "error: address not aligned");
1723 case ERROR_TARGET_DATA_ABORT
:
1724 command_print(cmd_ctx
, "error: access caused data abort, system possibly corrupted");
1726 case ERROR_TARGET_NOT_HALTED
:
1727 command_print(cmd_ctx
, "error: target must be halted for memory accesses");
1732 command_print(cmd_ctx
, "error: unknown error");
1740 int handle_load_image_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1750 duration_t duration
;
1751 char *duration_text
;
1753 target_t
*target
= get_current_target(cmd_ctx
);
1757 command_print(cmd_ctx
, "usage: load_image <filename> [address] [type]");
1761 /* a base address isn't always necessary, default to 0x0 (i.e. don't relocate) */
1764 image
.base_address_set
= 1;
1765 image
.base_address
= strtoul(args
[1], NULL
, 0);
1769 image
.base_address_set
= 0;
1772 image
.start_address_set
= 0;
1774 duration_start_measure(&duration
);
1776 if (image_open(&image
, args
[0], (argc
>= 3) ? args
[2] : NULL
) != ERROR_OK
)
1778 command_print(cmd_ctx
, "load_image error: %s", image
.error_str
);
1783 for (i
= 0; i
< image
.num_sections
; i
++)
1785 buffer
= malloc(image
.sections
[i
].size
);
1788 command_print(cmd_ctx
, "error allocating buffer for section (%d bytes)", image
.sections
[i
].size
);
1791 if ((retval
= image_read_section(&image
, i
, 0x0, image
.sections
[i
].size
, buffer
, &buf_cnt
)) != ERROR_OK
)
1793 ERROR("image_read_section failed with error code: %i", retval
);
1794 command_print(cmd_ctx
, "image reading failed, download aborted");
1796 image_close(&image
);
1799 target_write_buffer(target
, image
.sections
[i
].base_address
, buf_cnt
, buffer
);
1800 image_size
+= buf_cnt
;
1801 command_print(cmd_ctx
, "%u byte written at address 0x%8.8x", buf_cnt
, image
.sections
[i
].base_address
);
1806 duration_stop_measure(&duration
, &duration_text
);
1807 command_print(cmd_ctx
, "downloaded %u byte in %s", image_size
, duration_text
);
1808 free(duration_text
);
1810 image_close(&image
);
1816 int handle_dump_image_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1824 duration_t duration
;
1825 char *duration_text
;
1827 target_t
*target
= get_current_target(cmd_ctx
);
1831 command_print(cmd_ctx
, "usage: dump_image <filename> <address> <size>");
1835 address
= strtoul(args
[1], NULL
, 0);
1836 size
= strtoul(args
[2], NULL
, 0);
1838 if ((address
& 3) || (size
& 3))
1840 command_print(cmd_ctx
, "only 32-bit aligned address and size are supported");
1844 if (fileio_open(&fileio
, args
[0], FILEIO_WRITE
, FILEIO_BINARY
) != ERROR_OK
)
1846 command_print(cmd_ctx
, "dump_image error: %s", fileio
.error_str
);
1850 duration_start_measure(&duration
);
1855 u32 this_run_size
= (size
> 560) ? 560 : size
;
1857 target
->type
->read_memory(target
, address
, 4, this_run_size
/ 4, buffer
);
1858 fileio_write(&fileio
, this_run_size
, buffer
, &size_written
);
1860 size
-= this_run_size
;
1861 address
+= this_run_size
;
1864 fileio_close(&fileio
);
1866 duration_stop_measure(&duration
, &duration_text
);
1867 command_print(cmd_ctx
, "dumped %"PRIi64
" byte in %s", fileio
.size
, duration_text
);
1868 free(duration_text
);
1874 int handle_verify_image_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1882 u32 mem_checksum
= 0;
1886 duration_t duration
;
1887 char *duration_text
;
1889 target_t
*target
= get_current_target(cmd_ctx
);
1893 command_print(cmd_ctx
, "usage: verify_image <file> [offset] [type]");
1899 ERROR("no target selected");
1903 duration_start_measure(&duration
);
1907 image
.base_address_set
= 1;
1908 image
.base_address
= strtoul(args
[1], NULL
, 0);
1912 image
.base_address_set
= 0;
1913 image
.base_address
= 0x0;
1916 image
.start_address_set
= 0;
1918 if (image_open(&image
, args
[0], (argc
== 3) ? args
[2] : NULL
) != ERROR_OK
)
1920 command_print(cmd_ctx
, "verify_image error: %s", image
.error_str
);
1925 for (i
= 0; i
< image
.num_sections
; i
++)
1927 buffer
= malloc(image
.sections
[i
].size
);
1930 command_print(cmd_ctx
, "error allocating buffer for section (%d bytes)", image
.sections
[i
].size
);
1933 if ((retval
= image_read_section(&image
, i
, 0x0, image
.sections
[i
].size
, buffer
, &buf_cnt
)) != ERROR_OK
)
1935 ERROR("image_read_section failed with error code: %i", retval
);
1936 command_print(cmd_ctx
, "image reading failed, verify aborted");
1938 image_close(&image
);
1942 /* calculate checksum of image */
1943 image_calculate_checksum( buffer
, buf_cnt
, &checksum
);
1945 retval
= target_checksum_memory(target
, image
.sections
[i
].base_address
, buf_cnt
, &mem_checksum
);
1947 if( retval
!= ERROR_OK
)
1949 command_print(cmd_ctx
, "image verify failed, verify aborted");
1951 image_close(&image
);
1955 if( checksum
!= mem_checksum
)
1957 /* failed crc checksum, fall back to a binary compare */
1960 command_print(cmd_ctx
, "image verify checksum failed - attempting binary compare");
1962 data
= (u8
*)malloc(buf_cnt
);
1964 /* Can we use 32bit word accesses? */
1966 int count
= buf_cnt
;
1967 if ((count
% 4) == 0)
1972 retval
= target
->type
->read_memory(target
, image
.sections
[i
].base_address
, size
, count
, data
);
1974 if (retval
== ERROR_OK
)
1977 for (t
= 0; t
< buf_cnt
; t
++)
1979 if (data
[t
] != buffer
[t
])
1981 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
]);
1984 image_close(&image
);
1994 image_size
+= buf_cnt
;
1997 duration_stop_measure(&duration
, &duration_text
);
1998 command_print(cmd_ctx
, "verified %u bytes in %s", image_size
, duration_text
);
1999 free(duration_text
);
2001 image_close(&image
);
2006 int handle_bp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2009 target_t
*target
= get_current_target(cmd_ctx
);
2013 breakpoint_t
*breakpoint
= target
->breakpoints
;
2017 if (breakpoint
->type
== BKPT_SOFT
)
2019 char* buf
= buf_to_str(breakpoint
->orig_instr
, breakpoint
->length
, 16);
2020 command_print(cmd_ctx
, "0x%8.8x, 0x%x, %i, 0x%s", breakpoint
->address
, breakpoint
->length
, breakpoint
->set
, buf
);
2025 command_print(cmd_ctx
, "0x%8.8x, 0x%x, %i", breakpoint
->address
, breakpoint
->length
, breakpoint
->set
);
2027 breakpoint
= breakpoint
->next
;
2035 length
= strtoul(args
[1], NULL
, 0);
2038 if (strcmp(args
[2], "hw") == 0)
2041 if ((retval
= breakpoint_add(target
, strtoul(args
[0], NULL
, 0), length
, hw
)) != ERROR_OK
)
2045 case ERROR_TARGET_NOT_HALTED
:
2046 command_print(cmd_ctx
, "target must be halted to set breakpoints");
2048 case ERROR_TARGET_RESOURCE_NOT_AVAILABLE
:
2049 command_print(cmd_ctx
, "no more breakpoints available");
2052 command_print(cmd_ctx
, "unknown error, breakpoint not set");
2058 command_print(cmd_ctx
, "breakpoint added at address 0x%8.8x", strtoul(args
[0], NULL
, 0));
2063 command_print(cmd_ctx
, "usage: bp <address> <length> ['hw']");
2069 int handle_rbp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2071 target_t
*target
= get_current_target(cmd_ctx
);
2074 breakpoint_remove(target
, strtoul(args
[0], NULL
, 0));
2079 int handle_wp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2081 target_t
*target
= get_current_target(cmd_ctx
);
2086 watchpoint_t
*watchpoint
= target
->watchpoints
;
2090 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
);
2091 watchpoint
= watchpoint
->next
;
2096 enum watchpoint_rw type
= WPT_ACCESS
;
2097 u32 data_value
= 0x0;
2098 u32 data_mask
= 0xffffffff;
2114 command_print(cmd_ctx
, "usage: wp <address> <length> [r/w/a] [value] [mask]");
2120 data_value
= strtoul(args
[3], NULL
, 0);
2124 data_mask
= strtoul(args
[4], NULL
, 0);
2127 if ((retval
= watchpoint_add(target
, strtoul(args
[0], NULL
, 0),
2128 strtoul(args
[1], NULL
, 0), type
, data_value
, data_mask
)) != ERROR_OK
)
2132 case ERROR_TARGET_NOT_HALTED
:
2133 command_print(cmd_ctx
, "target must be halted to set watchpoints");
2135 case ERROR_TARGET_RESOURCE_NOT_AVAILABLE
:
2136 command_print(cmd_ctx
, "no more watchpoints available");
2139 command_print(cmd_ctx
, "unknown error, watchpoint not set");
2146 command_print(cmd_ctx
, "usage: wp <address> <length> [r/w/a] [value] [mask]");
2152 int handle_rwp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2154 target_t
*target
= get_current_target(cmd_ctx
);
2157 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)