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
);
53 int handle_target_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
54 int handle_daemon_startup_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
55 int handle_targets_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
57 int handle_target_script_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
58 int handle_run_and_halt_time_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
59 int handle_working_area_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
61 int handle_reg_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
62 int handle_poll_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
63 int handle_halt_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
64 int handle_wait_halt_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
65 int handle_reset_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
66 int handle_soft_reset_halt_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
67 int handle_resume_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
68 int handle_step_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
69 int handle_md_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
70 int handle_mw_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
71 int handle_load_image_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
72 int handle_dump_image_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
73 int handle_verify_image_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
74 int handle_bp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
75 int handle_rbp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
76 int handle_wp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
77 int handle_rwp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
78 int handle_virt2phys_command(command_context_t
*cmd_ctx
, char *cmd
, char **args
, int argc
);
79 int handle_profile_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
83 extern target_type_t arm7tdmi_target
;
84 extern target_type_t arm720t_target
;
85 extern target_type_t arm9tdmi_target
;
86 extern target_type_t arm920t_target
;
87 extern target_type_t arm966e_target
;
88 extern target_type_t arm926ejs_target
;
89 extern target_type_t feroceon_target
;
90 extern target_type_t xscale_target
;
91 extern target_type_t cortexm3_target
;
92 extern target_type_t arm11_target
;
94 target_type_t
*target_types
[] =
109 target_t
*targets
= NULL
;
110 target_event_callback_t
*target_event_callbacks
= NULL
;
111 target_timer_callback_t
*target_timer_callbacks
= NULL
;
113 char *target_state_strings
[] =
122 char *target_debug_reason_strings
[] =
124 "debug request", "breakpoint", "watchpoint",
125 "watchpoint and breakpoint", "single step",
126 "target not halted", "undefined"
129 char *target_endianess_strings
[] =
135 enum daemon_startup_mode startup_mode
= DAEMON_ATTACH
;
137 static int target_continous_poll
= 1;
139 /* read a u32 from a buffer in target memory endianness */
140 u32
target_buffer_get_u32(target_t
*target
, u8
*buffer
)
142 if (target
->endianness
== TARGET_LITTLE_ENDIAN
)
143 return le_to_h_u32(buffer
);
145 return be_to_h_u32(buffer
);
148 /* read a u16 from a buffer in target memory endianness */
149 u16
target_buffer_get_u16(target_t
*target
, u8
*buffer
)
151 if (target
->endianness
== TARGET_LITTLE_ENDIAN
)
152 return le_to_h_u16(buffer
);
154 return be_to_h_u16(buffer
);
157 /* write a u32 to a buffer in target memory endianness */
158 void target_buffer_set_u32(target_t
*target
, u8
*buffer
, u32 value
)
160 if (target
->endianness
== TARGET_LITTLE_ENDIAN
)
161 h_u32_to_le(buffer
, value
);
163 h_u32_to_be(buffer
, value
);
166 /* write a u16 to a buffer in target memory endianness */
167 void target_buffer_set_u16(target_t
*target
, u8
*buffer
, u16 value
)
169 if (target
->endianness
== TARGET_LITTLE_ENDIAN
)
170 h_u16_to_le(buffer
, value
);
172 h_u16_to_be(buffer
, value
);
175 /* returns a pointer to the n-th configured target */
176 target_t
* get_target_by_num(int num
)
178 target_t
*target
= targets
;
185 target
= target
->next
;
192 int get_num_by_target(target_t
*query_target
)
194 target_t
*target
= targets
;
199 if (target
== query_target
)
201 target
= target
->next
;
208 target_t
* get_current_target(command_context_t
*cmd_ctx
)
210 target_t
*target
= get_target_by_num(cmd_ctx
->current_target
);
214 LOG_ERROR("BUG: current_target out of bounds");
221 /* Process target initialization, when target entered debug out of reset
222 * the handler is unregistered at the end of this function, so it's only called once
224 int target_init_handler(struct target_s
*target
, enum target_event event
, void *priv
)
227 struct command_context_s
*cmd_ctx
= priv
;
229 if ((event
== TARGET_EVENT_HALTED
) && (target
->reset_script
))
231 target_unregister_event_callback(target_init_handler
, priv
);
233 script
= open_file_from_path(target
->reset_script
, "r");
236 LOG_ERROR("couldn't open script file %s", target
->reset_script
);
240 LOG_INFO("executing reset script '%s'", target
->reset_script
);
241 command_run_file(cmd_ctx
, script
, COMMAND_EXEC
);
244 jtag_execute_queue();
250 int target_run_and_halt_handler(void *priv
)
252 target_t
*target
= priv
;
254 target
->type
->halt(target
);
259 int target_process_reset(struct command_context_s
*cmd_ctx
)
261 int retval
= ERROR_OK
;
263 struct timeval timeout
, now
;
265 jtag
->speed(jtag_speed
);
267 /* prepare reset_halt where necessary */
271 if (jtag_reset_config
& RESET_SRST_PULLS_TRST
)
273 switch (target
->reset_mode
)
276 command_print(cmd_ctx
, "nSRST pulls nTRST, falling back to \"reset run_and_halt\"");
277 target
->reset_mode
= RESET_RUN_AND_HALT
;
280 command_print(cmd_ctx
, "nSRST pulls nTRST, falling back to \"reset run_and_init\"");
281 target
->reset_mode
= RESET_RUN_AND_INIT
;
287 target
= target
->next
;
293 /* we have no idea what state the target is in, so we
294 * have to drop working areas
296 target_free_all_working_areas_restore(target
, 0);
297 target
->type
->assert_reset(target
);
298 target
= target
->next
;
300 jtag_execute_queue();
302 /* request target halt if necessary, and schedule further action */
306 switch (target
->reset_mode
)
309 /* nothing to do if target just wants to be run */
311 case RESET_RUN_AND_HALT
:
313 target_register_timer_callback(target_run_and_halt_handler
, target
->run_and_halt_time
, 0, target
);
315 case RESET_RUN_AND_INIT
:
317 target_register_timer_callback(target_run_and_halt_handler
, target
->run_and_halt_time
, 0, target
);
318 target_register_event_callback(target_init_handler
, cmd_ctx
);
321 target
->type
->halt(target
);
324 target
->type
->halt(target
);
325 target_register_event_callback(target_init_handler
, cmd_ctx
);
328 LOG_ERROR("BUG: unknown target->reset_mode");
330 target
= target
->next
;
336 target
->type
->deassert_reset(target
);
337 target
= target
->next
;
339 jtag_execute_queue();
341 LOG_DEBUG("Waiting for halted stated as approperiate");
343 /* Wait for reset to complete, maximum 5 seconds. */
344 gettimeofday(&timeout
, NULL
);
345 timeval_add_time(&timeout
, 5, 0);
348 gettimeofday(&now
, NULL
);
350 target_call_timer_callbacks_now();
355 LOG_DEBUG("Polling target");
356 target
->type
->poll(target
);
357 if ((target
->reset_mode
== RESET_RUN_AND_INIT
) ||
358 (target
->reset_mode
== RESET_RUN_AND_HALT
) ||
359 (target
->reset_mode
== RESET_HALT
) ||
360 (target
->reset_mode
== RESET_INIT
))
362 if (target
->state
!= TARGET_HALTED
)
364 if ((now
.tv_sec
> timeout
.tv_sec
) || ((now
.tv_sec
== timeout
.tv_sec
) && (now
.tv_usec
>= timeout
.tv_usec
)))
366 LOG_USER("Timed out waiting for halt after reset");
369 /* this will send alive messages on e.g. GDB remote protocol. */
371 LOG_USER_N("%s", ""); /* avoid warning about zero length formatting message*/
375 target
= target
->next
;
377 /* All targets we're waiting for are halted */
385 /* We want any events to be processed before the prompt */
386 target_call_timer_callbacks_now();
388 /* if we timed out we need to unregister these handlers */
392 target_unregister_timer_callback(target_run_and_halt_handler
, target
);
393 target
= target
->next
;
395 target_unregister_event_callback(target_init_handler
, cmd_ctx
);
398 jtag
->speed(jtag_speed_post_reset
);
403 static int default_virt2phys(struct target_s
*target
, u32
virtual, u32
*physical
)
409 static int default_mmu(struct target_s
*target
, int *enabled
)
415 int target_init(struct command_context_s
*cmd_ctx
)
417 target_t
*target
= targets
;
421 if (target
->type
->init_target(cmd_ctx
, target
) != ERROR_OK
)
423 LOG_ERROR("target '%s' init failed", target
->type
->name
);
427 /* Set up default functions if none are provided by target */
428 if (target
->type
->virt2phys
== NULL
)
430 target
->type
->virt2phys
= default_virt2phys
;
432 if (target
->type
->mmu
== NULL
)
434 target
->type
->mmu
= default_mmu
;
436 target
= target
->next
;
441 target_register_user_commands(cmd_ctx
);
442 target_register_timer_callback(handle_target
, 100, 1, NULL
);
448 int target_init_reset(struct command_context_s
*cmd_ctx
)
450 if (startup_mode
== DAEMON_RESET
)
451 target_process_reset(cmd_ctx
);
456 int target_register_event_callback(int (*callback
)(struct target_s
*target
, enum target_event event
, void *priv
), void *priv
)
458 target_event_callback_t
**callbacks_p
= &target_event_callbacks
;
460 if (callback
== NULL
)
462 return ERROR_INVALID_ARGUMENTS
;
467 while ((*callbacks_p
)->next
)
468 callbacks_p
= &((*callbacks_p
)->next
);
469 callbacks_p
= &((*callbacks_p
)->next
);
472 (*callbacks_p
) = malloc(sizeof(target_event_callback_t
));
473 (*callbacks_p
)->callback
= callback
;
474 (*callbacks_p
)->priv
= priv
;
475 (*callbacks_p
)->next
= NULL
;
480 int target_register_timer_callback(int (*callback
)(void *priv
), int time_ms
, int periodic
, void *priv
)
482 target_timer_callback_t
**callbacks_p
= &target_timer_callbacks
;
485 if (callback
== NULL
)
487 return ERROR_INVALID_ARGUMENTS
;
492 while ((*callbacks_p
)->next
)
493 callbacks_p
= &((*callbacks_p
)->next
);
494 callbacks_p
= &((*callbacks_p
)->next
);
497 (*callbacks_p
) = malloc(sizeof(target_timer_callback_t
));
498 (*callbacks_p
)->callback
= callback
;
499 (*callbacks_p
)->periodic
= periodic
;
500 (*callbacks_p
)->time_ms
= time_ms
;
502 gettimeofday(&now
, NULL
);
503 (*callbacks_p
)->when
.tv_usec
= now
.tv_usec
+ (time_ms
% 1000) * 1000;
504 time_ms
-= (time_ms
% 1000);
505 (*callbacks_p
)->when
.tv_sec
= now
.tv_sec
+ (time_ms
/ 1000);
506 if ((*callbacks_p
)->when
.tv_usec
> 1000000)
508 (*callbacks_p
)->when
.tv_usec
= (*callbacks_p
)->when
.tv_usec
- 1000000;
509 (*callbacks_p
)->when
.tv_sec
+= 1;
512 (*callbacks_p
)->priv
= priv
;
513 (*callbacks_p
)->next
= NULL
;
518 int target_unregister_event_callback(int (*callback
)(struct target_s
*target
, enum target_event event
, void *priv
), void *priv
)
520 target_event_callback_t
**p
= &target_event_callbacks
;
521 target_event_callback_t
*c
= target_event_callbacks
;
523 if (callback
== NULL
)
525 return ERROR_INVALID_ARGUMENTS
;
530 target_event_callback_t
*next
= c
->next
;
531 if ((c
->callback
== callback
) && (c
->priv
== priv
))
545 int target_unregister_timer_callback(int (*callback
)(void *priv
), void *priv
)
547 target_timer_callback_t
**p
= &target_timer_callbacks
;
548 target_timer_callback_t
*c
= target_timer_callbacks
;
550 if (callback
== NULL
)
552 return ERROR_INVALID_ARGUMENTS
;
557 target_timer_callback_t
*next
= c
->next
;
558 if ((c
->callback
== callback
) && (c
->priv
== priv
))
572 int target_call_event_callbacks(target_t
*target
, enum target_event event
)
574 target_event_callback_t
*callback
= target_event_callbacks
;
575 target_event_callback_t
*next_callback
;
577 LOG_DEBUG("target event %i", event
);
581 next_callback
= callback
->next
;
582 callback
->callback(target
, event
, callback
->priv
);
583 callback
= next_callback
;
589 static int target_call_timer_callbacks_check_time(int checktime
)
591 target_timer_callback_t
*callback
= target_timer_callbacks
;
592 target_timer_callback_t
*next_callback
;
595 gettimeofday(&now
, NULL
);
599 next_callback
= callback
->next
;
601 if ((!checktime
&&callback
->periodic
)||
602 (((now
.tv_sec
>= callback
->when
.tv_sec
) && (now
.tv_usec
>= callback
->when
.tv_usec
))
603 || (now
.tv_sec
> callback
->when
.tv_sec
)))
605 callback
->callback(callback
->priv
);
606 if (callback
->periodic
)
608 int time_ms
= callback
->time_ms
;
609 callback
->when
.tv_usec
= now
.tv_usec
+ (time_ms
% 1000) * 1000;
610 time_ms
-= (time_ms
% 1000);
611 callback
->when
.tv_sec
= now
.tv_sec
+ time_ms
/ 1000;
612 if (callback
->when
.tv_usec
> 1000000)
614 callback
->when
.tv_usec
= callback
->when
.tv_usec
- 1000000;
615 callback
->when
.tv_sec
+= 1;
619 target_unregister_timer_callback(callback
->callback
, callback
->priv
);
622 callback
= next_callback
;
628 int target_call_timer_callbacks()
630 return target_call_timer_callbacks_check_time(1);
633 /* invoke periodic callbacks immediately */
634 int target_call_timer_callbacks_now()
636 return target_call_timer_callbacks(0);
640 int target_alloc_working_area(struct target_s
*target
, u32 size
, working_area_t
**area
)
642 working_area_t
*c
= target
->working_areas
;
643 working_area_t
*new_wa
= NULL
;
645 /* Reevaluate working area address based on MMU state*/
646 if (target
->working_areas
== NULL
)
650 retval
= target
->type
->mmu(target
, &enabled
);
651 if (retval
!= ERROR_OK
)
657 target
->working_area
= target
->working_area_virt
;
661 target
->working_area
= target
->working_area_phys
;
665 /* only allocate multiples of 4 byte */
668 LOG_ERROR("BUG: code tried to allocate unaligned number of bytes, padding");
669 size
= CEIL(size
, 4);
672 /* see if there's already a matching working area */
675 if ((c
->free
) && (c
->size
== size
))
683 /* if not, allocate a new one */
686 working_area_t
**p
= &target
->working_areas
;
687 u32 first_free
= target
->working_area
;
688 u32 free_size
= target
->working_area_size
;
690 LOG_DEBUG("allocating new working area");
692 c
= target
->working_areas
;
695 first_free
+= c
->size
;
696 free_size
-= c
->size
;
701 if (free_size
< size
)
703 LOG_WARNING("not enough working area available(requested %d, free %d)", size
, free_size
);
704 return ERROR_TARGET_RESOURCE_NOT_AVAILABLE
;
707 new_wa
= malloc(sizeof(working_area_t
));
710 new_wa
->address
= first_free
;
712 if (target
->backup_working_area
)
714 new_wa
->backup
= malloc(new_wa
->size
);
715 target
->type
->read_memory(target
, new_wa
->address
, 4, new_wa
->size
/ 4, new_wa
->backup
);
719 new_wa
->backup
= NULL
;
722 /* put new entry in list */
726 /* mark as used, and return the new (reused) area */
736 int target_free_working_area_restore(struct target_s
*target
, working_area_t
*area
, int restore
)
741 if (restore
&&target
->backup_working_area
)
742 target
->type
->write_memory(target
, area
->address
, 4, area
->size
/ 4, area
->backup
);
746 /* mark user pointer invalid */
753 int target_free_working_area(struct target_s
*target
, working_area_t
*area
)
755 return target_free_working_area_restore(target
, area
, 1);
758 int target_free_all_working_areas_restore(struct target_s
*target
, int restore
)
760 working_area_t
*c
= target
->working_areas
;
764 working_area_t
*next
= c
->next
;
765 target_free_working_area_restore(target
, c
, restore
);
775 target
->working_areas
= NULL
;
780 int target_free_all_working_areas(struct target_s
*target
)
782 return target_free_all_working_areas_restore(target
, 1);
785 int target_register_commands(struct command_context_s
*cmd_ctx
)
787 register_command(cmd_ctx
, NULL
, "target", handle_target_command
, COMMAND_CONFIG
, "target <cpu> [reset_init default - DEPRECATED] <chainpos> <endianness> <variant> [cpu type specifc args]");
788 register_command(cmd_ctx
, NULL
, "targets", handle_targets_command
, COMMAND_EXEC
, NULL
);
789 register_command(cmd_ctx
, NULL
, "daemon_startup", handle_daemon_startup_command
, COMMAND_CONFIG
, NULL
);
790 register_command(cmd_ctx
, NULL
, "target_script", handle_target_script_command
, COMMAND_CONFIG
, NULL
);
791 register_command(cmd_ctx
, NULL
, "run_and_halt_time", handle_run_and_halt_time_command
, COMMAND_CONFIG
, "<target> <run time ms>");
792 register_command(cmd_ctx
, NULL
, "working_area", handle_working_area_command
, COMMAND_ANY
, "working_area <target#> <address> <size> <'backup'|'nobackup'> [virtual address]");
793 register_command(cmd_ctx
, NULL
, "virt2phys", handle_virt2phys_command
, COMMAND_ANY
, "virt2phys <virtual address>");
794 register_command(cmd_ctx
, NULL
, "profile", handle_profile_command
, COMMAND_EXEC
, "PRELIMINARY! - profile <seconds> <gmon.out>");
799 int target_arch_state(struct target_s
*target
)
804 LOG_USER("No target has been configured");
808 LOG_USER("target state: %s", target_state_strings
[target
->state
]);
810 if (target
->state
!=TARGET_HALTED
)
813 retval
=target
->type
->arch_state(target
);
817 /* Single aligned words are guaranteed to use 16 or 32 bit access
818 * mode respectively, otherwise data is handled as quickly as
821 int target_write_buffer(struct target_s
*target
, u32 address
, u32 size
, u8
*buffer
)
825 LOG_DEBUG("writing buffer of %i byte at 0x%8.8x", size
, address
);
827 if (((address
% 2) == 0) && (size
== 2))
829 return target
->type
->write_memory(target
, address
, 2, 1, buffer
);
832 /* handle unaligned head bytes */
835 int unaligned
= 4 - (address
% 4);
837 if (unaligned
> size
)
840 if ((retval
= target
->type
->write_memory(target
, address
, 1, unaligned
, buffer
)) != ERROR_OK
)
844 address
+= unaligned
;
848 /* handle aligned words */
851 int aligned
= size
- (size
% 4);
853 /* use bulk writes above a certain limit. This may have to be changed */
856 if ((retval
= target
->type
->bulk_write_memory(target
, address
, aligned
/ 4, buffer
)) != ERROR_OK
)
861 if ((retval
= target
->type
->write_memory(target
, address
, 4, aligned
/ 4, buffer
)) != ERROR_OK
)
870 /* handle tail writes of less than 4 bytes */
873 if ((retval
= target
->type
->write_memory(target
, address
, 1, size
, buffer
)) != ERROR_OK
)
881 /* Single aligned words are guaranteed to use 16 or 32 bit access
882 * mode respectively, otherwise data is handled as quickly as
885 int target_read_buffer(struct target_s
*target
, u32 address
, u32 size
, u8
*buffer
)
889 LOG_DEBUG("reading buffer of %i byte at 0x%8.8x", size
, address
);
891 if (((address
% 2) == 0) && (size
== 2))
893 return target
->type
->read_memory(target
, address
, 2, 1, buffer
);
896 /* handle unaligned head bytes */
899 int unaligned
= 4 - (address
% 4);
901 if (unaligned
> size
)
904 if ((retval
= target
->type
->read_memory(target
, address
, 1, unaligned
, buffer
)) != ERROR_OK
)
908 address
+= unaligned
;
912 /* handle aligned words */
915 int aligned
= size
- (size
% 4);
917 if ((retval
= target
->type
->read_memory(target
, address
, 4, aligned
/ 4, buffer
)) != ERROR_OK
)
925 /* handle tail writes of less than 4 bytes */
928 if ((retval
= target
->type
->read_memory(target
, address
, 1, size
, buffer
)) != ERROR_OK
)
935 int target_checksum_memory(struct target_s
*target
, u32 address
, u32 size
, u32
* crc
)
942 if ((retval
= target
->type
->checksum_memory(target
, address
,
943 size
, &checksum
)) == ERROR_TARGET_RESOURCE_NOT_AVAILABLE
)
945 buffer
= malloc(size
);
948 LOG_ERROR("error allocating buffer for section (%d bytes)", size
);
949 return ERROR_INVALID_ARGUMENTS
;
951 retval
= target_read_buffer(target
, address
, size
, buffer
);
952 if (retval
!= ERROR_OK
)
958 /* convert to target endianess */
959 for (i
= 0; i
< (size
/sizeof(u32
)); i
++)
962 target_data
= target_buffer_get_u32(target
, &buffer
[i
*sizeof(u32
)]);
963 target_buffer_set_u32(target
, &buffer
[i
*sizeof(u32
)], target_data
);
966 retval
= image_calculate_checksum( buffer
, size
, &checksum
);
975 int target_read_u32(struct target_s
*target
, u32 address
, u32
*value
)
979 int retval
= target
->type
->read_memory(target
, address
, 4, 1, value_buf
);
981 if (retval
== ERROR_OK
)
983 *value
= target_buffer_get_u32(target
, value_buf
);
984 LOG_DEBUG("address: 0x%8.8x, value: 0x%8.8x", address
, *value
);
989 LOG_DEBUG("address: 0x%8.8x failed", address
);
995 int target_read_u16(struct target_s
*target
, u32 address
, u16
*value
)
999 int retval
= target
->type
->read_memory(target
, address
, 2, 1, value_buf
);
1001 if (retval
== ERROR_OK
)
1003 *value
= target_buffer_get_u16(target
, value_buf
);
1004 LOG_DEBUG("address: 0x%8.8x, value: 0x%4.4x", address
, *value
);
1009 LOG_DEBUG("address: 0x%8.8x failed", address
);
1015 int target_read_u8(struct target_s
*target
, u32 address
, u8
*value
)
1017 int retval
= target
->type
->read_memory(target
, address
, 1, 1, value
);
1019 if (retval
== ERROR_OK
)
1021 LOG_DEBUG("address: 0x%8.8x, value: 0x%2.2x", address
, *value
);
1026 LOG_DEBUG("address: 0x%8.8x failed", address
);
1032 int target_write_u32(struct target_s
*target
, u32 address
, u32 value
)
1037 LOG_DEBUG("address: 0x%8.8x, value: 0x%8.8x", address
, value
);
1039 target_buffer_set_u32(target
, value_buf
, value
);
1040 if ((retval
= target
->type
->write_memory(target
, address
, 4, 1, value_buf
)) != ERROR_OK
)
1042 LOG_DEBUG("failed: %i", retval
);
1048 int target_write_u16(struct target_s
*target
, u32 address
, u16 value
)
1053 LOG_DEBUG("address: 0x%8.8x, value: 0x%8.8x", address
, value
);
1055 target_buffer_set_u16(target
, value_buf
, value
);
1056 if ((retval
= target
->type
->write_memory(target
, address
, 2, 1, value_buf
)) != ERROR_OK
)
1058 LOG_DEBUG("failed: %i", retval
);
1064 int target_write_u8(struct target_s
*target
, u32 address
, u8 value
)
1068 LOG_DEBUG("address: 0x%8.8x, value: 0x%2.2x", address
, value
);
1070 if ((retval
= target
->type
->read_memory(target
, address
, 1, 1, &value
)) != ERROR_OK
)
1072 LOG_DEBUG("failed: %i", retval
);
1078 int target_register_user_commands(struct command_context_s
*cmd_ctx
)
1080 register_command(cmd_ctx
, NULL
, "reg", handle_reg_command
, COMMAND_EXEC
, NULL
);
1081 register_command(cmd_ctx
, NULL
, "poll", handle_poll_command
, COMMAND_EXEC
, "poll target state");
1082 register_command(cmd_ctx
, NULL
, "wait_halt", handle_wait_halt_command
, COMMAND_EXEC
, "wait for target halt [time (s)]");
1083 register_command(cmd_ctx
, NULL
, "halt", handle_halt_command
, COMMAND_EXEC
, "halt target");
1084 register_command(cmd_ctx
, NULL
, "resume", handle_resume_command
, COMMAND_EXEC
, "resume target [addr]");
1085 register_command(cmd_ctx
, NULL
, "step", handle_step_command
, COMMAND_EXEC
, "step one instruction from current PC or [addr]");
1086 register_command(cmd_ctx
, NULL
, "reset", handle_reset_command
, COMMAND_EXEC
, "reset target [run|halt|init|run_and_halt|run_and_init]");
1087 register_command(cmd_ctx
, NULL
, "soft_reset_halt", handle_soft_reset_halt_command
, COMMAND_EXEC
, "halt the target and do a soft reset");
1089 register_command(cmd_ctx
, NULL
, "mdw", handle_md_command
, COMMAND_EXEC
, "display memory words <addr> [count]");
1090 register_command(cmd_ctx
, NULL
, "mdh", handle_md_command
, COMMAND_EXEC
, "display memory half-words <addr> [count]");
1091 register_command(cmd_ctx
, NULL
, "mdb", handle_md_command
, COMMAND_EXEC
, "display memory bytes <addr> [count]");
1093 register_command(cmd_ctx
, NULL
, "mww", handle_mw_command
, COMMAND_EXEC
, "write memory word <addr> <value> [count]");
1094 register_command(cmd_ctx
, NULL
, "mwh", handle_mw_command
, COMMAND_EXEC
, "write memory half-word <addr> <value> [count]");
1095 register_command(cmd_ctx
, NULL
, "mwb", handle_mw_command
, COMMAND_EXEC
, "write memory byte <addr> <value> [count]");
1097 register_command(cmd_ctx
, NULL
, "bp", handle_bp_command
, COMMAND_EXEC
, "set breakpoint <address> <length> [hw]");
1098 register_command(cmd_ctx
, NULL
, "rbp", handle_rbp_command
, COMMAND_EXEC
, "remove breakpoint <adress>");
1099 register_command(cmd_ctx
, NULL
, "wp", handle_wp_command
, COMMAND_EXEC
, "set watchpoint <address> <length> <r/w/a> [value] [mask]");
1100 register_command(cmd_ctx
, NULL
, "rwp", handle_rwp_command
, COMMAND_EXEC
, "remove watchpoint <adress>");
1102 register_command(cmd_ctx
, NULL
, "load_image", handle_load_image_command
, COMMAND_EXEC
, "load_image <file> <address> ['bin'|'ihex'|'elf'|'s19']");
1103 register_command(cmd_ctx
, NULL
, "dump_image", handle_dump_image_command
, COMMAND_EXEC
, "dump_image <file> <address> <size>");
1104 register_command(cmd_ctx
, NULL
, "verify_image", handle_verify_image_command
, COMMAND_EXEC
, "verify_image <file> [offset] [type]");
1105 register_command(cmd_ctx
, NULL
, "load_binary", handle_load_image_command
, COMMAND_EXEC
, "[DEPRECATED] load_binary <file> <address>");
1106 register_command(cmd_ctx
, NULL
, "dump_binary", handle_dump_image_command
, COMMAND_EXEC
, "[DEPRECATED] dump_binary <file> <address> <size>");
1108 target_request_register_commands(cmd_ctx
);
1109 trace_register_commands(cmd_ctx
);
1114 int handle_targets_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1116 target_t
*target
= targets
;
1121 int num
= strtoul(args
[0], NULL
, 0);
1126 target
= target
->next
;
1130 cmd_ctx
->current_target
= num
;
1132 command_print(cmd_ctx
, "%i is out of bounds, only %i targets are configured", num
, count
);
1139 command_print(cmd_ctx
, "%i: %s (%s), state: %s", count
++, target
->type
->name
, target_endianess_strings
[target
->endianness
], target_state_strings
[target
->state
]);
1140 target
= target
->next
;
1146 int handle_target_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1153 return ERROR_COMMAND_SYNTAX_ERROR
;
1156 /* search for the specified target */
1157 if (args
[0] && (args
[0][0] != 0))
1159 for (i
= 0; target_types
[i
]; i
++)
1161 if (strcmp(args
[0], target_types
[i
]->name
) == 0)
1163 target_t
**last_target_p
= &targets
;
1165 /* register target specific commands */
1166 if (target_types
[i
]->register_commands(cmd_ctx
) != ERROR_OK
)
1168 LOG_ERROR("couldn't register '%s' commands", args
[0]);
1174 while ((*last_target_p
)->next
)
1175 last_target_p
= &((*last_target_p
)->next
);
1176 last_target_p
= &((*last_target_p
)->next
);
1179 *last_target_p
= malloc(sizeof(target_t
));
1181 (*last_target_p
)->type
= target_types
[i
];
1183 if (strcmp(args
[1], "big") == 0)
1184 (*last_target_p
)->endianness
= TARGET_BIG_ENDIAN
;
1185 else if (strcmp(args
[1], "little") == 0)
1186 (*last_target_p
)->endianness
= TARGET_LITTLE_ENDIAN
;
1189 LOG_ERROR("endianness must be either 'little' or 'big', not '%s'", args
[1]);
1190 return ERROR_COMMAND_SYNTAX_ERROR
;
1193 /* what to do on a target reset */
1194 (*last_target_p
)->reset_mode
= RESET_INIT
; /* default */
1195 if (strcmp(args
[2], "reset_halt") == 0)
1196 (*last_target_p
)->reset_mode
= RESET_HALT
;
1197 else if (strcmp(args
[2], "reset_run") == 0)
1198 (*last_target_p
)->reset_mode
= RESET_RUN
;
1199 else if (strcmp(args
[2], "reset_init") == 0)
1200 (*last_target_p
)->reset_mode
= RESET_INIT
;
1201 else if (strcmp(args
[2], "run_and_halt") == 0)
1202 (*last_target_p
)->reset_mode
= RESET_RUN_AND_HALT
;
1203 else if (strcmp(args
[2], "run_and_init") == 0)
1204 (*last_target_p
)->reset_mode
= RESET_RUN_AND_INIT
;
1207 /* Kludge! we want to make this reset arg optional while remaining compatible! */
1211 (*last_target_p
)->run_and_halt_time
= 1000; /* default 1s */
1213 (*last_target_p
)->reset_script
= NULL
;
1214 (*last_target_p
)->post_halt_script
= NULL
;
1215 (*last_target_p
)->pre_resume_script
= NULL
;
1216 (*last_target_p
)->gdb_program_script
= NULL
;
1218 (*last_target_p
)->working_area
= 0x0;
1219 (*last_target_p
)->working_area_size
= 0x0;
1220 (*last_target_p
)->working_areas
= NULL
;
1221 (*last_target_p
)->backup_working_area
= 0;
1223 (*last_target_p
)->state
= TARGET_UNKNOWN
;
1224 (*last_target_p
)->debug_reason
= DBG_REASON_UNDEFINED
;
1225 (*last_target_p
)->reg_cache
= NULL
;
1226 (*last_target_p
)->breakpoints
= NULL
;
1227 (*last_target_p
)->watchpoints
= NULL
;
1228 (*last_target_p
)->next
= NULL
;
1229 (*last_target_p
)->arch_info
= NULL
;
1231 /* initialize trace information */
1232 (*last_target_p
)->trace_info
= malloc(sizeof(trace_t
));
1233 (*last_target_p
)->trace_info
->num_trace_points
= 0;
1234 (*last_target_p
)->trace_info
->trace_points_size
= 0;
1235 (*last_target_p
)->trace_info
->trace_points
= NULL
;
1236 (*last_target_p
)->trace_info
->trace_history_size
= 0;
1237 (*last_target_p
)->trace_info
->trace_history
= NULL
;
1238 (*last_target_p
)->trace_info
->trace_history_pos
= 0;
1239 (*last_target_p
)->trace_info
->trace_history_overflowed
= 0;
1241 (*last_target_p
)->dbgmsg
= NULL
;
1242 (*last_target_p
)->dbg_msg_enabled
= 0;
1244 (*last_target_p
)->type
->target_command(cmd_ctx
, cmd
, args
, argc
, *last_target_p
);
1252 /* no matching target found */
1255 LOG_ERROR("target '%s' not found", args
[0]);
1256 return ERROR_COMMAND_SYNTAX_ERROR
;
1262 /* usage: target_script <target#> <event> <script_file> */
1263 int handle_target_script_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1265 target_t
*target
= NULL
;
1269 LOG_ERROR("incomplete target_script command");
1270 return ERROR_COMMAND_SYNTAX_ERROR
;
1273 target
= get_target_by_num(strtoul(args
[0], NULL
, 0));
1277 return ERROR_COMMAND_SYNTAX_ERROR
;
1280 if (strcmp(args
[1], "reset") == 0)
1282 if (target
->reset_script
)
1283 free(target
->reset_script
);
1284 target
->reset_script
= strdup(args
[2]);
1286 else if (strcmp(args
[1], "post_halt") == 0)
1288 if (target
->post_halt_script
)
1289 free(target
->post_halt_script
);
1290 target
->post_halt_script
= strdup(args
[2]);
1292 else if (strcmp(args
[1], "pre_resume") == 0)
1294 if (target
->pre_resume_script
)
1295 free(target
->pre_resume_script
);
1296 target
->pre_resume_script
= strdup(args
[2]);
1298 else if (strcmp(args
[1], "gdb_program_config") == 0)
1300 if (target
->gdb_program_script
)
1301 free(target
->gdb_program_script
);
1302 target
->gdb_program_script
= strdup(args
[2]);
1306 LOG_ERROR("unknown event type: '%s", args
[1]);
1307 return ERROR_COMMAND_SYNTAX_ERROR
;
1313 int handle_run_and_halt_time_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1315 target_t
*target
= NULL
;
1319 return ERROR_COMMAND_SYNTAX_ERROR
;
1322 target
= get_target_by_num(strtoul(args
[0], NULL
, 0));
1325 return ERROR_COMMAND_SYNTAX_ERROR
;
1328 target
->run_and_halt_time
= strtoul(args
[1], NULL
, 0);
1333 int handle_working_area_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1335 target_t
*target
= NULL
;
1337 if ((argc
< 4) || (argc
> 5))
1339 return ERROR_COMMAND_SYNTAX_ERROR
;
1342 target
= get_target_by_num(strtoul(args
[0], NULL
, 0));
1345 return ERROR_COMMAND_SYNTAX_ERROR
;
1347 target_free_all_working_areas(target
);
1349 target
->working_area_phys
= target
->working_area_virt
= strtoul(args
[1], NULL
, 0);
1352 target
->working_area_virt
= strtoul(args
[4], NULL
, 0);
1354 target
->working_area_size
= strtoul(args
[2], NULL
, 0);
1356 if (strcmp(args
[3], "backup") == 0)
1358 target
->backup_working_area
= 1;
1360 else if (strcmp(args
[3], "nobackup") == 0)
1362 target
->backup_working_area
= 0;
1366 LOG_ERROR("unrecognized <backup|nobackup> argument (%s)", args
[3]);
1367 return ERROR_COMMAND_SYNTAX_ERROR
;
1374 /* process target state changes */
1375 int handle_target(void *priv
)
1378 target_t
*target
= targets
;
1382 /* only poll if target isn't already halted */
1383 if (target
->state
!= TARGET_HALTED
)
1385 if (target_continous_poll
)
1386 if ((retval
= target
->type
->poll(target
)) != ERROR_OK
)
1388 LOG_ERROR("couldn't poll target(%d). It's due for a reset.", retval
);
1392 target
= target
->next
;
1398 int handle_reg_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1407 target
= get_current_target(cmd_ctx
);
1409 /* list all available registers for the current target */
1412 reg_cache_t
*cache
= target
->reg_cache
;
1418 for (i
= 0; i
< cache
->num_regs
; i
++)
1420 value
= buf_to_str(cache
->reg_list
[i
].value
, cache
->reg_list
[i
].size
, 16);
1421 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
);
1424 cache
= cache
->next
;
1430 /* access a single register by its ordinal number */
1431 if ((args
[0][0] >= '0') && (args
[0][0] <= '9'))
1433 int num
= strtoul(args
[0], NULL
, 0);
1434 reg_cache_t
*cache
= target
->reg_cache
;
1440 for (i
= 0; i
< cache
->num_regs
; i
++)
1444 reg
= &cache
->reg_list
[i
];
1450 cache
= cache
->next
;
1455 command_print(cmd_ctx
, "%i is out of bounds, the current target has only %i registers (0 - %i)", num
, count
, count
- 1);
1458 } else /* access a single register by its name */
1460 reg
= register_get_by_name(target
->reg_cache
, args
[0], 1);
1464 command_print(cmd_ctx
, "register %s not found in current target", args
[0]);
1469 /* display a register */
1470 if ((argc
== 1) || ((argc
== 2) && !((args
[1][0] >= '0') && (args
[1][0] <= '9'))))
1472 if ((argc
== 2) && (strcmp(args
[1], "force") == 0))
1475 if (reg
->valid
== 0)
1477 reg_arch_type_t
*arch_type
= register_get_arch_type(reg
->arch_type
);
1478 if (arch_type
== NULL
)
1480 LOG_ERROR("BUG: encountered unregistered arch type");
1483 arch_type
->get(reg
);
1485 value
= buf_to_str(reg
->value
, reg
->size
, 16);
1486 command_print(cmd_ctx
, "%s (/%i): 0x%s", reg
->name
, reg
->size
, value
);
1491 /* set register value */
1494 u8
*buf
= malloc(CEIL(reg
->size
, 8));
1495 str_to_buf(args
[1], strlen(args
[1]), buf
, reg
->size
, 0);
1497 reg_arch_type_t
*arch_type
= register_get_arch_type(reg
->arch_type
);
1498 if (arch_type
== NULL
)
1500 LOG_ERROR("BUG: encountered unregistered arch type");
1504 arch_type
->set(reg
, buf
);
1506 value
= buf_to_str(reg
->value
, reg
->size
, 16);
1507 command_print(cmd_ctx
, "%s (/%i): 0x%s", reg
->name
, reg
->size
, value
);
1515 command_print(cmd_ctx
, "usage: reg <#|name> [value]");
1520 static int wait_state(struct command_context_s
*cmd_ctx
, char *cmd
, enum target_state state
, int ms
);
1522 int handle_poll_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1524 target_t
*target
= get_current_target(cmd_ctx
);
1528 target
->type
->poll(target
);
1529 target_arch_state(target
);
1533 if (strcmp(args
[0], "on") == 0)
1535 target_continous_poll
= 1;
1537 else if (strcmp(args
[0], "off") == 0)
1539 target_continous_poll
= 0;
1543 command_print(cmd_ctx
, "arg is \"on\" or \"off\"");
1551 int handle_wait_halt_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1559 ms
= strtoul(args
[0], &end
, 0) * 1000;
1562 command_print(cmd_ctx
, "usage: %s [seconds]", cmd
);
1567 return wait_state(cmd_ctx
, cmd
, TARGET_HALTED
, ms
);
1570 static void target_process_events(struct command_context_s
*cmd_ctx
)
1572 target_t
*target
= get_current_target(cmd_ctx
);
1573 target
->type
->poll(target
);
1574 target_call_timer_callbacks_now();
1577 static int wait_state(struct command_context_s
*cmd_ctx
, char *cmd
, enum target_state state
, int ms
)
1580 struct timeval timeout
, now
;
1582 gettimeofday(&timeout
, NULL
);
1583 timeval_add_time(&timeout
, 0, ms
* 1000);
1585 target_t
*target
= get_current_target(cmd_ctx
);
1588 if ((retval
=target
->type
->poll(target
))!=ERROR_OK
)
1590 target_call_timer_callbacks_now();
1591 if (target
->state
== state
)
1598 command_print(cmd_ctx
, "waiting for target %s...", target_state_strings
[state
]);
1601 gettimeofday(&now
, NULL
);
1602 if ((now
.tv_sec
> timeout
.tv_sec
) || ((now
.tv_sec
== timeout
.tv_sec
) && (now
.tv_usec
>= timeout
.tv_usec
)))
1604 LOG_ERROR("timed out while waiting for target %s", target_state_strings
[state
]);
1612 int handle_halt_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1615 target_t
*target
= get_current_target(cmd_ctx
);
1619 if ((retval
= target
->type
->halt(target
)) != ERROR_OK
)
1624 return handle_wait_halt_command(cmd_ctx
, cmd
, args
, argc
);
1627 /* what to do on daemon startup */
1628 int handle_daemon_startup_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1632 if (strcmp(args
[0], "attach") == 0)
1634 startup_mode
= DAEMON_ATTACH
;
1637 else if (strcmp(args
[0], "reset") == 0)
1639 startup_mode
= DAEMON_RESET
;
1644 LOG_WARNING("invalid daemon_startup configuration directive: %s", args
[0]);
1649 int handle_soft_reset_halt_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1651 target_t
*target
= get_current_target(cmd_ctx
);
1653 LOG_USER("requesting target halt and executing a soft reset");
1655 target
->type
->soft_reset_halt(target
);
1660 int handle_reset_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1662 target_t
*target
= get_current_target(cmd_ctx
);
1663 enum target_reset_mode reset_mode
= target
->reset_mode
;
1664 enum target_reset_mode save
= target
->reset_mode
;
1670 if (strcmp("run", args
[0]) == 0)
1671 reset_mode
= RESET_RUN
;
1672 else if (strcmp("halt", args
[0]) == 0)
1673 reset_mode
= RESET_HALT
;
1674 else if (strcmp("init", args
[0]) == 0)
1675 reset_mode
= RESET_INIT
;
1676 else if (strcmp("run_and_halt", args
[0]) == 0)
1678 reset_mode
= RESET_RUN_AND_HALT
;
1681 target
->run_and_halt_time
= strtoul(args
[1], NULL
, 0);
1684 else if (strcmp("run_and_init", args
[0]) == 0)
1686 reset_mode
= RESET_RUN_AND_INIT
;
1689 target
->run_and_halt_time
= strtoul(args
[1], NULL
, 0);
1694 command_print(cmd_ctx
, "usage: reset ['run', 'halt', 'init', 'run_and_halt', 'run_and_init]");
1699 /* temporarily modify mode of current reset target */
1700 target
->reset_mode
= reset_mode
;
1702 /* reset *all* targets */
1703 target_process_reset(cmd_ctx
);
1705 /* Restore default reset mode for this target */
1706 target
->reset_mode
= save
;
1711 int handle_resume_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1714 target_t
*target
= get_current_target(cmd_ctx
);
1717 retval
= target
->type
->resume(target
, 1, 0, 1, 0); /* current pc, addr = 0, handle breakpoints, not debugging */
1719 retval
= target
->type
->resume(target
, 0, strtoul(args
[0], NULL
, 0), 1, 0); /* addr = args[0], handle breakpoints, not debugging */
1722 return ERROR_COMMAND_SYNTAX_ERROR
;
1725 target_process_events(cmd_ctx
);
1730 int handle_step_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1732 target_t
*target
= get_current_target(cmd_ctx
);
1737 target
->type
->step(target
, 1, 0, 1); /* current pc, addr = 0, handle breakpoints */
1740 target
->type
->step(target
, 0, strtoul(args
[0], NULL
, 0), 1); /* addr = args[0], handle breakpoints */
1745 int handle_md_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1747 const int line_bytecnt
= 32;
1760 target_t
*target
= get_current_target(cmd_ctx
);
1766 count
= strtoul(args
[1], NULL
, 0);
1768 address
= strtoul(args
[0], NULL
, 0);
1774 size
= 4; line_modulo
= line_bytecnt
/ 4;
1777 size
= 2; line_modulo
= line_bytecnt
/ 2;
1780 size
= 1; line_modulo
= line_bytecnt
/ 1;
1786 buffer
= calloc(count
, size
);
1787 retval
= target
->type
->read_memory(target
, address
, size
, count
, buffer
);
1788 if (retval
== ERROR_OK
)
1792 for (i
= 0; i
< count
; i
++)
1794 if (i
%line_modulo
== 0)
1795 output_len
+= snprintf(output
+ output_len
, 128 - output_len
, "0x%8.8x: ", address
+ (i
*size
));
1800 output_len
+= snprintf(output
+ output_len
, 128 - output_len
, "%8.8x ", target_buffer_get_u32(target
, &buffer
[i
*4]));
1803 output_len
+= snprintf(output
+ output_len
, 128 - output_len
, "%4.4x ", target_buffer_get_u16(target
, &buffer
[i
*2]));
1806 output_len
+= snprintf(output
+ output_len
, 128 - output_len
, "%2.2x ", buffer
[i
*1]);
1810 if ((i
%line_modulo
== line_modulo
-1) || (i
== count
- 1))
1812 command_print(cmd_ctx
, output
);
1818 LOG_ERROR("Failure examining memory");
1826 int handle_mw_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1833 target_t
*target
= get_current_target(cmd_ctx
);
1836 if ((argc
< 2) || (argc
> 3))
1837 return ERROR_COMMAND_SYNTAX_ERROR
;
1839 address
= strtoul(args
[0], NULL
, 0);
1840 value
= strtoul(args
[1], NULL
, 0);
1842 count
= strtoul(args
[2], NULL
, 0);
1849 target_buffer_set_u32(target
, value_buf
, value
);
1853 target_buffer_set_u16(target
, value_buf
, value
);
1857 value_buf
[0] = value
;
1860 return ERROR_COMMAND_SYNTAX_ERROR
;
1862 for (i
=0; i
<count
; i
++)
1868 retval
= target
->type
->write_memory(target
, address
+ i
*wordsize
, 4, 1, value_buf
);
1871 retval
= target
->type
->write_memory(target
, address
+ i
*wordsize
, 2, 1, value_buf
);
1874 retval
= target
->type
->write_memory(target
, address
+ i
*wordsize
, 1, 1, value_buf
);
1879 if (retval
!=ERROR_OK
)
1889 int handle_load_image_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1899 duration_t duration
;
1900 char *duration_text
;
1902 target_t
*target
= get_current_target(cmd_ctx
);
1906 command_print(cmd_ctx
, "usage: load_image <filename> [address] [type]");
1910 /* a base address isn't always necessary, default to 0x0 (i.e. don't relocate) */
1913 image
.base_address_set
= 1;
1914 image
.base_address
= strtoul(args
[1], NULL
, 0);
1918 image
.base_address_set
= 0;
1921 image
.start_address_set
= 0;
1923 duration_start_measure(&duration
);
1925 if (image_open(&image
, args
[0], (argc
>= 3) ? args
[2] : NULL
) != ERROR_OK
)
1932 for (i
= 0; i
< image
.num_sections
; i
++)
1934 buffer
= malloc(image
.sections
[i
].size
);
1937 command_print(cmd_ctx
, "error allocating buffer for section (%d bytes)", image
.sections
[i
].size
);
1941 if ((retval
= image_read_section(&image
, i
, 0x0, image
.sections
[i
].size
, buffer
, &buf_cnt
)) != ERROR_OK
)
1946 if ((retval
= target_write_buffer(target
, image
.sections
[i
].base_address
, buf_cnt
, buffer
)) != ERROR_OK
)
1951 image_size
+= buf_cnt
;
1952 command_print(cmd_ctx
, "%u byte written at address 0x%8.8x", buf_cnt
, image
.sections
[i
].base_address
);
1957 duration_stop_measure(&duration
, &duration_text
);
1958 if (retval
==ERROR_OK
)
1960 command_print(cmd_ctx
, "downloaded %u byte in %s", image_size
, duration_text
);
1962 free(duration_text
);
1964 image_close(&image
);
1970 int handle_dump_image_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1977 int retval
=ERROR_OK
;
1979 duration_t duration
;
1980 char *duration_text
;
1982 target_t
*target
= get_current_target(cmd_ctx
);
1986 command_print(cmd_ctx
, "usage: dump_image <filename> <address> <size>");
1990 address
= strtoul(args
[1], NULL
, 0);
1991 size
= strtoul(args
[2], NULL
, 0);
1993 if ((address
& 3) || (size
& 3))
1995 command_print(cmd_ctx
, "only 32-bit aligned address and size are supported");
1999 if (fileio_open(&fileio
, args
[0], FILEIO_WRITE
, FILEIO_BINARY
) != ERROR_OK
)
2004 duration_start_measure(&duration
);
2009 u32 this_run_size
= (size
> 560) ? 560 : size
;
2011 retval
= target
->type
->read_memory(target
, address
, 4, this_run_size
/ 4, buffer
);
2012 if (retval
!= ERROR_OK
)
2017 retval
= fileio_write(&fileio
, this_run_size
, buffer
, &size_written
);
2018 if (retval
!= ERROR_OK
)
2023 size
-= this_run_size
;
2024 address
+= this_run_size
;
2027 fileio_close(&fileio
);
2029 duration_stop_measure(&duration
, &duration_text
);
2030 if (retval
==ERROR_OK
)
2032 command_print(cmd_ctx
, "dumped %"PRIi64
" byte in %s", fileio
.size
, duration_text
);
2034 free(duration_text
);
2039 int handle_verify_image_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2047 u32 mem_checksum
= 0;
2051 duration_t duration
;
2052 char *duration_text
;
2054 target_t
*target
= get_current_target(cmd_ctx
);
2058 return ERROR_COMMAND_SYNTAX_ERROR
;
2063 LOG_ERROR("no target selected");
2067 duration_start_measure(&duration
);
2071 image
.base_address_set
= 1;
2072 image
.base_address
= strtoul(args
[1], NULL
, 0);
2076 image
.base_address_set
= 0;
2077 image
.base_address
= 0x0;
2080 image
.start_address_set
= 0;
2082 if ((retval
=image_open(&image
, args
[0], (argc
== 3) ? args
[2] : NULL
)) != ERROR_OK
)
2089 for (i
= 0; i
< image
.num_sections
; i
++)
2091 buffer
= malloc(image
.sections
[i
].size
);
2094 command_print(cmd_ctx
, "error allocating buffer for section (%d bytes)", image
.sections
[i
].size
);
2097 if ((retval
= image_read_section(&image
, i
, 0x0, image
.sections
[i
].size
, buffer
, &buf_cnt
)) != ERROR_OK
)
2103 /* calculate checksum of image */
2104 image_calculate_checksum( buffer
, buf_cnt
, &checksum
);
2106 retval
= target_checksum_memory(target
, image
.sections
[i
].base_address
, buf_cnt
, &mem_checksum
);
2107 if( retval
!= ERROR_OK
)
2113 if( checksum
!= mem_checksum
)
2115 /* failed crc checksum, fall back to a binary compare */
2118 command_print(cmd_ctx
, "checksum mismatch - attempting binary compare");
2120 data
= (u8
*)malloc(buf_cnt
);
2122 /* Can we use 32bit word accesses? */
2124 int count
= buf_cnt
;
2125 if ((count
% 4) == 0)
2130 retval
= target
->type
->read_memory(target
, image
.sections
[i
].base_address
, size
, count
, data
);
2131 if (retval
== ERROR_OK
)
2134 for (t
= 0; t
< buf_cnt
; t
++)
2136 if (data
[t
] != buffer
[t
])
2138 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
]);
2151 image_size
+= buf_cnt
;
2154 duration_stop_measure(&duration
, &duration_text
);
2155 if (retval
==ERROR_OK
)
2157 command_print(cmd_ctx
, "verified %u bytes in %s", image_size
, duration_text
);
2159 free(duration_text
);
2161 image_close(&image
);
2166 int handle_bp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2169 target_t
*target
= get_current_target(cmd_ctx
);
2173 breakpoint_t
*breakpoint
= target
->breakpoints
;
2177 if (breakpoint
->type
== BKPT_SOFT
)
2179 char* buf
= buf_to_str(breakpoint
->orig_instr
, breakpoint
->length
, 16);
2180 command_print(cmd_ctx
, "0x%8.8x, 0x%x, %i, 0x%s", breakpoint
->address
, breakpoint
->length
, breakpoint
->set
, buf
);
2185 command_print(cmd_ctx
, "0x%8.8x, 0x%x, %i", breakpoint
->address
, breakpoint
->length
, breakpoint
->set
);
2187 breakpoint
= breakpoint
->next
;
2195 length
= strtoul(args
[1], NULL
, 0);
2198 if (strcmp(args
[2], "hw") == 0)
2201 if ((retval
= breakpoint_add(target
, strtoul(args
[0], NULL
, 0), length
, hw
)) != ERROR_OK
)
2203 LOG_ERROR("Failure setting breakpoints");
2207 command_print(cmd_ctx
, "breakpoint added at address 0x%8.8x", strtoul(args
[0], NULL
, 0));
2212 command_print(cmd_ctx
, "usage: bp <address> <length> ['hw']");
2218 int handle_rbp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2220 target_t
*target
= get_current_target(cmd_ctx
);
2223 breakpoint_remove(target
, strtoul(args
[0], NULL
, 0));
2228 int handle_wp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2230 target_t
*target
= get_current_target(cmd_ctx
);
2235 watchpoint_t
*watchpoint
= target
->watchpoints
;
2239 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
);
2240 watchpoint
= watchpoint
->next
;
2245 enum watchpoint_rw type
= WPT_ACCESS
;
2246 u32 data_value
= 0x0;
2247 u32 data_mask
= 0xffffffff;
2263 command_print(cmd_ctx
, "usage: wp <address> <length> [r/w/a] [value] [mask]");
2269 data_value
= strtoul(args
[3], NULL
, 0);
2273 data_mask
= strtoul(args
[4], NULL
, 0);
2276 if ((retval
= watchpoint_add(target
, strtoul(args
[0], NULL
, 0),
2277 strtoul(args
[1], NULL
, 0), type
, data_value
, data_mask
)) != ERROR_OK
)
2279 LOG_ERROR("Failure setting breakpoints");
2284 command_print(cmd_ctx
, "usage: wp <address> <length> [r/w/a] [value] [mask]");
2290 int handle_rwp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2292 target_t
*target
= get_current_target(cmd_ctx
);
2295 watchpoint_remove(target
, strtoul(args
[0], NULL
, 0));
2300 int handle_virt2phys_command(command_context_t
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2303 target_t
*target
= get_current_target(cmd_ctx
);
2309 return ERROR_COMMAND_SYNTAX_ERROR
;
2311 va
= strtoul(args
[0], NULL
, 0);
2313 retval
= target
->type
->virt2phys(target
, va
, &pa
);
2314 if (retval
== ERROR_OK
)
2316 command_print(cmd_ctx
, "Physical address 0x%08x", pa
);
2320 /* lower levels will have logged a detailed error which is
2321 * forwarded to telnet/GDB session.
2326 static void writeLong(FILE *f
, int l
)
2331 char c
=(l
>>(i
*8))&0xff;
2332 fwrite(&c
, 1, 1, f
);
2336 static void writeString(FILE *f
, char *s
)
2338 fwrite(s
, 1, strlen(s
), f
);
2343 // Dump a gmon.out histogram file.
2344 static void writeGmon(u32
*samples
, int sampleNum
, char *filename
)
2347 FILE *f
=fopen(filename
, "w");
2350 fwrite("gmon", 1, 4, f
);
2351 writeLong(f
, 0x00000001); // Version
2352 writeLong(f
, 0); // padding
2353 writeLong(f
, 0); // padding
2354 writeLong(f
, 0); // padding
2356 fwrite("", 1, 1, f
); // GMON_TAG_TIME_HIST
2358 // figure out bucket size
2361 for (i
=0; i
<sampleNum
; i
++)
2373 int addressSpace
=(max
-min
+1);
2375 static int const maxBuckets
=256*1024; // maximum buckets.
2376 int length
=addressSpace
;
2377 if (length
> maxBuckets
)
2381 int *buckets
=malloc(sizeof(int)*length
);
2387 memset(buckets
, 0, sizeof(int)*length
);
2388 for (i
=0; i
<sampleNum
;i
++)
2390 u32 address
=samples
[i
];
2391 long long a
=address
-min
;
2392 long long b
=length
-1;
2393 long long c
=addressSpace
-1;
2394 int index
=(a
*b
)/c
; // danger!!!! int32 overflows
2398 // append binary memory gmon.out &profile_hist_hdr ((char*)&profile_hist_hdr + sizeof(struct gmon_hist_hdr))
2399 writeLong(f
, min
); // low_pc
2400 writeLong(f
, max
); // high_pc
2401 writeLong(f
, length
); // # of samples
2402 writeLong(f
, 64000000); // 64MHz
2403 writeString(f
, "seconds");
2404 for (i
=0; i
<(15-strlen("seconds")); i
++)
2406 fwrite("", 1, 1, f
); // padding
2408 writeString(f
, "s");
2410 // append binary memory gmon.out profile_hist_data (profile_hist_data + profile_hist_hdr.hist_size)
2412 char *data
=malloc(2*length
);
2415 for (i
=0; i
<length
;i
++)
2424 data
[i
*2+1]=(val
>>8)&0xff;
2427 fwrite(data
, 1, length
*2, f
);
2437 /* profiling samples the CPU PC as quickly as OpenOCD is able, which will be used as a random sampling of PC */
2438 int handle_profile_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2440 target_t
*target
= get_current_target(cmd_ctx
);
2441 struct timeval timeout
, now
;
2443 gettimeofday(&timeout
, NULL
);
2446 return ERROR_COMMAND_SYNTAX_ERROR
;
2449 timeval_add_time(&timeout
, strtoul(args
[0], &end
, 0), 0);
2455 command_print(cmd_ctx
, "Starting profiling. Halting and resuming the target as often as we can...");
2457 static const int maxSample
=10000;
2458 u32
*samples
=malloc(sizeof(u32
)*maxSample
);
2463 int retval
=ERROR_OK
;
2464 // hopefully it is safe to cache! We want to stop/restart as quickly as possible.
2465 reg_t
*reg
= register_get_by_name(target
->reg_cache
, "pc", 1);
2469 target
->type
->poll(target
);
2470 if (target
->state
== TARGET_HALTED
)
2472 u32 t
=*((u32
*)reg
->value
);
2473 samples
[numSamples
++]=t
;
2474 retval
= target
->type
->resume(target
, 1, 0, 0, 0); /* current pc, addr = 0, do not handle breakpoints, not debugging */
2475 target
->type
->poll(target
);
2476 usleep(10*1000); // sleep 10ms, i.e. <100 samples/second.
2477 } else if (target
->state
== TARGET_RUNNING
)
2479 // We want to quickly sample the PC.
2480 target
->type
->halt(target
);
2483 command_print(cmd_ctx
, "Target not halted or running");
2487 if (retval
!=ERROR_OK
)
2492 gettimeofday(&now
, NULL
);
2493 if ((numSamples
>=maxSample
) || ((now
.tv_sec
>= timeout
.tv_sec
) && (now
.tv_usec
>= timeout
.tv_usec
)))
2495 command_print(cmd_ctx
, "Profiling completed. %d samples.", numSamples
);
2496 target
->type
->poll(target
);
2497 if (target
->state
== TARGET_HALTED
)
2499 target
->type
->resume(target
, 1, 0, 0, 0); /* current pc, addr = 0, do not handle breakpoints, not debugging */
2501 target
->type
->poll(target
);
2502 writeGmon(samples
, numSamples
, args
[1]);
2503 command_print(cmd_ctx
, "Wrote %s", args
[1]);
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)