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
);
316 target
= target
->next
;
318 jtag_execute_queue();
323 int target_init(struct command_context_s
*cmd_ctx
)
325 target_t
*target
= targets
;
329 if (target
->type
->init_target(cmd_ctx
, target
) != ERROR_OK
)
331 ERROR("target '%s' init failed", target
->type
->name
);
334 target
= target
->next
;
339 target_register_user_commands(cmd_ctx
);
340 target_register_timer_callback(handle_target
, 100, 1, NULL
);
343 if (startup_mode
== DAEMON_RESET
)
344 target_process_reset(cmd_ctx
);
349 int target_register_event_callback(int (*callback
)(struct target_s
*target
, enum target_event event
, void *priv
), void *priv
)
351 target_event_callback_t
**callbacks_p
= &target_event_callbacks
;
353 if (callback
== NULL
)
355 return ERROR_INVALID_ARGUMENTS
;
360 while ((*callbacks_p
)->next
)
361 callbacks_p
= &((*callbacks_p
)->next
);
362 callbacks_p
= &((*callbacks_p
)->next
);
365 (*callbacks_p
) = malloc(sizeof(target_event_callback_t
));
366 (*callbacks_p
)->callback
= callback
;
367 (*callbacks_p
)->priv
= priv
;
368 (*callbacks_p
)->next
= NULL
;
373 int target_register_timer_callback(int (*callback
)(void *priv
), int time_ms
, int periodic
, void *priv
)
375 target_timer_callback_t
**callbacks_p
= &target_timer_callbacks
;
378 if (callback
== NULL
)
380 return ERROR_INVALID_ARGUMENTS
;
385 while ((*callbacks_p
)->next
)
386 callbacks_p
= &((*callbacks_p
)->next
);
387 callbacks_p
= &((*callbacks_p
)->next
);
390 (*callbacks_p
) = malloc(sizeof(target_timer_callback_t
));
391 (*callbacks_p
)->callback
= callback
;
392 (*callbacks_p
)->periodic
= periodic
;
393 (*callbacks_p
)->time_ms
= time_ms
;
395 gettimeofday(&now
, NULL
);
396 (*callbacks_p
)->when
.tv_usec
= now
.tv_usec
+ (time_ms
% 1000) * 1000;
397 time_ms
-= (time_ms
% 1000);
398 (*callbacks_p
)->when
.tv_sec
= now
.tv_sec
+ (time_ms
/ 1000);
399 if ((*callbacks_p
)->when
.tv_usec
> 1000000)
401 (*callbacks_p
)->when
.tv_usec
= (*callbacks_p
)->when
.tv_usec
- 1000000;
402 (*callbacks_p
)->when
.tv_sec
+= 1;
405 (*callbacks_p
)->priv
= priv
;
406 (*callbacks_p
)->next
= NULL
;
411 int target_unregister_event_callback(int (*callback
)(struct target_s
*target
, enum target_event event
, void *priv
), void *priv
)
413 target_event_callback_t
**p
= &target_event_callbacks
;
414 target_event_callback_t
*c
= target_event_callbacks
;
416 if (callback
== NULL
)
418 return ERROR_INVALID_ARGUMENTS
;
423 target_event_callback_t
*next
= c
->next
;
424 if ((c
->callback
== callback
) && (c
->priv
== priv
))
438 int target_unregister_timer_callback(int (*callback
)(void *priv
), void *priv
)
440 target_timer_callback_t
**p
= &target_timer_callbacks
;
441 target_timer_callback_t
*c
= target_timer_callbacks
;
443 if (callback
== NULL
)
445 return ERROR_INVALID_ARGUMENTS
;
450 target_timer_callback_t
*next
= c
->next
;
451 if ((c
->callback
== callback
) && (c
->priv
== priv
))
465 int target_call_event_callbacks(target_t
*target
, enum target_event event
)
467 target_event_callback_t
*callback
= target_event_callbacks
;
468 target_event_callback_t
*next_callback
;
470 DEBUG("target event %i", event
);
474 next_callback
= callback
->next
;
475 callback
->callback(target
, event
, callback
->priv
);
476 callback
= next_callback
;
482 int target_call_timer_callbacks()
484 target_timer_callback_t
*callback
= target_timer_callbacks
;
485 target_timer_callback_t
*next_callback
;
488 gettimeofday(&now
, NULL
);
492 next_callback
= callback
->next
;
494 if (((now
.tv_sec
>= callback
->when
.tv_sec
) && (now
.tv_usec
>= callback
->when
.tv_usec
))
495 || (now
.tv_sec
> callback
->when
.tv_sec
))
497 callback
->callback(callback
->priv
);
498 if (callback
->periodic
)
500 int time_ms
= callback
->time_ms
;
501 callback
->when
.tv_usec
= now
.tv_usec
+ (time_ms
% 1000) * 1000;
502 time_ms
-= (time_ms
% 1000);
503 callback
->when
.tv_sec
= now
.tv_sec
+ time_ms
/ 1000;
504 if (callback
->when
.tv_usec
> 1000000)
506 callback
->when
.tv_usec
= callback
->when
.tv_usec
- 1000000;
507 callback
->when
.tv_sec
+= 1;
511 target_unregister_timer_callback(callback
->callback
, callback
->priv
);
514 callback
= next_callback
;
520 int target_alloc_working_area(struct target_s
*target
, u32 size
, working_area_t
**area
)
522 working_area_t
*c
= target
->working_areas
;
523 working_area_t
*new_wa
= NULL
;
525 /* only allocate multiples of 4 byte */
528 ERROR("BUG: code tried to allocate unaligned number of bytes, padding");
529 size
= CEIL(size
, 4);
532 /* see if there's already a matching working area */
535 if ((c
->free
) && (c
->size
== size
))
543 /* if not, allocate a new one */
546 working_area_t
**p
= &target
->working_areas
;
547 u32 first_free
= target
->working_area
;
548 u32 free_size
= target
->working_area_size
;
550 DEBUG("allocating new working area");
552 c
= target
->working_areas
;
555 first_free
+= c
->size
;
556 free_size
-= c
->size
;
561 if (free_size
< size
)
563 WARNING("not enough working area available");
564 return ERROR_TARGET_RESOURCE_NOT_AVAILABLE
;
567 new_wa
= malloc(sizeof(working_area_t
));
570 new_wa
->address
= first_free
;
572 if (target
->backup_working_area
)
574 new_wa
->backup
= malloc(new_wa
->size
);
575 target
->type
->read_memory(target
, new_wa
->address
, 4, new_wa
->size
/ 4, new_wa
->backup
);
579 new_wa
->backup
= NULL
;
582 /* put new entry in list */
586 /* mark as used, and return the new (reused) area */
596 int target_free_working_area(struct target_s
*target
, working_area_t
*area
)
601 if (target
->backup_working_area
)
602 target
->type
->write_memory(target
, area
->address
, 4, area
->size
/ 4, area
->backup
);
606 /* mark user pointer invalid */
613 int target_free_all_working_areas(struct target_s
*target
)
615 working_area_t
*c
= target
->working_areas
;
619 working_area_t
*next
= c
->next
;
620 target_free_working_area(target
, c
);
630 target
->working_areas
= NULL
;
635 int target_register_commands(struct command_context_s
*cmd_ctx
)
637 register_command(cmd_ctx
, NULL
, "target", handle_target_command
, COMMAND_CONFIG
, NULL
);
638 register_command(cmd_ctx
, NULL
, "targets", handle_targets_command
, COMMAND_EXEC
, NULL
);
639 register_command(cmd_ctx
, NULL
, "daemon_startup", handle_daemon_startup_command
, COMMAND_CONFIG
, NULL
);
640 register_command(cmd_ctx
, NULL
, "target_script", handle_target_script_command
, COMMAND_CONFIG
, NULL
);
641 register_command(cmd_ctx
, NULL
, "run_and_halt_time", handle_run_and_halt_time_command
, COMMAND_CONFIG
, NULL
);
642 register_command(cmd_ctx
, NULL
, "working_area", handle_working_area_command
, COMMAND_CONFIG
, NULL
);
647 int target_write_buffer(struct target_s
*target
, u32 address
, u32 size
, u8
*buffer
)
651 DEBUG("writing buffer of %i byte at 0x%8.8x", size
, address
);
653 /* handle writes of less than 4 byte */
656 if ((retval
= target
->type
->write_memory(target
, address
, 1, size
, buffer
)) != ERROR_OK
)
661 /* handle unaligned head bytes */
664 int unaligned
= 4 - (address
% 4);
666 if ((retval
= target
->type
->write_memory(target
, address
, 1, unaligned
, buffer
)) != ERROR_OK
)
670 address
+= unaligned
;
674 /* handle aligned words */
677 int aligned
= size
- (size
% 4);
679 /* use bulk writes above a certain limit. This may have to be changed */
682 if ((retval
= target
->type
->bulk_write_memory(target
, address
, aligned
/ 4, buffer
)) != ERROR_OK
)
687 if ((retval
= target
->type
->write_memory(target
, address
, 4, aligned
/ 4, buffer
)) != ERROR_OK
)
696 /* handle tail writes of less than 4 bytes */
699 if ((retval
= target
->type
->write_memory(target
, address
, 1, size
, buffer
)) != ERROR_OK
)
706 int target_read_buffer(struct target_s
*target
, u32 address
, u32 size
, u8
*buffer
)
710 DEBUG("reading buffer of %i byte at 0x%8.8x", size
, address
);
712 /* handle reads of less than 4 byte */
715 if ((retval
= target
->type
->read_memory(target
, address
, 1, size
, buffer
)) != ERROR_OK
)
720 /* handle unaligned head bytes */
723 int unaligned
= 4 - (address
% 4);
725 if ((retval
= target
->type
->read_memory(target
, address
, 1, unaligned
, buffer
)) != ERROR_OK
)
729 address
+= unaligned
;
733 /* handle aligned words */
736 int aligned
= size
- (size
% 4);
738 if ((retval
= target
->type
->read_memory(target
, address
, 4, aligned
/ 4, buffer
)) != ERROR_OK
)
746 /* handle tail writes of less than 4 bytes */
749 if ((retval
= target
->type
->read_memory(target
, address
, 1, size
, buffer
)) != ERROR_OK
)
756 int target_checksum_memory(struct target_s
*target
, u32 address
, u32 size
, u32
* crc
)
763 if ((retval
= target
->type
->checksum_memory(target
, address
,
764 size
, &checksum
)) == ERROR_TARGET_RESOURCE_NOT_AVAILABLE
)
766 buffer
= malloc(size
);
769 ERROR("error allocating buffer for section (%d bytes)", size
);
772 target_read_buffer(target
, address
, size
, buffer
);
774 /* convert to target endianess */
775 for (i
= 0; i
< (size
/sizeof(u32
)); i
++)
778 target_data
= target_buffer_get_u32(target
, &buffer
[i
*sizeof(u32
)]);
779 target_buffer_set_u32(target
, &buffer
[i
*sizeof(u32
)], target_data
);
782 retval
= image_calculate_checksum( buffer
, size
, &checksum
);
791 int target_read_u32(struct target_s
*target
, u32 address
, u32
*value
)
795 int retval
= target
->type
->read_memory(target
, address
, 4, 1, value_buf
);
797 if (retval
== ERROR_OK
)
799 *value
= target_buffer_get_u32(target
, value_buf
);
800 DEBUG("address: 0x%8.8x, value: 0x%8.8x", address
, *value
);
805 DEBUG("address: 0x%8.8x failed", address
);
811 int target_read_u16(struct target_s
*target
, u32 address
, u16
*value
)
815 int retval
= target
->type
->read_memory(target
, address
, 2, 1, value_buf
);
817 if (retval
== ERROR_OK
)
819 *value
= target_buffer_get_u16(target
, value_buf
);
820 DEBUG("address: 0x%8.8x, value: 0x%4.4x", address
, *value
);
825 DEBUG("address: 0x%8.8x failed", address
);
831 int target_read_u8(struct target_s
*target
, u32 address
, u8
*value
)
833 int retval
= target
->type
->read_memory(target
, address
, 1, 1, value
);
835 if (retval
== ERROR_OK
)
837 DEBUG("address: 0x%8.8x, value: 0x%2.2x", address
, *value
);
842 DEBUG("address: 0x%8.8x failed", address
);
848 int target_write_u32(struct target_s
*target
, u32 address
, u32 value
)
853 DEBUG("address: 0x%8.8x, value: 0x%8.8x", address
, value
);
855 target_buffer_set_u32(target
, value_buf
, value
);
856 if ((retval
= target
->type
->write_memory(target
, address
, 4, 1, value_buf
)) != ERROR_OK
)
858 DEBUG("failed: %i", retval
);
864 int target_write_u16(struct target_s
*target
, u32 address
, u16 value
)
869 DEBUG("address: 0x%8.8x, value: 0x%8.8x", address
, value
);
871 target_buffer_set_u16(target
, value_buf
, value
);
872 if ((retval
= target
->type
->write_memory(target
, address
, 2, 1, value_buf
)) != ERROR_OK
)
874 DEBUG("failed: %i", retval
);
880 int target_write_u8(struct target_s
*target
, u32 address
, u8 value
)
884 DEBUG("address: 0x%8.8x, value: 0x%2.2x", address
, value
);
886 if ((retval
= target
->type
->read_memory(target
, address
, 1, 1, &value
)) != ERROR_OK
)
888 DEBUG("failed: %i", retval
);
894 int target_register_user_commands(struct command_context_s
*cmd_ctx
)
896 register_command(cmd_ctx
, NULL
, "reg", handle_reg_command
, COMMAND_EXEC
, NULL
);
897 register_command(cmd_ctx
, NULL
, "poll", handle_poll_command
, COMMAND_EXEC
, "poll target state");
898 register_command(cmd_ctx
, NULL
, "wait_halt", handle_wait_halt_command
, COMMAND_EXEC
, "wait for target halt [time (s)]");
899 register_command(cmd_ctx
, NULL
, "halt", handle_halt_command
, COMMAND_EXEC
, "halt target");
900 register_command(cmd_ctx
, NULL
, "resume", handle_resume_command
, COMMAND_EXEC
, "resume target [addr]");
901 register_command(cmd_ctx
, NULL
, "step", handle_step_command
, COMMAND_EXEC
, "step one instruction from current PC or [addr]");
902 register_command(cmd_ctx
, NULL
, "reset", handle_reset_command
, COMMAND_EXEC
, "reset target [run|halt|init|run_and_halt|run_and_init]");
903 register_command(cmd_ctx
, NULL
, "soft_reset_halt", handle_soft_reset_halt_command
, COMMAND_EXEC
, "halt the target and do a soft reset");
905 register_command(cmd_ctx
, NULL
, "mdw", handle_md_command
, COMMAND_EXEC
, "display memory words <addr> [count]");
906 register_command(cmd_ctx
, NULL
, "mdh", handle_md_command
, COMMAND_EXEC
, "display memory half-words <addr> [count]");
907 register_command(cmd_ctx
, NULL
, "mdb", handle_md_command
, COMMAND_EXEC
, "display memory bytes <addr> [count]");
909 register_command(cmd_ctx
, NULL
, "mww", handle_mw_command
, COMMAND_EXEC
, "write memory word <addr> <value>");
910 register_command(cmd_ctx
, NULL
, "mwh", handle_mw_command
, COMMAND_EXEC
, "write memory half-word <addr> <value>");
911 register_command(cmd_ctx
, NULL
, "mwb", handle_mw_command
, COMMAND_EXEC
, "write memory byte <addr> <value>");
913 register_command(cmd_ctx
, NULL
, "bp", handle_bp_command
, COMMAND_EXEC
, "set breakpoint <address> <length> [hw]");
914 register_command(cmd_ctx
, NULL
, "rbp", handle_rbp_command
, COMMAND_EXEC
, "remove breakpoint <adress>");
915 register_command(cmd_ctx
, NULL
, "wp", handle_wp_command
, COMMAND_EXEC
, "set watchpoint <address> <length> <r/w/a> [value] [mask]");
916 register_command(cmd_ctx
, NULL
, "rwp", handle_rwp_command
, COMMAND_EXEC
, "remove watchpoint <adress>");
918 register_command(cmd_ctx
, NULL
, "load_image", handle_load_image_command
, COMMAND_EXEC
, "load_image <file> <address> ['bin'|'ihex'|'elf'|'s19']");
919 register_command(cmd_ctx
, NULL
, "dump_image", handle_dump_image_command
, COMMAND_EXEC
, "dump_image <file> <address> <size>");
920 register_command(cmd_ctx
, NULL
, "verify_image", handle_verify_image_command
, COMMAND_EXEC
, "verify_image <file> [offset] [type]");
921 register_command(cmd_ctx
, NULL
, "load_binary", handle_load_image_command
, COMMAND_EXEC
, "[DEPRECATED] load_binary <file> <address>");
922 register_command(cmd_ctx
, NULL
, "dump_binary", handle_dump_image_command
, COMMAND_EXEC
, "[DEPRECATED] dump_binary <file> <address> <size>");
924 target_request_register_commands(cmd_ctx
);
925 trace_register_commands(cmd_ctx
);
930 int handle_targets_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
932 target_t
*target
= targets
;
937 int num
= strtoul(args
[0], NULL
, 0);
942 target
= target
->next
;
946 cmd_ctx
->current_target
= num
;
948 command_print(cmd_ctx
, "%i is out of bounds, only %i targets are configured", num
, count
);
955 command_print(cmd_ctx
, "%i: %s (%s), state: %s", count
++, target
->type
->name
, target_endianess_strings
[target
->endianness
], target_state_strings
[target
->state
]);
956 target
= target
->next
;
962 int handle_target_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
969 ERROR("target command requires at least three arguments: <type> <endianess> <reset_mode>");
973 /* search for the specified target */
974 if (args
[0] && (args
[0][0] != 0))
976 for (i
= 0; target_types
[i
]; i
++)
978 if (strcmp(args
[0], target_types
[i
]->name
) == 0)
980 target_t
**last_target_p
= &targets
;
982 /* register target specific commands */
983 if (target_types
[i
]->register_commands(cmd_ctx
) != ERROR_OK
)
985 ERROR("couldn't register '%s' commands", args
[0]);
991 while ((*last_target_p
)->next
)
992 last_target_p
= &((*last_target_p
)->next
);
993 last_target_p
= &((*last_target_p
)->next
);
996 *last_target_p
= malloc(sizeof(target_t
));
998 (*last_target_p
)->type
= target_types
[i
];
1000 if (strcmp(args
[1], "big") == 0)
1001 (*last_target_p
)->endianness
= TARGET_BIG_ENDIAN
;
1002 else if (strcmp(args
[1], "little") == 0)
1003 (*last_target_p
)->endianness
= TARGET_LITTLE_ENDIAN
;
1006 ERROR("endianness must be either 'little' or 'big', not '%s'", args
[1]);
1010 /* what to do on a target reset */
1011 if (strcmp(args
[2], "reset_halt") == 0)
1012 (*last_target_p
)->reset_mode
= RESET_HALT
;
1013 else if (strcmp(args
[2], "reset_run") == 0)
1014 (*last_target_p
)->reset_mode
= RESET_RUN
;
1015 else if (strcmp(args
[2], "reset_init") == 0)
1016 (*last_target_p
)->reset_mode
= RESET_INIT
;
1017 else if (strcmp(args
[2], "run_and_halt") == 0)
1018 (*last_target_p
)->reset_mode
= RESET_RUN_AND_HALT
;
1019 else if (strcmp(args
[2], "run_and_init") == 0)
1020 (*last_target_p
)->reset_mode
= RESET_RUN_AND_INIT
;
1023 ERROR("unknown target startup mode %s", args
[2]);
1026 (*last_target_p
)->run_and_halt_time
= 1000; /* default 1s */
1028 (*last_target_p
)->reset_script
= NULL
;
1029 (*last_target_p
)->post_halt_script
= NULL
;
1030 (*last_target_p
)->pre_resume_script
= NULL
;
1031 (*last_target_p
)->gdb_program_script
= NULL
;
1033 (*last_target_p
)->working_area
= 0x0;
1034 (*last_target_p
)->working_area_size
= 0x0;
1035 (*last_target_p
)->working_areas
= NULL
;
1036 (*last_target_p
)->backup_working_area
= 0;
1038 (*last_target_p
)->state
= TARGET_UNKNOWN
;
1039 (*last_target_p
)->reg_cache
= NULL
;
1040 (*last_target_p
)->breakpoints
= NULL
;
1041 (*last_target_p
)->watchpoints
= NULL
;
1042 (*last_target_p
)->next
= NULL
;
1043 (*last_target_p
)->arch_info
= NULL
;
1045 /* initialize trace information */
1046 (*last_target_p
)->trace_info
= malloc(sizeof(trace_t
));
1047 (*last_target_p
)->trace_info
->num_trace_points
= 0;
1048 (*last_target_p
)->trace_info
->trace_points_size
= 0;
1049 (*last_target_p
)->trace_info
->trace_points
= NULL
;
1050 (*last_target_p
)->trace_info
->trace_history_size
= 0;
1051 (*last_target_p
)->trace_info
->trace_history
= NULL
;
1052 (*last_target_p
)->trace_info
->trace_history_pos
= 0;
1053 (*last_target_p
)->trace_info
->trace_history_overflowed
= 0;
1055 (*last_target_p
)->dbgmsg
= NULL
;
1056 (*last_target_p
)->dbg_msg_enabled
= 0;
1058 (*last_target_p
)->type
->target_command(cmd_ctx
, cmd
, args
, argc
, *last_target_p
);
1066 /* no matching target found */
1069 ERROR("target '%s' not found", args
[0]);
1076 /* usage: target_script <target#> <event> <script_file> */
1077 int handle_target_script_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1079 target_t
*target
= NULL
;
1083 ERROR("incomplete target_script command");
1087 target
= get_target_by_num(strtoul(args
[0], NULL
, 0));
1091 ERROR("target number '%s' not defined", args
[0]);
1095 if (strcmp(args
[1], "reset") == 0)
1097 if (target
->reset_script
)
1098 free(target
->reset_script
);
1099 target
->reset_script
= strdup(args
[2]);
1101 else if (strcmp(args
[1], "post_halt") == 0)
1103 if (target
->post_halt_script
)
1104 free(target
->post_halt_script
);
1105 target
->post_halt_script
= strdup(args
[2]);
1107 else if (strcmp(args
[1], "pre_resume") == 0)
1109 if (target
->pre_resume_script
)
1110 free(target
->pre_resume_script
);
1111 target
->pre_resume_script
= strdup(args
[2]);
1113 else if (strcmp(args
[1], "gdb_program_config") == 0)
1115 if (target
->gdb_program_script
)
1116 free(target
->gdb_program_script
);
1117 target
->gdb_program_script
= strdup(args
[2]);
1121 ERROR("unknown event type: '%s", args
[1]);
1128 int handle_run_and_halt_time_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1130 target_t
*target
= NULL
;
1134 ERROR("incomplete run_and_halt_time command");
1138 target
= get_target_by_num(strtoul(args
[0], NULL
, 0));
1142 ERROR("target number '%s' not defined", args
[0]);
1146 target
->run_and_halt_time
= strtoul(args
[1], NULL
, 0);
1151 int handle_working_area_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1153 target_t
*target
= NULL
;
1157 ERROR("incomplete working_area command. usage: working_area <target#> <address> <size> <'backup'|'nobackup'>");
1161 target
= get_target_by_num(strtoul(args
[0], NULL
, 0));
1165 ERROR("target number '%s' not defined", args
[0]);
1169 target
->working_area
= strtoul(args
[1], NULL
, 0);
1170 target
->working_area_size
= strtoul(args
[2], NULL
, 0);
1172 if (strcmp(args
[3], "backup") == 0)
1174 target
->backup_working_area
= 1;
1176 else if (strcmp(args
[3], "nobackup") == 0)
1178 target
->backup_working_area
= 0;
1182 ERROR("unrecognized <backup|nobackup> argument (%s)", args
[3]);
1190 /* process target state changes */
1191 int handle_target(void *priv
)
1194 target_t
*target
= targets
;
1198 /* only poll if target isn't already halted */
1199 if (target
->state
!= TARGET_HALTED
)
1201 if (target_continous_poll
)
1202 if ((retval
= target
->type
->poll(target
)) < 0)
1204 ERROR("couldn't poll target. It's due for a reset.");
1208 target
= target
->next
;
1214 int handle_reg_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1223 target
= get_current_target(cmd_ctx
);
1225 /* list all available registers for the current target */
1228 reg_cache_t
*cache
= target
->reg_cache
;
1234 for (i
= 0; i
< cache
->num_regs
; i
++)
1236 value
= buf_to_str(cache
->reg_list
[i
].value
, cache
->reg_list
[i
].size
, 16);
1237 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
);
1240 cache
= cache
->next
;
1246 /* access a single register by its ordinal number */
1247 if ((args
[0][0] >= '0') && (args
[0][0] <= '9'))
1249 int num
= strtoul(args
[0], NULL
, 0);
1250 reg_cache_t
*cache
= target
->reg_cache
;
1256 for (i
= 0; i
< cache
->num_regs
; i
++)
1260 reg
= &cache
->reg_list
[i
];
1266 cache
= cache
->next
;
1271 command_print(cmd_ctx
, "%i is out of bounds, the current target has only %i registers (0 - %i)", num
, count
, count
- 1);
1274 } else /* access a single register by its name */
1276 reg
= register_get_by_name(target
->reg_cache
, args
[0], 1);
1280 command_print(cmd_ctx
, "register %s not found in current target", args
[0]);
1285 /* display a register */
1286 if ((argc
== 1) || ((argc
== 2) && !((args
[1][0] >= '0') && (args
[1][0] <= '9'))))
1288 if ((argc
== 2) && (strcmp(args
[1], "force") == 0))
1291 if (reg
->valid
== 0)
1293 reg_arch_type_t
*arch_type
= register_get_arch_type(reg
->arch_type
);
1294 if (arch_type
== NULL
)
1296 ERROR("BUG: encountered unregistered arch type");
1299 arch_type
->get(reg
);
1301 value
= buf_to_str(reg
->value
, reg
->size
, 16);
1302 command_print(cmd_ctx
, "%s (/%i): 0x%s", reg
->name
, reg
->size
, value
);
1307 /* set register value */
1310 u8
*buf
= malloc(CEIL(reg
->size
, 8));
1311 str_to_buf(args
[1], strlen(args
[1]), buf
, reg
->size
, 0);
1313 reg_arch_type_t
*arch_type
= register_get_arch_type(reg
->arch_type
);
1314 if (arch_type
== NULL
)
1316 ERROR("BUG: encountered unregistered arch type");
1320 arch_type
->set(reg
, buf
);
1322 value
= buf_to_str(reg
->value
, reg
->size
, 16);
1323 command_print(cmd_ctx
, "%s (/%i): 0x%s", reg
->name
, reg
->size
, value
);
1331 command_print(cmd_ctx
, "usage: reg <#|name> [value]");
1336 int handle_poll_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1338 target_t
*target
= get_current_target(cmd_ctx
);
1343 command_print(cmd_ctx
, "target state: %s", target_state_strings
[target
->type
->poll(target
)]);
1344 if (target
->state
== TARGET_HALTED
)
1346 target
->type
->arch_state(target
, buffer
, 512);
1348 command_print(cmd_ctx
, "%s", buffer
);
1353 if (strcmp(args
[0], "on") == 0)
1355 target_continous_poll
= 1;
1357 else if (strcmp(args
[0], "off") == 0)
1359 target_continous_poll
= 0;
1367 int handle_wait_halt_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1369 target_t
*target
= get_current_target(cmd_ctx
);
1370 struct timeval timeout
, now
;
1372 gettimeofday(&timeout
, NULL
);
1374 timeval_add_time(&timeout
, 5, 0);
1378 timeval_add_time(&timeout
, strtoul(args
[0], &end
, 0), 0);
1380 command_print(cmd_ctx
, "usage: wait_halt [seconds]");
1385 command_print(cmd_ctx
, "waiting for target halted...");
1387 while(target
->type
->poll(target
))
1389 if (target
->state
== TARGET_HALTED
)
1391 command_print(cmd_ctx
, "target halted");
1394 target_call_timer_callbacks();
1396 gettimeofday(&now
, NULL
);
1397 if ((now
.tv_sec
>= timeout
.tv_sec
) && (now
.tv_usec
>= timeout
.tv_usec
))
1399 command_print(cmd_ctx
, "timed out while waiting for target halt");
1400 ERROR("timed out while waiting for target halt");
1408 int handle_halt_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1411 target_t
*target
= get_current_target(cmd_ctx
);
1415 command_print(cmd_ctx
, "requesting target halt...");
1417 if ((retval
= target
->type
->halt(target
)) != ERROR_OK
)
1421 case ERROR_TARGET_ALREADY_HALTED
:
1422 command_print(cmd_ctx
, "target already halted");
1424 case ERROR_TARGET_TIMEOUT
:
1425 command_print(cmd_ctx
, "target timed out... shutting down");
1428 command_print(cmd_ctx
, "unknown error... shutting down");
1437 /* what to do on daemon startup */
1438 int handle_daemon_startup_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1442 if (strcmp(args
[0], "attach") == 0)
1444 startup_mode
= DAEMON_ATTACH
;
1447 else if (strcmp(args
[0], "reset") == 0)
1449 startup_mode
= DAEMON_RESET
;
1454 WARNING("invalid daemon_startup configuration directive: %s", args
[0]);
1459 int handle_soft_reset_halt_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1461 target_t
*target
= get_current_target(cmd_ctx
);
1464 command_print(cmd_ctx
, "requesting target halt and executing a soft reset");
1466 if ((retval
= target
->type
->soft_reset_halt(target
)) != ERROR_OK
)
1470 case ERROR_TARGET_TIMEOUT
:
1471 command_print(cmd_ctx
, "target timed out... shutting down");
1474 command_print(cmd_ctx
, "unknown error... shutting down");
1482 int handle_reset_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1484 target_t
*target
= get_current_target(cmd_ctx
);
1485 enum target_reset_mode reset_mode
= RESET_RUN
;
1491 if (strcmp("run", args
[0]) == 0)
1492 reset_mode
= RESET_RUN
;
1493 else if (strcmp("halt", args
[0]) == 0)
1494 reset_mode
= RESET_HALT
;
1495 else if (strcmp("init", args
[0]) == 0)
1496 reset_mode
= RESET_INIT
;
1497 else if (strcmp("run_and_halt", args
[0]) == 0)
1499 reset_mode
= RESET_RUN_AND_HALT
;
1502 target
->run_and_halt_time
= strtoul(args
[1], NULL
, 0);
1505 else if (strcmp("run_and_init", args
[0]) == 0)
1507 reset_mode
= RESET_RUN_AND_INIT
;
1510 target
->run_and_halt_time
= strtoul(args
[1], NULL
, 0);
1515 command_print(cmd_ctx
, "usage: reset ['run', 'halt', 'init', 'run_and_halt', 'run_and_init]");
1518 target
->reset_mode
= reset_mode
;
1521 target_process_reset(cmd_ctx
);
1526 int handle_resume_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1529 target_t
*target
= get_current_target(cmd_ctx
);
1534 retval
= target
->type
->resume(target
, 1, 0, 1, 0); /* current pc, addr = 0, handle breakpoints, not debugging */
1536 retval
= target
->type
->resume(target
, 0, strtoul(args
[0], NULL
, 0), 1, 0); /* addr = args[0], handle breakpoints, not debugging */
1539 command_print(cmd_ctx
, "usage: resume [address]");
1543 if (retval
!= ERROR_OK
)
1547 case ERROR_TARGET_NOT_HALTED
:
1548 command_print(cmd_ctx
, "target not halted");
1551 command_print(cmd_ctx
, "unknown error... shutting down");
1559 int handle_step_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1561 target_t
*target
= get_current_target(cmd_ctx
);
1566 target
->type
->step(target
, 1, 0, 1); /* current pc, addr = 0, handle breakpoints */
1569 target
->type
->step(target
, 0, strtoul(args
[0], NULL
, 0), 1); /* addr = args[0], handle breakpoints */
1574 int handle_md_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1576 const int line_bytecnt
= 32;
1589 target_t
*target
= get_current_target(cmd_ctx
);
1595 count
= strtoul(args
[1], NULL
, 0);
1597 address
= strtoul(args
[0], NULL
, 0);
1603 size
= 4; line_modulo
= line_bytecnt
/ 4;
1606 size
= 2; line_modulo
= line_bytecnt
/ 2;
1609 size
= 1; line_modulo
= line_bytecnt
/ 1;
1615 buffer
= calloc(count
, size
);
1616 retval
= target
->type
->read_memory(target
, address
, size
, count
, buffer
);
1617 if (retval
!= ERROR_OK
)
1621 case ERROR_TARGET_UNALIGNED_ACCESS
:
1622 command_print(cmd_ctx
, "error: address not aligned");
1624 case ERROR_TARGET_NOT_HALTED
:
1625 command_print(cmd_ctx
, "error: target must be halted for memory accesses");
1627 case ERROR_TARGET_DATA_ABORT
:
1628 command_print(cmd_ctx
, "error: access caused data abort, system possibly corrupted");
1631 command_print(cmd_ctx
, "error: unknown error");
1639 for (i
= 0; i
< count
; i
++)
1641 if (i
%line_modulo
== 0)
1642 output_len
+= snprintf(output
+ output_len
, 128 - output_len
, "0x%8.8x: ", address
+ (i
*size
));
1647 output_len
+= snprintf(output
+ output_len
, 128 - output_len
, "%8.8x ", target_buffer_get_u32(target
, &buffer
[i
*4]));
1650 output_len
+= snprintf(output
+ output_len
, 128 - output_len
, "%4.4x ", target_buffer_get_u16(target
, &buffer
[i
*2]));
1653 output_len
+= snprintf(output
+ output_len
, 128 - output_len
, "%2.2x ", buffer
[i
*1]);
1657 if ((i
%line_modulo
== line_modulo
-1) || (i
== count
- 1))
1659 command_print(cmd_ctx
, output
);
1669 int handle_mw_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1674 target_t
*target
= get_current_target(cmd_ctx
);
1680 address
= strtoul(args
[0], NULL
, 0);
1681 value
= strtoul(args
[1], NULL
, 0);
1686 target_buffer_set_u32(target
, value_buf
, value
);
1687 retval
= target
->type
->write_memory(target
, address
, 4, 1, value_buf
);
1690 target_buffer_set_u16(target
, value_buf
, value
);
1691 retval
= target
->type
->write_memory(target
, address
, 2, 1, value_buf
);
1694 value_buf
[0] = value
;
1695 retval
= target
->type
->write_memory(target
, address
, 1, 1, value_buf
);
1703 case ERROR_TARGET_UNALIGNED_ACCESS
:
1704 command_print(cmd_ctx
, "error: address not aligned");
1706 case ERROR_TARGET_DATA_ABORT
:
1707 command_print(cmd_ctx
, "error: access caused data abort, system possibly corrupted");
1709 case ERROR_TARGET_NOT_HALTED
:
1710 command_print(cmd_ctx
, "error: target must be halted for memory accesses");
1715 command_print(cmd_ctx
, "error: unknown error");
1723 int handle_load_image_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1733 duration_t duration
;
1734 char *duration_text
;
1736 target_t
*target
= get_current_target(cmd_ctx
);
1740 command_print(cmd_ctx
, "usage: load_image <filename> [address] [type]");
1744 /* a base address isn't always necessary, default to 0x0 (i.e. don't relocate) */
1747 image
.base_address_set
= 1;
1748 image
.base_address
= strtoul(args
[1], NULL
, 0);
1752 image
.base_address_set
= 0;
1755 image
.start_address_set
= 0;
1757 duration_start_measure(&duration
);
1759 if (image_open(&image
, args
[0], (argc
>= 3) ? args
[2] : NULL
) != ERROR_OK
)
1761 command_print(cmd_ctx
, "load_image error: %s", image
.error_str
);
1766 for (i
= 0; i
< image
.num_sections
; i
++)
1768 buffer
= malloc(image
.sections
[i
].size
);
1771 command_print(cmd_ctx
, "error allocating buffer for section (%d bytes)", image
.sections
[i
].size
);
1774 if ((retval
= image_read_section(&image
, i
, 0x0, image
.sections
[i
].size
, buffer
, &buf_cnt
)) != ERROR_OK
)
1776 ERROR("image_read_section failed with error code: %i", retval
);
1777 command_print(cmd_ctx
, "image reading failed, download aborted");
1779 image_close(&image
);
1782 target_write_buffer(target
, image
.sections
[i
].base_address
, buf_cnt
, buffer
);
1783 image_size
+= buf_cnt
;
1784 command_print(cmd_ctx
, "%u byte written at address 0x%8.8x", buf_cnt
, image
.sections
[i
].base_address
);
1789 duration_stop_measure(&duration
, &duration_text
);
1790 command_print(cmd_ctx
, "downloaded %u byte in %s", image_size
, duration_text
);
1791 free(duration_text
);
1793 image_close(&image
);
1799 int handle_dump_image_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1807 duration_t duration
;
1808 char *duration_text
;
1810 target_t
*target
= get_current_target(cmd_ctx
);
1814 command_print(cmd_ctx
, "usage: dump_image <filename> <address> <size>");
1818 address
= strtoul(args
[1], NULL
, 0);
1819 size
= strtoul(args
[2], NULL
, 0);
1821 if ((address
& 3) || (size
& 3))
1823 command_print(cmd_ctx
, "only 32-bit aligned address and size are supported");
1827 if (fileio_open(&fileio
, args
[0], FILEIO_WRITE
, FILEIO_BINARY
) != ERROR_OK
)
1829 command_print(cmd_ctx
, "dump_image error: %s", fileio
.error_str
);
1833 duration_start_measure(&duration
);
1838 u32 this_run_size
= (size
> 560) ? 560 : size
;
1840 target
->type
->read_memory(target
, address
, 4, this_run_size
/ 4, buffer
);
1841 fileio_write(&fileio
, this_run_size
, buffer
, &size_written
);
1843 size
-= this_run_size
;
1844 address
+= this_run_size
;
1847 fileio_close(&fileio
);
1849 duration_stop_measure(&duration
, &duration_text
);
1850 command_print(cmd_ctx
, "dumped %"PRIi64
" byte in %s", fileio
.size
, duration_text
);
1851 free(duration_text
);
1857 int handle_verify_image_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1865 u32 mem_checksum
= 0;
1869 duration_t duration
;
1870 char *duration_text
;
1872 target_t
*target
= get_current_target(cmd_ctx
);
1876 command_print(cmd_ctx
, "usage: verify_image <file> [offset] [type]");
1882 ERROR("no target selected");
1886 duration_start_measure(&duration
);
1890 image
.base_address_set
= 1;
1891 image
.base_address
= strtoul(args
[1], NULL
, 0);
1895 image
.base_address_set
= 0;
1896 image
.base_address
= 0x0;
1899 image
.start_address_set
= 0;
1901 if (image_open(&image
, args
[0], (argc
== 3) ? args
[2] : NULL
) != ERROR_OK
)
1903 command_print(cmd_ctx
, "verify_image error: %s", image
.error_str
);
1908 for (i
= 0; i
< image
.num_sections
; i
++)
1910 buffer
= malloc(image
.sections
[i
].size
);
1913 command_print(cmd_ctx
, "error allocating buffer for section (%d bytes)", image
.sections
[i
].size
);
1916 if ((retval
= image_read_section(&image
, i
, 0x0, image
.sections
[i
].size
, buffer
, &buf_cnt
)) != ERROR_OK
)
1918 ERROR("image_read_section failed with error code: %i", retval
);
1919 command_print(cmd_ctx
, "image reading failed, verify aborted");
1921 image_close(&image
);
1925 /* calculate checksum of image */
1926 image_calculate_checksum( buffer
, buf_cnt
, &checksum
);
1928 retval
= target_checksum_memory(target
, image
.sections
[i
].base_address
, buf_cnt
, &mem_checksum
);
1930 if( retval
!= ERROR_OK
)
1932 command_print(cmd_ctx
, "image verify failed, verify aborted");
1934 image_close(&image
);
1938 if( checksum
!= mem_checksum
)
1940 /* failed crc checksum, fall back to a binary compare */
1943 command_print(cmd_ctx
, "image verify checksum failed - attempting binary compare");
1945 data
= (u8
*)malloc(buf_cnt
);
1947 /* Can we use 32bit word accesses? */
1949 int count
= buf_cnt
;
1950 if ((count
% 4) == 0)
1955 retval
= target
->type
->read_memory(target
, image
.sections
[i
].base_address
, size
, count
, data
);
1957 if (retval
== ERROR_OK
)
1960 for (t
= 0; t
< buf_cnt
; t
++)
1962 if (data
[t
] != buffer
[t
])
1964 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
]);
1967 image_close(&image
);
1977 image_size
+= buf_cnt
;
1980 duration_stop_measure(&duration
, &duration_text
);
1981 command_print(cmd_ctx
, "verified %u bytes in %s", image_size
, duration_text
);
1982 free(duration_text
);
1984 image_close(&image
);
1989 int handle_bp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1992 target_t
*target
= get_current_target(cmd_ctx
);
1996 breakpoint_t
*breakpoint
= target
->breakpoints
;
2000 if (breakpoint
->type
== BKPT_SOFT
)
2002 char* buf
= buf_to_str(breakpoint
->orig_instr
, breakpoint
->length
, 16);
2003 command_print(cmd_ctx
, "0x%8.8x, 0x%x, %i, 0x%s", breakpoint
->address
, breakpoint
->length
, breakpoint
->set
, buf
);
2008 command_print(cmd_ctx
, "0x%8.8x, 0x%x, %i", breakpoint
->address
, breakpoint
->length
, breakpoint
->set
);
2010 breakpoint
= breakpoint
->next
;
2018 length
= strtoul(args
[1], NULL
, 0);
2021 if (strcmp(args
[2], "hw") == 0)
2024 if ((retval
= breakpoint_add(target
, strtoul(args
[0], NULL
, 0), length
, hw
)) != ERROR_OK
)
2028 case ERROR_TARGET_NOT_HALTED
:
2029 command_print(cmd_ctx
, "target must be halted to set breakpoints");
2031 case ERROR_TARGET_RESOURCE_NOT_AVAILABLE
:
2032 command_print(cmd_ctx
, "no more breakpoints available");
2035 command_print(cmd_ctx
, "unknown error, breakpoint not set");
2041 command_print(cmd_ctx
, "breakpoint added at address 0x%8.8x", strtoul(args
[0], NULL
, 0));
2046 command_print(cmd_ctx
, "usage: bp <address> <length> ['hw']");
2052 int handle_rbp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2054 target_t
*target
= get_current_target(cmd_ctx
);
2057 breakpoint_remove(target
, strtoul(args
[0], NULL
, 0));
2062 int handle_wp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2064 target_t
*target
= get_current_target(cmd_ctx
);
2069 watchpoint_t
*watchpoint
= target
->watchpoints
;
2073 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
);
2074 watchpoint
= watchpoint
->next
;
2079 enum watchpoint_rw type
= WPT_ACCESS
;
2080 u32 data_value
= 0x0;
2081 u32 data_mask
= 0xffffffff;
2097 command_print(cmd_ctx
, "usage: wp <address> <length> [r/w/a] [value] [mask]");
2103 data_value
= strtoul(args
[3], NULL
, 0);
2107 data_mask
= strtoul(args
[4], NULL
, 0);
2110 if ((retval
= watchpoint_add(target
, strtoul(args
[0], NULL
, 0),
2111 strtoul(args
[1], NULL
, 0), type
, data_value
, data_mask
)) != ERROR_OK
)
2115 case ERROR_TARGET_NOT_HALTED
:
2116 command_print(cmd_ctx
, "target must be halted to set watchpoints");
2118 case ERROR_TARGET_RESOURCE_NOT_AVAILABLE
:
2119 command_print(cmd_ctx
, "no more watchpoints available");
2122 command_print(cmd_ctx
, "unknown error, watchpoint not set");
2129 command_print(cmd_ctx
, "usage: wp <address> <length> [r/w/a] [value] [mask]");
2135 int handle_rwp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2137 target_t
*target
= get_current_target(cmd_ctx
);
2140 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)