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 switch (target
->reset_mode
)
291 target
->type
->prepare_reset_halt(target
);
296 target
= target
->next
;
302 target
->type
->assert_reset(target
);
303 target
= target
->next
;
305 jtag_execute_queue();
307 /* request target halt if necessary, and schedule further action */
311 switch (target
->reset_mode
)
314 /* nothing to do if target just wants to be run */
316 case RESET_RUN_AND_HALT
:
318 target_register_timer_callback(target_run_and_halt_handler
, target
->run_and_halt_time
, 0, target
);
320 case RESET_RUN_AND_INIT
:
322 target_register_timer_callback(target_run_and_halt_handler
, target
->run_and_halt_time
, 0, target
);
323 target_register_event_callback(target_init_handler
, cmd_ctx
);
326 target
->type
->halt(target
);
329 target
->type
->halt(target
);
330 target_register_event_callback(target_init_handler
, cmd_ctx
);
333 LOG_ERROR("BUG: unknown target->reset_mode");
335 target
= target
->next
;
341 target
->type
->deassert_reset(target
);
342 target
= target
->next
;
344 jtag_execute_queue();
346 /* Wait for reset to complete, maximum 5 seconds. */
347 gettimeofday(&timeout
, NULL
);
348 timeval_add_time(&timeout
, 5, 0);
351 gettimeofday(&now
, NULL
);
353 target_call_timer_callbacks_now();
358 target
->type
->poll(target
);
359 if ((target
->reset_mode
== RESET_RUN_AND_INIT
) || (target
->reset_mode
== RESET_RUN_AND_HALT
))
361 if (target
->state
!= TARGET_HALTED
)
363 if ((now
.tv_sec
> timeout
.tv_sec
) || ((now
.tv_sec
== timeout
.tv_sec
) && (now
.tv_usec
>= timeout
.tv_usec
)))
365 LOG_USER("Timed out waiting for reset");
368 /* this will send alive messages on e.g. GDB remote protocol. */
370 LOG_USER_N("%s", ""); /* avoid warning about zero length formatting message*/
374 target
= target
->next
;
376 /* All targets we're waiting for are halted */
384 /* We want any events to be processed before the prompt */
385 target_call_timer_callbacks_now();
387 jtag
->speed(jtag_speed_post_reset
);
392 static int default_virt2phys(struct target_s
*target
, u32
virtual, u32
*physical
)
398 static int default_mmu(struct target_s
*target
, int *enabled
)
404 int target_init(struct command_context_s
*cmd_ctx
)
406 target_t
*target
= targets
;
410 if (target
->type
->init_target(cmd_ctx
, target
) != ERROR_OK
)
412 LOG_ERROR("target '%s' init failed", target
->type
->name
);
416 /* Set up default functions if none are provided by target */
417 if (target
->type
->virt2phys
== NULL
)
419 target
->type
->virt2phys
= default_virt2phys
;
421 if (target
->type
->mmu
== NULL
)
423 target
->type
->mmu
= default_mmu
;
425 target
= target
->next
;
430 target_register_user_commands(cmd_ctx
);
431 target_register_timer_callback(handle_target
, 100, 1, NULL
);
437 int target_init_reset(struct command_context_s
*cmd_ctx
)
439 if (startup_mode
== DAEMON_RESET
)
440 target_process_reset(cmd_ctx
);
445 int target_register_event_callback(int (*callback
)(struct target_s
*target
, enum target_event event
, void *priv
), void *priv
)
447 target_event_callback_t
**callbacks_p
= &target_event_callbacks
;
449 if (callback
== NULL
)
451 return ERROR_INVALID_ARGUMENTS
;
456 while ((*callbacks_p
)->next
)
457 callbacks_p
= &((*callbacks_p
)->next
);
458 callbacks_p
= &((*callbacks_p
)->next
);
461 (*callbacks_p
) = malloc(sizeof(target_event_callback_t
));
462 (*callbacks_p
)->callback
= callback
;
463 (*callbacks_p
)->priv
= priv
;
464 (*callbacks_p
)->next
= NULL
;
469 int target_register_timer_callback(int (*callback
)(void *priv
), int time_ms
, int periodic
, void *priv
)
471 target_timer_callback_t
**callbacks_p
= &target_timer_callbacks
;
474 if (callback
== NULL
)
476 return ERROR_INVALID_ARGUMENTS
;
481 while ((*callbacks_p
)->next
)
482 callbacks_p
= &((*callbacks_p
)->next
);
483 callbacks_p
= &((*callbacks_p
)->next
);
486 (*callbacks_p
) = malloc(sizeof(target_timer_callback_t
));
487 (*callbacks_p
)->callback
= callback
;
488 (*callbacks_p
)->periodic
= periodic
;
489 (*callbacks_p
)->time_ms
= time_ms
;
491 gettimeofday(&now
, NULL
);
492 (*callbacks_p
)->when
.tv_usec
= now
.tv_usec
+ (time_ms
% 1000) * 1000;
493 time_ms
-= (time_ms
% 1000);
494 (*callbacks_p
)->when
.tv_sec
= now
.tv_sec
+ (time_ms
/ 1000);
495 if ((*callbacks_p
)->when
.tv_usec
> 1000000)
497 (*callbacks_p
)->when
.tv_usec
= (*callbacks_p
)->when
.tv_usec
- 1000000;
498 (*callbacks_p
)->when
.tv_sec
+= 1;
501 (*callbacks_p
)->priv
= priv
;
502 (*callbacks_p
)->next
= NULL
;
507 int target_unregister_event_callback(int (*callback
)(struct target_s
*target
, enum target_event event
, void *priv
), void *priv
)
509 target_event_callback_t
**p
= &target_event_callbacks
;
510 target_event_callback_t
*c
= target_event_callbacks
;
512 if (callback
== NULL
)
514 return ERROR_INVALID_ARGUMENTS
;
519 target_event_callback_t
*next
= c
->next
;
520 if ((c
->callback
== callback
) && (c
->priv
== priv
))
534 int target_unregister_timer_callback(int (*callback
)(void *priv
), void *priv
)
536 target_timer_callback_t
**p
= &target_timer_callbacks
;
537 target_timer_callback_t
*c
= target_timer_callbacks
;
539 if (callback
== NULL
)
541 return ERROR_INVALID_ARGUMENTS
;
546 target_timer_callback_t
*next
= c
->next
;
547 if ((c
->callback
== callback
) && (c
->priv
== priv
))
561 int target_call_event_callbacks(target_t
*target
, enum target_event event
)
563 target_event_callback_t
*callback
= target_event_callbacks
;
564 target_event_callback_t
*next_callback
;
566 LOG_DEBUG("target event %i", event
);
570 next_callback
= callback
->next
;
571 callback
->callback(target
, event
, callback
->priv
);
572 callback
= next_callback
;
578 int target_call_timer_callbacks()
580 target_timer_callback_t
*callback
= target_timer_callbacks
;
581 target_timer_callback_t
*next_callback
;
584 gettimeofday(&now
, NULL
);
588 next_callback
= callback
->next
;
590 if (((now
.tv_sec
>= callback
->when
.tv_sec
) && (now
.tv_usec
>= callback
->when
.tv_usec
))
591 || (now
.tv_sec
> callback
->when
.tv_sec
))
593 callback
->callback(callback
->priv
);
594 if (callback
->periodic
)
596 int time_ms
= callback
->time_ms
;
597 callback
->when
.tv_usec
= now
.tv_usec
+ (time_ms
% 1000) * 1000;
598 time_ms
-= (time_ms
% 1000);
599 callback
->when
.tv_sec
= now
.tv_sec
+ time_ms
/ 1000;
600 if (callback
->when
.tv_usec
> 1000000)
602 callback
->when
.tv_usec
= callback
->when
.tv_usec
- 1000000;
603 callback
->when
.tv_sec
+= 1;
607 target_unregister_timer_callback(callback
->callback
, callback
->priv
);
610 callback
= next_callback
;
616 int target_call_timer_callbacks_now()
618 /* TODO: this should invoke the timer callbacks now. This is used to ensure that
619 * any outstanding polls, etc. are in fact invoked before a synchronous command
622 return target_call_timer_callbacks();
626 int target_alloc_working_area(struct target_s
*target
, u32 size
, working_area_t
**area
)
628 working_area_t
*c
= target
->working_areas
;
629 working_area_t
*new_wa
= NULL
;
631 /* Reevaluate working area address based on MMU state*/
632 if (target
->working_areas
== NULL
)
636 retval
= target
->type
->mmu(target
, &enabled
);
637 if (retval
!= ERROR_OK
)
643 target
->working_area
= target
->working_area_virt
;
647 target
->working_area
= target
->working_area_phys
;
651 /* only allocate multiples of 4 byte */
654 LOG_ERROR("BUG: code tried to allocate unaligned number of bytes, padding");
655 size
= CEIL(size
, 4);
658 /* see if there's already a matching working area */
661 if ((c
->free
) && (c
->size
== size
))
669 /* if not, allocate a new one */
672 working_area_t
**p
= &target
->working_areas
;
673 u32 first_free
= target
->working_area
;
674 u32 free_size
= target
->working_area_size
;
676 LOG_DEBUG("allocating new working area");
678 c
= target
->working_areas
;
681 first_free
+= c
->size
;
682 free_size
-= c
->size
;
687 if (free_size
< size
)
689 LOG_WARNING("not enough working area available(requested %d, free %d)", size
, free_size
);
690 return ERROR_TARGET_RESOURCE_NOT_AVAILABLE
;
693 new_wa
= malloc(sizeof(working_area_t
));
696 new_wa
->address
= first_free
;
698 if (target
->backup_working_area
)
700 new_wa
->backup
= malloc(new_wa
->size
);
701 target
->type
->read_memory(target
, new_wa
->address
, 4, new_wa
->size
/ 4, new_wa
->backup
);
705 new_wa
->backup
= NULL
;
708 /* put new entry in list */
712 /* mark as used, and return the new (reused) area */
722 int target_free_working_area(struct target_s
*target
, working_area_t
*area
)
727 if (target
->backup_working_area
)
728 target
->type
->write_memory(target
, area
->address
, 4, area
->size
/ 4, area
->backup
);
732 /* mark user pointer invalid */
739 int target_free_all_working_areas(struct target_s
*target
)
741 working_area_t
*c
= target
->working_areas
;
745 working_area_t
*next
= c
->next
;
746 target_free_working_area(target
, c
);
756 target
->working_areas
= NULL
;
761 int target_register_commands(struct command_context_s
*cmd_ctx
)
763 register_command(cmd_ctx
, NULL
, "target", handle_target_command
, COMMAND_CONFIG
, NULL
);
764 register_command(cmd_ctx
, NULL
, "targets", handle_targets_command
, COMMAND_EXEC
, NULL
);
765 register_command(cmd_ctx
, NULL
, "daemon_startup", handle_daemon_startup_command
, COMMAND_CONFIG
, NULL
);
766 register_command(cmd_ctx
, NULL
, "target_script", handle_target_script_command
, COMMAND_CONFIG
, NULL
);
767 register_command(cmd_ctx
, NULL
, "run_and_halt_time", handle_run_and_halt_time_command
, COMMAND_CONFIG
, "<target> <run time ms>");
768 register_command(cmd_ctx
, NULL
, "working_area", handle_working_area_command
, COMMAND_ANY
, "working_area <target#> <address> <size> <'backup'|'nobackup'> [virtual address]");
769 register_command(cmd_ctx
, NULL
, "virt2phys", handle_virt2phys_command
, COMMAND_ANY
, "virt2phys <virtual address>");
770 register_command(cmd_ctx
, NULL
, "profile", handle_profile_command
, COMMAND_EXEC
, "PRELIMINARY! - profile <seconds> <gmon.out>");
775 int target_arch_state(struct target_s
*target
)
780 LOG_USER("No target has been configured");
784 LOG_USER("target state: %s", target_state_strings
[target
->state
]);
786 if (target
->state
!=TARGET_HALTED
)
789 retval
=target
->type
->arch_state(target
);
793 /* Single aligned words are guaranteed to use 16 or 32 bit access
794 * mode respectively, otherwise data is handled as quickly as
797 int target_write_buffer(struct target_s
*target
, u32 address
, u32 size
, u8
*buffer
)
801 LOG_DEBUG("writing buffer of %i byte at 0x%8.8x", size
, address
);
803 if (((address
% 2) == 0) && (size
== 2))
805 return target
->type
->write_memory(target
, address
, 2, 1, buffer
);
808 /* handle unaligned head bytes */
811 int unaligned
= 4 - (address
% 4);
813 if (unaligned
> size
)
816 if ((retval
= target
->type
->write_memory(target
, address
, 1, unaligned
, buffer
)) != ERROR_OK
)
820 address
+= unaligned
;
824 /* handle aligned words */
827 int aligned
= size
- (size
% 4);
829 /* use bulk writes above a certain limit. This may have to be changed */
832 if ((retval
= target
->type
->bulk_write_memory(target
, address
, aligned
/ 4, buffer
)) != ERROR_OK
)
837 if ((retval
= target
->type
->write_memory(target
, address
, 4, aligned
/ 4, buffer
)) != ERROR_OK
)
846 /* handle tail writes of less than 4 bytes */
849 if ((retval
= target
->type
->write_memory(target
, address
, 1, size
, buffer
)) != ERROR_OK
)
857 /* Single aligned words are guaranteed to use 16 or 32 bit access
858 * mode respectively, otherwise data is handled as quickly as
861 int target_read_buffer(struct target_s
*target
, u32 address
, u32 size
, u8
*buffer
)
865 LOG_DEBUG("reading buffer of %i byte at 0x%8.8x", size
, address
);
867 if (((address
% 2) == 0) && (size
== 2))
869 return target
->type
->read_memory(target
, address
, 2, 1, buffer
);
872 /* handle unaligned head bytes */
875 int unaligned
= 4 - (address
% 4);
877 if (unaligned
> size
)
880 if ((retval
= target
->type
->read_memory(target
, address
, 1, unaligned
, buffer
)) != ERROR_OK
)
884 address
+= unaligned
;
888 /* handle aligned words */
891 int aligned
= size
- (size
% 4);
893 if ((retval
= target
->type
->read_memory(target
, address
, 4, aligned
/ 4, buffer
)) != ERROR_OK
)
901 /* handle tail writes of less than 4 bytes */
904 if ((retval
= target
->type
->read_memory(target
, address
, 1, size
, buffer
)) != ERROR_OK
)
911 int target_checksum_memory(struct target_s
*target
, u32 address
, u32 size
, u32
* crc
)
918 if ((retval
= target
->type
->checksum_memory(target
, address
,
919 size
, &checksum
)) == ERROR_TARGET_RESOURCE_NOT_AVAILABLE
)
921 buffer
= malloc(size
);
924 LOG_ERROR("error allocating buffer for section (%d bytes)", size
);
925 return ERROR_INVALID_ARGUMENTS
;
927 retval
= target_read_buffer(target
, address
, size
, buffer
);
928 if (retval
!= ERROR_OK
)
934 /* convert to target endianess */
935 for (i
= 0; i
< (size
/sizeof(u32
)); i
++)
938 target_data
= target_buffer_get_u32(target
, &buffer
[i
*sizeof(u32
)]);
939 target_buffer_set_u32(target
, &buffer
[i
*sizeof(u32
)], target_data
);
942 retval
= image_calculate_checksum( buffer
, size
, &checksum
);
951 int target_read_u32(struct target_s
*target
, u32 address
, u32
*value
)
955 int retval
= target
->type
->read_memory(target
, address
, 4, 1, value_buf
);
957 if (retval
== ERROR_OK
)
959 *value
= target_buffer_get_u32(target
, value_buf
);
960 LOG_DEBUG("address: 0x%8.8x, value: 0x%8.8x", address
, *value
);
965 LOG_DEBUG("address: 0x%8.8x failed", address
);
971 int target_read_u16(struct target_s
*target
, u32 address
, u16
*value
)
975 int retval
= target
->type
->read_memory(target
, address
, 2, 1, value_buf
);
977 if (retval
== ERROR_OK
)
979 *value
= target_buffer_get_u16(target
, value_buf
);
980 LOG_DEBUG("address: 0x%8.8x, value: 0x%4.4x", address
, *value
);
985 LOG_DEBUG("address: 0x%8.8x failed", address
);
991 int target_read_u8(struct target_s
*target
, u32 address
, u8
*value
)
993 int retval
= target
->type
->read_memory(target
, address
, 1, 1, value
);
995 if (retval
== ERROR_OK
)
997 LOG_DEBUG("address: 0x%8.8x, value: 0x%2.2x", address
, *value
);
1002 LOG_DEBUG("address: 0x%8.8x failed", address
);
1008 int target_write_u32(struct target_s
*target
, u32 address
, u32 value
)
1013 LOG_DEBUG("address: 0x%8.8x, value: 0x%8.8x", address
, value
);
1015 target_buffer_set_u32(target
, value_buf
, value
);
1016 if ((retval
= target
->type
->write_memory(target
, address
, 4, 1, value_buf
)) != ERROR_OK
)
1018 LOG_DEBUG("failed: %i", retval
);
1024 int target_write_u16(struct target_s
*target
, u32 address
, u16 value
)
1029 LOG_DEBUG("address: 0x%8.8x, value: 0x%8.8x", address
, value
);
1031 target_buffer_set_u16(target
, value_buf
, value
);
1032 if ((retval
= target
->type
->write_memory(target
, address
, 2, 1, value_buf
)) != ERROR_OK
)
1034 LOG_DEBUG("failed: %i", retval
);
1040 int target_write_u8(struct target_s
*target
, u32 address
, u8 value
)
1044 LOG_DEBUG("address: 0x%8.8x, value: 0x%2.2x", address
, value
);
1046 if ((retval
= target
->type
->read_memory(target
, address
, 1, 1, &value
)) != ERROR_OK
)
1048 LOG_DEBUG("failed: %i", retval
);
1054 int target_register_user_commands(struct command_context_s
*cmd_ctx
)
1056 register_command(cmd_ctx
, NULL
, "reg", handle_reg_command
, COMMAND_EXEC
, NULL
);
1057 register_command(cmd_ctx
, NULL
, "poll", handle_poll_command
, COMMAND_EXEC
, "poll target state");
1058 register_command(cmd_ctx
, NULL
, "wait_halt", handle_wait_halt_command
, COMMAND_EXEC
, "wait for target halt [time (s)]");
1059 register_command(cmd_ctx
, NULL
, "halt", handle_halt_command
, COMMAND_EXEC
, "halt target");
1060 register_command(cmd_ctx
, NULL
, "resume", handle_resume_command
, COMMAND_EXEC
, "resume target [addr]");
1061 register_command(cmd_ctx
, NULL
, "step", handle_step_command
, COMMAND_EXEC
, "step one instruction from current PC or [addr]");
1062 register_command(cmd_ctx
, NULL
, "reset", handle_reset_command
, COMMAND_EXEC
, "reset target [run|halt|init|run_and_halt|run_and_init]");
1063 register_command(cmd_ctx
, NULL
, "soft_reset_halt", handle_soft_reset_halt_command
, COMMAND_EXEC
, "halt the target and do a soft reset");
1065 register_command(cmd_ctx
, NULL
, "mdw", handle_md_command
, COMMAND_EXEC
, "display memory words <addr> [count]");
1066 register_command(cmd_ctx
, NULL
, "mdh", handle_md_command
, COMMAND_EXEC
, "display memory half-words <addr> [count]");
1067 register_command(cmd_ctx
, NULL
, "mdb", handle_md_command
, COMMAND_EXEC
, "display memory bytes <addr> [count]");
1069 register_command(cmd_ctx
, NULL
, "mww", handle_mw_command
, COMMAND_EXEC
, "write memory word <addr> <value>");
1070 register_command(cmd_ctx
, NULL
, "mwh", handle_mw_command
, COMMAND_EXEC
, "write memory half-word <addr> <value>");
1071 register_command(cmd_ctx
, NULL
, "mwb", handle_mw_command
, COMMAND_EXEC
, "write memory byte <addr> <value>");
1073 register_command(cmd_ctx
, NULL
, "bp", handle_bp_command
, COMMAND_EXEC
, "set breakpoint <address> <length> [hw]");
1074 register_command(cmd_ctx
, NULL
, "rbp", handle_rbp_command
, COMMAND_EXEC
, "remove breakpoint <adress>");
1075 register_command(cmd_ctx
, NULL
, "wp", handle_wp_command
, COMMAND_EXEC
, "set watchpoint <address> <length> <r/w/a> [value] [mask]");
1076 register_command(cmd_ctx
, NULL
, "rwp", handle_rwp_command
, COMMAND_EXEC
, "remove watchpoint <adress>");
1078 register_command(cmd_ctx
, NULL
, "load_image", handle_load_image_command
, COMMAND_EXEC
, "load_image <file> <address> ['bin'|'ihex'|'elf'|'s19']");
1079 register_command(cmd_ctx
, NULL
, "dump_image", handle_dump_image_command
, COMMAND_EXEC
, "dump_image <file> <address> <size>");
1080 register_command(cmd_ctx
, NULL
, "verify_image", handle_verify_image_command
, COMMAND_EXEC
, "verify_image <file> [offset] [type]");
1081 register_command(cmd_ctx
, NULL
, "load_binary", handle_load_image_command
, COMMAND_EXEC
, "[DEPRECATED] load_binary <file> <address>");
1082 register_command(cmd_ctx
, NULL
, "dump_binary", handle_dump_image_command
, COMMAND_EXEC
, "[DEPRECATED] dump_binary <file> <address> <size>");
1084 target_request_register_commands(cmd_ctx
);
1085 trace_register_commands(cmd_ctx
);
1090 int handle_targets_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1092 target_t
*target
= targets
;
1097 int num
= strtoul(args
[0], NULL
, 0);
1102 target
= target
->next
;
1106 cmd_ctx
->current_target
= num
;
1108 command_print(cmd_ctx
, "%i is out of bounds, only %i targets are configured", num
, count
);
1115 command_print(cmd_ctx
, "%i: %s (%s), state: %s", count
++, target
->type
->name
, target_endianess_strings
[target
->endianness
], target_state_strings
[target
->state
]);
1116 target
= target
->next
;
1122 int handle_target_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1129 return ERROR_COMMAND_SYNTAX_ERROR
;
1132 /* search for the specified target */
1133 if (args
[0] && (args
[0][0] != 0))
1135 for (i
= 0; target_types
[i
]; i
++)
1137 if (strcmp(args
[0], target_types
[i
]->name
) == 0)
1139 target_t
**last_target_p
= &targets
;
1141 /* register target specific commands */
1142 if (target_types
[i
]->register_commands(cmd_ctx
) != ERROR_OK
)
1144 LOG_ERROR("couldn't register '%s' commands", args
[0]);
1150 while ((*last_target_p
)->next
)
1151 last_target_p
= &((*last_target_p
)->next
);
1152 last_target_p
= &((*last_target_p
)->next
);
1155 *last_target_p
= malloc(sizeof(target_t
));
1157 (*last_target_p
)->type
= target_types
[i
];
1159 if (strcmp(args
[1], "big") == 0)
1160 (*last_target_p
)->endianness
= TARGET_BIG_ENDIAN
;
1161 else if (strcmp(args
[1], "little") == 0)
1162 (*last_target_p
)->endianness
= TARGET_LITTLE_ENDIAN
;
1165 LOG_ERROR("endianness must be either 'little' or 'big', not '%s'", args
[1]);
1166 return ERROR_COMMAND_SYNTAX_ERROR
;
1169 /* what to do on a target reset */
1170 if (strcmp(args
[2], "reset_halt") == 0)
1171 (*last_target_p
)->reset_mode
= RESET_HALT
;
1172 else if (strcmp(args
[2], "reset_run") == 0)
1173 (*last_target_p
)->reset_mode
= RESET_RUN
;
1174 else if (strcmp(args
[2], "reset_init") == 0)
1175 (*last_target_p
)->reset_mode
= RESET_INIT
;
1176 else if (strcmp(args
[2], "run_and_halt") == 0)
1177 (*last_target_p
)->reset_mode
= RESET_RUN_AND_HALT
;
1178 else if (strcmp(args
[2], "run_and_init") == 0)
1179 (*last_target_p
)->reset_mode
= RESET_RUN_AND_INIT
;
1182 LOG_ERROR("unknown target startup mode %s", args
[2]);
1183 return ERROR_COMMAND_SYNTAX_ERROR
;
1185 (*last_target_p
)->run_and_halt_time
= 1000; /* default 1s */
1187 (*last_target_p
)->reset_script
= NULL
;
1188 (*last_target_p
)->post_halt_script
= NULL
;
1189 (*last_target_p
)->pre_resume_script
= NULL
;
1190 (*last_target_p
)->gdb_program_script
= NULL
;
1192 (*last_target_p
)->working_area
= 0x0;
1193 (*last_target_p
)->working_area_size
= 0x0;
1194 (*last_target_p
)->working_areas
= NULL
;
1195 (*last_target_p
)->backup_working_area
= 0;
1197 (*last_target_p
)->state
= TARGET_UNKNOWN
;
1198 (*last_target_p
)->debug_reason
= DBG_REASON_UNDEFINED
;
1199 (*last_target_p
)->reg_cache
= NULL
;
1200 (*last_target_p
)->breakpoints
= NULL
;
1201 (*last_target_p
)->watchpoints
= NULL
;
1202 (*last_target_p
)->next
= NULL
;
1203 (*last_target_p
)->arch_info
= NULL
;
1205 /* initialize trace information */
1206 (*last_target_p
)->trace_info
= malloc(sizeof(trace_t
));
1207 (*last_target_p
)->trace_info
->num_trace_points
= 0;
1208 (*last_target_p
)->trace_info
->trace_points_size
= 0;
1209 (*last_target_p
)->trace_info
->trace_points
= NULL
;
1210 (*last_target_p
)->trace_info
->trace_history_size
= 0;
1211 (*last_target_p
)->trace_info
->trace_history
= NULL
;
1212 (*last_target_p
)->trace_info
->trace_history_pos
= 0;
1213 (*last_target_p
)->trace_info
->trace_history_overflowed
= 0;
1215 (*last_target_p
)->dbgmsg
= NULL
;
1216 (*last_target_p
)->dbg_msg_enabled
= 0;
1218 (*last_target_p
)->type
->target_command(cmd_ctx
, cmd
, args
, argc
, *last_target_p
);
1226 /* no matching target found */
1229 LOG_ERROR("target '%s' not found", args
[0]);
1230 return ERROR_COMMAND_SYNTAX_ERROR
;
1236 /* usage: target_script <target#> <event> <script_file> */
1237 int handle_target_script_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1239 target_t
*target
= NULL
;
1243 LOG_ERROR("incomplete target_script command");
1244 return ERROR_COMMAND_SYNTAX_ERROR
;
1247 target
= get_target_by_num(strtoul(args
[0], NULL
, 0));
1251 return ERROR_COMMAND_SYNTAX_ERROR
;
1254 if (strcmp(args
[1], "reset") == 0)
1256 if (target
->reset_script
)
1257 free(target
->reset_script
);
1258 target
->reset_script
= strdup(args
[2]);
1260 else if (strcmp(args
[1], "post_halt") == 0)
1262 if (target
->post_halt_script
)
1263 free(target
->post_halt_script
);
1264 target
->post_halt_script
= strdup(args
[2]);
1266 else if (strcmp(args
[1], "pre_resume") == 0)
1268 if (target
->pre_resume_script
)
1269 free(target
->pre_resume_script
);
1270 target
->pre_resume_script
= strdup(args
[2]);
1272 else if (strcmp(args
[1], "gdb_program_config") == 0)
1274 if (target
->gdb_program_script
)
1275 free(target
->gdb_program_script
);
1276 target
->gdb_program_script
= strdup(args
[2]);
1280 LOG_ERROR("unknown event type: '%s", args
[1]);
1281 return ERROR_COMMAND_SYNTAX_ERROR
;
1287 int handle_run_and_halt_time_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1289 target_t
*target
= NULL
;
1293 return ERROR_COMMAND_SYNTAX_ERROR
;
1296 target
= get_target_by_num(strtoul(args
[0], NULL
, 0));
1299 return ERROR_COMMAND_SYNTAX_ERROR
;
1302 target
->run_and_halt_time
= strtoul(args
[1], NULL
, 0);
1307 int handle_working_area_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1309 target_t
*target
= NULL
;
1311 if ((argc
< 4) || (argc
> 5))
1313 return ERROR_COMMAND_SYNTAX_ERROR
;
1316 target
= get_target_by_num(strtoul(args
[0], NULL
, 0));
1319 return ERROR_COMMAND_SYNTAX_ERROR
;
1321 target_free_all_working_areas(target
);
1323 target
->working_area_phys
= target
->working_area_virt
= strtoul(args
[1], NULL
, 0);
1326 target
->working_area_virt
= strtoul(args
[4], NULL
, 0);
1328 target
->working_area_size
= strtoul(args
[2], NULL
, 0);
1330 if (strcmp(args
[3], "backup") == 0)
1332 target
->backup_working_area
= 1;
1334 else if (strcmp(args
[3], "nobackup") == 0)
1336 target
->backup_working_area
= 0;
1340 LOG_ERROR("unrecognized <backup|nobackup> argument (%s)", args
[3]);
1341 return ERROR_COMMAND_SYNTAX_ERROR
;
1348 /* process target state changes */
1349 int handle_target(void *priv
)
1352 target_t
*target
= targets
;
1356 /* only poll if target isn't already halted */
1357 if (target
->state
!= TARGET_HALTED
)
1359 if (target_continous_poll
)
1360 if ((retval
= target
->type
->poll(target
)) != ERROR_OK
)
1362 LOG_ERROR("couldn't poll target(%d). It's due for a reset.", retval
);
1366 target
= target
->next
;
1372 int handle_reg_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1381 target
= get_current_target(cmd_ctx
);
1383 /* list all available registers for the current target */
1386 reg_cache_t
*cache
= target
->reg_cache
;
1392 for (i
= 0; i
< cache
->num_regs
; i
++)
1394 value
= buf_to_str(cache
->reg_list
[i
].value
, cache
->reg_list
[i
].size
, 16);
1395 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
);
1398 cache
= cache
->next
;
1404 /* access a single register by its ordinal number */
1405 if ((args
[0][0] >= '0') && (args
[0][0] <= '9'))
1407 int num
= strtoul(args
[0], NULL
, 0);
1408 reg_cache_t
*cache
= target
->reg_cache
;
1414 for (i
= 0; i
< cache
->num_regs
; i
++)
1418 reg
= &cache
->reg_list
[i
];
1424 cache
= cache
->next
;
1429 command_print(cmd_ctx
, "%i is out of bounds, the current target has only %i registers (0 - %i)", num
, count
, count
- 1);
1432 } else /* access a single register by its name */
1434 reg
= register_get_by_name(target
->reg_cache
, args
[0], 1);
1438 command_print(cmd_ctx
, "register %s not found in current target", args
[0]);
1443 /* display a register */
1444 if ((argc
== 1) || ((argc
== 2) && !((args
[1][0] >= '0') && (args
[1][0] <= '9'))))
1446 if ((argc
== 2) && (strcmp(args
[1], "force") == 0))
1449 if (reg
->valid
== 0)
1451 reg_arch_type_t
*arch_type
= register_get_arch_type(reg
->arch_type
);
1452 if (arch_type
== NULL
)
1454 LOG_ERROR("BUG: encountered unregistered arch type");
1457 arch_type
->get(reg
);
1459 value
= buf_to_str(reg
->value
, reg
->size
, 16);
1460 command_print(cmd_ctx
, "%s (/%i): 0x%s", reg
->name
, reg
->size
, value
);
1465 /* set register value */
1468 u8
*buf
= malloc(CEIL(reg
->size
, 8));
1469 str_to_buf(args
[1], strlen(args
[1]), buf
, reg
->size
, 0);
1471 reg_arch_type_t
*arch_type
= register_get_arch_type(reg
->arch_type
);
1472 if (arch_type
== NULL
)
1474 LOG_ERROR("BUG: encountered unregistered arch type");
1478 arch_type
->set(reg
, buf
);
1480 value
= buf_to_str(reg
->value
, reg
->size
, 16);
1481 command_print(cmd_ctx
, "%s (/%i): 0x%s", reg
->name
, reg
->size
, value
);
1489 command_print(cmd_ctx
, "usage: reg <#|name> [value]");
1494 static int wait_state(struct command_context_s
*cmd_ctx
, char *cmd
, enum target_state state
, int ms
);
1496 int handle_poll_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1498 target_t
*target
= get_current_target(cmd_ctx
);
1502 target
->type
->poll(target
);
1503 target_arch_state(target
);
1507 if (strcmp(args
[0], "on") == 0)
1509 target_continous_poll
= 1;
1511 else if (strcmp(args
[0], "off") == 0)
1513 target_continous_poll
= 0;
1517 command_print(cmd_ctx
, "arg is \"on\" or \"off\"");
1525 int handle_wait_halt_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1533 ms
= strtoul(args
[0], &end
, 0) * 1000;
1536 command_print(cmd_ctx
, "usage: %s [seconds]", cmd
);
1541 return wait_state(cmd_ctx
, cmd
, TARGET_HALTED
, ms
);
1544 static void target_process_events(struct command_context_s
*cmd_ctx
)
1546 target_t
*target
= get_current_target(cmd_ctx
);
1547 target
->type
->poll(target
);
1548 target_call_timer_callbacks_now();
1551 static int wait_state(struct command_context_s
*cmd_ctx
, char *cmd
, enum target_state state
, int ms
)
1554 struct timeval timeout
, now
;
1556 gettimeofday(&timeout
, NULL
);
1557 timeval_add_time(&timeout
, 0, ms
* 1000);
1559 target_t
*target
= get_current_target(cmd_ctx
);
1562 if ((retval
=target
->type
->poll(target
))!=ERROR_OK
)
1564 target_call_timer_callbacks_now();
1565 if (target
->state
== state
)
1572 command_print(cmd_ctx
, "waiting for target %s...", target_state_strings
[state
]);
1575 gettimeofday(&now
, NULL
);
1576 if ((now
.tv_sec
> timeout
.tv_sec
) || ((now
.tv_sec
== timeout
.tv_sec
) && (now
.tv_usec
>= timeout
.tv_usec
)))
1578 LOG_ERROR("timed out while waiting for target %s", target_state_strings
[state
]);
1586 int handle_halt_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1589 target_t
*target
= get_current_target(cmd_ctx
);
1593 if ((retval
= target
->type
->halt(target
)) != ERROR_OK
)
1598 return handle_wait_halt_command(cmd_ctx
, cmd
, args
, argc
);
1601 /* what to do on daemon startup */
1602 int handle_daemon_startup_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1606 if (strcmp(args
[0], "attach") == 0)
1608 startup_mode
= DAEMON_ATTACH
;
1611 else if (strcmp(args
[0], "reset") == 0)
1613 startup_mode
= DAEMON_RESET
;
1618 LOG_WARNING("invalid daemon_startup configuration directive: %s", args
[0]);
1623 int handle_soft_reset_halt_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1625 target_t
*target
= get_current_target(cmd_ctx
);
1627 LOG_USER("requesting target halt and executing a soft reset");
1629 target
->type
->soft_reset_halt(target
);
1634 int handle_reset_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1636 target_t
*target
= get_current_target(cmd_ctx
);
1637 enum target_reset_mode reset_mode
= target
->reset_mode
;
1638 enum target_reset_mode save
= target
->reset_mode
;
1644 if (strcmp("run", args
[0]) == 0)
1645 reset_mode
= RESET_RUN
;
1646 else if (strcmp("halt", args
[0]) == 0)
1647 reset_mode
= RESET_HALT
;
1648 else if (strcmp("init", args
[0]) == 0)
1649 reset_mode
= RESET_INIT
;
1650 else if (strcmp("run_and_halt", args
[0]) == 0)
1652 reset_mode
= RESET_RUN_AND_HALT
;
1655 target
->run_and_halt_time
= strtoul(args
[1], NULL
, 0);
1658 else if (strcmp("run_and_init", args
[0]) == 0)
1660 reset_mode
= RESET_RUN_AND_INIT
;
1663 target
->run_and_halt_time
= strtoul(args
[1], NULL
, 0);
1668 command_print(cmd_ctx
, "usage: reset ['run', 'halt', 'init', 'run_and_halt', 'run_and_init]");
1673 /* temporarily modify mode of current reset target */
1674 target
->reset_mode
= reset_mode
;
1676 /* reset *all* targets */
1677 target_process_reset(cmd_ctx
);
1679 /* Restore default reset mode for this target */
1680 target
->reset_mode
= save
;
1685 int handle_resume_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1688 target_t
*target
= get_current_target(cmd_ctx
);
1691 retval
= target
->type
->resume(target
, 1, 0, 1, 0); /* current pc, addr = 0, handle breakpoints, not debugging */
1693 retval
= target
->type
->resume(target
, 0, strtoul(args
[0], NULL
, 0), 1, 0); /* addr = args[0], handle breakpoints, not debugging */
1696 return ERROR_COMMAND_SYNTAX_ERROR
;
1699 target_process_events(cmd_ctx
);
1704 int handle_step_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1706 target_t
*target
= get_current_target(cmd_ctx
);
1711 target
->type
->step(target
, 1, 0, 1); /* current pc, addr = 0, handle breakpoints */
1714 target
->type
->step(target
, 0, strtoul(args
[0], NULL
, 0), 1); /* addr = args[0], handle breakpoints */
1719 int handle_md_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1721 const int line_bytecnt
= 32;
1734 target_t
*target
= get_current_target(cmd_ctx
);
1740 count
= strtoul(args
[1], NULL
, 0);
1742 address
= strtoul(args
[0], NULL
, 0);
1748 size
= 4; line_modulo
= line_bytecnt
/ 4;
1751 size
= 2; line_modulo
= line_bytecnt
/ 2;
1754 size
= 1; line_modulo
= line_bytecnt
/ 1;
1760 buffer
= calloc(count
, size
);
1761 retval
= target
->type
->read_memory(target
, address
, size
, count
, buffer
);
1762 if (retval
== ERROR_OK
)
1766 for (i
= 0; i
< count
; i
++)
1768 if (i
%line_modulo
== 0)
1769 output_len
+= snprintf(output
+ output_len
, 128 - output_len
, "0x%8.8x: ", address
+ (i
*size
));
1774 output_len
+= snprintf(output
+ output_len
, 128 - output_len
, "%8.8x ", target_buffer_get_u32(target
, &buffer
[i
*4]));
1777 output_len
+= snprintf(output
+ output_len
, 128 - output_len
, "%4.4x ", target_buffer_get_u16(target
, &buffer
[i
*2]));
1780 output_len
+= snprintf(output
+ output_len
, 128 - output_len
, "%2.2x ", buffer
[i
*1]);
1784 if ((i
%line_modulo
== line_modulo
-1) || (i
== count
- 1))
1786 command_print(cmd_ctx
, output
);
1792 LOG_ERROR("Failure examining memory");
1800 int handle_mw_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1805 target_t
*target
= get_current_target(cmd_ctx
);
1811 address
= strtoul(args
[0], NULL
, 0);
1812 value
= strtoul(args
[1], NULL
, 0);
1817 target_buffer_set_u32(target
, value_buf
, value
);
1818 retval
= target
->type
->write_memory(target
, address
, 4, 1, value_buf
);
1821 target_buffer_set_u16(target
, value_buf
, value
);
1822 retval
= target
->type
->write_memory(target
, address
, 2, 1, value_buf
);
1825 value_buf
[0] = value
;
1826 retval
= target
->type
->write_memory(target
, address
, 1, 1, value_buf
);
1831 if (retval
!=ERROR_OK
)
1833 LOG_ERROR("Failure examining memory");
1840 int handle_load_image_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1850 duration_t duration
;
1851 char *duration_text
;
1853 target_t
*target
= get_current_target(cmd_ctx
);
1857 command_print(cmd_ctx
, "usage: load_image <filename> [address] [type]");
1861 /* a base address isn't always necessary, default to 0x0 (i.e. don't relocate) */
1864 image
.base_address_set
= 1;
1865 image
.base_address
= strtoul(args
[1], NULL
, 0);
1869 image
.base_address_set
= 0;
1872 image
.start_address_set
= 0;
1874 duration_start_measure(&duration
);
1876 if (image_open(&image
, args
[0], (argc
>= 3) ? args
[2] : NULL
) != ERROR_OK
)
1883 for (i
= 0; i
< image
.num_sections
; i
++)
1885 buffer
= malloc(image
.sections
[i
].size
);
1888 command_print(cmd_ctx
, "error allocating buffer for section (%d bytes)", image
.sections
[i
].size
);
1892 if ((retval
= image_read_section(&image
, i
, 0x0, image
.sections
[i
].size
, buffer
, &buf_cnt
)) != ERROR_OK
)
1897 if ((retval
= target_write_buffer(target
, image
.sections
[i
].base_address
, buf_cnt
, buffer
)) != ERROR_OK
)
1902 image_size
+= buf_cnt
;
1903 command_print(cmd_ctx
, "%u byte written at address 0x%8.8x", buf_cnt
, image
.sections
[i
].base_address
);
1908 duration_stop_measure(&duration
, &duration_text
);
1909 if (retval
==ERROR_OK
)
1911 command_print(cmd_ctx
, "downloaded %u byte in %s", image_size
, duration_text
);
1913 free(duration_text
);
1915 image_close(&image
);
1921 int handle_dump_image_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1928 int retval
=ERROR_OK
;
1930 duration_t duration
;
1931 char *duration_text
;
1933 target_t
*target
= get_current_target(cmd_ctx
);
1937 command_print(cmd_ctx
, "usage: dump_image <filename> <address> <size>");
1941 address
= strtoul(args
[1], NULL
, 0);
1942 size
= strtoul(args
[2], NULL
, 0);
1944 if ((address
& 3) || (size
& 3))
1946 command_print(cmd_ctx
, "only 32-bit aligned address and size are supported");
1950 if (fileio_open(&fileio
, args
[0], FILEIO_WRITE
, FILEIO_BINARY
) != ERROR_OK
)
1955 duration_start_measure(&duration
);
1960 u32 this_run_size
= (size
> 560) ? 560 : size
;
1962 retval
= target
->type
->read_memory(target
, address
, 4, this_run_size
/ 4, buffer
);
1963 if (retval
!= ERROR_OK
)
1968 retval
= fileio_write(&fileio
, this_run_size
, buffer
, &size_written
);
1969 if (retval
!= ERROR_OK
)
1974 size
-= this_run_size
;
1975 address
+= this_run_size
;
1978 fileio_close(&fileio
);
1980 duration_stop_measure(&duration
, &duration_text
);
1981 if (retval
==ERROR_OK
)
1983 command_print(cmd_ctx
, "dumped %"PRIi64
" byte in %s", fileio
.size
, duration_text
);
1985 free(duration_text
);
1990 int handle_verify_image_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1998 u32 mem_checksum
= 0;
2002 duration_t duration
;
2003 char *duration_text
;
2005 target_t
*target
= get_current_target(cmd_ctx
);
2009 command_print(cmd_ctx
, "usage: verify_image <file> [offset] [type]");
2015 LOG_ERROR("no target selected");
2019 duration_start_measure(&duration
);
2023 image
.base_address_set
= 1;
2024 image
.base_address
= strtoul(args
[1], NULL
, 0);
2028 image
.base_address_set
= 0;
2029 image
.base_address
= 0x0;
2032 image
.start_address_set
= 0;
2034 if (image_open(&image
, args
[0], (argc
== 3) ? args
[2] : NULL
) != ERROR_OK
)
2041 for (i
= 0; i
< image
.num_sections
; i
++)
2043 buffer
= malloc(image
.sections
[i
].size
);
2046 command_print(cmd_ctx
, "error allocating buffer for section (%d bytes)", image
.sections
[i
].size
);
2049 if ((retval
= image_read_section(&image
, i
, 0x0, image
.sections
[i
].size
, buffer
, &buf_cnt
)) != ERROR_OK
)
2055 /* calculate checksum of image */
2056 image_calculate_checksum( buffer
, buf_cnt
, &checksum
);
2058 retval
= target_checksum_memory(target
, image
.sections
[i
].base_address
, buf_cnt
, &mem_checksum
);
2059 if( retval
!= ERROR_OK
)
2065 if( checksum
!= mem_checksum
)
2067 /* failed crc checksum, fall back to a binary compare */
2070 command_print(cmd_ctx
, "checksum mismatch - attempting binary compare");
2072 data
= (u8
*)malloc(buf_cnt
);
2074 /* Can we use 32bit word accesses? */
2076 int count
= buf_cnt
;
2077 if ((count
% 4) == 0)
2082 retval
= target
->type
->read_memory(target
, image
.sections
[i
].base_address
, size
, count
, data
);
2083 if (retval
== ERROR_OK
)
2086 for (t
= 0; t
< buf_cnt
; t
++)
2088 if (data
[t
] != buffer
[t
])
2090 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
]);
2103 image_size
+= buf_cnt
;
2106 duration_stop_measure(&duration
, &duration_text
);
2107 if (retval
==ERROR_OK
)
2109 command_print(cmd_ctx
, "verified %u bytes in %s", image_size
, duration_text
);
2111 free(duration_text
);
2113 image_close(&image
);
2118 int handle_bp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2121 target_t
*target
= get_current_target(cmd_ctx
);
2125 breakpoint_t
*breakpoint
= target
->breakpoints
;
2129 if (breakpoint
->type
== BKPT_SOFT
)
2131 char* buf
= buf_to_str(breakpoint
->orig_instr
, breakpoint
->length
, 16);
2132 command_print(cmd_ctx
, "0x%8.8x, 0x%x, %i, 0x%s", breakpoint
->address
, breakpoint
->length
, breakpoint
->set
, buf
);
2137 command_print(cmd_ctx
, "0x%8.8x, 0x%x, %i", breakpoint
->address
, breakpoint
->length
, breakpoint
->set
);
2139 breakpoint
= breakpoint
->next
;
2147 length
= strtoul(args
[1], NULL
, 0);
2150 if (strcmp(args
[2], "hw") == 0)
2153 if ((retval
= breakpoint_add(target
, strtoul(args
[0], NULL
, 0), length
, hw
)) != ERROR_OK
)
2155 LOG_ERROR("Failure setting breakpoints");
2159 command_print(cmd_ctx
, "breakpoint added at address 0x%8.8x", strtoul(args
[0], NULL
, 0));
2164 command_print(cmd_ctx
, "usage: bp <address> <length> ['hw']");
2170 int handle_rbp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2172 target_t
*target
= get_current_target(cmd_ctx
);
2175 breakpoint_remove(target
, strtoul(args
[0], NULL
, 0));
2180 int handle_wp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2182 target_t
*target
= get_current_target(cmd_ctx
);
2187 watchpoint_t
*watchpoint
= target
->watchpoints
;
2191 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
);
2192 watchpoint
= watchpoint
->next
;
2197 enum watchpoint_rw type
= WPT_ACCESS
;
2198 u32 data_value
= 0x0;
2199 u32 data_mask
= 0xffffffff;
2215 command_print(cmd_ctx
, "usage: wp <address> <length> [r/w/a] [value] [mask]");
2221 data_value
= strtoul(args
[3], NULL
, 0);
2225 data_mask
= strtoul(args
[4], NULL
, 0);
2228 if ((retval
= watchpoint_add(target
, strtoul(args
[0], NULL
, 0),
2229 strtoul(args
[1], NULL
, 0), type
, data_value
, data_mask
)) != ERROR_OK
)
2231 LOG_ERROR("Failure setting breakpoints");
2236 command_print(cmd_ctx
, "usage: wp <address> <length> [r/w/a] [value] [mask]");
2242 int handle_rwp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2244 target_t
*target
= get_current_target(cmd_ctx
);
2247 watchpoint_remove(target
, strtoul(args
[0], NULL
, 0));
2252 int handle_virt2phys_command(command_context_t
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2255 target_t
*target
= get_current_target(cmd_ctx
);
2261 return ERROR_COMMAND_SYNTAX_ERROR
;
2263 va
= strtoul(args
[0], NULL
, 0);
2265 retval
= target
->type
->virt2phys(target
, va
, &pa
);
2266 if (retval
== ERROR_OK
)
2268 command_print(cmd_ctx
, "Physical address 0x%08x", pa
);
2272 /* lower levels will have logged a detailed error which is
2273 * forwarded to telnet/GDB session.
2278 static void writeLong(FILE *f
, int l
)
2283 char c
=(l
>>(i
*8))&0xff;
2284 fwrite(&c
, 1, 1, f
);
2288 static void writeString(FILE *f
, char *s
)
2290 fwrite(s
, 1, strlen(s
), f
);
2295 // Dump a gmon.out histogram file.
2296 static void writeGmon(u32
*samples
, int sampleNum
, char *filename
)
2299 FILE *f
=fopen(filename
, "w");
2302 fwrite("gmon", 1, 4, f
);
2303 writeLong(f
, 0x00000001); // Version
2304 writeLong(f
, 0); // padding
2305 writeLong(f
, 0); // padding
2306 writeLong(f
, 0); // padding
2308 fwrite("", 1, 1, f
); // GMON_TAG_TIME_HIST
2310 // figure out bucket size
2313 for (i
=0; i
<sampleNum
; i
++)
2325 int addressSpace
=(max
-min
+1);
2327 static int const maxBuckets
=256*1024; // maximum buckets.
2328 int length
=addressSpace
;
2329 if (length
> maxBuckets
)
2333 int *buckets
=malloc(sizeof(int)*length
);
2339 memset(buckets
, 0, sizeof(int)*length
);
2340 for (i
=0; i
<sampleNum
;i
++)
2342 u32 address
=samples
[i
];
2343 long long a
=address
-min
;
2344 long long b
=length
-1;
2345 long long c
=addressSpace
-1;
2346 int index
=(a
*b
)/c
; // danger!!!! int32 overflows
2350 // append binary memory gmon.out &profile_hist_hdr ((char*)&profile_hist_hdr + sizeof(struct gmon_hist_hdr))
2351 writeLong(f
, min
); // low_pc
2352 writeLong(f
, max
); // high_pc
2353 writeLong(f
, length
); // # of samples
2354 writeLong(f
, 64000000); // 64MHz
2355 writeString(f
, "seconds");
2356 for (i
=0; i
<(15-strlen("seconds")); i
++)
2358 fwrite("", 1, 1, f
); // padding
2360 writeString(f
, "s");
2362 // append binary memory gmon.out profile_hist_data (profile_hist_data + profile_hist_hdr.hist_size)
2364 char *data
=malloc(2*length
);
2367 for (i
=0; i
<length
;i
++)
2376 data
[i
*2+1]=(val
>>8)&0xff;
2379 fwrite(data
, 1, length
*2, f
);
2389 /* profiling samples the CPU PC as quickly as OpenOCD is able, which will be used as a random sampling of PC */
2390 int handle_profile_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2392 target_t
*target
= get_current_target(cmd_ctx
);
2393 struct timeval timeout
, now
;
2395 gettimeofday(&timeout
, NULL
);
2398 return ERROR_COMMAND_SYNTAX_ERROR
;
2401 timeval_add_time(&timeout
, strtoul(args
[0], &end
, 0), 0);
2407 command_print(cmd_ctx
, "Starting profiling. Halting and resuming the target as often as we can...");
2409 static const int maxSample
=10000;
2410 u32
*samples
=malloc(sizeof(u32
)*maxSample
);
2415 int retval
=ERROR_OK
;
2416 // hopefully it is safe to cache! We want to stop/restart as quickly as possible.
2417 reg_t
*reg
= register_get_by_name(target
->reg_cache
, "pc", 1);
2421 target
->type
->poll(target
);
2422 if (target
->state
== TARGET_HALTED
)
2424 u32 t
=*((u32
*)reg
->value
);
2425 samples
[numSamples
++]=t
;
2426 retval
= target
->type
->resume(target
, 1, 0, 0, 0); /* current pc, addr = 0, do not handle breakpoints, not debugging */
2427 target
->type
->poll(target
);
2428 usleep(10*1000); // sleep 10ms, i.e. <100 samples/second.
2429 } else if (target
->state
== TARGET_RUNNING
)
2431 // We want to quickly sample the PC.
2432 target
->type
->halt(target
);
2435 command_print(cmd_ctx
, "Target not halted or running");
2439 if (retval
!=ERROR_OK
)
2444 gettimeofday(&now
, NULL
);
2445 if ((numSamples
>=maxSample
) || ((now
.tv_sec
>= timeout
.tv_sec
) && (now
.tv_usec
>= timeout
.tv_usec
)))
2447 command_print(cmd_ctx
, "Profiling completed. %d samples.", numSamples
);
2448 target
->type
->poll(target
);
2449 if (target
->state
== TARGET_HALTED
)
2451 target
->type
->resume(target
, 1, 0, 0, 0); /* current pc, addr = 0, do not handle breakpoints, not debugging */
2453 target
->type
->poll(target
);
2454 writeGmon(samples
, numSamples
, args
[1]);
2455 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)