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 ***************************************************************************/
27 #include "configuration.h"
28 #include "binarybuffer.h"
34 #include <sys/types.h>
42 #include <time_support.h>
44 int cli_target_callback_event_handler(struct target_s
*target
, enum target_event event
, void *priv
);
46 int handle_target_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
47 int handle_daemon_startup_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
48 int handle_targets_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
50 int handle_target_script_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
51 int handle_run_and_halt_time_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
52 int handle_working_area_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
54 int handle_reg_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
55 int handle_poll_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
56 int handle_halt_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
57 int handle_wait_halt_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
58 int handle_reset_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
59 int handle_soft_reset_halt_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
60 int handle_resume_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
61 int handle_step_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
62 int handle_md_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
63 int handle_mw_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
64 int handle_load_binary_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
65 int handle_dump_binary_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
66 int handle_bp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
67 int handle_rbp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
68 int handle_wp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
69 int handle_rwp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
73 extern target_type_t arm7tdmi_target
;
74 extern target_type_t arm720t_target
;
75 extern target_type_t arm9tdmi_target
;
76 extern target_type_t arm920t_target
;
78 target_type_t
*target_types
[] =
87 target_t
*targets
= NULL
;
88 target_event_callback_t
*target_event_callbacks
= NULL
;
89 target_timer_callback_t
*target_timer_callbacks
= NULL
;
91 char *target_state_strings
[] =
100 char *target_debug_reason_strings
[] =
102 "debug request", "breakpoint", "watchpoint",
103 "watchpoint and breakpoint", "single step",
107 char *target_endianess_strings
[] =
113 enum daemon_startup_mode startup_mode
= DAEMON_ATTACH
;
115 static int target_continous_poll
= 1;
117 /* read a u32 from a buffer in target memory endianness */
118 u32
target_buffer_get_u32(target_t
*target
, u8
*buffer
)
120 if (target
->endianness
== TARGET_LITTLE_ENDIAN
)
121 return le_to_h_u32(buffer
);
123 return be_to_h_u32(buffer
);
126 /* read a u16 from a buffer in target memory endianness */
127 u16
target_buffer_get_u16(target_t
*target
, u8
*buffer
)
129 if (target
->endianness
== TARGET_LITTLE_ENDIAN
)
130 return le_to_h_u16(buffer
);
132 return be_to_h_u16(buffer
);
135 /* write a u32 to a buffer in target memory endianness */
136 void target_buffer_set_u32(target_t
*target
, u8
*buffer
, u32 value
)
138 if (target
->endianness
== TARGET_LITTLE_ENDIAN
)
139 h_u32_to_le(buffer
, value
);
141 h_u32_to_be(buffer
, value
);
144 /* write a u16 to a buffer in target memory endianness */
145 void target_buffer_set_u16(target_t
*target
, u8
*buffer
, u16 value
)
147 if (target
->endianness
== TARGET_LITTLE_ENDIAN
)
148 h_u16_to_le(buffer
, value
);
150 h_u16_to_be(buffer
, value
);
153 /* returns a pointer to the n-th configured target */
154 target_t
* get_target_by_num(int num
)
156 target_t
*target
= targets
;
163 target
= target
->next
;
170 int get_num_by_target(target_t
*query_target
)
172 target_t
*target
= targets
;
177 if (target
== query_target
)
179 target
= target
->next
;
186 target_t
* get_current_target(command_context_t
*cmd_ctx
)
188 target_t
*target
= get_target_by_num(cmd_ctx
->current_target
);
192 ERROR("BUG: current_target out of bounds");
199 /* Process target initialization, when target entered debug out of reset
200 * the handler is unregistered at the end of this function, so it's only called once
202 int target_init_handler(struct target_s
*target
, enum target_event event
, void *priv
)
205 struct command_context_s
*cmd_ctx
= priv
;
207 if ((event
== TARGET_EVENT_HALTED
) && (target
->reset_script
))
209 script
= fopen(target
->reset_script
, "r");
212 ERROR("couldn't open script file %s", target
->reset_script
);
216 INFO("executing reset script '%s'", target
->reset_script
);
217 command_run_file(cmd_ctx
, script
, COMMAND_EXEC
);
220 jtag_execute_queue();
222 target_unregister_event_callback(target_init_handler
, priv
);
228 int target_run_and_halt_handler(void *priv
)
230 target_t
*target
= priv
;
232 target
->type
->halt(target
);
237 int target_process_reset(struct command_context_s
*cmd_ctx
)
239 int retval
= ERROR_OK
;
245 target
->type
->assert_reset(target
);
246 target
= target
->next
;
248 jtag_execute_queue();
250 /* request target halt if necessary, and schedule further action */
254 switch (target
->reset_mode
)
257 /* nothing to do if target just wants to be run */
259 case RESET_RUN_AND_HALT
:
261 target_register_timer_callback(target_run_and_halt_handler
, target
->run_and_halt_time
, 0, target
);
263 case RESET_RUN_AND_INIT
:
265 target_register_timer_callback(target_run_and_halt_handler
, target
->run_and_halt_time
, 0, target
);
266 target_register_event_callback(target_init_handler
, cmd_ctx
);
269 target
->type
->halt(target
);
272 target
->type
->halt(target
);
273 target_register_event_callback(target_init_handler
, cmd_ctx
);
276 ERROR("BUG: unknown target->reset_mode");
278 target
= target
->next
;
284 target
->type
->deassert_reset(target
);
285 target
= target
->next
;
287 jtag_execute_queue();
292 int target_init(struct command_context_s
*cmd_ctx
)
294 target_t
*target
= targets
;
298 if (target
->type
->init_target(cmd_ctx
, target
) != ERROR_OK
)
300 ERROR("target '%s' init failed", target
->type
->name
);
303 target
= target
->next
;
308 target_register_user_commands(cmd_ctx
);
309 target_register_timer_callback(handle_target
, 100, 1, NULL
);
312 if (startup_mode
== DAEMON_RESET
)
313 target_process_reset(cmd_ctx
);
318 int target_register_event_callback(int (*callback
)(struct target_s
*target
, enum target_event event
, void *priv
), void *priv
)
320 target_event_callback_t
**callbacks_p
= &target_event_callbacks
;
322 if (callback
== NULL
)
324 return ERROR_INVALID_ARGUMENTS
;
329 while ((*callbacks_p
)->next
)
330 callbacks_p
= &((*callbacks_p
)->next
);
331 callbacks_p
= &((*callbacks_p
)->next
);
334 (*callbacks_p
) = malloc(sizeof(target_event_callback_t
));
335 (*callbacks_p
)->callback
= callback
;
336 (*callbacks_p
)->priv
= priv
;
337 (*callbacks_p
)->next
= NULL
;
342 int target_register_timer_callback(int (*callback
)(void *priv
), int time_ms
, int periodic
, void *priv
)
344 target_timer_callback_t
**callbacks_p
= &target_timer_callbacks
;
347 if (callback
== NULL
)
349 return ERROR_INVALID_ARGUMENTS
;
354 while ((*callbacks_p
)->next
)
355 callbacks_p
= &((*callbacks_p
)->next
);
356 callbacks_p
= &((*callbacks_p
)->next
);
359 (*callbacks_p
) = malloc(sizeof(target_timer_callback_t
));
360 (*callbacks_p
)->callback
= callback
;
361 (*callbacks_p
)->periodic
= periodic
;
362 (*callbacks_p
)->time_ms
= time_ms
;
364 gettimeofday(&now
, NULL
);
365 (*callbacks_p
)->when
.tv_usec
= now
.tv_usec
+ (time_ms
% 1000) * 1000;
366 time_ms
-= (time_ms
% 1000);
367 (*callbacks_p
)->when
.tv_sec
= now
.tv_sec
+ (time_ms
/ 1000);
368 if ((*callbacks_p
)->when
.tv_usec
> 1000000)
370 (*callbacks_p
)->when
.tv_usec
= (*callbacks_p
)->when
.tv_usec
- 1000000;
371 (*callbacks_p
)->when
.tv_sec
+= 1;
374 (*callbacks_p
)->priv
= priv
;
375 (*callbacks_p
)->next
= NULL
;
380 int target_unregister_event_callback(int (*callback
)(struct target_s
*target
, enum target_event event
, void *priv
), void *priv
)
382 target_event_callback_t
**p
= &target_event_callbacks
;
383 target_event_callback_t
*c
= target_event_callbacks
;
385 if (callback
== NULL
)
387 return ERROR_INVALID_ARGUMENTS
;
392 target_event_callback_t
*next
= c
->next
;
393 if ((c
->callback
== callback
) && (c
->priv
== priv
))
407 int target_unregister_timer_callback(int (*callback
)(void *priv
), void *priv
)
409 target_timer_callback_t
**p
= &target_timer_callbacks
;
410 target_timer_callback_t
*c
= target_timer_callbacks
;
412 if (callback
== NULL
)
414 return ERROR_INVALID_ARGUMENTS
;
419 target_timer_callback_t
*next
= c
->next
;
420 if ((c
->callback
== callback
) && (c
->priv
== priv
))
434 int target_call_event_callbacks(target_t
*target
, enum target_event event
)
436 target_event_callback_t
*callback
= target_event_callbacks
;
437 target_event_callback_t
*next_callback
;
439 DEBUG("target event %i", event
);
443 next_callback
= callback
->next
;
444 callback
->callback(target
, event
, callback
->priv
);
445 callback
= next_callback
;
451 int target_call_timer_callbacks()
453 target_timer_callback_t
*callback
= target_timer_callbacks
;
454 target_timer_callback_t
*next_callback
;
457 gettimeofday(&now
, NULL
);
461 next_callback
= callback
->next
;
463 if (((now
.tv_sec
>= callback
->when
.tv_sec
) && (now
.tv_usec
>= callback
->when
.tv_usec
))
464 || (now
.tv_sec
> callback
->when
.tv_sec
))
466 callback
->callback(callback
->priv
);
467 if (callback
->periodic
)
469 int time_ms
= callback
->time_ms
;
470 callback
->when
.tv_usec
= now
.tv_usec
+ (time_ms
% 1000) * 1000;
471 time_ms
-= (time_ms
% 1000);
472 callback
->when
.tv_sec
= now
.tv_sec
+ time_ms
/ 1000;
473 if (callback
->when
.tv_usec
> 1000000)
475 callback
->when
.tv_usec
= callback
->when
.tv_usec
- 1000000;
476 callback
->when
.tv_sec
+= 1;
480 target_unregister_timer_callback(callback
->callback
, callback
->priv
);
483 callback
= next_callback
;
489 int target_alloc_working_area(struct target_s
*target
, u32 size
, working_area_t
**area
)
491 working_area_t
*c
= target
->working_areas
;
492 working_area_t
*new_wa
= NULL
;
494 /* only allocate multiples of 4 byte */
497 ERROR("BUG: code tried to allocate unaligned number of bytes, padding");
498 size
= CEIL(size
, 4);
501 /* see if there's already a matching working area */
504 if ((c
->free
) && (c
->size
== size
))
512 /* if not, allocate a new one */
515 working_area_t
**p
= &target
->working_areas
;
516 u32 first_free
= target
->working_area
;
517 u32 free_size
= target
->working_area_size
;
519 DEBUG("allocating new working area");
521 c
= target
->working_areas
;
524 first_free
+= c
->size
;
525 free_size
-= c
->size
;
530 if (free_size
< size
)
532 WARNING("not enough working area available");
533 return ERROR_TARGET_RESOURCE_NOT_AVAILABLE
;
536 new_wa
= malloc(sizeof(working_area_t
));
539 new_wa
->address
= first_free
;
541 if (target
->backup_working_area
)
543 new_wa
->backup
= malloc(new_wa
->size
);
544 target
->type
->read_memory(target
, new_wa
->address
, 4, new_wa
->size
/ 4, new_wa
->backup
);
548 new_wa
->backup
= NULL
;
551 /* put new entry in list */
555 /* mark as used, and return the new (reused) area */
565 int target_free_working_area(struct target_s
*target
, working_area_t
*area
)
570 if (target
->backup_working_area
)
571 target
->type
->write_memory(target
, area
->address
, 4, area
->size
/ 4, area
->backup
);
575 /* mark user pointer invalid */
582 int target_free_all_working_areas(struct target_s
*target
)
584 working_area_t
*c
= target
->working_areas
;
588 working_area_t
*next
= c
->next
;
589 target_free_working_area(target
, c
);
599 target
->working_areas
= NULL
;
604 int target_register_commands(struct command_context_s
*cmd_ctx
)
606 register_command(cmd_ctx
, NULL
, "target", handle_target_command
, COMMAND_CONFIG
, NULL
);
607 register_command(cmd_ctx
, NULL
, "targets", handle_targets_command
, COMMAND_EXEC
, NULL
);
608 register_command(cmd_ctx
, NULL
, "daemon_startup", handle_daemon_startup_command
, COMMAND_CONFIG
, NULL
);
609 register_command(cmd_ctx
, NULL
, "target_script", handle_target_script_command
, COMMAND_CONFIG
, NULL
);
610 register_command(cmd_ctx
, NULL
, "run_and_halt_time", handle_run_and_halt_time_command
, COMMAND_CONFIG
, NULL
);
611 register_command(cmd_ctx
, NULL
, "working_area", handle_working_area_command
, COMMAND_CONFIG
, NULL
);
616 int target_write_buffer(struct target_s
*target
, u32 address
, u32 size
, u8
*buffer
)
620 DEBUG("writing buffer of %i byte at 0x%8.8x", size
, address
);
622 /* handle writes of less than 4 byte */
625 if ((retval
= target
->type
->write_memory(target
, address
, 1, size
, buffer
)) != ERROR_OK
)
629 /* handle unaligned head bytes */
632 int unaligned
= 4 - (address
% 4);
634 if ((retval
= target
->type
->write_memory(target
, address
, 1, unaligned
, buffer
)) != ERROR_OK
)
638 address
+= unaligned
;
642 /* handle aligned words */
645 int aligned
= size
- (size
% 4);
647 /* use bulk writes above a certain limit. This may have to be changed */
650 if ((retval
= target
->type
->bulk_write_memory(target
, address
, aligned
/ 4, buffer
)) != ERROR_OK
)
655 if ((retval
= target
->type
->write_memory(target
, address
, 4, aligned
/ 4, buffer
)) != ERROR_OK
)
664 /* handle tail writes of less than 4 bytes */
667 if ((retval
= target
->type
->write_memory(target
, address
, 1, size
, buffer
)) != ERROR_OK
)
674 int target_read_buffer(struct target_s
*target
, u32 address
, u32 size
, u8
*buffer
)
678 DEBUG("reading buffer of %i byte at 0x%8.8x", size
, address
);
680 /* handle reads of less than 4 byte */
683 if ((retval
= target
->type
->read_memory(target
, address
, 1, size
, buffer
)) != ERROR_OK
)
687 /* handle unaligned head bytes */
690 int unaligned
= 4 - (address
% 4);
692 if ((retval
= target
->type
->read_memory(target
, address
, 1, unaligned
, buffer
)) != ERROR_OK
)
695 address
+= unaligned
;
699 /* handle aligned words */
702 int aligned
= size
- (size
% 4);
704 if ((retval
= target
->type
->read_memory(target
, address
, 4, aligned
/ 4, buffer
)) != ERROR_OK
)
711 /* handle tail writes of less than 4 bytes */
714 if ((retval
= target
->type
->read_memory(target
, address
, 1, size
, buffer
)) != ERROR_OK
)
721 int target_register_user_commands(struct command_context_s
*cmd_ctx
)
723 register_command(cmd_ctx
, NULL
, "reg", handle_reg_command
, COMMAND_EXEC
, NULL
);
724 register_command(cmd_ctx
, NULL
, "poll", handle_poll_command
, COMMAND_EXEC
, "poll target state");
725 register_command(cmd_ctx
, NULL
, "wait_halt", handle_wait_halt_command
, COMMAND_EXEC
, "wait for target halt");
726 register_command(cmd_ctx
, NULL
, "halt", handle_halt_command
, COMMAND_EXEC
, "halt target");
727 register_command(cmd_ctx
, NULL
, "resume", handle_resume_command
, COMMAND_EXEC
, "resume target [addr]");
728 register_command(cmd_ctx
, NULL
, "step", handle_step_command
, COMMAND_EXEC
, "step one instruction");
729 register_command(cmd_ctx
, NULL
, "reset", handle_reset_command
, COMMAND_EXEC
, "reset target [run|halt|init|run_and_halt|run_and_init]");
730 register_command(cmd_ctx
, NULL
, "soft_reset_halt", handle_soft_reset_halt_command
, COMMAND_EXEC
, "halt the target and do a soft reset");
732 register_command(cmd_ctx
, NULL
, "mdw", handle_md_command
, COMMAND_EXEC
, "display memory words <addr> [count]");
733 register_command(cmd_ctx
, NULL
, "mdh", handle_md_command
, COMMAND_EXEC
, "display memory half-words <addr> [count]");
734 register_command(cmd_ctx
, NULL
, "mdb", handle_md_command
, COMMAND_EXEC
, "display memory bytes <addr> [count]");
736 register_command(cmd_ctx
, NULL
, "mww", handle_mw_command
, COMMAND_EXEC
, "write memory word <addr> <value>");
737 register_command(cmd_ctx
, NULL
, "mwh", handle_mw_command
, COMMAND_EXEC
, "write memory half-word <addr> <value>");
738 register_command(cmd_ctx
, NULL
, "mwb", handle_mw_command
, COMMAND_EXEC
, "write memory byte <addr> <value>");
740 register_command(cmd_ctx
, NULL
, "bp", handle_bp_command
, COMMAND_EXEC
, "set breakpoint <address> <length> [hw]");
741 register_command(cmd_ctx
, NULL
, "rbp", handle_rbp_command
, COMMAND_EXEC
, "remove breakpoint <adress>");
742 register_command(cmd_ctx
, NULL
, "wp", handle_wp_command
, COMMAND_EXEC
, "set watchpoint <address> <length> <r/w/a> [value] [mask]");
743 register_command(cmd_ctx
, NULL
, "rwp", handle_rwp_command
, COMMAND_EXEC
, "remove watchpoint <adress>");
745 register_command(cmd_ctx
, NULL
, "load_binary", handle_load_binary_command
, COMMAND_EXEC
, "load binary <file> <address>");
746 register_command(cmd_ctx
, NULL
, "dump_binary", handle_dump_binary_command
, COMMAND_EXEC
, "dump binary <file> <address> <size>");
751 int handle_targets_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
753 target_t
*target
= targets
;
758 int num
= strtoul(args
[0], NULL
, 0);
763 target
= target
->next
;
767 cmd_ctx
->current_target
= num
;
769 command_print(cmd_ctx
, "%i is out of bounds, only %i targets are configured", num
, count
);
776 command_print(cmd_ctx
, "%i: %s (%s), state: %s", count
++, target
->type
->name
, target_endianess_strings
[target
->endianness
], target_state_strings
[target
->state
]);
777 target
= target
->next
;
783 int handle_target_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
790 ERROR("target command requires at least three arguments: <type> <endianess> <reset_mode>");
794 /* search for the specified target */
795 if (args
[0] && (args
[0][0] != 0))
797 for (i
= 0; target_types
[i
]; i
++)
799 if (strcmp(args
[0], target_types
[i
]->name
) == 0)
801 target_t
**last_target_p
= &targets
;
803 /* register target specific commands */
804 if (target_types
[i
]->register_commands(cmd_ctx
) != ERROR_OK
)
806 ERROR("couldn't register '%s' commands", args
[0]);
812 while ((*last_target_p
)->next
)
813 last_target_p
= &((*last_target_p
)->next
);
814 last_target_p
= &((*last_target_p
)->next
);
817 *last_target_p
= malloc(sizeof(target_t
));
819 (*last_target_p
)->type
= target_types
[i
];
821 if (strcmp(args
[1], "big") == 0)
822 (*last_target_p
)->endianness
= TARGET_BIG_ENDIAN
;
823 else if (strcmp(args
[1], "little") == 0)
824 (*last_target_p
)->endianness
= TARGET_LITTLE_ENDIAN
;
827 ERROR("endianness must be either 'little' or 'big', not '%s'", args
[1]);
831 /* what to do on a target reset */
832 if (strcmp(args
[2], "reset_halt") == 0)
833 (*last_target_p
)->reset_mode
= RESET_HALT
;
834 else if (strcmp(args
[2], "reset_run") == 0)
835 (*last_target_p
)->reset_mode
= RESET_RUN
;
836 else if (strcmp(args
[2], "reset_init") == 0)
837 (*last_target_p
)->reset_mode
= RESET_INIT
;
838 else if (strcmp(args
[2], "run_and_halt") == 0)
839 (*last_target_p
)->reset_mode
= RESET_RUN_AND_HALT
;
840 else if (strcmp(args
[2], "run_and_init") == 0)
841 (*last_target_p
)->reset_mode
= RESET_RUN_AND_INIT
;
844 ERROR("unknown target startup mode %s", args
[2]);
847 (*last_target_p
)->run_and_halt_time
= 1000; /* default 1s */
849 (*last_target_p
)->reset_script
= NULL
;
850 (*last_target_p
)->post_halt_script
= NULL
;
851 (*last_target_p
)->pre_resume_script
= NULL
;
853 (*last_target_p
)->working_area
= 0x0;
854 (*last_target_p
)->working_area_size
= 0x0;
855 (*last_target_p
)->working_areas
= NULL
;
856 (*last_target_p
)->backup_working_area
= 0;
858 (*last_target_p
)->endianness
= TARGET_LITTLE_ENDIAN
;
859 (*last_target_p
)->state
= TARGET_UNKNOWN
;
860 (*last_target_p
)->reg_cache
= NULL
;
861 (*last_target_p
)->breakpoints
= NULL
;
862 (*last_target_p
)->watchpoints
= NULL
;
863 (*last_target_p
)->next
= NULL
;
864 (*last_target_p
)->arch_info
= NULL
;
866 (*last_target_p
)->type
->target_command(cmd_ctx
, cmd
, args
, argc
, *last_target_p
);
874 /* no matching target found */
877 ERROR("target '%s' not found", args
[0]);
884 /* usage: target_script <target#> <event> <script_file> */
885 int handle_target_script_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
887 target_t
*target
= NULL
;
891 ERROR("incomplete target_script command");
895 target
= get_target_by_num(strtoul(args
[0], NULL
, 0));
899 ERROR("target number '%s' not defined", args
[0]);
903 if (strcmp(args
[1], "reset") == 0)
905 if (target
->reset_script
)
906 free(target
->reset_script
);
907 target
->reset_script
= strdup(args
[2]);
909 else if (strcmp(args
[1], "post_halt") == 0)
911 if (target
->post_halt_script
)
912 free(target
->post_halt_script
);
913 target
->post_halt_script
= strdup(args
[2]);
915 else if (strcmp(args
[1], "pre_resume") == 0)
917 if (target
->pre_resume_script
)
918 free(target
->pre_resume_script
);
919 target
->pre_resume_script
= strdup(args
[2]);
923 ERROR("unknown event type: '%s", args
[1]);
930 int handle_run_and_halt_time_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
932 target_t
*target
= NULL
;
936 ERROR("incomplete run_and_halt_time command");
940 target
= get_target_by_num(strtoul(args
[0], NULL
, 0));
944 ERROR("target number '%s' not defined", args
[0]);
948 target
->run_and_halt_time
= strtoul(args
[1], NULL
, 0);
953 int handle_working_area_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
955 target_t
*target
= NULL
;
959 ERROR("incomplete working_area command. usage: working_area <target#> <address> <size> <'backup'|'nobackup'>");
963 target
= get_target_by_num(strtoul(args
[0], NULL
, 0));
967 ERROR("target number '%s' not defined", args
[0]);
971 target
->working_area
= strtoul(args
[1], NULL
, 0);
972 target
->working_area_size
= strtoul(args
[2], NULL
, 0);
974 if (strcmp(args
[3], "backup") == 0)
976 target
->backup_working_area
= 1;
978 else if (strcmp(args
[3], "nobackup") == 0)
980 target
->backup_working_area
= 0;
984 ERROR("unrecognized <backup|nobackup> argument (%s)", args
[3]);
992 /* process target state changes */
993 int handle_target(void *priv
)
996 target_t
*target
= targets
;
1000 /* only poll if target isn't already halted */
1001 if (target
->state
!= TARGET_HALTED
)
1003 if (target_continous_poll
)
1004 if ((retval
= target
->type
->poll(target
)) < 0)
1006 ERROR("couldn't poll target, exiting");
1011 target
= target
->next
;
1017 int handle_reg_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1026 target
= get_current_target(cmd_ctx
);
1028 /* list all available registers for the current target */
1031 reg_cache_t
*cache
= target
->reg_cache
;
1037 for (i
= 0; i
< cache
->num_regs
; i
++)
1039 value
= buf_to_char(cache
->reg_list
[i
].value
, cache
->reg_list
[i
].size
);
1040 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
);
1043 cache
= cache
->next
;
1049 /* access a single register by its ordinal number */
1050 if ((args
[0][0] >= '0') && (args
[0][0] <= '9'))
1052 int num
= strtoul(args
[0], NULL
, 0);
1053 reg_cache_t
*cache
= target
->reg_cache
;
1059 for (i
= 0; i
< cache
->num_regs
; i
++)
1063 reg
= &cache
->reg_list
[i
];
1069 cache
= cache
->next
;
1074 command_print(cmd_ctx
, "%i is out of bounds, the current target has only %i registers (0 - %i)", num
, count
, count
- 1);
1077 } else /* access a single register by its name */
1079 reg
= register_get_by_name(target
->reg_cache
, args
[0], 1);
1083 command_print(cmd_ctx
, "register %s not found in current target", args
[0]);
1088 /* display a register */
1089 if ((argc
== 1) || ((argc
== 2) && !((args
[1][0] >= '0') && (args
[1][0] <= '9'))))
1091 if ((argc
== 2) && (strcmp(args
[1], "force") == 0))
1094 if (reg
->valid
== 0)
1096 reg_arch_type_t
*arch_type
= register_get_arch_type(reg
->arch_type
);
1097 if (arch_type
== NULL
)
1099 ERROR("BUG: encountered unregistered arch type");
1102 arch_type
->get(reg
);
1104 value
= buf_to_char(reg
->value
, reg
->size
);
1105 command_print(cmd_ctx
, "%s (/%i): 0x%s", reg
->name
, reg
->size
, value
);
1110 /* set register value */
1113 u32 new_value
= strtoul(args
[1], NULL
, 0);
1114 reg_arch_type_t
*arch_type
= register_get_arch_type(reg
->arch_type
);
1115 if (arch_type
== NULL
)
1117 ERROR("BUG: encountered unregistered arch type");
1121 arch_type
->set(reg
, new_value
);
1122 value
= buf_to_char(reg
->value
, reg
->size
);
1123 command_print(cmd_ctx
, "%s (/%i): 0x%s", reg
->name
, reg
->size
, value
);
1129 command_print(cmd_ctx
, "usage: reg <#|name> [value]");
1134 int handle_poll_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1136 target_t
*target
= get_current_target(cmd_ctx
);
1141 command_print(cmd_ctx
, "target state: %s", target_state_strings
[target
->type
->poll(target
)]);
1142 if (target
->state
== TARGET_HALTED
)
1144 target
->type
->arch_state(target
, buffer
, 512);
1146 command_print(cmd_ctx
, "%s", buffer
);
1151 if (strcmp(args
[0], "on") == 0)
1153 target_continous_poll
= 1;
1155 else if (strcmp(args
[0], "off") == 0)
1157 target_continous_poll
= 0;
1165 int handle_wait_halt_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1167 target_t
*target
= get_current_target(cmd_ctx
);
1168 struct timeval timeout
, now
;
1170 gettimeofday(&timeout
, NULL
);
1171 timeval_add_time(&timeout
, 5, 0);
1173 command_print(cmd_ctx
, "waiting for target halted...");
1175 while(target
->type
->poll(target
))
1177 if (target
->state
== TARGET_HALTED
)
1179 command_print(cmd_ctx
, "target halted");
1182 target_call_timer_callbacks();
1184 gettimeofday(&now
, NULL
);
1185 if ((now
.tv_sec
>= timeout
.tv_sec
) && (now
.tv_usec
>= timeout
.tv_usec
))
1187 command_print(cmd_ctx
, "timed out while waiting for target halt");
1188 ERROR("timed out while waiting for target halt");
1196 int handle_halt_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1199 target_t
*target
= get_current_target(cmd_ctx
);
1203 command_print(cmd_ctx
, "requesting target halt...");
1205 if ((retval
= target
->type
->halt(target
)) != ERROR_OK
)
1209 case ERROR_TARGET_ALREADY_HALTED
:
1210 command_print(cmd_ctx
, "target already halted");
1212 case ERROR_TARGET_TIMEOUT
:
1213 command_print(cmd_ctx
, "target timed out... shutting down");
1216 command_print(cmd_ctx
, "unknown error... shutting down");
1225 /* what to do on daemon startup */
1226 int handle_daemon_startup_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1230 if (strcmp(args
[0], "attach") == 0)
1232 startup_mode
= DAEMON_ATTACH
;
1235 else if (strcmp(args
[0], "reset") == 0)
1237 startup_mode
= DAEMON_RESET
;
1242 WARNING("invalid daemon_startup configuration directive: %s", args
[0]);
1247 int handle_soft_reset_halt_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1249 target_t
*target
= get_current_target(cmd_ctx
);
1252 command_print(cmd_ctx
, "requesting target halt and executing a soft reset");
1254 if ((retval
= target
->type
->soft_reset_halt(target
)) != ERROR_OK
)
1258 case ERROR_TARGET_TIMEOUT
:
1259 command_print(cmd_ctx
, "target timed out... shutting down");
1262 command_print(cmd_ctx
, "unknown error... shutting down");
1270 int handle_reset_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1272 target_t
*target
= get_current_target(cmd_ctx
);
1273 enum target_reset_mode reset_mode
= RESET_RUN
;
1279 if (strcmp("run", args
[0]) == 0)
1280 reset_mode
= RESET_RUN
;
1281 else if (strcmp("halt", args
[0]) == 0)
1282 reset_mode
= RESET_HALT
;
1283 else if (strcmp("init", args
[0]) == 0)
1284 reset_mode
= RESET_INIT
;
1285 else if (strcmp("run_and_halt", args
[0]) == 0)
1287 reset_mode
= RESET_RUN_AND_HALT
;
1290 target
->run_and_halt_time
= strtoul(args
[1], NULL
, 0);
1293 else if (strcmp("run_and_init", args
[0]) == 0)
1295 reset_mode
= RESET_RUN_AND_INIT
;
1298 target
->run_and_halt_time
= strtoul(args
[1], NULL
, 0);
1303 command_print(cmd_ctx
, "usage: reset ['run', 'halt', 'init', 'run_and_halt', 'run_and_init]");
1306 target
->reset_mode
= reset_mode
;
1309 target_process_reset(cmd_ctx
);
1314 int handle_resume_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1317 target_t
*target
= get_current_target(cmd_ctx
);
1322 retval
= target
->type
->resume(target
, 1, 0, 1, 0); /* current pc, addr = 0, handle breakpoints, not debugging */
1324 retval
= target
->type
->resume(target
, 0, strtoul(args
[0], NULL
, 0), 1, 0); /* addr = args[0], handle breakpoints, not debugging */
1327 command_print(cmd_ctx
, "usage: resume [address]");
1331 if (retval
!= ERROR_OK
)
1335 case ERROR_TARGET_NOT_HALTED
:
1336 command_print(cmd_ctx
, "target not halted");
1339 command_print(cmd_ctx
, "unknown error... shutting down");
1347 int handle_step_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1349 target_t
*target
= get_current_target(cmd_ctx
);
1354 target
->type
->step(target
, 1, 0, 1); /* current pc, addr = 0, handle breakpoints */
1357 target
->type
->step(target
, 0, strtoul(args
[0], NULL
, 0), 1); /* addr = args[0], handle breakpoints */
1362 int handle_md_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1375 target_t
*target
= get_current_target(cmd_ctx
);
1381 count
= strtoul(args
[1], NULL
, 0);
1383 address
= strtoul(args
[0], NULL
, 0);
1401 buffer
= calloc(count
, size
);
1402 if ((retval
= target
->type
->read_memory(target
, address
, size
, count
, buffer
)) != ERROR_OK
)
1406 case ERROR_TARGET_UNALIGNED_ACCESS
:
1407 command_print(cmd_ctx
, "error: address not aligned");
1409 case ERROR_TARGET_NOT_HALTED
:
1410 command_print(cmd_ctx
, "error: target must be halted for memory accesses");
1412 case ERROR_TARGET_DATA_ABORT
:
1413 command_print(cmd_ctx
, "error: access caused data abort, system possibly corrupted");
1416 command_print(cmd_ctx
, "error: unknown error");
1423 for (i
= 0; i
< count
; i
++)
1426 output_len
+= snprintf(output
+ output_len
, 128 - output_len
, "0x%8.8x: ", address
+ (i
*size
));
1431 output_len
+= snprintf(output
+ output_len
, 128 - output_len
, "%8.8x ", ((u32
*)buffer
)[i
]);
1434 output_len
+= snprintf(output
+ output_len
, 128 - output_len
, "%4.4x ", ((u16
*)buffer
)[i
]);
1437 output_len
+= snprintf(output
+ output_len
, 128 - output_len
, "%2.2x ", ((u8
*)buffer
)[i
]);
1441 if ((i
%8 == 7) || (i
== count
- 1))
1443 command_print(cmd_ctx
, output
);
1453 int handle_mw_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1458 target_t
*target
= get_current_target(cmd_ctx
);
1463 address
= strtoul(args
[0], NULL
, 0);
1464 value
= strtoul(args
[1], NULL
, 0);
1469 retval
= target
->type
->write_memory(target
, address
, 4, 1, (u8
*)&value
);
1472 retval
= target
->type
->write_memory(target
, address
, 2, 1, (u8
*)&value
);
1475 retval
= target
->type
->write_memory(target
, address
, 1, 1, (u8
*)&value
);
1483 case ERROR_TARGET_UNALIGNED_ACCESS
:
1484 command_print(cmd_ctx
, "error: address not aligned");
1486 case ERROR_TARGET_DATA_ABORT
:
1487 command_print(cmd_ctx
, "error: access caused data abort, system possibly corrupted");
1489 case ERROR_TARGET_NOT_HALTED
:
1490 command_print(cmd_ctx
, "error: target must be halted for memory accesses");
1495 command_print(cmd_ctx
, "error: unknown error");
1503 int handle_load_binary_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1507 struct stat binary_stat
;
1513 struct timeval start
, end
, duration
;
1515 target_t
*target
= get_current_target(cmd_ctx
);
1519 command_print(cmd_ctx
, "usage: load_binary <filename> <address>");
1523 address
= strtoul(args
[1], NULL
, 0);
1525 if (stat(args
[0], &binary_stat
) == -1)
1527 ERROR("couldn't stat() %s: %s", args
[0], strerror(errno
));
1528 command_print(cmd_ctx
, "error accessing file %s", args
[0]);
1532 if (!(binary
= fopen(args
[0], "rb")))
1534 ERROR("couldn't open %s: %s", args
[0], strerror(errno
));
1535 command_print(cmd_ctx
, "error accessing file %s", args
[0]);
1539 buffer
= malloc(128 * 1024);
1541 gettimeofday(&start
, NULL
);
1543 binary_size
= binary_stat
.st_size
;
1544 while (binary_size
> 0)
1546 buf_cnt
= fread(buffer
, 1, 128*1024, binary
);
1547 target_write_buffer(target
, address
, buf_cnt
, buffer
);
1549 binary_size
-= buf_cnt
;
1552 gettimeofday(&end
, NULL
);
1556 timeval_subtract(&duration
, &end
, &start
);
1557 command_print(cmd_ctx
, "downloaded %lli byte in %is %ius", (long long) binary_stat
.st_size
, duration
.tv_sec
, duration
.tv_usec
);
1565 int handle_dump_binary_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1572 target_t
*target
= get_current_target(cmd_ctx
);
1576 command_print(cmd_ctx
, "usage: dump_binary <filename> <address> <size>");
1580 address
= strtoul(args
[1], NULL
, 0);
1581 size
= strtoul(args
[2], NULL
, 0);
1583 if (!(binary
= fopen(args
[0], "wb")))
1585 ERROR("couldn't open %s for writing: %s", args
[0], strerror(errno
));
1586 command_print(cmd_ctx
, "error accessing file %s", args
[0]);
1590 if ((address
& 3) || (size
& 3))
1592 command_print(cmd_ctx
, "only 32-bit aligned address and size are supported");
1598 u32 this_run_size
= (size
> 560) ? 560 : size
;
1599 target
->type
->read_memory(target
, address
, 4, this_run_size
/ 4, buffer
);
1600 fwrite(buffer
, 1, this_run_size
, binary
);
1601 size
-= this_run_size
;
1602 address
+= this_run_size
;
1611 int handle_bp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1614 target_t
*target
= get_current_target(cmd_ctx
);
1618 breakpoint_t
*breakpoint
= target
->breakpoints
;
1622 if (breakpoint
->type
== BKPT_SOFT
)
1624 char* buf
= buf_to_char(breakpoint
->orig_instr
, breakpoint
->length
);
1625 command_print(cmd_ctx
, "0x%8.8x, 0x%x, %i, 0x%s", breakpoint
->address
, breakpoint
->length
, breakpoint
->set
, buf
);
1630 command_print(cmd_ctx
, "0x%8.8x, 0x%x, %i", breakpoint
->address
, breakpoint
->length
, breakpoint
->set
);
1632 breakpoint
= breakpoint
->next
;
1640 length
= strtoul(args
[1], NULL
, 0);
1643 if (strcmp(args
[2], "hw") == 0)
1646 if ((retval
= breakpoint_add(target
, strtoul(args
[0], NULL
, 0), length
, hw
)) != ERROR_OK
)
1650 case ERROR_TARGET_NOT_HALTED
:
1651 command_print(cmd_ctx
, "target must be halted to set breakpoints");
1653 case ERROR_TARGET_RESOURCE_NOT_AVAILABLE
:
1654 command_print(cmd_ctx
, "no more breakpoints available");
1657 command_print(cmd_ctx
, "unknown error, breakpoint not set");
1666 int handle_rbp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1668 target_t
*target
= get_current_target(cmd_ctx
);
1671 breakpoint_remove(target
, strtoul(args
[0], NULL
, 0));
1676 int handle_wp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1678 target_t
*target
= get_current_target(cmd_ctx
);
1682 watchpoint_t
*watchpoint
= target
->watchpoints
;
1686 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
);
1687 watchpoint
= watchpoint
->next
;
1692 enum watchpoint_rw type
= WPT_ACCESS
;
1693 u32 data_value
= 0x0;
1694 u32 data_mask
= 0xffffffff;
1710 command_print(cmd_ctx
, "usage: wp <address> <length> [r/w/a] [value] [mask]");
1716 data_value
= strtoul(args
[3], NULL
, 0);
1720 data_mask
= strtoul(args
[4], NULL
, 0);
1722 watchpoint_add(target
, strtoul(args
[0], NULL
, 0), strtoul(args
[1], NULL
, 0), type
, data_value
, data_mask
);
1726 command_print(cmd_ctx
, "usage: wp <address> <length> [r/w/a] [value] [mask]");
1732 int handle_rwp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1734 target_t
*target
= get_current_target(cmd_ctx
);
1737 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)