1 /***************************************************************************
2 * Copyright (C) 2005 by Dominic Rath *
3 * Dominic.Rath@gmx.de *
5 * This program is free software; you can redistribute it and/or modify *
6 * it under the terms of the GNU General Public License as published by *
7 * the Free Software Foundation; either version 2 of the License, or *
8 * (at your option) any later version. *
10 * This program is distributed in the hope that it will be useful, *
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
13 * GNU General Public License for more details. *
15 * You should have received a copy of the GNU General Public License *
16 * along with this program; if not, write to the *
17 * Free Software Foundation, Inc., *
18 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
19 ***************************************************************************/
24 #include "replacements.h"
26 #include "target_request.h"
29 #include "configuration.h"
30 #include "binarybuffer.h"
37 #include <sys/types.h>
45 #include <time_support.h>
50 int cli_target_callback_event_handler(struct target_s
*target
, enum target_event event
, void *priv
);
53 int handle_target_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
54 int handle_daemon_startup_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
55 int handle_targets_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
57 int handle_target_script_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
58 int handle_run_and_halt_time_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
59 int handle_working_area_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
61 int handle_reg_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
62 int handle_poll_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
63 int handle_halt_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
64 int handle_wait_halt_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
65 int handle_reset_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
66 int handle_soft_reset_halt_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
67 int handle_resume_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
68 int handle_step_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
69 int handle_md_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
70 int handle_mw_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
71 int handle_load_image_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
72 int handle_dump_image_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
73 int handle_verify_image_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
74 int handle_bp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
75 int handle_rbp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
76 int handle_wp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
77 int handle_rwp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
78 int handle_virt2phys_command(command_context_t
*cmd_ctx
, char *cmd
, char **args
, int argc
);
79 int handle_profile_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
83 extern target_type_t arm7tdmi_target
;
84 extern target_type_t arm720t_target
;
85 extern target_type_t arm9tdmi_target
;
86 extern target_type_t arm920t_target
;
87 extern target_type_t arm966e_target
;
88 extern target_type_t arm926ejs_target
;
89 extern target_type_t feroceon_target
;
90 extern target_type_t xscale_target
;
91 extern target_type_t cortexm3_target
;
92 extern target_type_t arm11_target
;
94 target_type_t
*target_types
[] =
109 target_t
*targets
= NULL
;
110 target_event_callback_t
*target_event_callbacks
= NULL
;
111 target_timer_callback_t
*target_timer_callbacks
= NULL
;
113 char *target_state_strings
[] =
122 char *target_debug_reason_strings
[] =
124 "debug request", "breakpoint", "watchpoint",
125 "watchpoint and breakpoint", "single step",
126 "target not halted", "undefined"
129 char *target_endianess_strings
[] =
135 enum daemon_startup_mode startup_mode
= DAEMON_ATTACH
;
137 static int target_continous_poll
= 1;
139 /* read a u32 from a buffer in target memory endianness */
140 u32
target_buffer_get_u32(target_t
*target
, u8
*buffer
)
142 if (target
->endianness
== TARGET_LITTLE_ENDIAN
)
143 return le_to_h_u32(buffer
);
145 return be_to_h_u32(buffer
);
148 /* read a u16 from a buffer in target memory endianness */
149 u16
target_buffer_get_u16(target_t
*target
, u8
*buffer
)
151 if (target
->endianness
== TARGET_LITTLE_ENDIAN
)
152 return le_to_h_u16(buffer
);
154 return be_to_h_u16(buffer
);
157 /* write a u32 to a buffer in target memory endianness */
158 void target_buffer_set_u32(target_t
*target
, u8
*buffer
, u32 value
)
160 if (target
->endianness
== TARGET_LITTLE_ENDIAN
)
161 h_u32_to_le(buffer
, value
);
163 h_u32_to_be(buffer
, value
);
166 /* write a u16 to a buffer in target memory endianness */
167 void target_buffer_set_u16(target_t
*target
, u8
*buffer
, u16 value
)
169 if (target
->endianness
== TARGET_LITTLE_ENDIAN
)
170 h_u16_to_le(buffer
, value
);
172 h_u16_to_be(buffer
, value
);
175 /* returns a pointer to the n-th configured target */
176 target_t
* get_target_by_num(int num
)
178 target_t
*target
= targets
;
185 target
= target
->next
;
192 int get_num_by_target(target_t
*query_target
)
194 target_t
*target
= targets
;
199 if (target
== query_target
)
201 target
= target
->next
;
208 target_t
* get_current_target(command_context_t
*cmd_ctx
)
210 target_t
*target
= get_target_by_num(cmd_ctx
->current_target
);
214 LOG_ERROR("BUG: current_target out of bounds");
221 /* Process target initialization, when target entered debug out of reset
222 * the handler is unregistered at the end of this function, so it's only called once
224 int target_init_handler(struct target_s
*target
, enum target_event event
, void *priv
)
227 struct command_context_s
*cmd_ctx
= priv
;
229 if ((event
== TARGET_EVENT_HALTED
) && (target
->reset_script
))
231 target_unregister_event_callback(target_init_handler
, priv
);
233 script
= open_file_from_path(target
->reset_script
, "r");
236 LOG_ERROR("couldn't open script file %s", target
->reset_script
);
240 LOG_INFO("executing reset script '%s'", target
->reset_script
);
241 command_run_file(cmd_ctx
, script
, COMMAND_EXEC
);
244 jtag_execute_queue();
250 int target_run_and_halt_handler(void *priv
)
252 target_t
*target
= priv
;
254 target
->type
->halt(target
);
259 int target_process_reset(struct command_context_s
*cmd_ctx
)
261 int retval
= ERROR_OK
;
263 struct timeval timeout
, now
;
265 jtag
->speed(jtag_speed
);
267 /* prepare reset_halt where necessary */
271 if (jtag_reset_config
& RESET_SRST_PULLS_TRST
)
273 switch (target
->reset_mode
)
276 command_print(cmd_ctx
, "nSRST pulls nTRST, falling back to \"reset run_and_halt\"");
277 target
->reset_mode
= RESET_RUN_AND_HALT
;
280 command_print(cmd_ctx
, "nSRST pulls nTRST, falling back to \"reset run_and_init\"");
281 target
->reset_mode
= RESET_RUN_AND_INIT
;
287 target
= target
->next
;
293 /* we have no idea what state the target is in, so we
294 * have to drop working areas
296 target_free_all_working_areas_restore(target
, 0);
297 target
->type
->assert_reset(target
);
298 target
= target
->next
;
300 if ((retval
= jtag_execute_queue()) != ERROR_OK
)
302 LOG_WARNING("JTAG communication failed asserting reset.");
306 /* request target halt if necessary, and schedule further action */
310 switch (target
->reset_mode
)
313 /* nothing to do if target just wants to be run */
315 case RESET_RUN_AND_HALT
:
317 target_register_timer_callback(target_run_and_halt_handler
, target
->run_and_halt_time
, 0, target
);
319 case RESET_RUN_AND_INIT
:
321 target_register_timer_callback(target_run_and_halt_handler
, target
->run_and_halt_time
, 0, target
);
322 target_register_event_callback(target_init_handler
, cmd_ctx
);
325 target
->type
->halt(target
);
328 target
->type
->halt(target
);
329 target_register_event_callback(target_init_handler
, cmd_ctx
);
332 LOG_ERROR("BUG: unknown target->reset_mode");
334 target
= target
->next
;
337 if ((retval
= jtag_execute_queue()) != ERROR_OK
)
339 LOG_WARNING("JTAG communication failed while reset was asserted. Consider using srst_only for reset_config.");
346 target
->type
->deassert_reset(target
);
347 target
= target
->next
;
350 if ((retval
= jtag_execute_queue()) != ERROR_OK
)
352 LOG_WARNING("JTAG communication failed while deasserting reset.");
356 LOG_DEBUG("Waiting for halted stated as approperiate");
358 /* Wait for reset to complete, maximum 5 seconds. */
359 gettimeofday(&timeout
, NULL
);
360 timeval_add_time(&timeout
, 5, 0);
363 gettimeofday(&now
, NULL
);
365 target_call_timer_callbacks_now();
370 LOG_DEBUG("Polling target");
371 target
->type
->poll(target
);
372 if ((target
->reset_mode
== RESET_RUN_AND_INIT
) ||
373 (target
->reset_mode
== RESET_RUN_AND_HALT
) ||
374 (target
->reset_mode
== RESET_HALT
) ||
375 (target
->reset_mode
== RESET_INIT
))
377 if (target
->state
!= TARGET_HALTED
)
379 if ((now
.tv_sec
> timeout
.tv_sec
) || ((now
.tv_sec
== timeout
.tv_sec
) && (now
.tv_usec
>= timeout
.tv_usec
)))
381 LOG_USER("Timed out waiting for halt after reset");
384 /* this will send alive messages on e.g. GDB remote protocol. */
386 LOG_USER_N("%s", ""); /* avoid warning about zero length formatting message*/
390 target
= target
->next
;
392 /* All targets we're waiting for are halted */
400 /* We want any events to be processed before the prompt */
401 target_call_timer_callbacks_now();
403 /* if we timed out we need to unregister these handlers */
407 target_unregister_timer_callback(target_run_and_halt_handler
, target
);
408 target
= target
->next
;
410 target_unregister_event_callback(target_init_handler
, cmd_ctx
);
413 jtag
->speed(jtag_speed_post_reset
);
418 static int default_virt2phys(struct target_s
*target
, u32
virtual, u32
*physical
)
424 static int default_mmu(struct target_s
*target
, int *enabled
)
430 int target_init(struct command_context_s
*cmd_ctx
)
432 target_t
*target
= targets
;
436 if (target
->type
->init_target(cmd_ctx
, target
) != ERROR_OK
)
438 LOG_ERROR("target '%s' init failed", target
->type
->name
);
442 /* Set up default functions if none are provided by target */
443 if (target
->type
->virt2phys
== NULL
)
445 target
->type
->virt2phys
= default_virt2phys
;
447 if (target
->type
->mmu
== NULL
)
449 target
->type
->mmu
= default_mmu
;
451 target
= target
->next
;
456 target_register_user_commands(cmd_ctx
);
457 target_register_timer_callback(handle_target
, 100, 1, NULL
);
463 int target_init_reset(struct command_context_s
*cmd_ctx
)
465 if (startup_mode
== DAEMON_RESET
)
466 target_process_reset(cmd_ctx
);
471 int target_register_event_callback(int (*callback
)(struct target_s
*target
, enum target_event event
, void *priv
), void *priv
)
473 target_event_callback_t
**callbacks_p
= &target_event_callbacks
;
475 if (callback
== NULL
)
477 return ERROR_INVALID_ARGUMENTS
;
482 while ((*callbacks_p
)->next
)
483 callbacks_p
= &((*callbacks_p
)->next
);
484 callbacks_p
= &((*callbacks_p
)->next
);
487 (*callbacks_p
) = malloc(sizeof(target_event_callback_t
));
488 (*callbacks_p
)->callback
= callback
;
489 (*callbacks_p
)->priv
= priv
;
490 (*callbacks_p
)->next
= NULL
;
495 int target_register_timer_callback(int (*callback
)(void *priv
), int time_ms
, int periodic
, void *priv
)
497 target_timer_callback_t
**callbacks_p
= &target_timer_callbacks
;
500 if (callback
== NULL
)
502 return ERROR_INVALID_ARGUMENTS
;
507 while ((*callbacks_p
)->next
)
508 callbacks_p
= &((*callbacks_p
)->next
);
509 callbacks_p
= &((*callbacks_p
)->next
);
512 (*callbacks_p
) = malloc(sizeof(target_timer_callback_t
));
513 (*callbacks_p
)->callback
= callback
;
514 (*callbacks_p
)->periodic
= periodic
;
515 (*callbacks_p
)->time_ms
= time_ms
;
517 gettimeofday(&now
, NULL
);
518 (*callbacks_p
)->when
.tv_usec
= now
.tv_usec
+ (time_ms
% 1000) * 1000;
519 time_ms
-= (time_ms
% 1000);
520 (*callbacks_p
)->when
.tv_sec
= now
.tv_sec
+ (time_ms
/ 1000);
521 if ((*callbacks_p
)->when
.tv_usec
> 1000000)
523 (*callbacks_p
)->when
.tv_usec
= (*callbacks_p
)->when
.tv_usec
- 1000000;
524 (*callbacks_p
)->when
.tv_sec
+= 1;
527 (*callbacks_p
)->priv
= priv
;
528 (*callbacks_p
)->next
= NULL
;
533 int target_unregister_event_callback(int (*callback
)(struct target_s
*target
, enum target_event event
, void *priv
), void *priv
)
535 target_event_callback_t
**p
= &target_event_callbacks
;
536 target_event_callback_t
*c
= target_event_callbacks
;
538 if (callback
== NULL
)
540 return ERROR_INVALID_ARGUMENTS
;
545 target_event_callback_t
*next
= c
->next
;
546 if ((c
->callback
== callback
) && (c
->priv
== priv
))
560 int target_unregister_timer_callback(int (*callback
)(void *priv
), void *priv
)
562 target_timer_callback_t
**p
= &target_timer_callbacks
;
563 target_timer_callback_t
*c
= target_timer_callbacks
;
565 if (callback
== NULL
)
567 return ERROR_INVALID_ARGUMENTS
;
572 target_timer_callback_t
*next
= c
->next
;
573 if ((c
->callback
== callback
) && (c
->priv
== priv
))
587 int target_call_event_callbacks(target_t
*target
, enum target_event event
)
589 target_event_callback_t
*callback
= target_event_callbacks
;
590 target_event_callback_t
*next_callback
;
592 LOG_DEBUG("target event %i", event
);
596 next_callback
= callback
->next
;
597 callback
->callback(target
, event
, callback
->priv
);
598 callback
= next_callback
;
604 static int target_call_timer_callbacks_check_time(int checktime
)
606 target_timer_callback_t
*callback
= target_timer_callbacks
;
607 target_timer_callback_t
*next_callback
;
610 gettimeofday(&now
, NULL
);
614 next_callback
= callback
->next
;
616 if ((!checktime
&&callback
->periodic
)||
617 (((now
.tv_sec
>= callback
->when
.tv_sec
) && (now
.tv_usec
>= callback
->when
.tv_usec
))
618 || (now
.tv_sec
> callback
->when
.tv_sec
)))
620 callback
->callback(callback
->priv
);
621 if (callback
->periodic
)
623 int time_ms
= callback
->time_ms
;
624 callback
->when
.tv_usec
= now
.tv_usec
+ (time_ms
% 1000) * 1000;
625 time_ms
-= (time_ms
% 1000);
626 callback
->when
.tv_sec
= now
.tv_sec
+ time_ms
/ 1000;
627 if (callback
->when
.tv_usec
> 1000000)
629 callback
->when
.tv_usec
= callback
->when
.tv_usec
- 1000000;
630 callback
->when
.tv_sec
+= 1;
634 target_unregister_timer_callback(callback
->callback
, callback
->priv
);
637 callback
= next_callback
;
643 int target_call_timer_callbacks()
645 return target_call_timer_callbacks_check_time(1);
648 /* invoke periodic callbacks immediately */
649 int target_call_timer_callbacks_now()
651 return target_call_timer_callbacks(0);
655 int target_alloc_working_area(struct target_s
*target
, u32 size
, working_area_t
**area
)
657 working_area_t
*c
= target
->working_areas
;
658 working_area_t
*new_wa
= NULL
;
660 /* Reevaluate working area address based on MMU state*/
661 if (target
->working_areas
== NULL
)
665 retval
= target
->type
->mmu(target
, &enabled
);
666 if (retval
!= ERROR_OK
)
672 target
->working_area
= target
->working_area_virt
;
676 target
->working_area
= target
->working_area_phys
;
680 /* only allocate multiples of 4 byte */
683 LOG_ERROR("BUG: code tried to allocate unaligned number of bytes, padding");
684 size
= CEIL(size
, 4);
687 /* see if there's already a matching working area */
690 if ((c
->free
) && (c
->size
== size
))
698 /* if not, allocate a new one */
701 working_area_t
**p
= &target
->working_areas
;
702 u32 first_free
= target
->working_area
;
703 u32 free_size
= target
->working_area_size
;
705 LOG_DEBUG("allocating new working area");
707 c
= target
->working_areas
;
710 first_free
+= c
->size
;
711 free_size
-= c
->size
;
716 if (free_size
< size
)
718 LOG_WARNING("not enough working area available(requested %d, free %d)", size
, free_size
);
719 return ERROR_TARGET_RESOURCE_NOT_AVAILABLE
;
722 new_wa
= malloc(sizeof(working_area_t
));
725 new_wa
->address
= first_free
;
727 if (target
->backup_working_area
)
729 new_wa
->backup
= malloc(new_wa
->size
);
730 target
->type
->read_memory(target
, new_wa
->address
, 4, new_wa
->size
/ 4, new_wa
->backup
);
734 new_wa
->backup
= NULL
;
737 /* put new entry in list */
741 /* mark as used, and return the new (reused) area */
751 int target_free_working_area_restore(struct target_s
*target
, working_area_t
*area
, int restore
)
756 if (restore
&&target
->backup_working_area
)
757 target
->type
->write_memory(target
, area
->address
, 4, area
->size
/ 4, area
->backup
);
761 /* mark user pointer invalid */
768 int target_free_working_area(struct target_s
*target
, working_area_t
*area
)
770 return target_free_working_area_restore(target
, area
, 1);
773 int target_free_all_working_areas_restore(struct target_s
*target
, int restore
)
775 working_area_t
*c
= target
->working_areas
;
779 working_area_t
*next
= c
->next
;
780 target_free_working_area_restore(target
, c
, restore
);
790 target
->working_areas
= NULL
;
795 int target_free_all_working_areas(struct target_s
*target
)
797 return target_free_all_working_areas_restore(target
, 1);
800 int target_register_commands(struct command_context_s
*cmd_ctx
)
802 register_command(cmd_ctx
, NULL
, "target", handle_target_command
, COMMAND_CONFIG
, "target <cpu> [reset_init default - DEPRECATED] <chainpos> <endianness> <variant> [cpu type specifc args]");
803 register_command(cmd_ctx
, NULL
, "targets", handle_targets_command
, COMMAND_EXEC
, NULL
);
804 register_command(cmd_ctx
, NULL
, "daemon_startup", handle_daemon_startup_command
, COMMAND_CONFIG
, NULL
);
805 register_command(cmd_ctx
, NULL
, "target_script", handle_target_script_command
, COMMAND_CONFIG
, NULL
);
806 register_command(cmd_ctx
, NULL
, "run_and_halt_time", handle_run_and_halt_time_command
, COMMAND_CONFIG
, "<target> <run time ms>");
807 register_command(cmd_ctx
, NULL
, "working_area", handle_working_area_command
, COMMAND_ANY
, "working_area <target#> <address> <size> <'backup'|'nobackup'> [virtual address]");
808 register_command(cmd_ctx
, NULL
, "virt2phys", handle_virt2phys_command
, COMMAND_ANY
, "virt2phys <virtual address>");
809 register_command(cmd_ctx
, NULL
, "profile", handle_profile_command
, COMMAND_EXEC
, "PRELIMINARY! - profile <seconds> <gmon.out>");
814 int target_arch_state(struct target_s
*target
)
819 LOG_USER("No target has been configured");
823 LOG_USER("target state: %s", target_state_strings
[target
->state
]);
825 if (target
->state
!=TARGET_HALTED
)
828 retval
=target
->type
->arch_state(target
);
832 /* Single aligned words are guaranteed to use 16 or 32 bit access
833 * mode respectively, otherwise data is handled as quickly as
836 int target_write_buffer(struct target_s
*target
, u32 address
, u32 size
, u8
*buffer
)
840 LOG_DEBUG("writing buffer of %i byte at 0x%8.8x", size
, address
);
842 if (((address
% 2) == 0) && (size
== 2))
844 return target
->type
->write_memory(target
, address
, 2, 1, buffer
);
847 /* handle unaligned head bytes */
850 int unaligned
= 4 - (address
% 4);
852 if (unaligned
> size
)
855 if ((retval
= target
->type
->write_memory(target
, address
, 1, unaligned
, buffer
)) != ERROR_OK
)
859 address
+= unaligned
;
863 /* handle aligned words */
866 int aligned
= size
- (size
% 4);
868 /* use bulk writes above a certain limit. This may have to be changed */
871 if ((retval
= target
->type
->bulk_write_memory(target
, address
, aligned
/ 4, buffer
)) != ERROR_OK
)
876 if ((retval
= target
->type
->write_memory(target
, address
, 4, aligned
/ 4, buffer
)) != ERROR_OK
)
885 /* handle tail writes of less than 4 bytes */
888 if ((retval
= target
->type
->write_memory(target
, address
, 1, size
, buffer
)) != ERROR_OK
)
896 /* Single aligned words are guaranteed to use 16 or 32 bit access
897 * mode respectively, otherwise data is handled as quickly as
900 int target_read_buffer(struct target_s
*target
, u32 address
, u32 size
, u8
*buffer
)
904 LOG_DEBUG("reading buffer of %i byte at 0x%8.8x", size
, address
);
906 if (((address
% 2) == 0) && (size
== 2))
908 return target
->type
->read_memory(target
, address
, 2, 1, buffer
);
911 /* handle unaligned head bytes */
914 int unaligned
= 4 - (address
% 4);
916 if (unaligned
> size
)
919 if ((retval
= target
->type
->read_memory(target
, address
, 1, unaligned
, buffer
)) != ERROR_OK
)
923 address
+= unaligned
;
927 /* handle aligned words */
930 int aligned
= size
- (size
% 4);
932 if ((retval
= target
->type
->read_memory(target
, address
, 4, aligned
/ 4, buffer
)) != ERROR_OK
)
940 /* handle tail writes of less than 4 bytes */
943 if ((retval
= target
->type
->read_memory(target
, address
, 1, size
, buffer
)) != ERROR_OK
)
950 int target_checksum_memory(struct target_s
*target
, u32 address
, u32 size
, u32
* crc
)
957 if ((retval
= target
->type
->checksum_memory(target
, address
,
958 size
, &checksum
)) == ERROR_TARGET_RESOURCE_NOT_AVAILABLE
)
960 buffer
= malloc(size
);
963 LOG_ERROR("error allocating buffer for section (%d bytes)", size
);
964 return ERROR_INVALID_ARGUMENTS
;
966 retval
= target_read_buffer(target
, address
, size
, buffer
);
967 if (retval
!= ERROR_OK
)
973 /* convert to target endianess */
974 for (i
= 0; i
< (size
/sizeof(u32
)); i
++)
977 target_data
= target_buffer_get_u32(target
, &buffer
[i
*sizeof(u32
)]);
978 target_buffer_set_u32(target
, &buffer
[i
*sizeof(u32
)], target_data
);
981 retval
= image_calculate_checksum( buffer
, size
, &checksum
);
990 int target_read_u32(struct target_s
*target
, u32 address
, u32
*value
)
994 int retval
= target
->type
->read_memory(target
, address
, 4, 1, value_buf
);
996 if (retval
== ERROR_OK
)
998 *value
= target_buffer_get_u32(target
, value_buf
);
999 LOG_DEBUG("address: 0x%8.8x, value: 0x%8.8x", address
, *value
);
1004 LOG_DEBUG("address: 0x%8.8x failed", address
);
1010 int target_read_u16(struct target_s
*target
, u32 address
, u16
*value
)
1014 int retval
= target
->type
->read_memory(target
, address
, 2, 1, value_buf
);
1016 if (retval
== ERROR_OK
)
1018 *value
= target_buffer_get_u16(target
, value_buf
);
1019 LOG_DEBUG("address: 0x%8.8x, value: 0x%4.4x", address
, *value
);
1024 LOG_DEBUG("address: 0x%8.8x failed", address
);
1030 int target_read_u8(struct target_s
*target
, u32 address
, u8
*value
)
1032 int retval
= target
->type
->read_memory(target
, address
, 1, 1, value
);
1034 if (retval
== ERROR_OK
)
1036 LOG_DEBUG("address: 0x%8.8x, value: 0x%2.2x", address
, *value
);
1041 LOG_DEBUG("address: 0x%8.8x failed", address
);
1047 int target_write_u32(struct target_s
*target
, u32 address
, u32 value
)
1052 LOG_DEBUG("address: 0x%8.8x, value: 0x%8.8x", address
, value
);
1054 target_buffer_set_u32(target
, value_buf
, value
);
1055 if ((retval
= target
->type
->write_memory(target
, address
, 4, 1, value_buf
)) != ERROR_OK
)
1057 LOG_DEBUG("failed: %i", retval
);
1063 int target_write_u16(struct target_s
*target
, u32 address
, u16 value
)
1068 LOG_DEBUG("address: 0x%8.8x, value: 0x%8.8x", address
, value
);
1070 target_buffer_set_u16(target
, value_buf
, value
);
1071 if ((retval
= target
->type
->write_memory(target
, address
, 2, 1, value_buf
)) != ERROR_OK
)
1073 LOG_DEBUG("failed: %i", retval
);
1079 int target_write_u8(struct target_s
*target
, u32 address
, u8 value
)
1083 LOG_DEBUG("address: 0x%8.8x, value: 0x%2.2x", address
, value
);
1085 if ((retval
= target
->type
->read_memory(target
, address
, 1, 1, &value
)) != ERROR_OK
)
1087 LOG_DEBUG("failed: %i", retval
);
1093 int target_register_user_commands(struct command_context_s
*cmd_ctx
)
1095 register_command(cmd_ctx
, NULL
, "reg", handle_reg_command
, COMMAND_EXEC
, NULL
);
1096 register_command(cmd_ctx
, NULL
, "poll", handle_poll_command
, COMMAND_EXEC
, "poll target state");
1097 register_command(cmd_ctx
, NULL
, "wait_halt", handle_wait_halt_command
, COMMAND_EXEC
, "wait for target halt [time (s)]");
1098 register_command(cmd_ctx
, NULL
, "halt", handle_halt_command
, COMMAND_EXEC
, "halt target");
1099 register_command(cmd_ctx
, NULL
, "resume", handle_resume_command
, COMMAND_EXEC
, "resume target [addr]");
1100 register_command(cmd_ctx
, NULL
, "step", handle_step_command
, COMMAND_EXEC
, "step one instruction from current PC or [addr]");
1101 register_command(cmd_ctx
, NULL
, "reset", handle_reset_command
, COMMAND_EXEC
, "reset target [run|halt|init|run_and_halt|run_and_init]");
1102 register_command(cmd_ctx
, NULL
, "soft_reset_halt", handle_soft_reset_halt_command
, COMMAND_EXEC
, "halt the target and do a soft reset");
1104 register_command(cmd_ctx
, NULL
, "mdw", handle_md_command
, COMMAND_EXEC
, "display memory words <addr> [count]");
1105 register_command(cmd_ctx
, NULL
, "mdh", handle_md_command
, COMMAND_EXEC
, "display memory half-words <addr> [count]");
1106 register_command(cmd_ctx
, NULL
, "mdb", handle_md_command
, COMMAND_EXEC
, "display memory bytes <addr> [count]");
1108 register_command(cmd_ctx
, NULL
, "mww", handle_mw_command
, COMMAND_EXEC
, "write memory word <addr> <value> [count]");
1109 register_command(cmd_ctx
, NULL
, "mwh", handle_mw_command
, COMMAND_EXEC
, "write memory half-word <addr> <value> [count]");
1110 register_command(cmd_ctx
, NULL
, "mwb", handle_mw_command
, COMMAND_EXEC
, "write memory byte <addr> <value> [count]");
1112 register_command(cmd_ctx
, NULL
, "bp", handle_bp_command
, COMMAND_EXEC
, "set breakpoint <address> <length> [hw]");
1113 register_command(cmd_ctx
, NULL
, "rbp", handle_rbp_command
, COMMAND_EXEC
, "remove breakpoint <adress>");
1114 register_command(cmd_ctx
, NULL
, "wp", handle_wp_command
, COMMAND_EXEC
, "set watchpoint <address> <length> <r/w/a> [value] [mask]");
1115 register_command(cmd_ctx
, NULL
, "rwp", handle_rwp_command
, COMMAND_EXEC
, "remove watchpoint <adress>");
1117 register_command(cmd_ctx
, NULL
, "load_image", handle_load_image_command
, COMMAND_EXEC
, "load_image <file> <address> ['bin'|'ihex'|'elf'|'s19']");
1118 register_command(cmd_ctx
, NULL
, "dump_image", handle_dump_image_command
, COMMAND_EXEC
, "dump_image <file> <address> <size>");
1119 register_command(cmd_ctx
, NULL
, "verify_image", handle_verify_image_command
, COMMAND_EXEC
, "verify_image <file> [offset] [type]");
1120 register_command(cmd_ctx
, NULL
, "load_binary", handle_load_image_command
, COMMAND_EXEC
, "[DEPRECATED] load_binary <file> <address>");
1121 register_command(cmd_ctx
, NULL
, "dump_binary", handle_dump_image_command
, COMMAND_EXEC
, "[DEPRECATED] dump_binary <file> <address> <size>");
1123 target_request_register_commands(cmd_ctx
);
1124 trace_register_commands(cmd_ctx
);
1129 int handle_targets_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1131 target_t
*target
= targets
;
1136 int num
= strtoul(args
[0], NULL
, 0);
1141 target
= target
->next
;
1145 cmd_ctx
->current_target
= num
;
1147 command_print(cmd_ctx
, "%i is out of bounds, only %i targets are configured", num
, count
);
1154 command_print(cmd_ctx
, "%i: %s (%s), state: %s", count
++, target
->type
->name
, target_endianess_strings
[target
->endianness
], target_state_strings
[target
->state
]);
1155 target
= target
->next
;
1161 int handle_target_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1168 return ERROR_COMMAND_SYNTAX_ERROR
;
1171 /* search for the specified target */
1172 if (args
[0] && (args
[0][0] != 0))
1174 for (i
= 0; target_types
[i
]; i
++)
1176 if (strcmp(args
[0], target_types
[i
]->name
) == 0)
1178 target_t
**last_target_p
= &targets
;
1180 /* register target specific commands */
1181 if (target_types
[i
]->register_commands(cmd_ctx
) != ERROR_OK
)
1183 LOG_ERROR("couldn't register '%s' commands", args
[0]);
1189 while ((*last_target_p
)->next
)
1190 last_target_p
= &((*last_target_p
)->next
);
1191 last_target_p
= &((*last_target_p
)->next
);
1194 *last_target_p
= malloc(sizeof(target_t
));
1196 (*last_target_p
)->type
= target_types
[i
];
1198 if (strcmp(args
[1], "big") == 0)
1199 (*last_target_p
)->endianness
= TARGET_BIG_ENDIAN
;
1200 else if (strcmp(args
[1], "little") == 0)
1201 (*last_target_p
)->endianness
= TARGET_LITTLE_ENDIAN
;
1204 LOG_ERROR("endianness must be either 'little' or 'big', not '%s'", args
[1]);
1205 return ERROR_COMMAND_SYNTAX_ERROR
;
1208 /* what to do on a target reset */
1209 (*last_target_p
)->reset_mode
= RESET_INIT
; /* default */
1210 if (strcmp(args
[2], "reset_halt") == 0)
1211 (*last_target_p
)->reset_mode
= RESET_HALT
;
1212 else if (strcmp(args
[2], "reset_run") == 0)
1213 (*last_target_p
)->reset_mode
= RESET_RUN
;
1214 else if (strcmp(args
[2], "reset_init") == 0)
1215 (*last_target_p
)->reset_mode
= RESET_INIT
;
1216 else if (strcmp(args
[2], "run_and_halt") == 0)
1217 (*last_target_p
)->reset_mode
= RESET_RUN_AND_HALT
;
1218 else if (strcmp(args
[2], "run_and_init") == 0)
1219 (*last_target_p
)->reset_mode
= RESET_RUN_AND_INIT
;
1222 /* Kludge! we want to make this reset arg optional while remaining compatible! */
1226 (*last_target_p
)->run_and_halt_time
= 1000; /* default 1s */
1228 (*last_target_p
)->reset_script
= NULL
;
1229 (*last_target_p
)->post_halt_script
= NULL
;
1230 (*last_target_p
)->pre_resume_script
= NULL
;
1231 (*last_target_p
)->gdb_program_script
= NULL
;
1233 (*last_target_p
)->working_area
= 0x0;
1234 (*last_target_p
)->working_area_size
= 0x0;
1235 (*last_target_p
)->working_areas
= NULL
;
1236 (*last_target_p
)->backup_working_area
= 0;
1238 (*last_target_p
)->state
= TARGET_UNKNOWN
;
1239 (*last_target_p
)->debug_reason
= DBG_REASON_UNDEFINED
;
1240 (*last_target_p
)->reg_cache
= NULL
;
1241 (*last_target_p
)->breakpoints
= NULL
;
1242 (*last_target_p
)->watchpoints
= NULL
;
1243 (*last_target_p
)->next
= NULL
;
1244 (*last_target_p
)->arch_info
= NULL
;
1246 /* initialize trace information */
1247 (*last_target_p
)->trace_info
= malloc(sizeof(trace_t
));
1248 (*last_target_p
)->trace_info
->num_trace_points
= 0;
1249 (*last_target_p
)->trace_info
->trace_points_size
= 0;
1250 (*last_target_p
)->trace_info
->trace_points
= NULL
;
1251 (*last_target_p
)->trace_info
->trace_history_size
= 0;
1252 (*last_target_p
)->trace_info
->trace_history
= NULL
;
1253 (*last_target_p
)->trace_info
->trace_history_pos
= 0;
1254 (*last_target_p
)->trace_info
->trace_history_overflowed
= 0;
1256 (*last_target_p
)->dbgmsg
= NULL
;
1257 (*last_target_p
)->dbg_msg_enabled
= 0;
1259 (*last_target_p
)->type
->target_command(cmd_ctx
, cmd
, args
, argc
, *last_target_p
);
1267 /* no matching target found */
1270 LOG_ERROR("target '%s' not found", args
[0]);
1271 return ERROR_COMMAND_SYNTAX_ERROR
;
1277 /* usage: target_script <target#> <event> <script_file> */
1278 int handle_target_script_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1280 target_t
*target
= NULL
;
1284 LOG_ERROR("incomplete target_script command");
1285 return ERROR_COMMAND_SYNTAX_ERROR
;
1288 target
= get_target_by_num(strtoul(args
[0], NULL
, 0));
1292 return ERROR_COMMAND_SYNTAX_ERROR
;
1295 if (strcmp(args
[1], "reset") == 0)
1297 if (target
->reset_script
)
1298 free(target
->reset_script
);
1299 target
->reset_script
= strdup(args
[2]);
1301 else if (strcmp(args
[1], "post_halt") == 0)
1303 if (target
->post_halt_script
)
1304 free(target
->post_halt_script
);
1305 target
->post_halt_script
= strdup(args
[2]);
1307 else if (strcmp(args
[1], "pre_resume") == 0)
1309 if (target
->pre_resume_script
)
1310 free(target
->pre_resume_script
);
1311 target
->pre_resume_script
= strdup(args
[2]);
1313 else if (strcmp(args
[1], "gdb_program_config") == 0)
1315 if (target
->gdb_program_script
)
1316 free(target
->gdb_program_script
);
1317 target
->gdb_program_script
= strdup(args
[2]);
1321 LOG_ERROR("unknown event type: '%s", args
[1]);
1322 return ERROR_COMMAND_SYNTAX_ERROR
;
1328 int handle_run_and_halt_time_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1330 target_t
*target
= NULL
;
1334 return ERROR_COMMAND_SYNTAX_ERROR
;
1337 target
= get_target_by_num(strtoul(args
[0], NULL
, 0));
1340 return ERROR_COMMAND_SYNTAX_ERROR
;
1343 target
->run_and_halt_time
= strtoul(args
[1], NULL
, 0);
1348 int handle_working_area_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1350 target_t
*target
= NULL
;
1352 if ((argc
< 4) || (argc
> 5))
1354 return ERROR_COMMAND_SYNTAX_ERROR
;
1357 target
= get_target_by_num(strtoul(args
[0], NULL
, 0));
1360 return ERROR_COMMAND_SYNTAX_ERROR
;
1362 target_free_all_working_areas(target
);
1364 target
->working_area_phys
= target
->working_area_virt
= strtoul(args
[1], NULL
, 0);
1367 target
->working_area_virt
= strtoul(args
[4], NULL
, 0);
1369 target
->working_area_size
= strtoul(args
[2], NULL
, 0);
1371 if (strcmp(args
[3], "backup") == 0)
1373 target
->backup_working_area
= 1;
1375 else if (strcmp(args
[3], "nobackup") == 0)
1377 target
->backup_working_area
= 0;
1381 LOG_ERROR("unrecognized <backup|nobackup> argument (%s)", args
[3]);
1382 return ERROR_COMMAND_SYNTAX_ERROR
;
1389 /* process target state changes */
1390 int handle_target(void *priv
)
1393 target_t
*target
= targets
;
1397 /* only poll if target isn't already halted */
1398 if (target
->state
!= TARGET_HALTED
)
1400 if (target_continous_poll
)
1401 if ((retval
= target
->type
->poll(target
)) != ERROR_OK
)
1403 LOG_ERROR("couldn't poll target(%d). It's due for a reset.", retval
);
1407 target
= target
->next
;
1413 int handle_reg_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1422 target
= get_current_target(cmd_ctx
);
1424 /* list all available registers for the current target */
1427 reg_cache_t
*cache
= target
->reg_cache
;
1433 for (i
= 0; i
< cache
->num_regs
; i
++)
1435 value
= buf_to_str(cache
->reg_list
[i
].value
, cache
->reg_list
[i
].size
, 16);
1436 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
);
1439 cache
= cache
->next
;
1445 /* access a single register by its ordinal number */
1446 if ((args
[0][0] >= '0') && (args
[0][0] <= '9'))
1448 int num
= strtoul(args
[0], NULL
, 0);
1449 reg_cache_t
*cache
= target
->reg_cache
;
1455 for (i
= 0; i
< cache
->num_regs
; i
++)
1459 reg
= &cache
->reg_list
[i
];
1465 cache
= cache
->next
;
1470 command_print(cmd_ctx
, "%i is out of bounds, the current target has only %i registers (0 - %i)", num
, count
, count
- 1);
1473 } else /* access a single register by its name */
1475 reg
= register_get_by_name(target
->reg_cache
, args
[0], 1);
1479 command_print(cmd_ctx
, "register %s not found in current target", args
[0]);
1484 /* display a register */
1485 if ((argc
== 1) || ((argc
== 2) && !((args
[1][0] >= '0') && (args
[1][0] <= '9'))))
1487 if ((argc
== 2) && (strcmp(args
[1], "force") == 0))
1490 if (reg
->valid
== 0)
1492 reg_arch_type_t
*arch_type
= register_get_arch_type(reg
->arch_type
);
1493 if (arch_type
== NULL
)
1495 LOG_ERROR("BUG: encountered unregistered arch type");
1498 arch_type
->get(reg
);
1500 value
= buf_to_str(reg
->value
, reg
->size
, 16);
1501 command_print(cmd_ctx
, "%s (/%i): 0x%s", reg
->name
, reg
->size
, value
);
1506 /* set register value */
1509 u8
*buf
= malloc(CEIL(reg
->size
, 8));
1510 str_to_buf(args
[1], strlen(args
[1]), buf
, reg
->size
, 0);
1512 reg_arch_type_t
*arch_type
= register_get_arch_type(reg
->arch_type
);
1513 if (arch_type
== NULL
)
1515 LOG_ERROR("BUG: encountered unregistered arch type");
1519 arch_type
->set(reg
, buf
);
1521 value
= buf_to_str(reg
->value
, reg
->size
, 16);
1522 command_print(cmd_ctx
, "%s (/%i): 0x%s", reg
->name
, reg
->size
, value
);
1530 command_print(cmd_ctx
, "usage: reg <#|name> [value]");
1535 static int wait_state(struct command_context_s
*cmd_ctx
, char *cmd
, enum target_state state
, int ms
);
1537 int handle_poll_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1539 target_t
*target
= get_current_target(cmd_ctx
);
1543 target
->type
->poll(target
);
1544 target_arch_state(target
);
1548 if (strcmp(args
[0], "on") == 0)
1550 target_continous_poll
= 1;
1552 else if (strcmp(args
[0], "off") == 0)
1554 target_continous_poll
= 0;
1558 command_print(cmd_ctx
, "arg is \"on\" or \"off\"");
1566 int handle_wait_halt_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1574 ms
= strtoul(args
[0], &end
, 0) * 1000;
1577 command_print(cmd_ctx
, "usage: %s [seconds]", cmd
);
1582 return wait_state(cmd_ctx
, cmd
, TARGET_HALTED
, ms
);
1585 static void target_process_events(struct command_context_s
*cmd_ctx
)
1587 target_t
*target
= get_current_target(cmd_ctx
);
1588 target
->type
->poll(target
);
1589 target_call_timer_callbacks_now();
1592 static int wait_state(struct command_context_s
*cmd_ctx
, char *cmd
, enum target_state state
, int ms
)
1595 struct timeval timeout
, now
;
1597 gettimeofday(&timeout
, NULL
);
1598 timeval_add_time(&timeout
, 0, ms
* 1000);
1600 target_t
*target
= get_current_target(cmd_ctx
);
1603 if ((retval
=target
->type
->poll(target
))!=ERROR_OK
)
1605 target_call_timer_callbacks_now();
1606 if (target
->state
== state
)
1613 command_print(cmd_ctx
, "waiting for target %s...", target_state_strings
[state
]);
1616 gettimeofday(&now
, NULL
);
1617 if ((now
.tv_sec
> timeout
.tv_sec
) || ((now
.tv_sec
== timeout
.tv_sec
) && (now
.tv_usec
>= timeout
.tv_usec
)))
1619 LOG_ERROR("timed out while waiting for target %s", target_state_strings
[state
]);
1627 int handle_halt_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1630 target_t
*target
= get_current_target(cmd_ctx
);
1634 if ((retval
= target
->type
->halt(target
)) != ERROR_OK
)
1639 return handle_wait_halt_command(cmd_ctx
, cmd
, args
, argc
);
1642 /* what to do on daemon startup */
1643 int handle_daemon_startup_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1647 if (strcmp(args
[0], "attach") == 0)
1649 startup_mode
= DAEMON_ATTACH
;
1652 else if (strcmp(args
[0], "reset") == 0)
1654 startup_mode
= DAEMON_RESET
;
1659 LOG_WARNING("invalid daemon_startup configuration directive: %s", args
[0]);
1664 int handle_soft_reset_halt_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1666 target_t
*target
= get_current_target(cmd_ctx
);
1668 LOG_USER("requesting target halt and executing a soft reset");
1670 target
->type
->soft_reset_halt(target
);
1675 int handle_reset_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1677 target_t
*target
= get_current_target(cmd_ctx
);
1678 enum target_reset_mode reset_mode
= target
->reset_mode
;
1679 enum target_reset_mode save
= target
->reset_mode
;
1685 if (strcmp("run", args
[0]) == 0)
1686 reset_mode
= RESET_RUN
;
1687 else if (strcmp("halt", args
[0]) == 0)
1688 reset_mode
= RESET_HALT
;
1689 else if (strcmp("init", args
[0]) == 0)
1690 reset_mode
= RESET_INIT
;
1691 else if (strcmp("run_and_halt", args
[0]) == 0)
1693 reset_mode
= RESET_RUN_AND_HALT
;
1696 target
->run_and_halt_time
= strtoul(args
[1], NULL
, 0);
1699 else if (strcmp("run_and_init", args
[0]) == 0)
1701 reset_mode
= RESET_RUN_AND_INIT
;
1704 target
->run_and_halt_time
= strtoul(args
[1], NULL
, 0);
1709 command_print(cmd_ctx
, "usage: reset ['run', 'halt', 'init', 'run_and_halt', 'run_and_init]");
1714 /* temporarily modify mode of current reset target */
1715 target
->reset_mode
= reset_mode
;
1717 /* reset *all* targets */
1718 target_process_reset(cmd_ctx
);
1720 /* Restore default reset mode for this target */
1721 target
->reset_mode
= save
;
1726 int handle_resume_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1729 target_t
*target
= get_current_target(cmd_ctx
);
1732 retval
= target
->type
->resume(target
, 1, 0, 1, 0); /* current pc, addr = 0, handle breakpoints, not debugging */
1734 retval
= target
->type
->resume(target
, 0, strtoul(args
[0], NULL
, 0), 1, 0); /* addr = args[0], handle breakpoints, not debugging */
1737 return ERROR_COMMAND_SYNTAX_ERROR
;
1740 target_process_events(cmd_ctx
);
1745 int handle_step_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1747 target_t
*target
= get_current_target(cmd_ctx
);
1752 target
->type
->step(target
, 1, 0, 1); /* current pc, addr = 0, handle breakpoints */
1755 target
->type
->step(target
, 0, strtoul(args
[0], NULL
, 0), 1); /* addr = args[0], handle breakpoints */
1760 int handle_md_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1762 const int line_bytecnt
= 32;
1775 target_t
*target
= get_current_target(cmd_ctx
);
1781 count
= strtoul(args
[1], NULL
, 0);
1783 address
= strtoul(args
[0], NULL
, 0);
1789 size
= 4; line_modulo
= line_bytecnt
/ 4;
1792 size
= 2; line_modulo
= line_bytecnt
/ 2;
1795 size
= 1; line_modulo
= line_bytecnt
/ 1;
1801 buffer
= calloc(count
, size
);
1802 retval
= target
->type
->read_memory(target
, address
, size
, count
, buffer
);
1803 if (retval
== ERROR_OK
)
1807 for (i
= 0; i
< count
; i
++)
1809 if (i
%line_modulo
== 0)
1810 output_len
+= snprintf(output
+ output_len
, 128 - output_len
, "0x%8.8x: ", address
+ (i
*size
));
1815 output_len
+= snprintf(output
+ output_len
, 128 - output_len
, "%8.8x ", target_buffer_get_u32(target
, &buffer
[i
*4]));
1818 output_len
+= snprintf(output
+ output_len
, 128 - output_len
, "%4.4x ", target_buffer_get_u16(target
, &buffer
[i
*2]));
1821 output_len
+= snprintf(output
+ output_len
, 128 - output_len
, "%2.2x ", buffer
[i
*1]);
1825 if ((i
%line_modulo
== line_modulo
-1) || (i
== count
- 1))
1827 command_print(cmd_ctx
, output
);
1833 LOG_ERROR("Failure examining memory");
1841 int handle_mw_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1848 target_t
*target
= get_current_target(cmd_ctx
);
1851 if ((argc
< 2) || (argc
> 3))
1852 return ERROR_COMMAND_SYNTAX_ERROR
;
1854 address
= strtoul(args
[0], NULL
, 0);
1855 value
= strtoul(args
[1], NULL
, 0);
1857 count
= strtoul(args
[2], NULL
, 0);
1864 target_buffer_set_u32(target
, value_buf
, value
);
1868 target_buffer_set_u16(target
, value_buf
, value
);
1872 value_buf
[0] = value
;
1875 return ERROR_COMMAND_SYNTAX_ERROR
;
1877 for (i
=0; i
<count
; i
++)
1883 retval
= target
->type
->write_memory(target
, address
+ i
*wordsize
, 4, 1, value_buf
);
1886 retval
= target
->type
->write_memory(target
, address
+ i
*wordsize
, 2, 1, value_buf
);
1889 retval
= target
->type
->write_memory(target
, address
+ i
*wordsize
, 1, 1, value_buf
);
1894 if (retval
!=ERROR_OK
)
1904 int handle_load_image_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1914 duration_t duration
;
1915 char *duration_text
;
1917 target_t
*target
= get_current_target(cmd_ctx
);
1921 command_print(cmd_ctx
, "usage: load_image <filename> [address] [type]");
1925 /* a base address isn't always necessary, default to 0x0 (i.e. don't relocate) */
1928 image
.base_address_set
= 1;
1929 image
.base_address
= strtoul(args
[1], NULL
, 0);
1933 image
.base_address_set
= 0;
1936 image
.start_address_set
= 0;
1938 duration_start_measure(&duration
);
1940 if (image_open(&image
, args
[0], (argc
>= 3) ? args
[2] : NULL
) != ERROR_OK
)
1947 for (i
= 0; i
< image
.num_sections
; i
++)
1949 buffer
= malloc(image
.sections
[i
].size
);
1952 command_print(cmd_ctx
, "error allocating buffer for section (%d bytes)", image
.sections
[i
].size
);
1956 if ((retval
= image_read_section(&image
, i
, 0x0, image
.sections
[i
].size
, buffer
, &buf_cnt
)) != ERROR_OK
)
1961 if ((retval
= target_write_buffer(target
, image
.sections
[i
].base_address
, buf_cnt
, buffer
)) != ERROR_OK
)
1966 image_size
+= buf_cnt
;
1967 command_print(cmd_ctx
, "%u byte written at address 0x%8.8x", buf_cnt
, image
.sections
[i
].base_address
);
1972 duration_stop_measure(&duration
, &duration_text
);
1973 if (retval
==ERROR_OK
)
1975 command_print(cmd_ctx
, "downloaded %u byte in %s", image_size
, duration_text
);
1977 free(duration_text
);
1979 image_close(&image
);
1985 int handle_dump_image_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1992 int retval
=ERROR_OK
;
1994 duration_t duration
;
1995 char *duration_text
;
1997 target_t
*target
= get_current_target(cmd_ctx
);
2001 command_print(cmd_ctx
, "usage: dump_image <filename> <address> <size>");
2005 address
= strtoul(args
[1], NULL
, 0);
2006 size
= strtoul(args
[2], NULL
, 0);
2008 if ((address
& 3) || (size
& 3))
2010 command_print(cmd_ctx
, "only 32-bit aligned address and size are supported");
2014 if (fileio_open(&fileio
, args
[0], FILEIO_WRITE
, FILEIO_BINARY
) != ERROR_OK
)
2019 duration_start_measure(&duration
);
2024 u32 this_run_size
= (size
> 560) ? 560 : size
;
2026 retval
= target
->type
->read_memory(target
, address
, 4, this_run_size
/ 4, buffer
);
2027 if (retval
!= ERROR_OK
)
2032 retval
= fileio_write(&fileio
, this_run_size
, buffer
, &size_written
);
2033 if (retval
!= ERROR_OK
)
2038 size
-= this_run_size
;
2039 address
+= this_run_size
;
2042 fileio_close(&fileio
);
2044 duration_stop_measure(&duration
, &duration_text
);
2045 if (retval
==ERROR_OK
)
2047 command_print(cmd_ctx
, "dumped %"PRIi64
" byte in %s", fileio
.size
, duration_text
);
2049 free(duration_text
);
2054 int handle_verify_image_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2062 u32 mem_checksum
= 0;
2066 duration_t duration
;
2067 char *duration_text
;
2069 target_t
*target
= get_current_target(cmd_ctx
);
2073 return ERROR_COMMAND_SYNTAX_ERROR
;
2078 LOG_ERROR("no target selected");
2082 duration_start_measure(&duration
);
2086 image
.base_address_set
= 1;
2087 image
.base_address
= strtoul(args
[1], NULL
, 0);
2091 image
.base_address_set
= 0;
2092 image
.base_address
= 0x0;
2095 image
.start_address_set
= 0;
2097 if ((retval
=image_open(&image
, args
[0], (argc
== 3) ? args
[2] : NULL
)) != ERROR_OK
)
2104 for (i
= 0; i
< image
.num_sections
; i
++)
2106 buffer
= malloc(image
.sections
[i
].size
);
2109 command_print(cmd_ctx
, "error allocating buffer for section (%d bytes)", image
.sections
[i
].size
);
2112 if ((retval
= image_read_section(&image
, i
, 0x0, image
.sections
[i
].size
, buffer
, &buf_cnt
)) != ERROR_OK
)
2118 /* calculate checksum of image */
2119 image_calculate_checksum( buffer
, buf_cnt
, &checksum
);
2121 retval
= target_checksum_memory(target
, image
.sections
[i
].base_address
, buf_cnt
, &mem_checksum
);
2122 if( retval
!= ERROR_OK
)
2128 if( checksum
!= mem_checksum
)
2130 /* failed crc checksum, fall back to a binary compare */
2133 command_print(cmd_ctx
, "checksum mismatch - attempting binary compare");
2135 data
= (u8
*)malloc(buf_cnt
);
2137 /* Can we use 32bit word accesses? */
2139 int count
= buf_cnt
;
2140 if ((count
% 4) == 0)
2145 retval
= target
->type
->read_memory(target
, image
.sections
[i
].base_address
, size
, count
, data
);
2146 if (retval
== ERROR_OK
)
2149 for (t
= 0; t
< buf_cnt
; t
++)
2151 if (data
[t
] != buffer
[t
])
2153 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
]);
2166 image_size
+= buf_cnt
;
2169 duration_stop_measure(&duration
, &duration_text
);
2170 if (retval
==ERROR_OK
)
2172 command_print(cmd_ctx
, "verified %u bytes in %s", image_size
, duration_text
);
2174 free(duration_text
);
2176 image_close(&image
);
2181 int handle_bp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2184 target_t
*target
= get_current_target(cmd_ctx
);
2188 breakpoint_t
*breakpoint
= target
->breakpoints
;
2192 if (breakpoint
->type
== BKPT_SOFT
)
2194 char* buf
= buf_to_str(breakpoint
->orig_instr
, breakpoint
->length
, 16);
2195 command_print(cmd_ctx
, "0x%8.8x, 0x%x, %i, 0x%s", breakpoint
->address
, breakpoint
->length
, breakpoint
->set
, buf
);
2200 command_print(cmd_ctx
, "0x%8.8x, 0x%x, %i", breakpoint
->address
, breakpoint
->length
, breakpoint
->set
);
2202 breakpoint
= breakpoint
->next
;
2210 length
= strtoul(args
[1], NULL
, 0);
2213 if (strcmp(args
[2], "hw") == 0)
2216 if ((retval
= breakpoint_add(target
, strtoul(args
[0], NULL
, 0), length
, hw
)) != ERROR_OK
)
2218 LOG_ERROR("Failure setting breakpoints");
2222 command_print(cmd_ctx
, "breakpoint added at address 0x%8.8x", strtoul(args
[0], NULL
, 0));
2227 command_print(cmd_ctx
, "usage: bp <address> <length> ['hw']");
2233 int handle_rbp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2235 target_t
*target
= get_current_target(cmd_ctx
);
2238 breakpoint_remove(target
, strtoul(args
[0], NULL
, 0));
2243 int handle_wp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2245 target_t
*target
= get_current_target(cmd_ctx
);
2250 watchpoint_t
*watchpoint
= target
->watchpoints
;
2254 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
);
2255 watchpoint
= watchpoint
->next
;
2260 enum watchpoint_rw type
= WPT_ACCESS
;
2261 u32 data_value
= 0x0;
2262 u32 data_mask
= 0xffffffff;
2278 command_print(cmd_ctx
, "usage: wp <address> <length> [r/w/a] [value] [mask]");
2284 data_value
= strtoul(args
[3], NULL
, 0);
2288 data_mask
= strtoul(args
[4], NULL
, 0);
2291 if ((retval
= watchpoint_add(target
, strtoul(args
[0], NULL
, 0),
2292 strtoul(args
[1], NULL
, 0), type
, data_value
, data_mask
)) != ERROR_OK
)
2294 LOG_ERROR("Failure setting breakpoints");
2299 command_print(cmd_ctx
, "usage: wp <address> <length> [r/w/a] [value] [mask]");
2305 int handle_rwp_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2307 target_t
*target
= get_current_target(cmd_ctx
);
2310 watchpoint_remove(target
, strtoul(args
[0], NULL
, 0));
2315 int handle_virt2phys_command(command_context_t
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2318 target_t
*target
= get_current_target(cmd_ctx
);
2324 return ERROR_COMMAND_SYNTAX_ERROR
;
2326 va
= strtoul(args
[0], NULL
, 0);
2328 retval
= target
->type
->virt2phys(target
, va
, &pa
);
2329 if (retval
== ERROR_OK
)
2331 command_print(cmd_ctx
, "Physical address 0x%08x", pa
);
2335 /* lower levels will have logged a detailed error which is
2336 * forwarded to telnet/GDB session.
2341 static void writeLong(FILE *f
, int l
)
2346 char c
=(l
>>(i
*8))&0xff;
2347 fwrite(&c
, 1, 1, f
);
2351 static void writeString(FILE *f
, char *s
)
2353 fwrite(s
, 1, strlen(s
), f
);
2358 // Dump a gmon.out histogram file.
2359 static void writeGmon(u32
*samples
, int sampleNum
, char *filename
)
2362 FILE *f
=fopen(filename
, "w");
2365 fwrite("gmon", 1, 4, f
);
2366 writeLong(f
, 0x00000001); // Version
2367 writeLong(f
, 0); // padding
2368 writeLong(f
, 0); // padding
2369 writeLong(f
, 0); // padding
2371 fwrite("", 1, 1, f
); // GMON_TAG_TIME_HIST
2373 // figure out bucket size
2376 for (i
=0; i
<sampleNum
; i
++)
2388 int addressSpace
=(max
-min
+1);
2390 static int const maxBuckets
=256*1024; // maximum buckets.
2391 int length
=addressSpace
;
2392 if (length
> maxBuckets
)
2396 int *buckets
=malloc(sizeof(int)*length
);
2402 memset(buckets
, 0, sizeof(int)*length
);
2403 for (i
=0; i
<sampleNum
;i
++)
2405 u32 address
=samples
[i
];
2406 long long a
=address
-min
;
2407 long long b
=length
-1;
2408 long long c
=addressSpace
-1;
2409 int index
=(a
*b
)/c
; // danger!!!! int32 overflows
2413 // append binary memory gmon.out &profile_hist_hdr ((char*)&profile_hist_hdr + sizeof(struct gmon_hist_hdr))
2414 writeLong(f
, min
); // low_pc
2415 writeLong(f
, max
); // high_pc
2416 writeLong(f
, length
); // # of samples
2417 writeLong(f
, 64000000); // 64MHz
2418 writeString(f
, "seconds");
2419 for (i
=0; i
<(15-strlen("seconds")); i
++)
2421 fwrite("", 1, 1, f
); // padding
2423 writeString(f
, "s");
2425 // append binary memory gmon.out profile_hist_data (profile_hist_data + profile_hist_hdr.hist_size)
2427 char *data
=malloc(2*length
);
2430 for (i
=0; i
<length
;i
++)
2439 data
[i
*2+1]=(val
>>8)&0xff;
2442 fwrite(data
, 1, length
*2, f
);
2452 /* profiling samples the CPU PC as quickly as OpenOCD is able, which will be used as a random sampling of PC */
2453 int handle_profile_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2455 target_t
*target
= get_current_target(cmd_ctx
);
2456 struct timeval timeout
, now
;
2458 gettimeofday(&timeout
, NULL
);
2461 return ERROR_COMMAND_SYNTAX_ERROR
;
2464 timeval_add_time(&timeout
, strtoul(args
[0], &end
, 0), 0);
2470 command_print(cmd_ctx
, "Starting profiling. Halting and resuming the target as often as we can...");
2472 static const int maxSample
=10000;
2473 u32
*samples
=malloc(sizeof(u32
)*maxSample
);
2478 int retval
=ERROR_OK
;
2479 // hopefully it is safe to cache! We want to stop/restart as quickly as possible.
2480 reg_t
*reg
= register_get_by_name(target
->reg_cache
, "pc", 1);
2484 target
->type
->poll(target
);
2485 if (target
->state
== TARGET_HALTED
)
2487 u32 t
=*((u32
*)reg
->value
);
2488 samples
[numSamples
++]=t
;
2489 retval
= target
->type
->resume(target
, 1, 0, 0, 0); /* current pc, addr = 0, do not handle breakpoints, not debugging */
2490 target
->type
->poll(target
);
2491 usleep(10*1000); // sleep 10ms, i.e. <100 samples/second.
2492 } else if (target
->state
== TARGET_RUNNING
)
2494 // We want to quickly sample the PC.
2495 target
->type
->halt(target
);
2498 command_print(cmd_ctx
, "Target not halted or running");
2502 if (retval
!=ERROR_OK
)
2507 gettimeofday(&now
, NULL
);
2508 if ((numSamples
>=maxSample
) || ((now
.tv_sec
>= timeout
.tv_sec
) && (now
.tv_usec
>= timeout
.tv_usec
)))
2510 command_print(cmd_ctx
, "Profiling completed. %d samples.", numSamples
);
2511 target
->type
->poll(target
);
2512 if (target
->state
== TARGET_HALTED
)
2514 target
->type
->resume(target
, 1, 0, 0, 0); /* current pc, addr = 0, do not handle breakpoints, not debugging */
2516 target
->type
->poll(target
);
2517 writeGmon(samples
, numSamples
, args
[1]);
2518 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)