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"
28 #include "configuration.h"
29 #include "binarybuffer.h"
36 #include <sys/types.h>
44 #include <time_support.h>
49 int cli_target_callback_event_handler(struct target_s
*target
, enum target_event event
, void *priv
);
51 int handle_target_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
52 int handle_daemon_startup_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
53 int handle_targets_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
55 int handle_target_script_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
56 int handle_run_and_halt_time_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
57 int handle_working_area_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
59 int handle_reg_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
60 int handle_poll_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
61 int handle_halt_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
62 int handle_wait_halt_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
63 int handle_reset_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
64 int handle_soft_reset_halt_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
65 int handle_resume_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
66 int handle_step_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
67 int handle_md_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
68 int handle_mw_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
69 int handle_load_image_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
70 int handle_dump_image_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
71 int handle_bp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
72 int handle_rbp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
73 int handle_wp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
74 int handle_rwp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
78 extern target_type_t arm7tdmi_target
;
79 extern target_type_t arm720t_target
;
80 extern target_type_t arm9tdmi_target
;
81 extern target_type_t arm920t_target
;
82 extern target_type_t arm966e_target
;
83 extern target_type_t arm926ejs_target
;
84 extern target_type_t xscale_target
;
85 extern target_type_t cortexm3_target
;
87 target_type_t
*target_types
[] =
100 target_t
*targets
= NULL
;
101 target_event_callback_t
*target_event_callbacks
= NULL
;
102 target_timer_callback_t
*target_timer_callbacks
= NULL
;
104 char *target_state_strings
[] =
113 char *target_debug_reason_strings
[] =
115 "debug request", "breakpoint", "watchpoint",
116 "watchpoint and breakpoint", "single step",
120 char *target_endianess_strings
[] =
126 enum daemon_startup_mode startup_mode
= DAEMON_ATTACH
;
128 static int target_continous_poll
= 1;
130 /* read a u32 from a buffer in target memory endianness */
131 u32
target_buffer_get_u32(target_t
*target
, u8
*buffer
)
133 if (target
->endianness
== TARGET_LITTLE_ENDIAN
)
134 return le_to_h_u32(buffer
);
136 return be_to_h_u32(buffer
);
139 /* read a u16 from a buffer in target memory endianness */
140 u16
target_buffer_get_u16(target_t
*target
, u8
*buffer
)
142 if (target
->endianness
== TARGET_LITTLE_ENDIAN
)
143 return le_to_h_u16(buffer
);
145 return be_to_h_u16(buffer
);
148 /* write a u32 to a buffer in target memory endianness */
149 void target_buffer_set_u32(target_t
*target
, u8
*buffer
, u32 value
)
151 if (target
->endianness
== TARGET_LITTLE_ENDIAN
)
152 h_u32_to_le(buffer
, value
);
154 h_u32_to_be(buffer
, value
);
157 /* write a u16 to a buffer in target memory endianness */
158 void target_buffer_set_u16(target_t
*target
, u8
*buffer
, u16 value
)
160 if (target
->endianness
== TARGET_LITTLE_ENDIAN
)
161 h_u16_to_le(buffer
, value
);
163 h_u16_to_be(buffer
, value
);
166 /* returns a pointer to the n-th configured target */
167 target_t
* get_target_by_num(int num
)
169 target_t
*target
= targets
;
176 target
= target
->next
;
183 int get_num_by_target(target_t
*query_target
)
185 target_t
*target
= targets
;
190 if (target
== query_target
)
192 target
= target
->next
;
199 target_t
* get_current_target(command_context_t
*cmd_ctx
)
201 target_t
*target
= get_target_by_num(cmd_ctx
->current_target
);
205 ERROR("BUG: current_target out of bounds");
212 /* Process target initialization, when target entered debug out of reset
213 * the handler is unregistered at the end of this function, so it's only called once
215 int target_init_handler(struct target_s
*target
, enum target_event event
, void *priv
)
218 struct command_context_s
*cmd_ctx
= priv
;
220 if ((event
== TARGET_EVENT_HALTED
) && (target
->reset_script
))
222 target_unregister_event_callback(target_init_handler
, priv
);
224 script
= fopen(target
->reset_script
, "r");
227 ERROR("couldn't open script file %s", target
->reset_script
);
231 INFO("executing reset script '%s'", target
->reset_script
);
232 command_run_file(cmd_ctx
, script
, COMMAND_EXEC
);
235 jtag_execute_queue();
241 int target_run_and_halt_handler(void *priv
)
243 target_t
*target
= priv
;
245 target
->type
->halt(target
);
250 int target_process_reset(struct command_context_s
*cmd_ctx
)
252 int retval
= ERROR_OK
;
255 /* prepare reset_halt where necessary */
259 switch (target
->reset_mode
)
263 target
->type
->prepare_reset_halt(target
);
268 target
= target
->next
;
274 target
->type
->assert_reset(target
);
275 target
= target
->next
;
277 jtag_execute_queue();
279 /* request target halt if necessary, and schedule further action */
283 switch (target
->reset_mode
)
286 /* nothing to do if target just wants to be run */
288 case RESET_RUN_AND_HALT
:
290 target_register_timer_callback(target_run_and_halt_handler
, target
->run_and_halt_time
, 0, target
);
292 case RESET_RUN_AND_INIT
:
294 target_register_timer_callback(target_run_and_halt_handler
, target
->run_and_halt_time
, 0, target
);
295 target_register_event_callback(target_init_handler
, cmd_ctx
);
298 target
->type
->halt(target
);
301 target
->type
->halt(target
);
302 target_register_event_callback(target_init_handler
, cmd_ctx
);
305 ERROR("BUG: unknown target->reset_mode");
307 target
= target
->next
;
313 target
->type
->deassert_reset(target
);
314 target
= target
->next
;
316 jtag_execute_queue();
321 int target_init(struct command_context_s
*cmd_ctx
)
323 target_t
*target
= targets
;
327 if (target
->type
->init_target(cmd_ctx
, target
) != ERROR_OK
)
329 ERROR("target '%s' init failed", target
->type
->name
);
332 target
= target
->next
;
337 target_register_user_commands(cmd_ctx
);
338 target_register_timer_callback(handle_target
, 100, 1, NULL
);
341 if (startup_mode
== DAEMON_RESET
)
342 target_process_reset(cmd_ctx
);
347 int target_register_event_callback(int (*callback
)(struct target_s
*target
, enum target_event event
, void *priv
), void *priv
)
349 target_event_callback_t
**callbacks_p
= &target_event_callbacks
;
351 if (callback
== NULL
)
353 return ERROR_INVALID_ARGUMENTS
;
358 while ((*callbacks_p
)->next
)
359 callbacks_p
= &((*callbacks_p
)->next
);
360 callbacks_p
= &((*callbacks_p
)->next
);
363 (*callbacks_p
) = malloc(sizeof(target_event_callback_t
));
364 (*callbacks_p
)->callback
= callback
;
365 (*callbacks_p
)->priv
= priv
;
366 (*callbacks_p
)->next
= NULL
;
371 int target_register_timer_callback(int (*callback
)(void *priv
), int time_ms
, int periodic
, void *priv
)
373 target_timer_callback_t
**callbacks_p
= &target_timer_callbacks
;
376 if (callback
== NULL
)
378 return ERROR_INVALID_ARGUMENTS
;
383 while ((*callbacks_p
)->next
)
384 callbacks_p
= &((*callbacks_p
)->next
);
385 callbacks_p
= &((*callbacks_p
)->next
);
388 (*callbacks_p
) = malloc(sizeof(target_timer_callback_t
));
389 (*callbacks_p
)->callback
= callback
;
390 (*callbacks_p
)->periodic
= periodic
;
391 (*callbacks_p
)->time_ms
= time_ms
;
393 gettimeofday(&now
, NULL
);
394 (*callbacks_p
)->when
.tv_usec
= now
.tv_usec
+ (time_ms
% 1000) * 1000;
395 time_ms
-= (time_ms
% 1000);
396 (*callbacks_p
)->when
.tv_sec
= now
.tv_sec
+ (time_ms
/ 1000);
397 if ((*callbacks_p
)->when
.tv_usec
> 1000000)
399 (*callbacks_p
)->when
.tv_usec
= (*callbacks_p
)->when
.tv_usec
- 1000000;
400 (*callbacks_p
)->when
.tv_sec
+= 1;
403 (*callbacks_p
)->priv
= priv
;
404 (*callbacks_p
)->next
= NULL
;
409 int target_unregister_event_callback(int (*callback
)(struct target_s
*target
, enum target_event event
, void *priv
), void *priv
)
411 target_event_callback_t
**p
= &target_event_callbacks
;
412 target_event_callback_t
*c
= target_event_callbacks
;
414 if (callback
== NULL
)
416 return ERROR_INVALID_ARGUMENTS
;
421 target_event_callback_t
*next
= c
->next
;
422 if ((c
->callback
== callback
) && (c
->priv
== priv
))
436 int target_unregister_timer_callback(int (*callback
)(void *priv
), void *priv
)
438 target_timer_callback_t
**p
= &target_timer_callbacks
;
439 target_timer_callback_t
*c
= target_timer_callbacks
;
441 if (callback
== NULL
)
443 return ERROR_INVALID_ARGUMENTS
;
448 target_timer_callback_t
*next
= c
->next
;
449 if ((c
->callback
== callback
) && (c
->priv
== priv
))
463 int target_call_event_callbacks(target_t
*target
, enum target_event event
)
465 target_event_callback_t
*callback
= target_event_callbacks
;
466 target_event_callback_t
*next_callback
;
468 DEBUG("target event %i", event
);
472 next_callback
= callback
->next
;
473 callback
->callback(target
, event
, callback
->priv
);
474 callback
= next_callback
;
480 int target_call_timer_callbacks()
482 target_timer_callback_t
*callback
= target_timer_callbacks
;
483 target_timer_callback_t
*next_callback
;
486 gettimeofday(&now
, NULL
);
490 next_callback
= callback
->next
;
492 if (((now
.tv_sec
>= callback
->when
.tv_sec
) && (now
.tv_usec
>= callback
->when
.tv_usec
))
493 || (now
.tv_sec
> callback
->when
.tv_sec
))
495 callback
->callback(callback
->priv
);
496 if (callback
->periodic
)
498 int time_ms
= callback
->time_ms
;
499 callback
->when
.tv_usec
= now
.tv_usec
+ (time_ms
% 1000) * 1000;
500 time_ms
-= (time_ms
% 1000);
501 callback
->when
.tv_sec
= now
.tv_sec
+ time_ms
/ 1000;
502 if (callback
->when
.tv_usec
> 1000000)
504 callback
->when
.tv_usec
= callback
->when
.tv_usec
- 1000000;
505 callback
->when
.tv_sec
+= 1;
509 target_unregister_timer_callback(callback
->callback
, callback
->priv
);
512 callback
= next_callback
;
518 int target_alloc_working_area(struct target_s
*target
, u32 size
, working_area_t
**area
)
520 working_area_t
*c
= target
->working_areas
;
521 working_area_t
*new_wa
= NULL
;
523 /* only allocate multiples of 4 byte */
526 ERROR("BUG: code tried to allocate unaligned number of bytes, padding");
527 size
= CEIL(size
, 4);
530 /* see if there's already a matching working area */
533 if ((c
->free
) && (c
->size
== size
))
541 /* if not, allocate a new one */
544 working_area_t
**p
= &target
->working_areas
;
545 u32 first_free
= target
->working_area
;
546 u32 free_size
= target
->working_area_size
;
548 DEBUG("allocating new working area");
550 c
= target
->working_areas
;
553 first_free
+= c
->size
;
554 free_size
-= c
->size
;
559 if (free_size
< size
)
561 WARNING("not enough working area available");
562 return ERROR_TARGET_RESOURCE_NOT_AVAILABLE
;
565 new_wa
= malloc(sizeof(working_area_t
));
568 new_wa
->address
= first_free
;
570 if (target
->backup_working_area
)
572 new_wa
->backup
= malloc(new_wa
->size
);
573 target
->type
->read_memory(target
, new_wa
->address
, 4, new_wa
->size
/ 4, new_wa
->backup
);
577 new_wa
->backup
= NULL
;
580 /* put new entry in list */
584 /* mark as used, and return the new (reused) area */
594 int target_free_working_area(struct target_s
*target
, working_area_t
*area
)
599 if (target
->backup_working_area
)
600 target
->type
->write_memory(target
, area
->address
, 4, area
->size
/ 4, area
->backup
);
604 /* mark user pointer invalid */
611 int target_free_all_working_areas(struct target_s
*target
)
613 working_area_t
*c
= target
->working_areas
;
617 working_area_t
*next
= c
->next
;
618 target_free_working_area(target
, c
);
628 target
->working_areas
= NULL
;
633 int target_register_commands(struct command_context_s
*cmd_ctx
)
635 register_command(cmd_ctx
, NULL
, "target", handle_target_command
, COMMAND_CONFIG
, NULL
);
636 register_command(cmd_ctx
, NULL
, "targets", handle_targets_command
, COMMAND_EXEC
, NULL
);
637 register_command(cmd_ctx
, NULL
, "daemon_startup", handle_daemon_startup_command
, COMMAND_CONFIG
, NULL
);
638 register_command(cmd_ctx
, NULL
, "target_script", handle_target_script_command
, COMMAND_CONFIG
, NULL
);
639 register_command(cmd_ctx
, NULL
, "run_and_halt_time", handle_run_and_halt_time_command
, COMMAND_CONFIG
, NULL
);
640 register_command(cmd_ctx
, NULL
, "working_area", handle_working_area_command
, COMMAND_CONFIG
, NULL
);
645 int target_write_buffer(struct target_s
*target
, u32 address
, u32 size
, u8
*buffer
)
649 DEBUG("writing buffer of %i byte at 0x%8.8x", size
, address
);
651 /* handle writes of less than 4 byte */
654 if ((retval
= target
->type
->write_memory(target
, address
, 1, size
, buffer
)) != ERROR_OK
)
659 /* handle unaligned head bytes */
662 int unaligned
= 4 - (address
% 4);
664 if ((retval
= target
->type
->write_memory(target
, address
, 1, unaligned
, buffer
)) != ERROR_OK
)
668 address
+= unaligned
;
672 /* handle aligned words */
675 int aligned
= size
- (size
% 4);
677 /* use bulk writes above a certain limit. This may have to be changed */
680 if ((retval
= target
->type
->bulk_write_memory(target
, address
, aligned
/ 4, buffer
)) != ERROR_OK
)
685 if ((retval
= target
->type
->write_memory(target
, address
, 4, aligned
/ 4, buffer
)) != ERROR_OK
)
694 /* handle tail writes of less than 4 bytes */
697 if ((retval
= target
->type
->write_memory(target
, address
, 1, size
, buffer
)) != ERROR_OK
)
704 int target_read_buffer(struct target_s
*target
, u32 address
, u32 size
, u8
*buffer
)
708 DEBUG("reading buffer of %i byte at 0x%8.8x", size
, address
);
710 /* handle reads of less than 4 byte */
713 if ((retval
= target
->type
->read_memory(target
, address
, 1, size
, buffer
)) != ERROR_OK
)
718 /* handle unaligned head bytes */
721 int unaligned
= 4 - (address
% 4);
723 if ((retval
= target
->type
->read_memory(target
, address
, 1, unaligned
, buffer
)) != ERROR_OK
)
727 address
+= unaligned
;
731 /* handle aligned words */
734 int aligned
= size
- (size
% 4);
736 if ((retval
= target
->type
->read_memory(target
, address
, 4, aligned
/ 4, buffer
)) != ERROR_OK
)
744 /* handle tail writes of less than 4 bytes */
747 if ((retval
= target
->type
->read_memory(target
, address
, 1, size
, buffer
)) != ERROR_OK
)
754 int target_read_u32(struct target_s
*target
, u32 address
, u32
*value
)
758 int retval
= target
->type
->read_memory(target
, address
, 4, 1, value_buf
);
760 if (retval
== ERROR_OK
)
762 *value
= target_buffer_get_u32(target
, value_buf
);
763 DEBUG("address: 0x%8.8x, value: 0x%8.8x", address
, *value
);
768 DEBUG("address: 0x%8.8x failed", address
);
774 int target_read_u16(struct target_s
*target
, u32 address
, u16
*value
)
778 int retval
= target
->type
->read_memory(target
, address
, 2, 1, value_buf
);
780 if (retval
== ERROR_OK
)
782 *value
= target_buffer_get_u16(target
, value_buf
);
783 DEBUG("address: 0x%8.8x, value: 0x%4.4x", address
, *value
);
788 DEBUG("address: 0x%8.8x failed", address
);
794 int target_read_u8(struct target_s
*target
, u32 address
, u8
*value
)
796 int retval
= target
->type
->read_memory(target
, address
, 1, 1, value
);
798 if (retval
== ERROR_OK
)
800 DEBUG("address: 0x%8.8x, value: 0x%2.2x", address
, *value
);
805 DEBUG("address: 0x%8.8x failed", address
);
811 int target_write_u32(struct target_s
*target
, u32 address
, u32 value
)
816 DEBUG("address: 0x%8.8x, value: 0x%8.8x", address
, value
);
818 target_buffer_set_u32(target
, value_buf
, value
);
819 if ((retval
= target
->type
->write_memory(target
, address
, 4, 1, value_buf
)) != ERROR_OK
)
821 DEBUG("failed: %i", retval
);
827 int target_write_u16(struct target_s
*target
, u32 address
, u16 value
)
832 DEBUG("address: 0x%8.8x, value: 0x%8.8x", address
, value
);
834 target_buffer_set_u16(target
, value_buf
, value
);
835 if ((retval
= target
->type
->write_memory(target
, address
, 2, 1, value_buf
)) != ERROR_OK
)
837 DEBUG("failed: %i", retval
);
843 int target_write_u8(struct target_s
*target
, u32 address
, u8 value
)
847 DEBUG("address: 0x%8.8x, value: 0x%2.2x", address
, value
);
849 if ((retval
= target
->type
->read_memory(target
, address
, 1, 1, &value
)) != ERROR_OK
)
851 DEBUG("failed: %i", retval
);
857 int target_register_user_commands(struct command_context_s
*cmd_ctx
)
859 register_command(cmd_ctx
, NULL
, "reg", handle_reg_command
, COMMAND_EXEC
, NULL
);
860 register_command(cmd_ctx
, NULL
, "poll", handle_poll_command
, COMMAND_EXEC
, "poll target state");
861 register_command(cmd_ctx
, NULL
, "wait_halt", handle_wait_halt_command
, COMMAND_EXEC
, "wait for target halt [time (s)]");
862 register_command(cmd_ctx
, NULL
, "halt", handle_halt_command
, COMMAND_EXEC
, "halt target");
863 register_command(cmd_ctx
, NULL
, "resume", handle_resume_command
, COMMAND_EXEC
, "resume target [addr]");
864 register_command(cmd_ctx
, NULL
, "step", handle_step_command
, COMMAND_EXEC
, "step one instruction");
865 register_command(cmd_ctx
, NULL
, "reset", handle_reset_command
, COMMAND_EXEC
, "reset target [run|halt|init|run_and_halt|run_and_init]");
866 register_command(cmd_ctx
, NULL
, "soft_reset_halt", handle_soft_reset_halt_command
, COMMAND_EXEC
, "halt the target and do a soft reset");
868 register_command(cmd_ctx
, NULL
, "mdw", handle_md_command
, COMMAND_EXEC
, "display memory words <addr> [count]");
869 register_command(cmd_ctx
, NULL
, "mdh", handle_md_command
, COMMAND_EXEC
, "display memory half-words <addr> [count]");
870 register_command(cmd_ctx
, NULL
, "mdb", handle_md_command
, COMMAND_EXEC
, "display memory bytes <addr> [count]");
872 register_command(cmd_ctx
, NULL
, "mww", handle_mw_command
, COMMAND_EXEC
, "write memory word <addr> <value>");
873 register_command(cmd_ctx
, NULL
, "mwh", handle_mw_command
, COMMAND_EXEC
, "write memory half-word <addr> <value>");
874 register_command(cmd_ctx
, NULL
, "mwb", handle_mw_command
, COMMAND_EXEC
, "write memory byte <addr> <value>");
876 register_command(cmd_ctx
, NULL
, "bp", handle_bp_command
, COMMAND_EXEC
, "set breakpoint <address> <length> [hw]");
877 register_command(cmd_ctx
, NULL
, "rbp", handle_rbp_command
, COMMAND_EXEC
, "remove breakpoint <adress>");
878 register_command(cmd_ctx
, NULL
, "wp", handle_wp_command
, COMMAND_EXEC
, "set watchpoint <address> <length> <r/w/a> [value] [mask]");
879 register_command(cmd_ctx
, NULL
, "rwp", handle_rwp_command
, COMMAND_EXEC
, "remove watchpoint <adress>");
881 register_command(cmd_ctx
, NULL
, "load_image", handle_load_image_command
, COMMAND_EXEC
, "load_image <file> <address> ['bin'|'ihex'|'elf'|'s19']");
882 register_command(cmd_ctx
, NULL
, "dump_image", handle_dump_image_command
, COMMAND_EXEC
, "dump_image <file> <address> <size>");
883 register_command(cmd_ctx
, NULL
, "load_binary", handle_load_image_command
, COMMAND_EXEC
, "[DEPRECATED] load_binary <file> <address>");
884 register_command(cmd_ctx
, NULL
, "dump_binary", handle_dump_image_command
, COMMAND_EXEC
, "[DEPRECATED] dump_binary <file> <address> <size>");
889 int handle_targets_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
891 target_t
*target
= targets
;
896 int num
= strtoul(args
[0], NULL
, 0);
901 target
= target
->next
;
905 cmd_ctx
->current_target
= num
;
907 command_print(cmd_ctx
, "%i is out of bounds, only %i targets are configured", num
, count
);
914 command_print(cmd_ctx
, "%i: %s (%s), state: %s", count
++, target
->type
->name
, target_endianess_strings
[target
->endianness
], target_state_strings
[target
->state
]);
915 target
= target
->next
;
921 int handle_target_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
928 ERROR("target command requires at least three arguments: <type> <endianess> <reset_mode>");
932 /* search for the specified target */
933 if (args
[0] && (args
[0][0] != 0))
935 for (i
= 0; target_types
[i
]; i
++)
937 if (strcmp(args
[0], target_types
[i
]->name
) == 0)
939 target_t
**last_target_p
= &targets
;
941 /* register target specific commands */
942 if (target_types
[i
]->register_commands(cmd_ctx
) != ERROR_OK
)
944 ERROR("couldn't register '%s' commands", args
[0]);
950 while ((*last_target_p
)->next
)
951 last_target_p
= &((*last_target_p
)->next
);
952 last_target_p
= &((*last_target_p
)->next
);
955 *last_target_p
= malloc(sizeof(target_t
));
957 (*last_target_p
)->type
= target_types
[i
];
959 if (strcmp(args
[1], "big") == 0)
960 (*last_target_p
)->endianness
= TARGET_BIG_ENDIAN
;
961 else if (strcmp(args
[1], "little") == 0)
962 (*last_target_p
)->endianness
= TARGET_LITTLE_ENDIAN
;
965 ERROR("endianness must be either 'little' or 'big', not '%s'", args
[1]);
969 /* what to do on a target reset */
970 if (strcmp(args
[2], "reset_halt") == 0)
971 (*last_target_p
)->reset_mode
= RESET_HALT
;
972 else if (strcmp(args
[2], "reset_run") == 0)
973 (*last_target_p
)->reset_mode
= RESET_RUN
;
974 else if (strcmp(args
[2], "reset_init") == 0)
975 (*last_target_p
)->reset_mode
= RESET_INIT
;
976 else if (strcmp(args
[2], "run_and_halt") == 0)
977 (*last_target_p
)->reset_mode
= RESET_RUN_AND_HALT
;
978 else if (strcmp(args
[2], "run_and_init") == 0)
979 (*last_target_p
)->reset_mode
= RESET_RUN_AND_INIT
;
982 ERROR("unknown target startup mode %s", args
[2]);
985 (*last_target_p
)->run_and_halt_time
= 1000; /* default 1s */
987 (*last_target_p
)->reset_script
= NULL
;
988 (*last_target_p
)->post_halt_script
= NULL
;
989 (*last_target_p
)->pre_resume_script
= NULL
;
991 (*last_target_p
)->working_area
= 0x0;
992 (*last_target_p
)->working_area_size
= 0x0;
993 (*last_target_p
)->working_areas
= NULL
;
994 (*last_target_p
)->backup_working_area
= 0;
996 (*last_target_p
)->state
= TARGET_UNKNOWN
;
997 (*last_target_p
)->reg_cache
= NULL
;
998 (*last_target_p
)->breakpoints
= NULL
;
999 (*last_target_p
)->watchpoints
= NULL
;
1000 (*last_target_p
)->next
= NULL
;
1001 (*last_target_p
)->arch_info
= NULL
;
1003 (*last_target_p
)->type
->target_command(cmd_ctx
, cmd
, args
, argc
, *last_target_p
);
1011 /* no matching target found */
1014 ERROR("target '%s' not found", args
[0]);
1021 /* usage: target_script <target#> <event> <script_file> */
1022 int handle_target_script_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1024 target_t
*target
= NULL
;
1028 ERROR("incomplete target_script command");
1032 target
= get_target_by_num(strtoul(args
[0], NULL
, 0));
1036 ERROR("target number '%s' not defined", args
[0]);
1040 if (strcmp(args
[1], "reset") == 0)
1042 if (target
->reset_script
)
1043 free(target
->reset_script
);
1044 target
->reset_script
= strdup(args
[2]);
1046 else if (strcmp(args
[1], "post_halt") == 0)
1048 if (target
->post_halt_script
)
1049 free(target
->post_halt_script
);
1050 target
->post_halt_script
= strdup(args
[2]);
1052 else if (strcmp(args
[1], "pre_resume") == 0)
1054 if (target
->pre_resume_script
)
1055 free(target
->pre_resume_script
);
1056 target
->pre_resume_script
= strdup(args
[2]);
1060 ERROR("unknown event type: '%s", args
[1]);
1067 int handle_run_and_halt_time_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1069 target_t
*target
= NULL
;
1073 ERROR("incomplete run_and_halt_time command");
1077 target
= get_target_by_num(strtoul(args
[0], NULL
, 0));
1081 ERROR("target number '%s' not defined", args
[0]);
1085 target
->run_and_halt_time
= strtoul(args
[1], NULL
, 0);
1090 int handle_working_area_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1092 target_t
*target
= NULL
;
1096 ERROR("incomplete working_area command. usage: working_area <target#> <address> <size> <'backup'|'nobackup'>");
1100 target
= get_target_by_num(strtoul(args
[0], NULL
, 0));
1104 ERROR("target number '%s' not defined", args
[0]);
1108 target
->working_area
= strtoul(args
[1], NULL
, 0);
1109 target
->working_area_size
= strtoul(args
[2], NULL
, 0);
1111 if (strcmp(args
[3], "backup") == 0)
1113 target
->backup_working_area
= 1;
1115 else if (strcmp(args
[3], "nobackup") == 0)
1117 target
->backup_working_area
= 0;
1121 ERROR("unrecognized <backup|nobackup> argument (%s)", args
[3]);
1129 /* process target state changes */
1130 int handle_target(void *priv
)
1133 target_t
*target
= targets
;
1137 /* only poll if target isn't already halted */
1138 if (target
->state
!= TARGET_HALTED
)
1140 if (target_continous_poll
)
1141 if ((retval
= target
->type
->poll(target
)) < 0)
1143 ERROR("couldn't poll target, exiting");
1148 target
= target
->next
;
1154 int handle_reg_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1163 target
= get_current_target(cmd_ctx
);
1165 /* list all available registers for the current target */
1168 reg_cache_t
*cache
= target
->reg_cache
;
1174 for (i
= 0; i
< cache
->num_regs
; i
++)
1176 value
= buf_to_str(cache
->reg_list
[i
].value
, cache
->reg_list
[i
].size
, 16);
1177 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
);
1180 cache
= cache
->next
;
1186 /* access a single register by its ordinal number */
1187 if ((args
[0][0] >= '0') && (args
[0][0] <= '9'))
1189 int num
= strtoul(args
[0], NULL
, 0);
1190 reg_cache_t
*cache
= target
->reg_cache
;
1196 for (i
= 0; i
< cache
->num_regs
; i
++)
1200 reg
= &cache
->reg_list
[i
];
1206 cache
= cache
->next
;
1211 command_print(cmd_ctx
, "%i is out of bounds, the current target has only %i registers (0 - %i)", num
, count
, count
- 1);
1214 } else /* access a single register by its name */
1216 reg
= register_get_by_name(target
->reg_cache
, args
[0], 1);
1220 command_print(cmd_ctx
, "register %s not found in current target", args
[0]);
1225 /* display a register */
1226 if ((argc
== 1) || ((argc
== 2) && !((args
[1][0] >= '0') && (args
[1][0] <= '9'))))
1228 if ((argc
== 2) && (strcmp(args
[1], "force") == 0))
1231 if (reg
->valid
== 0)
1233 reg_arch_type_t
*arch_type
= register_get_arch_type(reg
->arch_type
);
1234 if (arch_type
== NULL
)
1236 ERROR("BUG: encountered unregistered arch type");
1239 arch_type
->get(reg
);
1241 value
= buf_to_str(reg
->value
, reg
->size
, 16);
1242 command_print(cmd_ctx
, "%s (/%i): 0x%s", reg
->name
, reg
->size
, value
);
1247 /* set register value */
1250 u8
*buf
= malloc(CEIL(reg
->size
, 8));
1251 str_to_buf(args
[1], strlen(args
[1]), buf
, reg
->size
, 0);
1253 reg_arch_type_t
*arch_type
= register_get_arch_type(reg
->arch_type
);
1254 if (arch_type
== NULL
)
1256 ERROR("BUG: encountered unregistered arch type");
1260 arch_type
->set(reg
, buf
);
1262 value
= buf_to_str(reg
->value
, reg
->size
, 16);
1263 command_print(cmd_ctx
, "%s (/%i): 0x%s", reg
->name
, reg
->size
, value
);
1271 command_print(cmd_ctx
, "usage: reg <#|name> [value]");
1276 int handle_poll_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1278 target_t
*target
= get_current_target(cmd_ctx
);
1283 command_print(cmd_ctx
, "target state: %s", target_state_strings
[target
->type
->poll(target
)]);
1284 if (target
->state
== TARGET_HALTED
)
1286 target
->type
->arch_state(target
, buffer
, 512);
1288 command_print(cmd_ctx
, "%s", buffer
);
1293 if (strcmp(args
[0], "on") == 0)
1295 target_continous_poll
= 1;
1297 else if (strcmp(args
[0], "off") == 0)
1299 target_continous_poll
= 0;
1307 int handle_wait_halt_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1309 target_t
*target
= get_current_target(cmd_ctx
);
1310 struct timeval timeout
, now
;
1312 gettimeofday(&timeout
, NULL
);
1314 timeval_add_time(&timeout
, 5, 0);
1318 timeval_add_time(&timeout
, strtoul(args
[0], &end
, 0), 0);
1320 command_print(cmd_ctx
, "usage: wait_halt [seconds]");
1325 command_print(cmd_ctx
, "waiting for target halted...");
1327 while(target
->type
->poll(target
))
1329 if (target
->state
== TARGET_HALTED
)
1331 command_print(cmd_ctx
, "target halted");
1334 target_call_timer_callbacks();
1336 gettimeofday(&now
, NULL
);
1337 if ((now
.tv_sec
>= timeout
.tv_sec
) && (now
.tv_usec
>= timeout
.tv_usec
))
1339 command_print(cmd_ctx
, "timed out while waiting for target halt");
1340 ERROR("timed out while waiting for target halt");
1348 int handle_halt_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1351 target_t
*target
= get_current_target(cmd_ctx
);
1355 command_print(cmd_ctx
, "requesting target halt...");
1357 if ((retval
= target
->type
->halt(target
)) != ERROR_OK
)
1361 case ERROR_TARGET_ALREADY_HALTED
:
1362 command_print(cmd_ctx
, "target already halted");
1364 case ERROR_TARGET_TIMEOUT
:
1365 command_print(cmd_ctx
, "target timed out... shutting down");
1368 command_print(cmd_ctx
, "unknown error... shutting down");
1377 /* what to do on daemon startup */
1378 int handle_daemon_startup_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1382 if (strcmp(args
[0], "attach") == 0)
1384 startup_mode
= DAEMON_ATTACH
;
1387 else if (strcmp(args
[0], "reset") == 0)
1389 startup_mode
= DAEMON_RESET
;
1394 WARNING("invalid daemon_startup configuration directive: %s", args
[0]);
1399 int handle_soft_reset_halt_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1401 target_t
*target
= get_current_target(cmd_ctx
);
1404 command_print(cmd_ctx
, "requesting target halt and executing a soft reset");
1406 if ((retval
= target
->type
->soft_reset_halt(target
)) != ERROR_OK
)
1410 case ERROR_TARGET_TIMEOUT
:
1411 command_print(cmd_ctx
, "target timed out... shutting down");
1414 command_print(cmd_ctx
, "unknown error... shutting down");
1422 int handle_reset_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1424 target_t
*target
= get_current_target(cmd_ctx
);
1425 enum target_reset_mode reset_mode
= RESET_RUN
;
1431 if (strcmp("run", args
[0]) == 0)
1432 reset_mode
= RESET_RUN
;
1433 else if (strcmp("halt", args
[0]) == 0)
1434 reset_mode
= RESET_HALT
;
1435 else if (strcmp("init", args
[0]) == 0)
1436 reset_mode
= RESET_INIT
;
1437 else if (strcmp("run_and_halt", args
[0]) == 0)
1439 reset_mode
= RESET_RUN_AND_HALT
;
1442 target
->run_and_halt_time
= strtoul(args
[1], NULL
, 0);
1445 else if (strcmp("run_and_init", args
[0]) == 0)
1447 reset_mode
= RESET_RUN_AND_INIT
;
1450 target
->run_and_halt_time
= strtoul(args
[1], NULL
, 0);
1455 command_print(cmd_ctx
, "usage: reset ['run', 'halt', 'init', 'run_and_halt', 'run_and_init]");
1458 target
->reset_mode
= reset_mode
;
1461 target_process_reset(cmd_ctx
);
1466 int handle_resume_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1469 target_t
*target
= get_current_target(cmd_ctx
);
1474 retval
= target
->type
->resume(target
, 1, 0, 1, 0); /* current pc, addr = 0, handle breakpoints, not debugging */
1476 retval
= target
->type
->resume(target
, 0, strtoul(args
[0], NULL
, 0), 1, 0); /* addr = args[0], handle breakpoints, not debugging */
1479 command_print(cmd_ctx
, "usage: resume [address]");
1483 if (retval
!= ERROR_OK
)
1487 case ERROR_TARGET_NOT_HALTED
:
1488 command_print(cmd_ctx
, "target not halted");
1491 command_print(cmd_ctx
, "unknown error... shutting down");
1499 int handle_step_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1501 target_t
*target
= get_current_target(cmd_ctx
);
1506 target
->type
->step(target
, 1, 0, 1); /* current pc, addr = 0, handle breakpoints */
1509 target
->type
->step(target
, 0, strtoul(args
[0], NULL
, 0), 1); /* addr = args[0], handle breakpoints */
1514 int handle_md_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1527 target_t
*target
= get_current_target(cmd_ctx
);
1533 count
= strtoul(args
[1], NULL
, 0);
1535 address
= strtoul(args
[0], NULL
, 0);
1553 buffer
= calloc(count
, size
);
1554 if ((retval
= target
->type
->read_memory(target
, address
, size
, count
, buffer
)) != ERROR_OK
)
1558 case ERROR_TARGET_UNALIGNED_ACCESS
:
1559 command_print(cmd_ctx
, "error: address not aligned");
1561 case ERROR_TARGET_NOT_HALTED
:
1562 command_print(cmd_ctx
, "error: target must be halted for memory accesses");
1564 case ERROR_TARGET_DATA_ABORT
:
1565 command_print(cmd_ctx
, "error: access caused data abort, system possibly corrupted");
1568 command_print(cmd_ctx
, "error: unknown error");
1576 for (i
= 0; i
< count
; i
++)
1579 output_len
+= snprintf(output
+ output_len
, 128 - output_len
, "0x%8.8x: ", address
+ (i
*size
));
1584 output_len
+= snprintf(output
+ output_len
, 128 - output_len
, "%8.8x ", target_buffer_get_u32(target
, &buffer
[i
*4]));
1587 output_len
+= snprintf(output
+ output_len
, 128 - output_len
, "%4.4x ", target_buffer_get_u16(target
, &buffer
[i
*2]));
1590 output_len
+= snprintf(output
+ output_len
, 128 - output_len
, "%2.2x ", buffer
[i
*1]);
1594 if ((i
%8 == 7) || (i
== count
- 1))
1596 command_print(cmd_ctx
, output
);
1606 int handle_mw_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1611 target_t
*target
= get_current_target(cmd_ctx
);
1617 address
= strtoul(args
[0], NULL
, 0);
1618 value
= strtoul(args
[1], NULL
, 0);
1623 target_buffer_set_u32(target
, value_buf
, value
);
1624 retval
= target
->type
->write_memory(target
, address
, 4, 1, value_buf
);
1627 target_buffer_set_u16(target
, value_buf
, value
);
1628 retval
= target
->type
->write_memory(target
, address
, 2, 1, value_buf
);
1631 value_buf
[0] = value
;
1632 retval
= target
->type
->write_memory(target
, address
, 1, 1, value_buf
);
1640 case ERROR_TARGET_UNALIGNED_ACCESS
:
1641 command_print(cmd_ctx
, "error: address not aligned");
1643 case ERROR_TARGET_DATA_ABORT
:
1644 command_print(cmd_ctx
, "error: access caused data abort, system possibly corrupted");
1646 case ERROR_TARGET_NOT_HALTED
:
1647 command_print(cmd_ctx
, "error: target must be halted for memory accesses");
1652 command_print(cmd_ctx
, "error: unknown error");
1660 int handle_load_image_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1670 duration_t duration
;
1671 char *duration_text
;
1673 target_t
*target
= get_current_target(cmd_ctx
);
1677 command_print(cmd_ctx
, "usage: load_image <filename> [address] [type]");
1681 /* a base address isn't always necessary, default to 0x0 (i.e. don't relocate) */
1684 image
.base_address_set
= 1;
1685 image
.base_address
= strtoul(args
[1], NULL
, 0);
1689 image
.base_address_set
= 0;
1692 image
.start_address_set
= 0;
1694 duration_start_measure(&duration
);
1696 if (image_open(&image
, args
[0], (argc
>= 3) ? args
[2] : NULL
) != ERROR_OK
)
1698 command_print(cmd_ctx
, "load_image error: %s", image
.error_str
);
1703 for (i
= 0; i
< image
.num_sections
; i
++)
1705 buffer
= malloc(image
.sections
[i
].size
);
1706 if ((retval
= image_read_section(&image
, i
, 0x0, image
.sections
[i
].size
, buffer
, &buf_cnt
)) != ERROR_OK
)
1708 ERROR("image_read_section failed with error code: %i", retval
);
1709 command_print(cmd_ctx
, "image reading failed, download aborted");
1711 image_close(&image
);
1714 target_write_buffer(target
, image
.sections
[i
].base_address
, buf_cnt
, buffer
);
1715 image_size
+= buf_cnt
;
1716 command_print(cmd_ctx
, "%u byte written at address 0x%8.8x", buf_cnt
, image
.sections
[i
].base_address
);
1721 duration_stop_measure(&duration
, &duration_text
);
1722 command_print(cmd_ctx
, "downloaded %u byte in %s", image_size
, duration_text
);
1723 free(duration_text
);
1725 image_close(&image
);
1731 int handle_dump_image_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1739 duration_t duration
;
1740 char *duration_text
;
1742 target_t
*target
= get_current_target(cmd_ctx
);
1746 command_print(cmd_ctx
, "usage: dump_image <filename> <address> <size>");
1750 address
= strtoul(args
[1], NULL
, 0);
1751 size
= strtoul(args
[2], NULL
, 0);
1753 if ((address
& 3) || (size
& 3))
1755 command_print(cmd_ctx
, "only 32-bit aligned address and size are supported");
1759 if (fileio_open(&fileio
, args
[0], FILEIO_WRITE
, FILEIO_BINARY
) != ERROR_OK
)
1761 command_print(cmd_ctx
, "dump_image error: %s", fileio
.error_str
);
1765 duration_start_measure(&duration
);
1770 u32 this_run_size
= (size
> 560) ? 560 : size
;
1772 target
->type
->read_memory(target
, address
, 4, this_run_size
/ 4, buffer
);
1773 fileio_write(&fileio
, this_run_size
, buffer
, &size_written
);
1775 size
-= this_run_size
;
1776 address
+= this_run_size
;
1779 fileio_close(&fileio
);
1781 duration_stop_measure(&duration
, &duration_text
);
1782 command_print(cmd_ctx
, "dumped %"PRIi64
" byte in %s", fileio
.size
, duration_text
);
1783 free(duration_text
);
1789 int handle_bp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1792 target_t
*target
= get_current_target(cmd_ctx
);
1796 breakpoint_t
*breakpoint
= target
->breakpoints
;
1800 if (breakpoint
->type
== BKPT_SOFT
)
1802 char* buf
= buf_to_str(breakpoint
->orig_instr
, breakpoint
->length
, 16);
1803 command_print(cmd_ctx
, "0x%8.8x, 0x%x, %i, 0x%s", breakpoint
->address
, breakpoint
->length
, breakpoint
->set
, buf
);
1808 command_print(cmd_ctx
, "0x%8.8x, 0x%x, %i", breakpoint
->address
, breakpoint
->length
, breakpoint
->set
);
1810 breakpoint
= breakpoint
->next
;
1818 length
= strtoul(args
[1], NULL
, 0);
1821 if (strcmp(args
[2], "hw") == 0)
1824 if ((retval
= breakpoint_add(target
, strtoul(args
[0], NULL
, 0), length
, hw
)) != ERROR_OK
)
1828 case ERROR_TARGET_NOT_HALTED
:
1829 command_print(cmd_ctx
, "target must be halted to set breakpoints");
1831 case ERROR_TARGET_RESOURCE_NOT_AVAILABLE
:
1832 command_print(cmd_ctx
, "no more breakpoints available");
1835 command_print(cmd_ctx
, "unknown error, breakpoint not set");
1841 command_print(cmd_ctx
, "breakpoint added at address 0x%8.8x", strtoul(args
[0], NULL
, 0));
1846 command_print(cmd_ctx
, "usage: bp <address> <length> ['hw']");
1852 int handle_rbp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1854 target_t
*target
= get_current_target(cmd_ctx
);
1857 breakpoint_remove(target
, strtoul(args
[0], NULL
, 0));
1862 int handle_wp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1864 target_t
*target
= get_current_target(cmd_ctx
);
1869 watchpoint_t
*watchpoint
= target
->watchpoints
;
1873 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
);
1874 watchpoint
= watchpoint
->next
;
1879 enum watchpoint_rw type
= WPT_ACCESS
;
1880 u32 data_value
= 0x0;
1881 u32 data_mask
= 0xffffffff;
1897 command_print(cmd_ctx
, "usage: wp <address> <length> [r/w/a] [value] [mask]");
1903 data_value
= strtoul(args
[3], NULL
, 0);
1907 data_mask
= strtoul(args
[4], NULL
, 0);
1910 if ((retval
= watchpoint_add(target
, strtoul(args
[0], NULL
, 0),
1911 strtoul(args
[1], NULL
, 0), type
, data_value
, data_mask
)) != ERROR_OK
)
1915 case ERROR_TARGET_NOT_HALTED
:
1916 command_print(cmd_ctx
, "target must be halted to set watchpoints");
1918 case ERROR_TARGET_RESOURCE_NOT_AVAILABLE
:
1919 command_print(cmd_ctx
, "no more watchpoints available");
1922 command_print(cmd_ctx
, "unknown error, watchpoint not set");
1929 command_print(cmd_ctx
, "usage: wp <address> <length> [r/w/a] [value] [mask]");
1935 int handle_rwp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1937 target_t
*target
= get_current_target(cmd_ctx
);
1940 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)