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 static int target_call_timer_callbacks_check_time(int checktime
)
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 ((!checktime
&&callback
->periodic
)||
591 (((now
.tv_sec
>= callback
->when
.tv_sec
) && (now
.tv_usec
>= callback
->when
.tv_usec
))
592 || (now
.tv_sec
> callback
->when
.tv_sec
)))
594 callback
->callback(callback
->priv
);
595 if (callback
->periodic
)
597 int time_ms
= callback
->time_ms
;
598 callback
->when
.tv_usec
= now
.tv_usec
+ (time_ms
% 1000) * 1000;
599 time_ms
-= (time_ms
% 1000);
600 callback
->when
.tv_sec
= now
.tv_sec
+ time_ms
/ 1000;
601 if (callback
->when
.tv_usec
> 1000000)
603 callback
->when
.tv_usec
= callback
->when
.tv_usec
- 1000000;
604 callback
->when
.tv_sec
+= 1;
608 target_unregister_timer_callback(callback
->callback
, callback
->priv
);
611 callback
= next_callback
;
617 int target_call_timer_callbacks()
619 return target_call_timer_callbacks_check_time(1);
622 /* invoke periodic callbacks immediately */
623 int target_call_timer_callbacks_now()
625 return target_call_timer_callbacks(0);
629 int target_alloc_working_area(struct target_s
*target
, u32 size
, working_area_t
**area
)
631 working_area_t
*c
= target
->working_areas
;
632 working_area_t
*new_wa
= NULL
;
634 /* Reevaluate working area address based on MMU state*/
635 if (target
->working_areas
== NULL
)
639 retval
= target
->type
->mmu(target
, &enabled
);
640 if (retval
!= ERROR_OK
)
646 target
->working_area
= target
->working_area_virt
;
650 target
->working_area
= target
->working_area_phys
;
654 /* only allocate multiples of 4 byte */
657 LOG_ERROR("BUG: code tried to allocate unaligned number of bytes, padding");
658 size
= CEIL(size
, 4);
661 /* see if there's already a matching working area */
664 if ((c
->free
) && (c
->size
== size
))
672 /* if not, allocate a new one */
675 working_area_t
**p
= &target
->working_areas
;
676 u32 first_free
= target
->working_area
;
677 u32 free_size
= target
->working_area_size
;
679 LOG_DEBUG("allocating new working area");
681 c
= target
->working_areas
;
684 first_free
+= c
->size
;
685 free_size
-= c
->size
;
690 if (free_size
< size
)
692 LOG_WARNING("not enough working area available(requested %d, free %d)", size
, free_size
);
693 return ERROR_TARGET_RESOURCE_NOT_AVAILABLE
;
696 new_wa
= malloc(sizeof(working_area_t
));
699 new_wa
->address
= first_free
;
701 if (target
->backup_working_area
)
703 new_wa
->backup
= malloc(new_wa
->size
);
704 target
->type
->read_memory(target
, new_wa
->address
, 4, new_wa
->size
/ 4, new_wa
->backup
);
708 new_wa
->backup
= NULL
;
711 /* put new entry in list */
715 /* mark as used, and return the new (reused) area */
725 int target_free_working_area(struct target_s
*target
, working_area_t
*area
)
730 if (target
->backup_working_area
)
731 target
->type
->write_memory(target
, area
->address
, 4, area
->size
/ 4, area
->backup
);
735 /* mark user pointer invalid */
742 int target_free_all_working_areas(struct target_s
*target
)
744 working_area_t
*c
= target
->working_areas
;
748 working_area_t
*next
= c
->next
;
749 target_free_working_area(target
, c
);
759 target
->working_areas
= NULL
;
764 int target_register_commands(struct command_context_s
*cmd_ctx
)
766 register_command(cmd_ctx
, NULL
, "target", handle_target_command
, COMMAND_CONFIG
, NULL
);
767 register_command(cmd_ctx
, NULL
, "targets", handle_targets_command
, COMMAND_EXEC
, NULL
);
768 register_command(cmd_ctx
, NULL
, "daemon_startup", handle_daemon_startup_command
, COMMAND_CONFIG
, NULL
);
769 register_command(cmd_ctx
, NULL
, "target_script", handle_target_script_command
, COMMAND_CONFIG
, NULL
);
770 register_command(cmd_ctx
, NULL
, "run_and_halt_time", handle_run_and_halt_time_command
, COMMAND_CONFIG
, "<target> <run time ms>");
771 register_command(cmd_ctx
, NULL
, "working_area", handle_working_area_command
, COMMAND_ANY
, "working_area <target#> <address> <size> <'backup'|'nobackup'> [virtual address]");
772 register_command(cmd_ctx
, NULL
, "virt2phys", handle_virt2phys_command
, COMMAND_ANY
, "virt2phys <virtual address>");
773 register_command(cmd_ctx
, NULL
, "profile", handle_profile_command
, COMMAND_EXEC
, "PRELIMINARY! - profile <seconds> <gmon.out>");
778 int target_arch_state(struct target_s
*target
)
783 LOG_USER("No target has been configured");
787 LOG_USER("target state: %s", target_state_strings
[target
->state
]);
789 if (target
->state
!=TARGET_HALTED
)
792 retval
=target
->type
->arch_state(target
);
796 /* Single aligned words are guaranteed to use 16 or 32 bit access
797 * mode respectively, otherwise data is handled as quickly as
800 int target_write_buffer(struct target_s
*target
, u32 address
, u32 size
, u8
*buffer
)
804 LOG_DEBUG("writing buffer of %i byte at 0x%8.8x", size
, address
);
806 if (((address
% 2) == 0) && (size
== 2))
808 return target
->type
->write_memory(target
, address
, 2, 1, buffer
);
811 /* handle unaligned head bytes */
814 int unaligned
= 4 - (address
% 4);
816 if (unaligned
> size
)
819 if ((retval
= target
->type
->write_memory(target
, address
, 1, unaligned
, buffer
)) != ERROR_OK
)
823 address
+= unaligned
;
827 /* handle aligned words */
830 int aligned
= size
- (size
% 4);
832 /* use bulk writes above a certain limit. This may have to be changed */
835 if ((retval
= target
->type
->bulk_write_memory(target
, address
, aligned
/ 4, buffer
)) != ERROR_OK
)
840 if ((retval
= target
->type
->write_memory(target
, address
, 4, aligned
/ 4, buffer
)) != ERROR_OK
)
849 /* handle tail writes of less than 4 bytes */
852 if ((retval
= target
->type
->write_memory(target
, address
, 1, size
, buffer
)) != ERROR_OK
)
860 /* Single aligned words are guaranteed to use 16 or 32 bit access
861 * mode respectively, otherwise data is handled as quickly as
864 int target_read_buffer(struct target_s
*target
, u32 address
, u32 size
, u8
*buffer
)
868 LOG_DEBUG("reading buffer of %i byte at 0x%8.8x", size
, address
);
870 if (((address
% 2) == 0) && (size
== 2))
872 return target
->type
->read_memory(target
, address
, 2, 1, buffer
);
875 /* handle unaligned head bytes */
878 int unaligned
= 4 - (address
% 4);
880 if (unaligned
> size
)
883 if ((retval
= target
->type
->read_memory(target
, address
, 1, unaligned
, buffer
)) != ERROR_OK
)
887 address
+= unaligned
;
891 /* handle aligned words */
894 int aligned
= size
- (size
% 4);
896 if ((retval
= target
->type
->read_memory(target
, address
, 4, aligned
/ 4, buffer
)) != ERROR_OK
)
904 /* handle tail writes of less than 4 bytes */
907 if ((retval
= target
->type
->read_memory(target
, address
, 1, size
, buffer
)) != ERROR_OK
)
914 int target_checksum_memory(struct target_s
*target
, u32 address
, u32 size
, u32
* crc
)
921 if ((retval
= target
->type
->checksum_memory(target
, address
,
922 size
, &checksum
)) == ERROR_TARGET_RESOURCE_NOT_AVAILABLE
)
924 buffer
= malloc(size
);
927 LOG_ERROR("error allocating buffer for section (%d bytes)", size
);
928 return ERROR_INVALID_ARGUMENTS
;
930 retval
= target_read_buffer(target
, address
, size
, buffer
);
931 if (retval
!= ERROR_OK
)
937 /* convert to target endianess */
938 for (i
= 0; i
< (size
/sizeof(u32
)); i
++)
941 target_data
= target_buffer_get_u32(target
, &buffer
[i
*sizeof(u32
)]);
942 target_buffer_set_u32(target
, &buffer
[i
*sizeof(u32
)], target_data
);
945 retval
= image_calculate_checksum( buffer
, size
, &checksum
);
954 int target_read_u32(struct target_s
*target
, u32 address
, u32
*value
)
958 int retval
= target
->type
->read_memory(target
, address
, 4, 1, value_buf
);
960 if (retval
== ERROR_OK
)
962 *value
= target_buffer_get_u32(target
, value_buf
);
963 LOG_DEBUG("address: 0x%8.8x, value: 0x%8.8x", address
, *value
);
968 LOG_DEBUG("address: 0x%8.8x failed", address
);
974 int target_read_u16(struct target_s
*target
, u32 address
, u16
*value
)
978 int retval
= target
->type
->read_memory(target
, address
, 2, 1, value_buf
);
980 if (retval
== ERROR_OK
)
982 *value
= target_buffer_get_u16(target
, value_buf
);
983 LOG_DEBUG("address: 0x%8.8x, value: 0x%4.4x", address
, *value
);
988 LOG_DEBUG("address: 0x%8.8x failed", address
);
994 int target_read_u8(struct target_s
*target
, u32 address
, u8
*value
)
996 int retval
= target
->type
->read_memory(target
, address
, 1, 1, value
);
998 if (retval
== ERROR_OK
)
1000 LOG_DEBUG("address: 0x%8.8x, value: 0x%2.2x", address
, *value
);
1005 LOG_DEBUG("address: 0x%8.8x failed", address
);
1011 int target_write_u32(struct target_s
*target
, u32 address
, u32 value
)
1016 LOG_DEBUG("address: 0x%8.8x, value: 0x%8.8x", address
, value
);
1018 target_buffer_set_u32(target
, value_buf
, value
);
1019 if ((retval
= target
->type
->write_memory(target
, address
, 4, 1, value_buf
)) != ERROR_OK
)
1021 LOG_DEBUG("failed: %i", retval
);
1027 int target_write_u16(struct target_s
*target
, u32 address
, u16 value
)
1032 LOG_DEBUG("address: 0x%8.8x, value: 0x%8.8x", address
, value
);
1034 target_buffer_set_u16(target
, value_buf
, value
);
1035 if ((retval
= target
->type
->write_memory(target
, address
, 2, 1, value_buf
)) != ERROR_OK
)
1037 LOG_DEBUG("failed: %i", retval
);
1043 int target_write_u8(struct target_s
*target
, u32 address
, u8 value
)
1047 LOG_DEBUG("address: 0x%8.8x, value: 0x%2.2x", address
, value
);
1049 if ((retval
= target
->type
->read_memory(target
, address
, 1, 1, &value
)) != ERROR_OK
)
1051 LOG_DEBUG("failed: %i", retval
);
1057 int target_register_user_commands(struct command_context_s
*cmd_ctx
)
1059 register_command(cmd_ctx
, NULL
, "reg", handle_reg_command
, COMMAND_EXEC
, NULL
);
1060 register_command(cmd_ctx
, NULL
, "poll", handle_poll_command
, COMMAND_EXEC
, "poll target state");
1061 register_command(cmd_ctx
, NULL
, "wait_halt", handle_wait_halt_command
, COMMAND_EXEC
, "wait for target halt [time (s)]");
1062 register_command(cmd_ctx
, NULL
, "halt", handle_halt_command
, COMMAND_EXEC
, "halt target");
1063 register_command(cmd_ctx
, NULL
, "resume", handle_resume_command
, COMMAND_EXEC
, "resume target [addr]");
1064 register_command(cmd_ctx
, NULL
, "step", handle_step_command
, COMMAND_EXEC
, "step one instruction from current PC or [addr]");
1065 register_command(cmd_ctx
, NULL
, "reset", handle_reset_command
, COMMAND_EXEC
, "reset target [run|halt|init|run_and_halt|run_and_init]");
1066 register_command(cmd_ctx
, NULL
, "soft_reset_halt", handle_soft_reset_halt_command
, COMMAND_EXEC
, "halt the target and do a soft reset");
1068 register_command(cmd_ctx
, NULL
, "mdw", handle_md_command
, COMMAND_EXEC
, "display memory words <addr> [count]");
1069 register_command(cmd_ctx
, NULL
, "mdh", handle_md_command
, COMMAND_EXEC
, "display memory half-words <addr> [count]");
1070 register_command(cmd_ctx
, NULL
, "mdb", handle_md_command
, COMMAND_EXEC
, "display memory bytes <addr> [count]");
1072 register_command(cmd_ctx
, NULL
, "mww", handle_mw_command
, COMMAND_EXEC
, "write memory word <addr> <value> [count]");
1073 register_command(cmd_ctx
, NULL
, "mwh", handle_mw_command
, COMMAND_EXEC
, "write memory half-word <addr> <value> [count]");
1074 register_command(cmd_ctx
, NULL
, "mwb", handle_mw_command
, COMMAND_EXEC
, "write memory byte <addr> <value> [count]");
1076 register_command(cmd_ctx
, NULL
, "bp", handle_bp_command
, COMMAND_EXEC
, "set breakpoint <address> <length> [hw]");
1077 register_command(cmd_ctx
, NULL
, "rbp", handle_rbp_command
, COMMAND_EXEC
, "remove breakpoint <adress>");
1078 register_command(cmd_ctx
, NULL
, "wp", handle_wp_command
, COMMAND_EXEC
, "set watchpoint <address> <length> <r/w/a> [value] [mask]");
1079 register_command(cmd_ctx
, NULL
, "rwp", handle_rwp_command
, COMMAND_EXEC
, "remove watchpoint <adress>");
1081 register_command(cmd_ctx
, NULL
, "load_image", handle_load_image_command
, COMMAND_EXEC
, "load_image <file> <address> ['bin'|'ihex'|'elf'|'s19']");
1082 register_command(cmd_ctx
, NULL
, "dump_image", handle_dump_image_command
, COMMAND_EXEC
, "dump_image <file> <address> <size>");
1083 register_command(cmd_ctx
, NULL
, "verify_image", handle_verify_image_command
, COMMAND_EXEC
, "verify_image <file> [offset] [type]");
1084 register_command(cmd_ctx
, NULL
, "load_binary", handle_load_image_command
, COMMAND_EXEC
, "[DEPRECATED] load_binary <file> <address>");
1085 register_command(cmd_ctx
, NULL
, "dump_binary", handle_dump_image_command
, COMMAND_EXEC
, "[DEPRECATED] dump_binary <file> <address> <size>");
1087 target_request_register_commands(cmd_ctx
);
1088 trace_register_commands(cmd_ctx
);
1093 int handle_targets_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1095 target_t
*target
= targets
;
1100 int num
= strtoul(args
[0], NULL
, 0);
1105 target
= target
->next
;
1109 cmd_ctx
->current_target
= num
;
1111 command_print(cmd_ctx
, "%i is out of bounds, only %i targets are configured", num
, count
);
1118 command_print(cmd_ctx
, "%i: %s (%s), state: %s", count
++, target
->type
->name
, target_endianess_strings
[target
->endianness
], target_state_strings
[target
->state
]);
1119 target
= target
->next
;
1125 int handle_target_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1132 return ERROR_COMMAND_SYNTAX_ERROR
;
1135 /* search for the specified target */
1136 if (args
[0] && (args
[0][0] != 0))
1138 for (i
= 0; target_types
[i
]; i
++)
1140 if (strcmp(args
[0], target_types
[i
]->name
) == 0)
1142 target_t
**last_target_p
= &targets
;
1144 /* register target specific commands */
1145 if (target_types
[i
]->register_commands(cmd_ctx
) != ERROR_OK
)
1147 LOG_ERROR("couldn't register '%s' commands", args
[0]);
1153 while ((*last_target_p
)->next
)
1154 last_target_p
= &((*last_target_p
)->next
);
1155 last_target_p
= &((*last_target_p
)->next
);
1158 *last_target_p
= malloc(sizeof(target_t
));
1160 (*last_target_p
)->type
= target_types
[i
];
1162 if (strcmp(args
[1], "big") == 0)
1163 (*last_target_p
)->endianness
= TARGET_BIG_ENDIAN
;
1164 else if (strcmp(args
[1], "little") == 0)
1165 (*last_target_p
)->endianness
= TARGET_LITTLE_ENDIAN
;
1168 LOG_ERROR("endianness must be either 'little' or 'big', not '%s'", args
[1]);
1169 return ERROR_COMMAND_SYNTAX_ERROR
;
1172 /* what to do on a target reset */
1173 if (strcmp(args
[2], "reset_halt") == 0)
1174 (*last_target_p
)->reset_mode
= RESET_HALT
;
1175 else if (strcmp(args
[2], "reset_run") == 0)
1176 (*last_target_p
)->reset_mode
= RESET_RUN
;
1177 else if (strcmp(args
[2], "reset_init") == 0)
1178 (*last_target_p
)->reset_mode
= RESET_INIT
;
1179 else if (strcmp(args
[2], "run_and_halt") == 0)
1180 (*last_target_p
)->reset_mode
= RESET_RUN_AND_HALT
;
1181 else if (strcmp(args
[2], "run_and_init") == 0)
1182 (*last_target_p
)->reset_mode
= RESET_RUN_AND_INIT
;
1185 LOG_ERROR("unknown target startup mode %s", args
[2]);
1186 return ERROR_COMMAND_SYNTAX_ERROR
;
1188 (*last_target_p
)->run_and_halt_time
= 1000; /* default 1s */
1190 (*last_target_p
)->reset_script
= NULL
;
1191 (*last_target_p
)->post_halt_script
= NULL
;
1192 (*last_target_p
)->pre_resume_script
= NULL
;
1193 (*last_target_p
)->gdb_program_script
= NULL
;
1195 (*last_target_p
)->working_area
= 0x0;
1196 (*last_target_p
)->working_area_size
= 0x0;
1197 (*last_target_p
)->working_areas
= NULL
;
1198 (*last_target_p
)->backup_working_area
= 0;
1200 (*last_target_p
)->state
= TARGET_UNKNOWN
;
1201 (*last_target_p
)->debug_reason
= DBG_REASON_UNDEFINED
;
1202 (*last_target_p
)->reg_cache
= NULL
;
1203 (*last_target_p
)->breakpoints
= NULL
;
1204 (*last_target_p
)->watchpoints
= NULL
;
1205 (*last_target_p
)->next
= NULL
;
1206 (*last_target_p
)->arch_info
= NULL
;
1208 /* initialize trace information */
1209 (*last_target_p
)->trace_info
= malloc(sizeof(trace_t
));
1210 (*last_target_p
)->trace_info
->num_trace_points
= 0;
1211 (*last_target_p
)->trace_info
->trace_points_size
= 0;
1212 (*last_target_p
)->trace_info
->trace_points
= NULL
;
1213 (*last_target_p
)->trace_info
->trace_history_size
= 0;
1214 (*last_target_p
)->trace_info
->trace_history
= NULL
;
1215 (*last_target_p
)->trace_info
->trace_history_pos
= 0;
1216 (*last_target_p
)->trace_info
->trace_history_overflowed
= 0;
1218 (*last_target_p
)->dbgmsg
= NULL
;
1219 (*last_target_p
)->dbg_msg_enabled
= 0;
1221 (*last_target_p
)->type
->target_command(cmd_ctx
, cmd
, args
, argc
, *last_target_p
);
1229 /* no matching target found */
1232 LOG_ERROR("target '%s' not found", args
[0]);
1233 return ERROR_COMMAND_SYNTAX_ERROR
;
1239 /* usage: target_script <target#> <event> <script_file> */
1240 int handle_target_script_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1242 target_t
*target
= NULL
;
1246 LOG_ERROR("incomplete target_script command");
1247 return ERROR_COMMAND_SYNTAX_ERROR
;
1250 target
= get_target_by_num(strtoul(args
[0], NULL
, 0));
1254 return ERROR_COMMAND_SYNTAX_ERROR
;
1257 if (strcmp(args
[1], "reset") == 0)
1259 if (target
->reset_script
)
1260 free(target
->reset_script
);
1261 target
->reset_script
= strdup(args
[2]);
1263 else if (strcmp(args
[1], "post_halt") == 0)
1265 if (target
->post_halt_script
)
1266 free(target
->post_halt_script
);
1267 target
->post_halt_script
= strdup(args
[2]);
1269 else if (strcmp(args
[1], "pre_resume") == 0)
1271 if (target
->pre_resume_script
)
1272 free(target
->pre_resume_script
);
1273 target
->pre_resume_script
= strdup(args
[2]);
1275 else if (strcmp(args
[1], "gdb_program_config") == 0)
1277 if (target
->gdb_program_script
)
1278 free(target
->gdb_program_script
);
1279 target
->gdb_program_script
= strdup(args
[2]);
1283 LOG_ERROR("unknown event type: '%s", args
[1]);
1284 return ERROR_COMMAND_SYNTAX_ERROR
;
1290 int handle_run_and_halt_time_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1292 target_t
*target
= NULL
;
1296 return ERROR_COMMAND_SYNTAX_ERROR
;
1299 target
= get_target_by_num(strtoul(args
[0], NULL
, 0));
1302 return ERROR_COMMAND_SYNTAX_ERROR
;
1305 target
->run_and_halt_time
= strtoul(args
[1], NULL
, 0);
1310 int handle_working_area_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1312 target_t
*target
= NULL
;
1314 if ((argc
< 4) || (argc
> 5))
1316 return ERROR_COMMAND_SYNTAX_ERROR
;
1319 target
= get_target_by_num(strtoul(args
[0], NULL
, 0));
1322 return ERROR_COMMAND_SYNTAX_ERROR
;
1324 target_free_all_working_areas(target
);
1326 target
->working_area_phys
= target
->working_area_virt
= strtoul(args
[1], NULL
, 0);
1329 target
->working_area_virt
= strtoul(args
[4], NULL
, 0);
1331 target
->working_area_size
= strtoul(args
[2], NULL
, 0);
1333 if (strcmp(args
[3], "backup") == 0)
1335 target
->backup_working_area
= 1;
1337 else if (strcmp(args
[3], "nobackup") == 0)
1339 target
->backup_working_area
= 0;
1343 LOG_ERROR("unrecognized <backup|nobackup> argument (%s)", args
[3]);
1344 return ERROR_COMMAND_SYNTAX_ERROR
;
1351 /* process target state changes */
1352 int handle_target(void *priv
)
1355 target_t
*target
= targets
;
1359 /* only poll if target isn't already halted */
1360 if (target
->state
!= TARGET_HALTED
)
1362 if (target_continous_poll
)
1363 if ((retval
= target
->type
->poll(target
)) != ERROR_OK
)
1365 LOG_ERROR("couldn't poll target(%d). It's due for a reset.", retval
);
1369 target
= target
->next
;
1375 int handle_reg_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1384 target
= get_current_target(cmd_ctx
);
1386 /* list all available registers for the current target */
1389 reg_cache_t
*cache
= target
->reg_cache
;
1395 for (i
= 0; i
< cache
->num_regs
; i
++)
1397 value
= buf_to_str(cache
->reg_list
[i
].value
, cache
->reg_list
[i
].size
, 16);
1398 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
);
1401 cache
= cache
->next
;
1407 /* access a single register by its ordinal number */
1408 if ((args
[0][0] >= '0') && (args
[0][0] <= '9'))
1410 int num
= strtoul(args
[0], NULL
, 0);
1411 reg_cache_t
*cache
= target
->reg_cache
;
1417 for (i
= 0; i
< cache
->num_regs
; i
++)
1421 reg
= &cache
->reg_list
[i
];
1427 cache
= cache
->next
;
1432 command_print(cmd_ctx
, "%i is out of bounds, the current target has only %i registers (0 - %i)", num
, count
, count
- 1);
1435 } else /* access a single register by its name */
1437 reg
= register_get_by_name(target
->reg_cache
, args
[0], 1);
1441 command_print(cmd_ctx
, "register %s not found in current target", args
[0]);
1446 /* display a register */
1447 if ((argc
== 1) || ((argc
== 2) && !((args
[1][0] >= '0') && (args
[1][0] <= '9'))))
1449 if ((argc
== 2) && (strcmp(args
[1], "force") == 0))
1452 if (reg
->valid
== 0)
1454 reg_arch_type_t
*arch_type
= register_get_arch_type(reg
->arch_type
);
1455 if (arch_type
== NULL
)
1457 LOG_ERROR("BUG: encountered unregistered arch type");
1460 arch_type
->get(reg
);
1462 value
= buf_to_str(reg
->value
, reg
->size
, 16);
1463 command_print(cmd_ctx
, "%s (/%i): 0x%s", reg
->name
, reg
->size
, value
);
1468 /* set register value */
1471 u8
*buf
= malloc(CEIL(reg
->size
, 8));
1472 str_to_buf(args
[1], strlen(args
[1]), buf
, reg
->size
, 0);
1474 reg_arch_type_t
*arch_type
= register_get_arch_type(reg
->arch_type
);
1475 if (arch_type
== NULL
)
1477 LOG_ERROR("BUG: encountered unregistered arch type");
1481 arch_type
->set(reg
, buf
);
1483 value
= buf_to_str(reg
->value
, reg
->size
, 16);
1484 command_print(cmd_ctx
, "%s (/%i): 0x%s", reg
->name
, reg
->size
, value
);
1492 command_print(cmd_ctx
, "usage: reg <#|name> [value]");
1497 static int wait_state(struct command_context_s
*cmd_ctx
, char *cmd
, enum target_state state
, int ms
);
1499 int handle_poll_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1501 target_t
*target
= get_current_target(cmd_ctx
);
1505 target
->type
->poll(target
);
1506 target_arch_state(target
);
1510 if (strcmp(args
[0], "on") == 0)
1512 target_continous_poll
= 1;
1514 else if (strcmp(args
[0], "off") == 0)
1516 target_continous_poll
= 0;
1520 command_print(cmd_ctx
, "arg is \"on\" or \"off\"");
1528 int handle_wait_halt_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1536 ms
= strtoul(args
[0], &end
, 0) * 1000;
1539 command_print(cmd_ctx
, "usage: %s [seconds]", cmd
);
1544 return wait_state(cmd_ctx
, cmd
, TARGET_HALTED
, ms
);
1547 static void target_process_events(struct command_context_s
*cmd_ctx
)
1549 target_t
*target
= get_current_target(cmd_ctx
);
1550 target
->type
->poll(target
);
1551 target_call_timer_callbacks_now();
1554 static int wait_state(struct command_context_s
*cmd_ctx
, char *cmd
, enum target_state state
, int ms
)
1557 struct timeval timeout
, now
;
1559 gettimeofday(&timeout
, NULL
);
1560 timeval_add_time(&timeout
, 0, ms
* 1000);
1562 target_t
*target
= get_current_target(cmd_ctx
);
1565 if ((retval
=target
->type
->poll(target
))!=ERROR_OK
)
1567 target_call_timer_callbacks_now();
1568 if (target
->state
== state
)
1575 command_print(cmd_ctx
, "waiting for target %s...", target_state_strings
[state
]);
1578 gettimeofday(&now
, NULL
);
1579 if ((now
.tv_sec
> timeout
.tv_sec
) || ((now
.tv_sec
== timeout
.tv_sec
) && (now
.tv_usec
>= timeout
.tv_usec
)))
1581 LOG_ERROR("timed out while waiting for target %s", target_state_strings
[state
]);
1589 int handle_halt_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1592 target_t
*target
= get_current_target(cmd_ctx
);
1596 if ((retval
= target
->type
->halt(target
)) != ERROR_OK
)
1601 return handle_wait_halt_command(cmd_ctx
, cmd
, args
, argc
);
1604 /* what to do on daemon startup */
1605 int handle_daemon_startup_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1609 if (strcmp(args
[0], "attach") == 0)
1611 startup_mode
= DAEMON_ATTACH
;
1614 else if (strcmp(args
[0], "reset") == 0)
1616 startup_mode
= DAEMON_RESET
;
1621 LOG_WARNING("invalid daemon_startup configuration directive: %s", args
[0]);
1626 int handle_soft_reset_halt_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1628 target_t
*target
= get_current_target(cmd_ctx
);
1630 LOG_USER("requesting target halt and executing a soft reset");
1632 target
->type
->soft_reset_halt(target
);
1637 int handle_reset_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1639 target_t
*target
= get_current_target(cmd_ctx
);
1640 enum target_reset_mode reset_mode
= target
->reset_mode
;
1641 enum target_reset_mode save
= target
->reset_mode
;
1647 if (strcmp("run", args
[0]) == 0)
1648 reset_mode
= RESET_RUN
;
1649 else if (strcmp("halt", args
[0]) == 0)
1650 reset_mode
= RESET_HALT
;
1651 else if (strcmp("init", args
[0]) == 0)
1652 reset_mode
= RESET_INIT
;
1653 else if (strcmp("run_and_halt", args
[0]) == 0)
1655 reset_mode
= RESET_RUN_AND_HALT
;
1658 target
->run_and_halt_time
= strtoul(args
[1], NULL
, 0);
1661 else if (strcmp("run_and_init", args
[0]) == 0)
1663 reset_mode
= RESET_RUN_AND_INIT
;
1666 target
->run_and_halt_time
= strtoul(args
[1], NULL
, 0);
1671 command_print(cmd_ctx
, "usage: reset ['run', 'halt', 'init', 'run_and_halt', 'run_and_init]");
1676 /* temporarily modify mode of current reset target */
1677 target
->reset_mode
= reset_mode
;
1679 /* reset *all* targets */
1680 target_process_reset(cmd_ctx
);
1682 /* Restore default reset mode for this target */
1683 target
->reset_mode
= save
;
1688 int handle_resume_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1691 target_t
*target
= get_current_target(cmd_ctx
);
1694 retval
= target
->type
->resume(target
, 1, 0, 1, 0); /* current pc, addr = 0, handle breakpoints, not debugging */
1696 retval
= target
->type
->resume(target
, 0, strtoul(args
[0], NULL
, 0), 1, 0); /* addr = args[0], handle breakpoints, not debugging */
1699 return ERROR_COMMAND_SYNTAX_ERROR
;
1702 target_process_events(cmd_ctx
);
1707 int handle_step_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1709 target_t
*target
= get_current_target(cmd_ctx
);
1714 target
->type
->step(target
, 1, 0, 1); /* current pc, addr = 0, handle breakpoints */
1717 target
->type
->step(target
, 0, strtoul(args
[0], NULL
, 0), 1); /* addr = args[0], handle breakpoints */
1722 int handle_md_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1724 const int line_bytecnt
= 32;
1737 target_t
*target
= get_current_target(cmd_ctx
);
1743 count
= strtoul(args
[1], NULL
, 0);
1745 address
= strtoul(args
[0], NULL
, 0);
1751 size
= 4; line_modulo
= line_bytecnt
/ 4;
1754 size
= 2; line_modulo
= line_bytecnt
/ 2;
1757 size
= 1; line_modulo
= line_bytecnt
/ 1;
1763 buffer
= calloc(count
, size
);
1764 retval
= target
->type
->read_memory(target
, address
, size
, count
, buffer
);
1765 if (retval
== ERROR_OK
)
1769 for (i
= 0; i
< count
; i
++)
1771 if (i
%line_modulo
== 0)
1772 output_len
+= snprintf(output
+ output_len
, 128 - output_len
, "0x%8.8x: ", address
+ (i
*size
));
1777 output_len
+= snprintf(output
+ output_len
, 128 - output_len
, "%8.8x ", target_buffer_get_u32(target
, &buffer
[i
*4]));
1780 output_len
+= snprintf(output
+ output_len
, 128 - output_len
, "%4.4x ", target_buffer_get_u16(target
, &buffer
[i
*2]));
1783 output_len
+= snprintf(output
+ output_len
, 128 - output_len
, "%2.2x ", buffer
[i
*1]);
1787 if ((i
%line_modulo
== line_modulo
-1) || (i
== count
- 1))
1789 command_print(cmd_ctx
, output
);
1795 LOG_ERROR("Failure examining memory");
1803 int handle_mw_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1810 target_t
*target
= get_current_target(cmd_ctx
);
1813 if ((argc
< 2) || (argc
> 3))
1814 return ERROR_COMMAND_SYNTAX_ERROR
;
1816 address
= strtoul(args
[0], NULL
, 0);
1817 value
= strtoul(args
[1], NULL
, 0);
1819 count
= strtoul(args
[2], NULL
, 0);
1826 target_buffer_set_u32(target
, value_buf
, value
);
1830 target_buffer_set_u16(target
, value_buf
, value
);
1834 value_buf
[0] = value
;
1837 return ERROR_COMMAND_SYNTAX_ERROR
;
1839 for (i
=0; i
<count
; i
++)
1845 retval
= target
->type
->write_memory(target
, address
+ i
*wordsize
, 4, 1, value_buf
);
1848 retval
= target
->type
->write_memory(target
, address
+ i
*wordsize
, 2, 1, value_buf
);
1851 retval
= target
->type
->write_memory(target
, address
+ i
*wordsize
, 1, 1, value_buf
);
1856 if (retval
!=ERROR_OK
)
1866 int handle_load_image_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1876 duration_t duration
;
1877 char *duration_text
;
1879 target_t
*target
= get_current_target(cmd_ctx
);
1883 command_print(cmd_ctx
, "usage: load_image <filename> [address] [type]");
1887 /* a base address isn't always necessary, default to 0x0 (i.e. don't relocate) */
1890 image
.base_address_set
= 1;
1891 image
.base_address
= strtoul(args
[1], NULL
, 0);
1895 image
.base_address_set
= 0;
1898 image
.start_address_set
= 0;
1900 duration_start_measure(&duration
);
1902 if (image_open(&image
, args
[0], (argc
>= 3) ? args
[2] : NULL
) != ERROR_OK
)
1909 for (i
= 0; i
< image
.num_sections
; i
++)
1911 buffer
= malloc(image
.sections
[i
].size
);
1914 command_print(cmd_ctx
, "error allocating buffer for section (%d bytes)", image
.sections
[i
].size
);
1918 if ((retval
= image_read_section(&image
, i
, 0x0, image
.sections
[i
].size
, buffer
, &buf_cnt
)) != ERROR_OK
)
1923 if ((retval
= target_write_buffer(target
, image
.sections
[i
].base_address
, buf_cnt
, buffer
)) != ERROR_OK
)
1928 image_size
+= buf_cnt
;
1929 command_print(cmd_ctx
, "%u byte written at address 0x%8.8x", buf_cnt
, image
.sections
[i
].base_address
);
1934 duration_stop_measure(&duration
, &duration_text
);
1935 if (retval
==ERROR_OK
)
1937 command_print(cmd_ctx
, "downloaded %u byte in %s", image_size
, duration_text
);
1939 free(duration_text
);
1941 image_close(&image
);
1947 int handle_dump_image_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1954 int retval
=ERROR_OK
;
1956 duration_t duration
;
1957 char *duration_text
;
1959 target_t
*target
= get_current_target(cmd_ctx
);
1963 command_print(cmd_ctx
, "usage: dump_image <filename> <address> <size>");
1967 address
= strtoul(args
[1], NULL
, 0);
1968 size
= strtoul(args
[2], NULL
, 0);
1970 if ((address
& 3) || (size
& 3))
1972 command_print(cmd_ctx
, "only 32-bit aligned address and size are supported");
1976 if (fileio_open(&fileio
, args
[0], FILEIO_WRITE
, FILEIO_BINARY
) != ERROR_OK
)
1981 duration_start_measure(&duration
);
1986 u32 this_run_size
= (size
> 560) ? 560 : size
;
1988 retval
= target
->type
->read_memory(target
, address
, 4, this_run_size
/ 4, buffer
);
1989 if (retval
!= ERROR_OK
)
1994 retval
= fileio_write(&fileio
, this_run_size
, buffer
, &size_written
);
1995 if (retval
!= ERROR_OK
)
2000 size
-= this_run_size
;
2001 address
+= this_run_size
;
2004 fileio_close(&fileio
);
2006 duration_stop_measure(&duration
, &duration_text
);
2007 if (retval
==ERROR_OK
)
2009 command_print(cmd_ctx
, "dumped %"PRIi64
" byte in %s", fileio
.size
, duration_text
);
2011 free(duration_text
);
2016 int handle_verify_image_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2024 u32 mem_checksum
= 0;
2028 duration_t duration
;
2029 char *duration_text
;
2031 target_t
*target
= get_current_target(cmd_ctx
);
2035 command_print(cmd_ctx
, "usage: verify_image <file> [offset] [type]");
2041 LOG_ERROR("no target selected");
2045 duration_start_measure(&duration
);
2049 image
.base_address_set
= 1;
2050 image
.base_address
= strtoul(args
[1], NULL
, 0);
2054 image
.base_address_set
= 0;
2055 image
.base_address
= 0x0;
2058 image
.start_address_set
= 0;
2060 if (image_open(&image
, args
[0], (argc
== 3) ? args
[2] : NULL
) != ERROR_OK
)
2067 for (i
= 0; i
< image
.num_sections
; i
++)
2069 buffer
= malloc(image
.sections
[i
].size
);
2072 command_print(cmd_ctx
, "error allocating buffer for section (%d bytes)", image
.sections
[i
].size
);
2075 if ((retval
= image_read_section(&image
, i
, 0x0, image
.sections
[i
].size
, buffer
, &buf_cnt
)) != ERROR_OK
)
2081 /* calculate checksum of image */
2082 image_calculate_checksum( buffer
, buf_cnt
, &checksum
);
2084 retval
= target_checksum_memory(target
, image
.sections
[i
].base_address
, buf_cnt
, &mem_checksum
);
2085 if( retval
!= ERROR_OK
)
2091 if( checksum
!= mem_checksum
)
2093 /* failed crc checksum, fall back to a binary compare */
2096 command_print(cmd_ctx
, "checksum mismatch - attempting binary compare");
2098 data
= (u8
*)malloc(buf_cnt
);
2100 /* Can we use 32bit word accesses? */
2102 int count
= buf_cnt
;
2103 if ((count
% 4) == 0)
2108 retval
= target
->type
->read_memory(target
, image
.sections
[i
].base_address
, size
, count
, data
);
2109 if (retval
== ERROR_OK
)
2112 for (t
= 0; t
< buf_cnt
; t
++)
2114 if (data
[t
] != buffer
[t
])
2116 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
]);
2129 image_size
+= buf_cnt
;
2132 duration_stop_measure(&duration
, &duration_text
);
2133 if (retval
==ERROR_OK
)
2135 command_print(cmd_ctx
, "verified %u bytes in %s", image_size
, duration_text
);
2137 free(duration_text
);
2139 image_close(&image
);
2144 int handle_bp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2147 target_t
*target
= get_current_target(cmd_ctx
);
2151 breakpoint_t
*breakpoint
= target
->breakpoints
;
2155 if (breakpoint
->type
== BKPT_SOFT
)
2157 char* buf
= buf_to_str(breakpoint
->orig_instr
, breakpoint
->length
, 16);
2158 command_print(cmd_ctx
, "0x%8.8x, 0x%x, %i, 0x%s", breakpoint
->address
, breakpoint
->length
, breakpoint
->set
, buf
);
2163 command_print(cmd_ctx
, "0x%8.8x, 0x%x, %i", breakpoint
->address
, breakpoint
->length
, breakpoint
->set
);
2165 breakpoint
= breakpoint
->next
;
2173 length
= strtoul(args
[1], NULL
, 0);
2176 if (strcmp(args
[2], "hw") == 0)
2179 if ((retval
= breakpoint_add(target
, strtoul(args
[0], NULL
, 0), length
, hw
)) != ERROR_OK
)
2181 LOG_ERROR("Failure setting breakpoints");
2185 command_print(cmd_ctx
, "breakpoint added at address 0x%8.8x", strtoul(args
[0], NULL
, 0));
2190 command_print(cmd_ctx
, "usage: bp <address> <length> ['hw']");
2196 int handle_rbp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2198 target_t
*target
= get_current_target(cmd_ctx
);
2201 breakpoint_remove(target
, strtoul(args
[0], NULL
, 0));
2206 int handle_wp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2208 target_t
*target
= get_current_target(cmd_ctx
);
2213 watchpoint_t
*watchpoint
= target
->watchpoints
;
2217 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
);
2218 watchpoint
= watchpoint
->next
;
2223 enum watchpoint_rw type
= WPT_ACCESS
;
2224 u32 data_value
= 0x0;
2225 u32 data_mask
= 0xffffffff;
2241 command_print(cmd_ctx
, "usage: wp <address> <length> [r/w/a] [value] [mask]");
2247 data_value
= strtoul(args
[3], NULL
, 0);
2251 data_mask
= strtoul(args
[4], NULL
, 0);
2254 if ((retval
= watchpoint_add(target
, strtoul(args
[0], NULL
, 0),
2255 strtoul(args
[1], NULL
, 0), type
, data_value
, data_mask
)) != ERROR_OK
)
2257 LOG_ERROR("Failure setting breakpoints");
2262 command_print(cmd_ctx
, "usage: wp <address> <length> [r/w/a] [value] [mask]");
2268 int handle_rwp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2270 target_t
*target
= get_current_target(cmd_ctx
);
2273 watchpoint_remove(target
, strtoul(args
[0], NULL
, 0));
2278 int handle_virt2phys_command(command_context_t
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2281 target_t
*target
= get_current_target(cmd_ctx
);
2287 return ERROR_COMMAND_SYNTAX_ERROR
;
2289 va
= strtoul(args
[0], NULL
, 0);
2291 retval
= target
->type
->virt2phys(target
, va
, &pa
);
2292 if (retval
== ERROR_OK
)
2294 command_print(cmd_ctx
, "Physical address 0x%08x", pa
);
2298 /* lower levels will have logged a detailed error which is
2299 * forwarded to telnet/GDB session.
2304 static void writeLong(FILE *f
, int l
)
2309 char c
=(l
>>(i
*8))&0xff;
2310 fwrite(&c
, 1, 1, f
);
2314 static void writeString(FILE *f
, char *s
)
2316 fwrite(s
, 1, strlen(s
), f
);
2321 // Dump a gmon.out histogram file.
2322 static void writeGmon(u32
*samples
, int sampleNum
, char *filename
)
2325 FILE *f
=fopen(filename
, "w");
2328 fwrite("gmon", 1, 4, f
);
2329 writeLong(f
, 0x00000001); // Version
2330 writeLong(f
, 0); // padding
2331 writeLong(f
, 0); // padding
2332 writeLong(f
, 0); // padding
2334 fwrite("", 1, 1, f
); // GMON_TAG_TIME_HIST
2336 // figure out bucket size
2339 for (i
=0; i
<sampleNum
; i
++)
2351 int addressSpace
=(max
-min
+1);
2353 static int const maxBuckets
=256*1024; // maximum buckets.
2354 int length
=addressSpace
;
2355 if (length
> maxBuckets
)
2359 int *buckets
=malloc(sizeof(int)*length
);
2365 memset(buckets
, 0, sizeof(int)*length
);
2366 for (i
=0; i
<sampleNum
;i
++)
2368 u32 address
=samples
[i
];
2369 long long a
=address
-min
;
2370 long long b
=length
-1;
2371 long long c
=addressSpace
-1;
2372 int index
=(a
*b
)/c
; // danger!!!! int32 overflows
2376 // append binary memory gmon.out &profile_hist_hdr ((char*)&profile_hist_hdr + sizeof(struct gmon_hist_hdr))
2377 writeLong(f
, min
); // low_pc
2378 writeLong(f
, max
); // high_pc
2379 writeLong(f
, length
); // # of samples
2380 writeLong(f
, 64000000); // 64MHz
2381 writeString(f
, "seconds");
2382 for (i
=0; i
<(15-strlen("seconds")); i
++)
2384 fwrite("", 1, 1, f
); // padding
2386 writeString(f
, "s");
2388 // append binary memory gmon.out profile_hist_data (profile_hist_data + profile_hist_hdr.hist_size)
2390 char *data
=malloc(2*length
);
2393 for (i
=0; i
<length
;i
++)
2402 data
[i
*2+1]=(val
>>8)&0xff;
2405 fwrite(data
, 1, length
*2, f
);
2415 /* profiling samples the CPU PC as quickly as OpenOCD is able, which will be used as a random sampling of PC */
2416 int handle_profile_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2418 target_t
*target
= get_current_target(cmd_ctx
);
2419 struct timeval timeout
, now
;
2421 gettimeofday(&timeout
, NULL
);
2424 return ERROR_COMMAND_SYNTAX_ERROR
;
2427 timeval_add_time(&timeout
, strtoul(args
[0], &end
, 0), 0);
2433 command_print(cmd_ctx
, "Starting profiling. Halting and resuming the target as often as we can...");
2435 static const int maxSample
=10000;
2436 u32
*samples
=malloc(sizeof(u32
)*maxSample
);
2441 int retval
=ERROR_OK
;
2442 // hopefully it is safe to cache! We want to stop/restart as quickly as possible.
2443 reg_t
*reg
= register_get_by_name(target
->reg_cache
, "pc", 1);
2447 target
->type
->poll(target
);
2448 if (target
->state
== TARGET_HALTED
)
2450 u32 t
=*((u32
*)reg
->value
);
2451 samples
[numSamples
++]=t
;
2452 retval
= target
->type
->resume(target
, 1, 0, 0, 0); /* current pc, addr = 0, do not handle breakpoints, not debugging */
2453 target
->type
->poll(target
);
2454 usleep(10*1000); // sleep 10ms, i.e. <100 samples/second.
2455 } else if (target
->state
== TARGET_RUNNING
)
2457 // We want to quickly sample the PC.
2458 target
->type
->halt(target
);
2461 command_print(cmd_ctx
, "Target not halted or running");
2465 if (retval
!=ERROR_OK
)
2470 gettimeofday(&now
, NULL
);
2471 if ((numSamples
>=maxSample
) || ((now
.tv_sec
>= timeout
.tv_sec
) && (now
.tv_usec
>= timeout
.tv_usec
)))
2473 command_print(cmd_ctx
, "Profiling completed. %d samples.", numSamples
);
2474 target
->type
->poll(target
);
2475 if (target
->state
== TARGET_HALTED
)
2477 target
->type
->resume(target
, 1, 0, 0, 0); /* current pc, addr = 0, do not handle breakpoints, not debugging */
2479 target
->type
->poll(target
);
2480 writeGmon(samples
, numSamples
, args
[1]);
2481 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)