1 /***************************************************************************
2 * Copyright (C) 2005 by Dominic Rath *
3 * Dominic.Rath@gmx.de *
5 * Copyright (C) 2007,2008 �yvind Harboe *
6 * oyvind.harboe@zylin.com *
8 * Copyright (C) 2008 by Spencer Oliver *
9 * spen@spen-soft.co.uk *
11 * Copyright (C) 2008 by Hongtao Zheng *
14 * This program is free software; you can redistribute it and/or modify *
15 * it under the terms of the GNU General Public License as published by *
16 * the Free Software Foundation; either version 2 of the License, or *
17 * (at your option) any later version. *
19 * This program is distributed in the hope that it will be useful, *
20 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
21 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
22 * GNU General Public License for more details. *
24 * You should have received a copy of the GNU General Public License *
25 * along with this program; if not, write to the *
26 * Free Software Foundation, Inc., *
27 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
28 ***************************************************************************/
33 #include "embeddedice.h"
34 #include "target_request.h"
35 #include "arm7_9_common.h"
36 #include "time_support.h"
37 #include "arm_simulator.h"
40 int arm7_9_debug_entry(target_t
*target
);
41 int arm7_9_enable_sw_bkpts(struct target_s
*target
);
43 /* command handler forward declarations */
44 int handle_arm7_9_write_xpsr_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
45 int handle_arm7_9_write_xpsr_im8_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
46 int handle_arm7_9_read_core_reg_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
47 int handle_arm7_9_write_core_reg_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
48 int handle_arm7_9_dbgrq_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
49 int handle_arm7_9_fast_memory_access_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
50 int handle_arm7_9_dcc_downloads_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
51 int handle_arm7_9_etm_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
54 * Clear watchpoints for an ARM7/9 target.
56 * @param arm7_9 Pointer to the common struct for an ARM7/9 target
57 * @return JTAG error status after executing queue
59 static int arm7_9_clear_watchpoints(arm7_9_common_t
*arm7_9
)
62 embeddedice_write_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W0_CONTROL_VALUE
], 0x0);
63 embeddedice_write_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W1_CONTROL_VALUE
], 0x0);
64 arm7_9
->sw_breakpoints_added
= 0;
66 arm7_9
->wp1_used
= arm7_9
->wp1_used_default
;
67 arm7_9
->wp_available
= arm7_9
->wp_available_max
;
69 return jtag_execute_queue();
73 * Assign a watchpoint to one of the two available hardware comparators in an
74 * ARM7 or ARM9 target.
76 * @param arm7_9 Pointer to the common struct for an ARM7/9 target
77 * @param breakpoint Pointer to the breakpoint to be used as a watchpoint
79 static void arm7_9_assign_wp(arm7_9_common_t
*arm7_9
, breakpoint_t
*breakpoint
)
81 if (!arm7_9
->wp0_used
)
85 arm7_9
->wp_available
--;
87 else if (!arm7_9
->wp1_used
)
91 arm7_9
->wp_available
--;
95 LOG_ERROR("BUG: no hardware comparator available");
97 LOG_DEBUG("BPID: %d (0x%08" PRIx32
") using hw wp: %d",
98 breakpoint
->unique_id
,
104 * Setup an ARM7/9 target's embedded ICE registers for software breakpoints.
106 * @param arm7_9 Pointer to common struct for ARM7/9 targets
107 * @return Error codes if there is a problem finding a watchpoint or the result
108 * of executing the JTAG queue
110 static int arm7_9_set_software_breakpoints(arm7_9_common_t
*arm7_9
)
112 if (arm7_9
->sw_breakpoints_added
)
116 if (arm7_9
->wp_available
< 1)
118 LOG_WARNING("can't enable sw breakpoints with no watchpoint unit available");
119 return ERROR_TARGET_RESOURCE_NOT_AVAILABLE
;
121 arm7_9
->wp_available
--;
123 /* pick a breakpoint unit */
124 if (!arm7_9
->wp0_used
)
126 arm7_9
->sw_breakpoints_added
= 1;
127 arm7_9
->wp0_used
= 3;
128 } else if (!arm7_9
->wp1_used
)
130 arm7_9
->sw_breakpoints_added
= 2;
131 arm7_9
->wp1_used
= 3;
135 LOG_ERROR("BUG: both watchpoints used, but wp_available >= 1");
139 if (arm7_9
->sw_breakpoints_added
== 1)
141 embeddedice_set_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W0_DATA_VALUE
], arm7_9
->arm_bkpt
);
142 embeddedice_set_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W0_DATA_MASK
], 0x0);
143 embeddedice_set_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W0_ADDR_MASK
], 0xffffffffu
);
144 embeddedice_set_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W0_CONTROL_MASK
], ~EICE_W_CTRL_nOPC
& 0xff);
145 embeddedice_set_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W0_CONTROL_VALUE
], EICE_W_CTRL_ENABLE
);
147 else if (arm7_9
->sw_breakpoints_added
== 2)
149 embeddedice_set_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W1_DATA_VALUE
], arm7_9
->arm_bkpt
);
150 embeddedice_set_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W1_DATA_MASK
], 0x0);
151 embeddedice_set_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W1_ADDR_MASK
], 0xffffffffu
);
152 embeddedice_set_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W1_CONTROL_MASK
], ~EICE_W_CTRL_nOPC
& 0xff);
153 embeddedice_set_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W1_CONTROL_VALUE
], EICE_W_CTRL_ENABLE
);
157 LOG_ERROR("BUG: both watchpoints used, but wp_available >= 1");
160 LOG_DEBUG("SW BP using hw wp: %d",
161 arm7_9
->sw_breakpoints_added
);
163 return jtag_execute_queue();
167 * Setup the common pieces for an ARM7/9 target after reset or on startup.
169 * @param target Pointer to an ARM7/9 target to setup
170 * @return Result of clearing the watchpoints on the target
172 int arm7_9_setup(target_t
*target
)
174 armv4_5_common_t
*armv4_5
= target
->arch_info
;
175 arm7_9_common_t
*arm7_9
= armv4_5
->arch_info
;
177 return arm7_9_clear_watchpoints(arm7_9
);
181 * Retrieves the architecture information pointers for ARMv4/5 and ARM7/9
182 * targets. A return of ERROR_OK signifies that the target is a valid target
183 * and that the pointers have been set properly.
185 * @param target Pointer to the target device to get the pointers from
186 * @param armv4_5_p Pointer to be filled in with the common struct for ARMV4/5
188 * @param arm7_9_p Pointer to be filled in with the common struct for ARM7/9
190 * @return ERROR_OK if successful
192 int arm7_9_get_arch_pointers(target_t
*target
, armv4_5_common_t
**armv4_5_p
, arm7_9_common_t
**arm7_9_p
)
194 armv4_5_common_t
*armv4_5
= target
->arch_info
;
195 arm7_9_common_t
*arm7_9
= armv4_5
->arch_info
;
197 if (armv4_5
->common_magic
!= ARMV4_5_COMMON_MAGIC
)
202 if (arm7_9
->common_magic
!= ARM7_9_COMMON_MAGIC
)
207 *armv4_5_p
= armv4_5
;
214 * Set either a hardware or software breakpoint on an ARM7/9 target. The
215 * breakpoint is set up even if it is already set. Some actions, e.g. reset,
216 * might have erased the values in Embedded ICE.
218 * @param target Pointer to the target device to set the breakpoints on
219 * @param breakpoint Pointer to the breakpoint to be set
220 * @return For hardware breakpoints, this is the result of executing the JTAG
221 * queue. For software breakpoints, this will be the status of the
222 * required memory reads and writes
224 int arm7_9_set_breakpoint(struct target_s
*target
, breakpoint_t
*breakpoint
)
226 armv4_5_common_t
*armv4_5
= target
->arch_info
;
227 arm7_9_common_t
*arm7_9
= armv4_5
->arch_info
;
228 int retval
= ERROR_OK
;
230 LOG_DEBUG("BPID: %d, Address: 0x%08" PRIx32
,
231 breakpoint
->unique_id
,
232 breakpoint
->address
);
234 if (target
->state
!= TARGET_HALTED
)
236 LOG_WARNING("target not halted");
237 return ERROR_TARGET_NOT_HALTED
;
240 if (breakpoint
->type
== BKPT_HARD
)
242 /* either an ARM (4 byte) or Thumb (2 byte) breakpoint */
243 uint32_t mask
= (breakpoint
->length
== 4) ? 0x3u
: 0x1u
;
245 /* reassign a hw breakpoint */
246 if (breakpoint
->set
== 0)
248 arm7_9_assign_wp(arm7_9
, breakpoint
);
251 if (breakpoint
->set
== 1)
253 embeddedice_set_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W0_ADDR_VALUE
], breakpoint
->address
);
254 embeddedice_set_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W0_ADDR_MASK
], mask
);
255 embeddedice_set_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W0_DATA_MASK
], 0xffffffffu
);
256 embeddedice_set_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W0_CONTROL_MASK
], ~EICE_W_CTRL_nOPC
& 0xff);
257 embeddedice_set_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W0_CONTROL_VALUE
], EICE_W_CTRL_ENABLE
);
259 else if (breakpoint
->set
== 2)
261 embeddedice_set_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W1_ADDR_VALUE
], breakpoint
->address
);
262 embeddedice_set_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W1_ADDR_MASK
], mask
);
263 embeddedice_set_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W1_DATA_MASK
], 0xffffffffu
);
264 embeddedice_set_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W1_CONTROL_MASK
], ~EICE_W_CTRL_nOPC
& 0xff);
265 embeddedice_set_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W1_CONTROL_VALUE
], EICE_W_CTRL_ENABLE
);
269 LOG_ERROR("BUG: no hardware comparator available");
273 retval
= jtag_execute_queue();
275 else if (breakpoint
->type
== BKPT_SOFT
)
277 if ((retval
= arm7_9_set_software_breakpoints(arm7_9
)) != ERROR_OK
)
280 /* did we already set this breakpoint? */
284 if (breakpoint
->length
== 4)
286 uint32_t verify
= 0xffffffff;
287 /* keep the original instruction in target endianness */
288 if ((retval
= target_read_memory(target
, breakpoint
->address
, 4, 1, breakpoint
->orig_instr
)) != ERROR_OK
)
292 /* write the breakpoint instruction in target endianness (arm7_9->arm_bkpt is host endian) */
293 if ((retval
= target_write_u32(target
, breakpoint
->address
, arm7_9
->arm_bkpt
)) != ERROR_OK
)
298 if ((retval
= target_read_u32(target
, breakpoint
->address
, &verify
)) != ERROR_OK
)
302 if (verify
!= arm7_9
->arm_bkpt
)
304 LOG_ERROR("Unable to set 32 bit software breakpoint at address %08" PRIx32
" - check that memory is read/writable", breakpoint
->address
);
310 uint16_t verify
= 0xffff;
311 /* keep the original instruction in target endianness */
312 if ((retval
= target_read_memory(target
, breakpoint
->address
, 2, 1, breakpoint
->orig_instr
)) != ERROR_OK
)
316 /* write the breakpoint instruction in target endianness (arm7_9->thumb_bkpt is host endian) */
317 if ((retval
= target_write_u16(target
, breakpoint
->address
, arm7_9
->thumb_bkpt
)) != ERROR_OK
)
322 if ((retval
= target_read_u16(target
, breakpoint
->address
, &verify
)) != ERROR_OK
)
326 if (verify
!= arm7_9
->thumb_bkpt
)
328 LOG_ERROR("Unable to set thumb software breakpoint at address %08" PRIx32
" - check that memory is read/writable", breakpoint
->address
);
339 * Unsets an existing breakpoint on an ARM7/9 target. If it is a hardware
340 * breakpoint, the watchpoint used will be freed and the Embedded ICE registers
341 * will be updated. Otherwise, the software breakpoint will be restored to its
342 * original instruction if it hasn't already been modified.
344 * @param target Pointer to ARM7/9 target to unset the breakpoint from
345 * @param breakpoint Pointer to breakpoint to be unset
346 * @return For hardware breakpoints, this is the result of executing the JTAG
347 * queue. For software breakpoints, this will be the status of the
348 * required memory reads and writes
350 int arm7_9_unset_breakpoint(struct target_s
*target
, breakpoint_t
*breakpoint
)
352 int retval
= ERROR_OK
;
354 armv4_5_common_t
*armv4_5
= target
->arch_info
;
355 arm7_9_common_t
*arm7_9
= armv4_5
->arch_info
;
357 LOG_DEBUG("BPID: %d, Address: 0x%08" PRIx32
,
358 breakpoint
->unique_id
,
359 breakpoint
->address
);
361 if (!breakpoint
->set
)
363 LOG_WARNING("breakpoint not set");
367 if (breakpoint
->type
== BKPT_HARD
)
369 LOG_DEBUG("BPID: %d Releasing hw wp: %d",
370 breakpoint
->unique_id
,
372 if (breakpoint
->set
== 1)
374 embeddedice_set_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W0_CONTROL_VALUE
], 0x0);
375 arm7_9
->wp0_used
= 0;
376 arm7_9
->wp_available
++;
378 else if (breakpoint
->set
== 2)
380 embeddedice_set_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W1_CONTROL_VALUE
], 0x0);
381 arm7_9
->wp1_used
= 0;
382 arm7_9
->wp_available
++;
384 retval
= jtag_execute_queue();
389 /* restore original instruction (kept in target endianness) */
390 if (breakpoint
->length
== 4)
392 uint32_t current_instr
;
393 /* check that user program as not modified breakpoint instruction */
394 if ((retval
= target_read_memory(target
, breakpoint
->address
, 4, 1, (uint8_t*)¤t_instr
)) != ERROR_OK
)
398 if (current_instr
== arm7_9
->arm_bkpt
)
399 if ((retval
= target_write_memory(target
, breakpoint
->address
, 4, 1, breakpoint
->orig_instr
)) != ERROR_OK
)
406 uint16_t current_instr
;
407 /* check that user program as not modified breakpoint instruction */
408 if ((retval
= target_read_memory(target
, breakpoint
->address
, 2, 1, (uint8_t*)¤t_instr
)) != ERROR_OK
)
412 if (current_instr
== arm7_9
->thumb_bkpt
)
413 if ((retval
= target_write_memory(target
, breakpoint
->address
, 2, 1, breakpoint
->orig_instr
)) != ERROR_OK
)
425 * Add a breakpoint to an ARM7/9 target. This makes sure that there are no
426 * dangling breakpoints and that the desired breakpoint can be added.
428 * @param target Pointer to the target ARM7/9 device to add a breakpoint to
429 * @param breakpoint Pointer to the breakpoint to be added
430 * @return An error status if there is a problem adding the breakpoint or the
431 * result of setting the breakpoint
433 int arm7_9_add_breakpoint(struct target_s
*target
, breakpoint_t
*breakpoint
)
435 armv4_5_common_t
*armv4_5
= target
->arch_info
;
436 arm7_9_common_t
*arm7_9
= armv4_5
->arch_info
;
438 if (target
->state
!= TARGET_HALTED
)
440 LOG_WARNING("target not halted");
441 return ERROR_TARGET_NOT_HALTED
;
444 if (arm7_9
->breakpoint_count
== 0)
446 /* make sure we don't have any dangling breakpoints. This is vital upon
447 * GDB connect/disconnect
449 arm7_9_clear_watchpoints(arm7_9
);
452 if ((breakpoint
->type
== BKPT_HARD
) && (arm7_9
->wp_available
< 1))
454 LOG_INFO("no watchpoint unit available for hardware breakpoint");
455 return ERROR_TARGET_RESOURCE_NOT_AVAILABLE
;
458 if ((breakpoint
->length
!= 2) && (breakpoint
->length
!= 4))
460 LOG_INFO("only breakpoints of two (Thumb) or four (ARM) bytes length supported");
461 return ERROR_TARGET_RESOURCE_NOT_AVAILABLE
;
464 if (breakpoint
->type
== BKPT_HARD
)
466 arm7_9_assign_wp(arm7_9
, breakpoint
);
469 arm7_9
->breakpoint_count
++;
471 return arm7_9_set_breakpoint(target
, breakpoint
);
475 * Removes a breakpoint from an ARM7/9 target. This will make sure there are no
476 * dangling breakpoints and updates available watchpoints if it is a hardware
479 * @param target Pointer to the target to have a breakpoint removed
480 * @param breakpoint Pointer to the breakpoint to be removed
481 * @return Error status if there was a problem unsetting the breakpoint or the
482 * watchpoints could not be cleared
484 int arm7_9_remove_breakpoint(struct target_s
*target
, breakpoint_t
*breakpoint
)
486 int retval
= ERROR_OK
;
487 armv4_5_common_t
*armv4_5
= target
->arch_info
;
488 arm7_9_common_t
*arm7_9
= armv4_5
->arch_info
;
490 if ((retval
= arm7_9_unset_breakpoint(target
, breakpoint
)) != ERROR_OK
)
495 if (breakpoint
->type
== BKPT_HARD
)
496 arm7_9
->wp_available
++;
498 arm7_9
->breakpoint_count
--;
499 if (arm7_9
->breakpoint_count
== 0)
501 /* make sure we don't have any dangling breakpoints */
502 if ((retval
= arm7_9_clear_watchpoints(arm7_9
)) != ERROR_OK
)
512 * Sets a watchpoint for an ARM7/9 target in one of the watchpoint units. It is
513 * considered a bug to call this function when there are no available watchpoint
516 * @param target Pointer to an ARM7/9 target to set a watchpoint on
517 * @param watchpoint Pointer to the watchpoint to be set
518 * @return Error status if watchpoint set fails or the result of executing the
521 int arm7_9_set_watchpoint(struct target_s
*target
, watchpoint_t
*watchpoint
)
523 int retval
= ERROR_OK
;
524 armv4_5_common_t
*armv4_5
= target
->arch_info
;
525 arm7_9_common_t
*arm7_9
= armv4_5
->arch_info
;
529 mask
= watchpoint
->length
- 1;
531 if (target
->state
!= TARGET_HALTED
)
533 LOG_WARNING("target not halted");
534 return ERROR_TARGET_NOT_HALTED
;
537 if (watchpoint
->rw
== WPT_ACCESS
)
542 if (!arm7_9
->wp0_used
)
544 embeddedice_set_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W0_ADDR_VALUE
], watchpoint
->address
);
545 embeddedice_set_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W0_ADDR_MASK
], mask
);
546 embeddedice_set_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W0_DATA_MASK
], watchpoint
->mask
);
547 if (watchpoint
->mask
!= 0xffffffffu
)
548 embeddedice_set_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W0_DATA_VALUE
], watchpoint
->value
);
549 embeddedice_set_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W0_CONTROL_MASK
], 0xff & ~EICE_W_CTRL_nOPC
& ~rw_mask
);
550 embeddedice_set_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W0_CONTROL_VALUE
], EICE_W_CTRL_ENABLE
| EICE_W_CTRL_nOPC
| (watchpoint
->rw
& 1));
552 if ((retval
= jtag_execute_queue()) != ERROR_OK
)
557 arm7_9
->wp0_used
= 2;
559 else if (!arm7_9
->wp1_used
)
561 embeddedice_set_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W1_ADDR_VALUE
], watchpoint
->address
);
562 embeddedice_set_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W1_ADDR_MASK
], mask
);
563 embeddedice_set_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W1_DATA_MASK
], watchpoint
->mask
);
564 if (watchpoint
->mask
!= 0xffffffffu
)
565 embeddedice_set_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W1_DATA_VALUE
], watchpoint
->value
);
566 embeddedice_set_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W1_CONTROL_MASK
], 0xff & ~EICE_W_CTRL_nOPC
& ~rw_mask
);
567 embeddedice_set_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W1_CONTROL_VALUE
], EICE_W_CTRL_ENABLE
| EICE_W_CTRL_nOPC
| (watchpoint
->rw
& 1));
569 if ((retval
= jtag_execute_queue()) != ERROR_OK
)
574 arm7_9
->wp1_used
= 2;
578 LOG_ERROR("BUG: no hardware comparator available");
586 * Unset an existing watchpoint and clear the used watchpoint unit.
588 * @param target Pointer to the target to have the watchpoint removed
589 * @param watchpoint Pointer to the watchpoint to be removed
590 * @return Error status while trying to unset the watchpoint or the result of
591 * executing the JTAG queue
593 int arm7_9_unset_watchpoint(struct target_s
*target
, watchpoint_t
*watchpoint
)
595 int retval
= ERROR_OK
;
596 armv4_5_common_t
*armv4_5
= target
->arch_info
;
597 arm7_9_common_t
*arm7_9
= armv4_5
->arch_info
;
599 if (target
->state
!= TARGET_HALTED
)
601 LOG_WARNING("target not halted");
602 return ERROR_TARGET_NOT_HALTED
;
605 if (!watchpoint
->set
)
607 LOG_WARNING("breakpoint not set");
611 if (watchpoint
->set
== 1)
613 embeddedice_set_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W0_CONTROL_VALUE
], 0x0);
614 if ((retval
= jtag_execute_queue()) != ERROR_OK
)
618 arm7_9
->wp0_used
= 0;
620 else if (watchpoint
->set
== 2)
622 embeddedice_set_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W1_CONTROL_VALUE
], 0x0);
623 if ((retval
= jtag_execute_queue()) != ERROR_OK
)
627 arm7_9
->wp1_used
= 0;
635 * Add a watchpoint to an ARM7/9 target. If there are no watchpoint units
636 * available, an error response is returned.
638 * @param target Pointer to the ARM7/9 target to add a watchpoint to
639 * @param watchpoint Pointer to the watchpoint to be added
640 * @return Error status while trying to add the watchpoint
642 int arm7_9_add_watchpoint(struct target_s
*target
, watchpoint_t
*watchpoint
)
644 armv4_5_common_t
*armv4_5
= target
->arch_info
;
645 arm7_9_common_t
*arm7_9
= armv4_5
->arch_info
;
647 if (target
->state
!= TARGET_HALTED
)
649 LOG_WARNING("target not halted");
650 return ERROR_TARGET_NOT_HALTED
;
653 if (arm7_9
->wp_available
< 1)
655 return ERROR_TARGET_RESOURCE_NOT_AVAILABLE
;
658 if ((watchpoint
->length
!= 1) && (watchpoint
->length
!= 2) && (watchpoint
->length
!= 4))
660 return ERROR_TARGET_RESOURCE_NOT_AVAILABLE
;
663 arm7_9
->wp_available
--;
669 * Remove a watchpoint from an ARM7/9 target. The watchpoint will be unset and
670 * the used watchpoint unit will be reopened.
672 * @param target Pointer to the target to remove a watchpoint from
673 * @param watchpoint Pointer to the watchpoint to be removed
674 * @return Result of trying to unset the watchpoint
676 int arm7_9_remove_watchpoint(struct target_s
*target
, watchpoint_t
*watchpoint
)
678 int retval
= ERROR_OK
;
679 armv4_5_common_t
*armv4_5
= target
->arch_info
;
680 arm7_9_common_t
*arm7_9
= armv4_5
->arch_info
;
684 if ((retval
= arm7_9_unset_watchpoint(target
, watchpoint
)) != ERROR_OK
)
690 arm7_9
->wp_available
++;
696 * Restarts the target by sending a RESTART instruction and moving the JTAG
697 * state to IDLE. This includes a timeout waiting for DBGACK and SYSCOMP to be
698 * asserted by the processor.
700 * @param target Pointer to target to issue commands to
701 * @return Error status if there is a timeout or a problem while executing the
704 int arm7_9_execute_sys_speed(struct target_s
*target
)
708 armv4_5_common_t
*armv4_5
= target
->arch_info
;
709 arm7_9_common_t
*arm7_9
= armv4_5
->arch_info
;
710 arm_jtag_t
*jtag_info
= &arm7_9
->jtag_info
;
711 reg_t
*dbg_stat
= &arm7_9
->eice_cache
->reg_list
[EICE_DBG_STAT
];
713 /* set RESTART instruction */
714 jtag_set_end_state(TAP_IDLE
);
715 if (arm7_9
->need_bypass_before_restart
) {
716 arm7_9
->need_bypass_before_restart
= 0;
717 arm_jtag_set_instr(jtag_info
, 0xf, NULL
);
719 arm_jtag_set_instr(jtag_info
, 0x4, NULL
);
721 long long then
= timeval_ms();
723 while (!(timeout
= ((timeval_ms()-then
) > 1000)))
725 /* read debug status register */
726 embeddedice_read_reg(dbg_stat
);
727 if ((retval
= jtag_execute_queue()) != ERROR_OK
)
729 if ((buf_get_u32(dbg_stat
->value
, EICE_DBG_STATUS_DBGACK
, 1))
730 && (buf_get_u32(dbg_stat
->value
, EICE_DBG_STATUS_SYSCOMP
, 1)))
732 if (debug_level
>= 3)
742 LOG_ERROR("timeout waiting for SYSCOMP & DBGACK, last DBG_STATUS: %" PRIx32
"", buf_get_u32(dbg_stat
->value
, 0, dbg_stat
->size
));
743 return ERROR_TARGET_TIMEOUT
;
750 * Restarts the target by sending a RESTART instruction and moving the JTAG
751 * state to IDLE. This validates that DBGACK and SYSCOMP are set without
752 * waiting until they are.
754 * @param target Pointer to the target to issue commands to
755 * @return Always ERROR_OK
757 int arm7_9_execute_fast_sys_speed(struct target_s
*target
)
760 static uint8_t check_value
[4], check_mask
[4];
762 armv4_5_common_t
*armv4_5
= target
->arch_info
;
763 arm7_9_common_t
*arm7_9
= armv4_5
->arch_info
;
764 arm_jtag_t
*jtag_info
= &arm7_9
->jtag_info
;
765 reg_t
*dbg_stat
= &arm7_9
->eice_cache
->reg_list
[EICE_DBG_STAT
];
767 /* set RESTART instruction */
768 jtag_set_end_state(TAP_IDLE
);
769 if (arm7_9
->need_bypass_before_restart
) {
770 arm7_9
->need_bypass_before_restart
= 0;
771 arm_jtag_set_instr(jtag_info
, 0xf, NULL
);
773 arm_jtag_set_instr(jtag_info
, 0x4, NULL
);
777 /* check for DBGACK and SYSCOMP set (others don't care) */
779 /* NB! These are constants that must be available until after next jtag_execute() and
780 * we evaluate the values upon first execution in lieu of setting up these constants
781 * during early setup.
783 buf_set_u32(check_value
, 0, 32, 0x9);
784 buf_set_u32(check_mask
, 0, 32, 0x9);
788 /* read debug status register */
789 embeddedice_read_reg_w_check(dbg_stat
, check_value
, check_mask
);
795 * Get some data from the ARM7/9 target.
797 * @param target Pointer to the ARM7/9 target to read data from
798 * @param size The number of 32bit words to be read
799 * @param buffer Pointer to the buffer that will hold the data
800 * @return The result of receiving data from the Embedded ICE unit
802 int arm7_9_target_request_data(target_t
*target
, uint32_t size
, uint8_t *buffer
)
804 armv4_5_common_t
*armv4_5
= target
->arch_info
;
805 arm7_9_common_t
*arm7_9
= armv4_5
->arch_info
;
806 arm_jtag_t
*jtag_info
= &arm7_9
->jtag_info
;
808 int retval
= ERROR_OK
;
811 data
= malloc(size
* (sizeof(uint32_t)));
813 retval
= embeddedice_receive(jtag_info
, data
, size
);
815 /* return the 32-bit ints in the 8-bit array */
816 for (i
= 0; i
< size
; i
++)
818 h_u32_to_le(buffer
+ (i
* 4), data
[i
]);
827 * Handles requests to an ARM7/9 target. If debug messaging is enabled, the
828 * target is running and the DCC control register has the W bit high, this will
829 * execute the request on the target.
831 * @param priv Void pointer expected to be a target_t pointer
832 * @return ERROR_OK unless there are issues with the JTAG queue or when reading
833 * from the Embedded ICE unit
835 int arm7_9_handle_target_request(void *priv
)
837 int retval
= ERROR_OK
;
838 target_t
*target
= priv
;
839 if (!target_was_examined(target
))
841 armv4_5_common_t
*armv4_5
= target
->arch_info
;
842 arm7_9_common_t
*arm7_9
= armv4_5
->arch_info
;
843 arm_jtag_t
*jtag_info
= &arm7_9
->jtag_info
;
844 reg_t
*dcc_control
= &arm7_9
->eice_cache
->reg_list
[EICE_COMMS_CTRL
];
846 if (!target
->dbg_msg_enabled
)
849 if (target
->state
== TARGET_RUNNING
)
851 /* read DCC control register */
852 embeddedice_read_reg(dcc_control
);
853 if ((retval
= jtag_execute_queue()) != ERROR_OK
)
859 if (buf_get_u32(dcc_control
->value
, 1, 1) == 1)
863 if ((retval
= embeddedice_receive(jtag_info
, &request
, 1)) != ERROR_OK
)
867 if ((retval
= target_request(target
, request
)) != ERROR_OK
)
878 * Polls an ARM7/9 target for its current status. If DBGACK is set, the target
879 * is manipulated to the right halted state based on its current state. This is
883 * <tr><th > State</th><th > Action</th></tr>
884 * <tr><td > TARGET_RUNNING | TARGET_RESET</td><td > Enters debug mode. If TARGET_RESET, pc may be checked</td></tr>
885 * <tr><td > TARGET_UNKNOWN</td><td > Warning is logged</td></tr>
886 * <tr><td > TARGET_DEBUG_RUNNING</td><td > Enters debug mode</td></tr>
887 * <tr><td > TARGET_HALTED</td><td > Nothing</td></tr>
890 * If the target does not end up in the halted state, a warning is produced. If
891 * DBGACK is cleared, then the target is expected to either be running or
894 * @param target Pointer to the ARM7/9 target to poll
895 * @return ERROR_OK or an error status if a command fails
897 int arm7_9_poll(target_t
*target
)
900 armv4_5_common_t
*armv4_5
= target
->arch_info
;
901 arm7_9_common_t
*arm7_9
= armv4_5
->arch_info
;
902 reg_t
*dbg_stat
= &arm7_9
->eice_cache
->reg_list
[EICE_DBG_STAT
];
904 /* read debug status register */
905 embeddedice_read_reg(dbg_stat
);
906 if ((retval
= jtag_execute_queue()) != ERROR_OK
)
911 if (buf_get_u32(dbg_stat
->value
, EICE_DBG_STATUS_DBGACK
, 1))
913 /* LOG_DEBUG("DBGACK set, dbg_state->value: 0x%x", buf_get_u32(dbg_stat->value, 0, 32));*/
914 if (target
->state
== TARGET_UNKNOWN
)
916 /* Starting OpenOCD with target in debug-halt */
917 target
->state
= TARGET_RUNNING
;
918 LOG_DEBUG("DBGACK already set during server startup.");
920 if ((target
->state
== TARGET_RUNNING
) || (target
->state
== TARGET_RESET
))
923 if (target
->state
== TARGET_RESET
)
925 if (target
->reset_halt
)
927 enum reset_types jtag_reset_config
= jtag_get_reset_config();
928 if ((jtag_reset_config
& RESET_SRST_PULLS_TRST
) == 0)
935 target
->state
= TARGET_HALTED
;
937 if ((retval
= arm7_9_debug_entry(target
)) != ERROR_OK
)
942 reg_t
*reg
= register_get_by_name(target
->reg_cache
, "pc", 1);
943 uint32_t t
=*((uint32_t *)reg
->value
);
946 LOG_ERROR("PC was not 0. Does this target need srst_pulls_trst?");
950 if ((retval
= target_call_event_callbacks(target
, TARGET_EVENT_HALTED
)) != ERROR_OK
)
955 if (target
->state
== TARGET_DEBUG_RUNNING
)
957 target
->state
= TARGET_HALTED
;
958 if ((retval
= arm7_9_debug_entry(target
)) != ERROR_OK
)
961 if ((retval
= target_call_event_callbacks(target
, TARGET_EVENT_DEBUG_HALTED
)) != ERROR_OK
)
966 if (target
->state
!= TARGET_HALTED
)
968 LOG_WARNING("DBGACK set, but the target did not end up in the halted state %d", target
->state
);
973 if (target
->state
!= TARGET_DEBUG_RUNNING
)
974 target
->state
= TARGET_RUNNING
;
981 * Asserts the reset (SRST) on an ARM7/9 target. Some -S targets (ARM966E-S in
982 * the STR912 isn't affected, ARM926EJ-S in the LPC3180 and AT91SAM9260 is
983 * affected) completely stop the JTAG clock while the core is held in reset
984 * (SRST). It isn't possible to program the halt condition once reset is
985 * asserted, hence a hook that allows the target to set up its reset-halt
986 * condition is setup prior to asserting reset.
988 * @param target Pointer to an ARM7/9 target to assert reset on
989 * @return ERROR_FAIL if the JTAG device does not have SRST, otherwise ERROR_OK
991 int arm7_9_assert_reset(target_t
*target
)
993 armv4_5_common_t
*armv4_5
= target
->arch_info
;
994 arm7_9_common_t
*arm7_9
= armv4_5
->arch_info
;
995 LOG_DEBUG("target->state: %s",
996 target_state_name(target
));
998 enum reset_types jtag_reset_config
= jtag_get_reset_config();
999 if (!(jtag_reset_config
& RESET_HAS_SRST
))
1001 LOG_ERROR("Can't assert SRST");
1005 if (target
->reset_halt
)
1008 * Some targets do not support communication while SRST is asserted. We need to
1009 * set up the reset vector catch here.
1011 * If TRST is asserted, then these settings will be reset anyway, so setting them
1014 if (arm7_9
->has_vector_catch
)
1016 /* program vector catch register to catch reset vector */
1017 embeddedice_write_reg(&arm7_9
->eice_cache
->reg_list
[EICE_VEC_CATCH
], 0x1);
1021 /* program watchpoint unit to match on reset vector address */
1022 embeddedice_write_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W0_ADDR_VALUE
], 0x0);
1023 embeddedice_write_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W0_ADDR_MASK
], 0x3);
1024 embeddedice_write_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W0_DATA_MASK
], 0xffffffff);
1025 embeddedice_write_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W0_CONTROL_VALUE
], EICE_W_CTRL_ENABLE
);
1026 embeddedice_write_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W0_CONTROL_MASK
], ~EICE_W_CTRL_nOPC
& 0xff);
1030 /* here we should issue an SRST only, but we may have to assert TRST as well */
1031 if (jtag_reset_config
& RESET_SRST_PULLS_TRST
)
1033 jtag_add_reset(1, 1);
1036 jtag_add_reset(0, 1);
1039 target
->state
= TARGET_RESET
;
1040 jtag_add_sleep(50000);
1042 armv4_5_invalidate_core_regs(target
);
1044 if ((target
->reset_halt
) && ((jtag_reset_config
& RESET_SRST_PULLS_TRST
) == 0))
1046 /* debug entry was already prepared in arm7_9_assert_reset() */
1047 target
->debug_reason
= DBG_REASON_DBGRQ
;
1054 * Deassert the reset (SRST) signal on an ARM7/9 target. If SRST pulls TRST
1055 * and the target is being reset into a halt, a warning will be triggered
1056 * because it is not possible to reset into a halted mode in this case. The
1057 * target is halted using the target's functions.
1059 * @param target Pointer to the target to have the reset deasserted
1060 * @return ERROR_OK or an error from polling or halting the target
1062 int arm7_9_deassert_reset(target_t
*target
)
1064 int retval
= ERROR_OK
;
1065 LOG_DEBUG("target->state: %s",
1066 target_state_name(target
));
1068 /* deassert reset lines */
1069 jtag_add_reset(0, 0);
1071 enum reset_types jtag_reset_config
= jtag_get_reset_config();
1072 if (target
->reset_halt
&& (jtag_reset_config
& RESET_SRST_PULLS_TRST
) != 0)
1074 LOG_WARNING("srst pulls trst - can not reset into halted mode. Issuing halt after reset.");
1075 /* set up embedded ice registers again */
1076 if ((retval
= target_examine_one(target
)) != ERROR_OK
)
1079 if ((retval
= target_poll(target
)) != ERROR_OK
)
1084 if ((retval
= target_halt(target
)) != ERROR_OK
)
1094 * Clears the halt condition for an ARM7/9 target. If it isn't coming out of
1095 * reset and if DBGRQ is used, it is progammed to be deasserted. If the reset
1096 * vector catch was used, it is restored. Otherwise, the control value is
1097 * restored and the watchpoint unit is restored if it was in use.
1099 * @param target Pointer to the ARM7/9 target to have halt cleared
1100 * @return Always ERROR_OK
1102 int arm7_9_clear_halt(target_t
*target
)
1104 armv4_5_common_t
*armv4_5
= target
->arch_info
;
1105 arm7_9_common_t
*arm7_9
= armv4_5
->arch_info
;
1106 reg_t
*dbg_ctrl
= &arm7_9
->eice_cache
->reg_list
[EICE_DBG_CTRL
];
1108 /* we used DBGRQ only if we didn't come out of reset */
1109 if (!arm7_9
->debug_entry_from_reset
&& arm7_9
->use_dbgrq
)
1111 /* program EmbeddedICE Debug Control Register to deassert DBGRQ
1113 buf_set_u32(dbg_ctrl
->value
, EICE_DBG_CONTROL_DBGRQ
, 1, 0);
1114 embeddedice_store_reg(dbg_ctrl
);
1118 if (arm7_9
->debug_entry_from_reset
&& arm7_9
->has_vector_catch
)
1120 /* if we came out of reset, and vector catch is supported, we used
1121 * vector catch to enter debug state
1122 * restore the register in that case
1124 embeddedice_store_reg(&arm7_9
->eice_cache
->reg_list
[EICE_VEC_CATCH
]);
1128 /* restore registers if watchpoint unit 0 was in use
1130 if (arm7_9
->wp0_used
)
1132 if (arm7_9
->debug_entry_from_reset
)
1134 embeddedice_store_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W0_ADDR_VALUE
]);
1136 embeddedice_store_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W0_ADDR_MASK
]);
1137 embeddedice_store_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W0_DATA_MASK
]);
1138 embeddedice_store_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W0_CONTROL_MASK
]);
1140 /* control value always has to be restored, as it was either disabled,
1141 * or enabled with possibly different bits
1143 embeddedice_store_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W0_CONTROL_VALUE
]);
1151 * Issue a software reset and halt to an ARM7/9 target. The target is halted
1152 * and then there is a wait until the processor shows the halt. This wait can
1153 * timeout and results in an error being returned. The software reset involves
1154 * clearing the halt, updating the debug control register, changing to ARM mode,
1155 * reset of the program counter, and reset of all of the registers.
1157 * @param target Pointer to the ARM7/9 target to be reset and halted by software
1158 * @return Error status if any of the commands fail, otherwise ERROR_OK
1160 int arm7_9_soft_reset_halt(struct target_s
*target
)
1162 armv4_5_common_t
*armv4_5
= target
->arch_info
;
1163 arm7_9_common_t
*arm7_9
= armv4_5
->arch_info
;
1164 reg_t
*dbg_stat
= &arm7_9
->eice_cache
->reg_list
[EICE_DBG_STAT
];
1165 reg_t
*dbg_ctrl
= &arm7_9
->eice_cache
->reg_list
[EICE_DBG_CTRL
];
1169 if ((retval
= target_halt(target
)) != ERROR_OK
)
1172 long long then
= timeval_ms();
1174 while (!(timeout
= ((timeval_ms()-then
) > 1000)))
1176 if (buf_get_u32(dbg_stat
->value
, EICE_DBG_STATUS_DBGACK
, 1) != 0)
1178 embeddedice_read_reg(dbg_stat
);
1179 if ((retval
= jtag_execute_queue()) != ERROR_OK
)
1181 if (debug_level
>= 3)
1191 LOG_ERROR("Failed to halt CPU after 1 sec");
1192 return ERROR_TARGET_TIMEOUT
;
1194 target
->state
= TARGET_HALTED
;
1196 /* program EmbeddedICE Debug Control Register to assert DBGACK and INTDIS
1197 * ensure that DBGRQ is cleared
1199 buf_set_u32(dbg_ctrl
->value
, EICE_DBG_CONTROL_DBGACK
, 1, 1);
1200 buf_set_u32(dbg_ctrl
->value
, EICE_DBG_CONTROL_DBGRQ
, 1, 0);
1201 buf_set_u32(dbg_ctrl
->value
, EICE_DBG_CONTROL_INTDIS
, 1, 1);
1202 embeddedice_store_reg(dbg_ctrl
);
1204 if ((retval
= arm7_9_clear_halt(target
)) != ERROR_OK
)
1209 /* if the target is in Thumb state, change to ARM state */
1210 if (buf_get_u32(dbg_stat
->value
, EICE_DBG_STATUS_ITBIT
, 1))
1212 uint32_t r0_thumb
, pc_thumb
;
1213 LOG_DEBUG("target entered debug from Thumb state, changing to ARM");
1214 /* Entered debug from Thumb mode */
1215 armv4_5
->core_state
= ARMV4_5_STATE_THUMB
;
1216 arm7_9
->change_to_arm(target
, &r0_thumb
, &pc_thumb
);
1219 /* all register content is now invalid */
1220 if ((retval
= armv4_5_invalidate_core_regs(target
)) != ERROR_OK
)
1225 /* SVC, ARM state, IRQ and FIQ disabled */
1226 buf_set_u32(armv4_5
->core_cache
->reg_list
[ARMV4_5_CPSR
].value
, 0, 8, 0xd3);
1227 armv4_5
->core_cache
->reg_list
[ARMV4_5_CPSR
].dirty
= 1;
1228 armv4_5
->core_cache
->reg_list
[ARMV4_5_CPSR
].valid
= 1;
1230 /* start fetching from 0x0 */
1231 buf_set_u32(armv4_5
->core_cache
->reg_list
[15].value
, 0, 32, 0x0);
1232 armv4_5
->core_cache
->reg_list
[15].dirty
= 1;
1233 armv4_5
->core_cache
->reg_list
[15].valid
= 1;
1235 armv4_5
->core_mode
= ARMV4_5_MODE_SVC
;
1236 armv4_5
->core_state
= ARMV4_5_STATE_ARM
;
1238 if (armv4_5_mode_to_number(armv4_5
->core_mode
)==-1)
1241 /* reset registers */
1242 for (i
= 0; i
<= 14; i
++)
1244 buf_set_u32(ARMV4_5_CORE_REG_MODE(armv4_5
->core_cache
, armv4_5
->core_mode
, i
).value
, 0, 32, 0xffffffff);
1245 ARMV4_5_CORE_REG_MODE(armv4_5
->core_cache
, armv4_5
->core_mode
, i
).dirty
= 1;
1246 ARMV4_5_CORE_REG_MODE(armv4_5
->core_cache
, armv4_5
->core_mode
, i
).valid
= 1;
1249 if ((retval
= target_call_event_callbacks(target
, TARGET_EVENT_HALTED
)) != ERROR_OK
)
1258 * Halt an ARM7/9 target. This is accomplished by either asserting the DBGRQ
1259 * line or by programming a watchpoint to trigger on any address. It is
1260 * considered a bug to call this function while the target is in the
1261 * TARGET_RESET state.
1263 * @param target Pointer to the ARM7/9 target to be halted
1264 * @return Always ERROR_OK
1266 int arm7_9_halt(target_t
*target
)
1268 if (target
->state
== TARGET_RESET
)
1270 LOG_ERROR("BUG: arm7/9 does not support halt during reset. This is handled in arm7_9_assert_reset()");
1274 armv4_5_common_t
*armv4_5
= target
->arch_info
;
1275 arm7_9_common_t
*arm7_9
= armv4_5
->arch_info
;
1276 reg_t
*dbg_ctrl
= &arm7_9
->eice_cache
->reg_list
[EICE_DBG_CTRL
];
1278 LOG_DEBUG("target->state: %s",
1279 target_state_name(target
));
1281 if (target
->state
== TARGET_HALTED
)
1283 LOG_DEBUG("target was already halted");
1287 if (target
->state
== TARGET_UNKNOWN
)
1289 LOG_WARNING("target was in unknown state when halt was requested");
1292 if (arm7_9
->use_dbgrq
)
1294 /* program EmbeddedICE Debug Control Register to assert DBGRQ
1296 if (arm7_9
->set_special_dbgrq
) {
1297 arm7_9
->set_special_dbgrq(target
);
1299 buf_set_u32(dbg_ctrl
->value
, EICE_DBG_CONTROL_DBGRQ
, 1, 1);
1300 embeddedice_store_reg(dbg_ctrl
);
1305 /* program watchpoint unit to match on any address
1307 embeddedice_write_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W0_ADDR_MASK
], 0xffffffff);
1308 embeddedice_write_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W0_DATA_MASK
], 0xffffffff);
1309 embeddedice_write_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W0_CONTROL_VALUE
], EICE_W_CTRL_ENABLE
);
1310 embeddedice_write_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W0_CONTROL_MASK
], ~EICE_W_CTRL_nOPC
& 0xff);
1313 target
->debug_reason
= DBG_REASON_DBGRQ
;
1319 * Handle an ARM7/9 target's entry into debug mode. The halt is cleared on the
1320 * ARM. The JTAG queue is then executed and the reason for debug entry is
1321 * examined. Once done, the target is verified to be halted and the processor
1322 * is forced into ARM mode. The core registers are saved for the current core
1323 * mode and the program counter (register 15) is updated as needed. The core
1324 * registers and CPSR and SPSR are saved for restoration later.
1326 * @param target Pointer to target that is entering debug mode
1327 * @return Error code if anything fails, otherwise ERROR_OK
1329 int arm7_9_debug_entry(target_t
*target
)
1332 uint32_t context
[16];
1333 uint32_t* context_p
[16];
1334 uint32_t r0_thumb
, pc_thumb
;
1337 /* get pointers to arch-specific information */
1338 armv4_5_common_t
*armv4_5
= target
->arch_info
;
1339 arm7_9_common_t
*arm7_9
= armv4_5
->arch_info
;
1340 reg_t
*dbg_stat
= &arm7_9
->eice_cache
->reg_list
[EICE_DBG_STAT
];
1341 reg_t
*dbg_ctrl
= &arm7_9
->eice_cache
->reg_list
[EICE_DBG_CTRL
];
1343 #ifdef _DEBUG_ARM7_9_
1347 if (arm7_9
->pre_debug_entry
)
1348 arm7_9
->pre_debug_entry(target
);
1350 /* program EmbeddedICE Debug Control Register to assert DBGACK and INTDIS
1351 * ensure that DBGRQ is cleared
1353 buf_set_u32(dbg_ctrl
->value
, EICE_DBG_CONTROL_DBGACK
, 1, 1);
1354 buf_set_u32(dbg_ctrl
->value
, EICE_DBG_CONTROL_DBGRQ
, 1, 0);
1355 buf_set_u32(dbg_ctrl
->value
, EICE_DBG_CONTROL_INTDIS
, 1, 1);
1356 embeddedice_store_reg(dbg_ctrl
);
1358 if ((retval
= arm7_9_clear_halt(target
)) != ERROR_OK
)
1363 if ((retval
= jtag_execute_queue()) != ERROR_OK
)
1368 if ((retval
= arm7_9
->examine_debug_reason(target
)) != ERROR_OK
)
1372 if (target
->state
!= TARGET_HALTED
)
1374 LOG_WARNING("target not halted");
1375 return ERROR_TARGET_NOT_HALTED
;
1378 /* if the target is in Thumb state, change to ARM state */
1379 if (buf_get_u32(dbg_stat
->value
, EICE_DBG_STATUS_ITBIT
, 1))
1381 LOG_DEBUG("target entered debug from Thumb state");
1382 /* Entered debug from Thumb mode */
1383 armv4_5
->core_state
= ARMV4_5_STATE_THUMB
;
1384 arm7_9
->change_to_arm(target
, &r0_thumb
, &pc_thumb
);
1385 LOG_DEBUG("r0_thumb: 0x%8.8" PRIx32
", pc_thumb: 0x%8.8" PRIx32
"", r0_thumb
, pc_thumb
);
1389 LOG_DEBUG("target entered debug from ARM state");
1390 /* Entered debug from ARM mode */
1391 armv4_5
->core_state
= ARMV4_5_STATE_ARM
;
1394 for (i
= 0; i
< 16; i
++)
1395 context_p
[i
] = &context
[i
];
1396 /* save core registers (r0 - r15 of current core mode) */
1397 arm7_9
->read_core_regs(target
, 0xffff, context_p
);
1399 arm7_9
->read_xpsr(target
, &cpsr
, 0);
1401 if ((retval
= jtag_execute_queue()) != ERROR_OK
)
1404 /* if the core has been executing in Thumb state, set the T bit */
1405 if (armv4_5
->core_state
== ARMV4_5_STATE_THUMB
)
1408 buf_set_u32(armv4_5
->core_cache
->reg_list
[ARMV4_5_CPSR
].value
, 0, 32, cpsr
);
1409 armv4_5
->core_cache
->reg_list
[ARMV4_5_CPSR
].dirty
= 0;
1410 armv4_5
->core_cache
->reg_list
[ARMV4_5_CPSR
].valid
= 1;
1412 armv4_5
->core_mode
= cpsr
& 0x1f;
1414 if (armv4_5_mode_to_number(armv4_5
->core_mode
) == -1)
1416 target
->state
= TARGET_UNKNOWN
;
1417 LOG_ERROR("cpsr contains invalid mode value - communication failure");
1418 return ERROR_TARGET_FAILURE
;
1421 LOG_DEBUG("target entered debug state in %s mode", armv4_5_mode_strings
[armv4_5_mode_to_number(armv4_5
->core_mode
)]);
1423 if (armv4_5
->core_state
== ARMV4_5_STATE_THUMB
)
1425 LOG_DEBUG("thumb state, applying fixups");
1426 context
[0] = r0_thumb
;
1427 context
[15] = pc_thumb
;
1428 } else if (armv4_5
->core_state
== ARMV4_5_STATE_ARM
)
1430 /* adjust value stored by STM */
1431 context
[15] -= 3 * 4;
1434 if ((target
->debug_reason
!= DBG_REASON_DBGRQ
) || (!arm7_9
->use_dbgrq
))
1435 context
[15] -= 3 * ((armv4_5
->core_state
== ARMV4_5_STATE_ARM
) ? 4 : 2);
1437 context
[15] -= arm7_9
->dbgreq_adjust_pc
* ((armv4_5
->core_state
== ARMV4_5_STATE_ARM
) ? 4 : 2);
1439 if (armv4_5_mode_to_number(armv4_5
->core_mode
)==-1)
1442 for (i
= 0; i
<= 15; i
++)
1444 LOG_DEBUG("r%i: 0x%8.8" PRIx32
"", i
, context
[i
]);
1445 buf_set_u32(ARMV4_5_CORE_REG_MODE(armv4_5
->core_cache
, armv4_5
->core_mode
, i
).value
, 0, 32, context
[i
]);
1446 ARMV4_5_CORE_REG_MODE(armv4_5
->core_cache
, armv4_5
->core_mode
, i
).dirty
= 0;
1447 ARMV4_5_CORE_REG_MODE(armv4_5
->core_cache
, armv4_5
->core_mode
, i
).valid
= 1;
1450 LOG_DEBUG("entered debug state at PC 0x%" PRIx32
"", context
[15]);
1452 if (armv4_5_mode_to_number(armv4_5
->core_mode
)==-1)
1455 /* exceptions other than USR & SYS have a saved program status register */
1456 if ((armv4_5
->core_mode
!= ARMV4_5_MODE_USR
) && (armv4_5
->core_mode
!= ARMV4_5_MODE_SYS
))
1459 arm7_9
->read_xpsr(target
, &spsr
, 1);
1460 if ((retval
= jtag_execute_queue()) != ERROR_OK
)
1464 buf_set_u32(ARMV4_5_CORE_REG_MODE(armv4_5
->core_cache
, armv4_5
->core_mode
, 16).value
, 0, 32, spsr
);
1465 ARMV4_5_CORE_REG_MODE(armv4_5
->core_cache
, armv4_5
->core_mode
, 16).dirty
= 0;
1466 ARMV4_5_CORE_REG_MODE(armv4_5
->core_cache
, armv4_5
->core_mode
, 16).valid
= 1;
1469 /* r0 and r15 (pc) have to be restored later */
1470 ARMV4_5_CORE_REG_MODE(armv4_5
->core_cache
, armv4_5
->core_mode
, 0).dirty
= ARMV4_5_CORE_REG_MODE(armv4_5
->core_cache
, armv4_5
->core_mode
, 0).valid
;
1471 ARMV4_5_CORE_REG_MODE(armv4_5
->core_cache
, armv4_5
->core_mode
, 15).dirty
= ARMV4_5_CORE_REG_MODE(armv4_5
->core_cache
, armv4_5
->core_mode
, 15).valid
;
1473 if ((retval
= jtag_execute_queue()) != ERROR_OK
)
1476 if (arm7_9
->post_debug_entry
)
1477 arm7_9
->post_debug_entry(target
);
1483 * Validate the full context for an ARM7/9 target in all processor modes. If
1484 * there are any invalid registers for the target, they will all be read. This
1487 * @param target Pointer to the ARM7/9 target to capture the full context from
1488 * @return Error if the target is not halted, has an invalid core mode, or if
1489 * the JTAG queue fails to execute
1491 int arm7_9_full_context(target_t
*target
)
1495 armv4_5_common_t
*armv4_5
= target
->arch_info
;
1496 arm7_9_common_t
*arm7_9
= armv4_5
->arch_info
;
1500 if (target
->state
!= TARGET_HALTED
)
1502 LOG_WARNING("target not halted");
1503 return ERROR_TARGET_NOT_HALTED
;
1506 if (armv4_5_mode_to_number(armv4_5
->core_mode
)==-1)
1509 /* iterate through processor modes (User, FIQ, IRQ, SVC, ABT, UND)
1510 * SYS shares registers with User, so we don't touch SYS
1512 for (i
= 0; i
< 6; i
++)
1515 uint32_t* reg_p
[16];
1519 /* check if there are invalid registers in the current mode
1521 for (j
= 0; j
<= 16; j
++)
1523 if (ARMV4_5_CORE_REG_MODE(armv4_5
->core_cache
, armv4_5_number_to_mode(i
), j
).valid
== 0)
1531 /* change processor mode (and mask T bit) */
1532 tmp_cpsr
= buf_get_u32(armv4_5
->core_cache
->reg_list
[ARMV4_5_CPSR
].value
, 0, 8) & 0xE0;
1533 tmp_cpsr
|= armv4_5_number_to_mode(i
);
1535 arm7_9
->write_xpsr_im8(target
, tmp_cpsr
& 0xff, 0, 0);
1537 for (j
= 0; j
< 15; j
++)
1539 if (ARMV4_5_CORE_REG_MODE(armv4_5
->core_cache
, armv4_5_number_to_mode(i
), j
).valid
== 0)
1541 reg_p
[j
] = (uint32_t*)ARMV4_5_CORE_REG_MODE(armv4_5
->core_cache
, armv4_5_number_to_mode(i
), j
).value
;
1543 ARMV4_5_CORE_REG_MODE(armv4_5
->core_cache
, armv4_5_number_to_mode(i
), j
).valid
= 1;
1544 ARMV4_5_CORE_REG_MODE(armv4_5
->core_cache
, armv4_5_number_to_mode(i
), j
).dirty
= 0;
1548 /* if only the PSR is invalid, mask is all zeroes */
1550 arm7_9
->read_core_regs(target
, mask
, reg_p
);
1552 /* check if the PSR has to be read */
1553 if (ARMV4_5_CORE_REG_MODE(armv4_5
->core_cache
, armv4_5_number_to_mode(i
), 16).valid
== 0)
1555 arm7_9
->read_xpsr(target
, (uint32_t*)ARMV4_5_CORE_REG_MODE(armv4_5
->core_cache
, armv4_5_number_to_mode(i
), 16).value
, 1);
1556 ARMV4_5_CORE_REG_MODE(armv4_5
->core_cache
, armv4_5_number_to_mode(i
), 16).valid
= 1;
1557 ARMV4_5_CORE_REG_MODE(armv4_5
->core_cache
, armv4_5_number_to_mode(i
), 16).dirty
= 0;
1562 /* restore processor mode (mask T bit) */
1563 arm7_9
->write_xpsr_im8(target
, buf_get_u32(armv4_5
->core_cache
->reg_list
[ARMV4_5_CPSR
].value
, 0, 8) & ~0x20, 0, 0);
1565 if ((retval
= jtag_execute_queue()) != ERROR_OK
)
1573 * Restore the processor context on an ARM7/9 target. The full processor
1574 * context is analyzed to see if any of the registers are dirty on this end, but
1575 * have a valid new value. If this is the case, the processor is changed to the
1576 * appropriate mode and the new register values are written out to the
1577 * processor. If there happens to be a dirty register with an invalid value, an
1578 * error will be logged.
1580 * @param target Pointer to the ARM7/9 target to have its context restored
1581 * @return Error status if the target is not halted or the core mode in the
1582 * armv4_5 struct is invalid.
1584 int arm7_9_restore_context(target_t
*target
)
1586 armv4_5_common_t
*armv4_5
= target
->arch_info
;
1587 arm7_9_common_t
*arm7_9
= armv4_5
->arch_info
;
1589 armv4_5_core_reg_t
*reg_arch_info
;
1590 enum armv4_5_mode current_mode
= armv4_5
->core_mode
;
1597 if (target
->state
!= TARGET_HALTED
)
1599 LOG_WARNING("target not halted");
1600 return ERROR_TARGET_NOT_HALTED
;
1603 if (arm7_9
->pre_restore_context
)
1604 arm7_9
->pre_restore_context(target
);
1606 if (armv4_5_mode_to_number(armv4_5
->core_mode
)==-1)
1609 /* iterate through processor modes (User, FIQ, IRQ, SVC, ABT, UND)
1610 * SYS shares registers with User, so we don't touch SYS
1612 for (i
= 0; i
< 6; i
++)
1614 LOG_DEBUG("examining %s mode", armv4_5_mode_strings
[i
]);
1617 /* check if there are dirty registers in the current mode
1619 for (j
= 0; j
<= 16; j
++)
1621 reg
= &ARMV4_5_CORE_REG_MODE(armv4_5
->core_cache
, armv4_5_number_to_mode(i
), j
);
1622 reg_arch_info
= reg
->arch_info
;
1623 if (reg
->dirty
== 1)
1625 if (reg
->valid
== 1)
1628 LOG_DEBUG("examining dirty reg: %s", reg
->name
);
1629 if ((reg_arch_info
->mode
!= ARMV4_5_MODE_ANY
)
1630 && (reg_arch_info
->mode
!= current_mode
)
1631 && !((reg_arch_info
->mode
== ARMV4_5_MODE_USR
) && (armv4_5
->core_mode
== ARMV4_5_MODE_SYS
))
1632 && !((reg_arch_info
->mode
== ARMV4_5_MODE_SYS
) && (armv4_5
->core_mode
== ARMV4_5_MODE_USR
)))
1635 LOG_DEBUG("require mode change");
1640 LOG_ERROR("BUG: dirty register '%s', but no valid data", reg
->name
);
1647 uint32_t mask
= 0x0;
1655 /* change processor mode (mask T bit) */
1656 tmp_cpsr
= buf_get_u32(armv4_5
->core_cache
->reg_list
[ARMV4_5_CPSR
].value
, 0, 8) & 0xE0;
1657 tmp_cpsr
|= armv4_5_number_to_mode(i
);
1659 arm7_9
->write_xpsr_im8(target
, tmp_cpsr
& 0xff, 0, 0);
1660 current_mode
= armv4_5_number_to_mode(i
);
1663 for (j
= 0; j
<= 14; j
++)
1665 reg
= &ARMV4_5_CORE_REG_MODE(armv4_5
->core_cache
, armv4_5_number_to_mode(i
), j
);
1666 reg_arch_info
= reg
->arch_info
;
1669 if (reg
->dirty
== 1)
1671 regs
[j
] = buf_get_u32(reg
->value
, 0, 32);
1676 LOG_DEBUG("writing register %i of mode %s with value 0x%8.8" PRIx32
"", j
, armv4_5_mode_strings
[i
], regs
[j
]);
1682 arm7_9
->write_core_regs(target
, mask
, regs
);
1685 reg
= &ARMV4_5_CORE_REG_MODE(armv4_5
->core_cache
, armv4_5_number_to_mode(i
), 16);
1686 reg_arch_info
= reg
->arch_info
;
1687 if ((reg
->dirty
) && (reg_arch_info
->mode
!= ARMV4_5_MODE_ANY
))
1689 LOG_DEBUG("writing SPSR of mode %i with value 0x%8.8" PRIx32
"", i
, buf_get_u32(reg
->value
, 0, 32));
1690 arm7_9
->write_xpsr(target
, buf_get_u32(reg
->value
, 0, 32), 1);
1695 if ((armv4_5
->core_cache
->reg_list
[ARMV4_5_CPSR
].dirty
== 0) && (armv4_5
->core_mode
!= current_mode
))
1697 /* restore processor mode (mask T bit) */
1700 tmp_cpsr
= buf_get_u32(armv4_5
->core_cache
->reg_list
[ARMV4_5_CPSR
].value
, 0, 8) & 0xE0;
1701 tmp_cpsr
|= armv4_5_number_to_mode(i
);
1703 LOG_DEBUG("writing lower 8 bit of cpsr with value 0x%2.2x", (unsigned)(tmp_cpsr
));
1704 arm7_9
->write_xpsr_im8(target
, tmp_cpsr
& 0xff, 0, 0);
1706 else if (armv4_5
->core_cache
->reg_list
[ARMV4_5_CPSR
].dirty
== 1)
1708 /* CPSR has been changed, full restore necessary (mask T bit) */
1709 LOG_DEBUG("writing cpsr with value 0x%8.8" PRIx32
"", buf_get_u32(armv4_5
->core_cache
->reg_list
[ARMV4_5_CPSR
].value
, 0, 32));
1710 arm7_9
->write_xpsr(target
, buf_get_u32(armv4_5
->core_cache
->reg_list
[ARMV4_5_CPSR
].value
, 0, 32) & ~0x20, 0);
1711 armv4_5
->core_cache
->reg_list
[ARMV4_5_CPSR
].dirty
= 0;
1712 armv4_5
->core_cache
->reg_list
[ARMV4_5_CPSR
].valid
= 1;
1716 LOG_DEBUG("writing PC with value 0x%8.8" PRIx32
"", buf_get_u32(armv4_5
->core_cache
->reg_list
[15].value
, 0, 32));
1717 arm7_9
->write_pc(target
, buf_get_u32(armv4_5
->core_cache
->reg_list
[15].value
, 0, 32));
1718 armv4_5
->core_cache
->reg_list
[15].dirty
= 0;
1720 if (arm7_9
->post_restore_context
)
1721 arm7_9
->post_restore_context(target
);
1727 * Restart the core of an ARM7/9 target. A RESTART command is sent to the
1728 * instruction register and the JTAG state is set to TAP_IDLE causing a core
1731 * @param target Pointer to the ARM7/9 target to be restarted
1732 * @return Result of executing the JTAG queue
1734 int arm7_9_restart_core(struct target_s
*target
)
1736 armv4_5_common_t
*armv4_5
= target
->arch_info
;
1737 arm7_9_common_t
*arm7_9
= armv4_5
->arch_info
;
1738 arm_jtag_t
*jtag_info
= &arm7_9
->jtag_info
;
1740 /* set RESTART instruction */
1741 jtag_set_end_state(TAP_IDLE
);
1742 if (arm7_9
->need_bypass_before_restart
) {
1743 arm7_9
->need_bypass_before_restart
= 0;
1744 arm_jtag_set_instr(jtag_info
, 0xf, NULL
);
1746 arm_jtag_set_instr(jtag_info
, 0x4, NULL
);
1748 jtag_add_runtest(1, jtag_set_end_state(TAP_IDLE
));
1749 return jtag_execute_queue();
1753 * Enable the watchpoints on an ARM7/9 target. The target's watchpoints are
1754 * iterated through and are set on the target if they aren't already set.
1756 * @param target Pointer to the ARM7/9 target to enable watchpoints on
1758 void arm7_9_enable_watchpoints(struct target_s
*target
)
1760 watchpoint_t
*watchpoint
= target
->watchpoints
;
1764 if (watchpoint
->set
== 0)
1765 arm7_9_set_watchpoint(target
, watchpoint
);
1766 watchpoint
= watchpoint
->next
;
1771 * Enable the breakpoints on an ARM7/9 target. The target's breakpoints are
1772 * iterated through and are set on the target.
1774 * @param target Pointer to the ARM7/9 target to enable breakpoints on
1776 void arm7_9_enable_breakpoints(struct target_s
*target
)
1778 breakpoint_t
*breakpoint
= target
->breakpoints
;
1780 /* set any pending breakpoints */
1783 arm7_9_set_breakpoint(target
, breakpoint
);
1784 breakpoint
= breakpoint
->next
;
1788 int arm7_9_resume(struct target_s
*target
, int current
, uint32_t address
, int handle_breakpoints
, int debug_execution
)
1790 armv4_5_common_t
*armv4_5
= target
->arch_info
;
1791 arm7_9_common_t
*arm7_9
= armv4_5
->arch_info
;
1792 breakpoint_t
*breakpoint
= target
->breakpoints
;
1793 reg_t
*dbg_ctrl
= &arm7_9
->eice_cache
->reg_list
[EICE_DBG_CTRL
];
1794 int err
, retval
= ERROR_OK
;
1798 if (target
->state
!= TARGET_HALTED
)
1800 LOG_WARNING("target not halted");
1801 return ERROR_TARGET_NOT_HALTED
;
1804 if (!debug_execution
)
1806 target_free_all_working_areas(target
);
1809 /* current = 1: continue on current pc, otherwise continue at <address> */
1811 buf_set_u32(armv4_5
->core_cache
->reg_list
[15].value
, 0, 32, address
);
1813 uint32_t current_pc
;
1814 current_pc
= buf_get_u32(armv4_5
->core_cache
->reg_list
[15].value
, 0, 32);
1816 /* the front-end may request us not to handle breakpoints */
1817 if (handle_breakpoints
)
1819 if ((breakpoint
= breakpoint_find(target
, buf_get_u32(armv4_5
->core_cache
->reg_list
[15].value
, 0, 32))))
1821 LOG_DEBUG("unset breakpoint at 0x%8.8" PRIx32
" (id: %d)", breakpoint
->address
, breakpoint
->unique_id
);
1822 if ((retval
= arm7_9_unset_breakpoint(target
, breakpoint
)) != ERROR_OK
)
1827 /* calculate PC of next instruction */
1829 if ((retval
= arm_simulate_step(target
, &next_pc
)) != ERROR_OK
)
1831 uint32_t current_opcode
;
1832 target_read_u32(target
, current_pc
, ¤t_opcode
);
1833 LOG_ERROR("BUG: couldn't calculate PC of next instruction, current opcode was 0x%8.8" PRIx32
"", current_opcode
);
1837 LOG_DEBUG("enable single-step");
1838 arm7_9
->enable_single_step(target
, next_pc
);
1840 target
->debug_reason
= DBG_REASON_SINGLESTEP
;
1842 if ((retval
= arm7_9_restore_context(target
)) != ERROR_OK
)
1847 if (armv4_5
->core_state
== ARMV4_5_STATE_ARM
)
1848 arm7_9
->branch_resume(target
);
1849 else if (armv4_5
->core_state
== ARMV4_5_STATE_THUMB
)
1851 arm7_9
->branch_resume_thumb(target
);
1855 LOG_ERROR("unhandled core state");
1859 buf_set_u32(dbg_ctrl
->value
, EICE_DBG_CONTROL_DBGACK
, 1, 0);
1860 embeddedice_write_reg(dbg_ctrl
, buf_get_u32(dbg_ctrl
->value
, 0, dbg_ctrl
->size
));
1861 err
= arm7_9_execute_sys_speed(target
);
1863 LOG_DEBUG("disable single-step");
1864 arm7_9
->disable_single_step(target
);
1866 if (err
!= ERROR_OK
)
1868 if ((retval
= arm7_9_set_breakpoint(target
, breakpoint
)) != ERROR_OK
)
1872 target
->state
= TARGET_UNKNOWN
;
1876 arm7_9_debug_entry(target
);
1877 LOG_DEBUG("new PC after step: 0x%8.8" PRIx32
"", buf_get_u32(armv4_5
->core_cache
->reg_list
[15].value
, 0, 32));
1879 LOG_DEBUG("set breakpoint at 0x%8.8" PRIx32
"", breakpoint
->address
);
1880 if ((retval
= arm7_9_set_breakpoint(target
, breakpoint
)) != ERROR_OK
)
1887 /* enable any pending breakpoints and watchpoints */
1888 arm7_9_enable_breakpoints(target
);
1889 arm7_9_enable_watchpoints(target
);
1891 if ((retval
= arm7_9_restore_context(target
)) != ERROR_OK
)
1896 if (armv4_5
->core_state
== ARMV4_5_STATE_ARM
)
1898 arm7_9
->branch_resume(target
);
1900 else if (armv4_5
->core_state
== ARMV4_5_STATE_THUMB
)
1902 arm7_9
->branch_resume_thumb(target
);
1906 LOG_ERROR("unhandled core state");
1910 /* deassert DBGACK and INTDIS */
1911 buf_set_u32(dbg_ctrl
->value
, EICE_DBG_CONTROL_DBGACK
, 1, 0);
1912 /* INTDIS only when we really resume, not during debug execution */
1913 if (!debug_execution
)
1914 buf_set_u32(dbg_ctrl
->value
, EICE_DBG_CONTROL_INTDIS
, 1, 0);
1915 embeddedice_write_reg(dbg_ctrl
, buf_get_u32(dbg_ctrl
->value
, 0, dbg_ctrl
->size
));
1917 if ((retval
= arm7_9_restart_core(target
)) != ERROR_OK
)
1922 target
->debug_reason
= DBG_REASON_NOTHALTED
;
1924 if (!debug_execution
)
1926 /* registers are now invalid */
1927 armv4_5_invalidate_core_regs(target
);
1928 target
->state
= TARGET_RUNNING
;
1929 if ((retval
= target_call_event_callbacks(target
, TARGET_EVENT_RESUMED
)) != ERROR_OK
)
1936 target
->state
= TARGET_DEBUG_RUNNING
;
1937 if ((retval
= target_call_event_callbacks(target
, TARGET_EVENT_DEBUG_RESUMED
)) != ERROR_OK
)
1943 LOG_DEBUG("target resumed");
1948 void arm7_9_enable_eice_step(target_t
*target
, uint32_t next_pc
)
1950 armv4_5_common_t
*armv4_5
= target
->arch_info
;
1951 arm7_9_common_t
*arm7_9
= armv4_5
->arch_info
;
1953 uint32_t current_pc
;
1954 current_pc
= buf_get_u32(armv4_5
->core_cache
->reg_list
[15].value
, 0, 32);
1956 if (next_pc
!= current_pc
)
1958 /* setup an inverse breakpoint on the current PC
1959 * - comparator 1 matches the current address
1960 * - rangeout from comparator 1 is connected to comparator 0 rangein
1961 * - comparator 0 matches any address, as long as rangein is low */
1962 embeddedice_write_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W0_ADDR_MASK
], 0xffffffff);
1963 embeddedice_write_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W0_DATA_MASK
], 0xffffffff);
1964 embeddedice_write_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W0_CONTROL_VALUE
], EICE_W_CTRL_ENABLE
);
1965 embeddedice_write_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W0_CONTROL_MASK
], ~(EICE_W_CTRL_RANGE
| EICE_W_CTRL_nOPC
) & 0xff);
1966 embeddedice_write_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W1_ADDR_VALUE
], current_pc
);
1967 embeddedice_write_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W1_ADDR_MASK
], 0);
1968 embeddedice_write_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W1_DATA_MASK
], 0xffffffff);
1969 embeddedice_write_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W1_CONTROL_VALUE
], 0x0);
1970 embeddedice_write_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W1_CONTROL_MASK
], ~EICE_W_CTRL_nOPC
& 0xff);
1974 embeddedice_write_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W0_ADDR_MASK
], 0xffffffff);
1975 embeddedice_write_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W0_DATA_MASK
], 0xffffffff);
1976 embeddedice_write_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W0_CONTROL_VALUE
], 0x0);
1977 embeddedice_write_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W0_CONTROL_MASK
], 0xff);
1978 embeddedice_write_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W1_ADDR_VALUE
], next_pc
);
1979 embeddedice_write_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W1_ADDR_MASK
], 0);
1980 embeddedice_write_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W1_DATA_MASK
], 0xffffffff);
1981 embeddedice_write_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W1_CONTROL_VALUE
], EICE_W_CTRL_ENABLE
);
1982 embeddedice_write_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W1_CONTROL_MASK
], ~EICE_W_CTRL_nOPC
& 0xff);
1986 void arm7_9_disable_eice_step(target_t
*target
)
1988 armv4_5_common_t
*armv4_5
= target
->arch_info
;
1989 arm7_9_common_t
*arm7_9
= armv4_5
->arch_info
;
1991 embeddedice_store_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W0_ADDR_MASK
]);
1992 embeddedice_store_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W0_DATA_MASK
]);
1993 embeddedice_store_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W0_CONTROL_VALUE
]);
1994 embeddedice_store_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W0_CONTROL_MASK
]);
1995 embeddedice_store_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W1_ADDR_VALUE
]);
1996 embeddedice_store_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W1_ADDR_MASK
]);
1997 embeddedice_store_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W1_DATA_MASK
]);
1998 embeddedice_store_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W1_CONTROL_MASK
]);
1999 embeddedice_store_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W1_CONTROL_VALUE
]);
2002 int arm7_9_step(struct target_s
*target
, int current
, uint32_t address
, int handle_breakpoints
)
2004 armv4_5_common_t
*armv4_5
= target
->arch_info
;
2005 arm7_9_common_t
*arm7_9
= armv4_5
->arch_info
;
2006 breakpoint_t
*breakpoint
= NULL
;
2009 if (target
->state
!= TARGET_HALTED
)
2011 LOG_WARNING("target not halted");
2012 return ERROR_TARGET_NOT_HALTED
;
2015 /* current = 1: continue on current pc, otherwise continue at <address> */
2017 buf_set_u32(armv4_5
->core_cache
->reg_list
[15].value
, 0, 32, address
);
2019 uint32_t current_pc
;
2020 current_pc
= buf_get_u32(armv4_5
->core_cache
->reg_list
[15].value
, 0, 32);
2022 /* the front-end may request us not to handle breakpoints */
2023 if (handle_breakpoints
)
2024 if ((breakpoint
= breakpoint_find(target
, buf_get_u32(armv4_5
->core_cache
->reg_list
[15].value
, 0, 32))))
2025 if ((retval
= arm7_9_unset_breakpoint(target
, breakpoint
)) != ERROR_OK
)
2030 target
->debug_reason
= DBG_REASON_SINGLESTEP
;
2032 /* calculate PC of next instruction */
2034 if ((retval
= arm_simulate_step(target
, &next_pc
)) != ERROR_OK
)
2036 uint32_t current_opcode
;
2037 target_read_u32(target
, current_pc
, ¤t_opcode
);
2038 LOG_ERROR("BUG: couldn't calculate PC of next instruction, current opcode was 0x%8.8" PRIx32
"", current_opcode
);
2042 if ((retval
= arm7_9_restore_context(target
)) != ERROR_OK
)
2047 arm7_9
->enable_single_step(target
, next_pc
);
2049 if (armv4_5
->core_state
== ARMV4_5_STATE_ARM
)
2051 arm7_9
->branch_resume(target
);
2053 else if (armv4_5
->core_state
== ARMV4_5_STATE_THUMB
)
2055 arm7_9
->branch_resume_thumb(target
);
2059 LOG_ERROR("unhandled core state");
2063 if ((retval
= target_call_event_callbacks(target
, TARGET_EVENT_RESUMED
)) != ERROR_OK
)
2068 err
= arm7_9_execute_sys_speed(target
);
2069 arm7_9
->disable_single_step(target
);
2071 /* registers are now invalid */
2072 armv4_5_invalidate_core_regs(target
);
2074 if (err
!= ERROR_OK
)
2076 target
->state
= TARGET_UNKNOWN
;
2078 arm7_9_debug_entry(target
);
2079 if ((retval
= target_call_event_callbacks(target
, TARGET_EVENT_HALTED
)) != ERROR_OK
)
2083 LOG_DEBUG("target stepped");
2087 if ((retval
= arm7_9_set_breakpoint(target
, breakpoint
)) != ERROR_OK
)
2095 int arm7_9_read_core_reg(struct target_s
*target
, int num
, enum armv4_5_mode mode
)
2097 uint32_t* reg_p
[16];
2100 armv4_5_common_t
*armv4_5
= target
->arch_info
;
2101 arm7_9_common_t
*arm7_9
= armv4_5
->arch_info
;
2103 if (armv4_5_mode_to_number(armv4_5
->core_mode
)==-1)
2106 enum armv4_5_mode reg_mode
= ((armv4_5_core_reg_t
*)ARMV4_5_CORE_REG_MODE(armv4_5
->core_cache
, mode
, num
).arch_info
)->mode
;
2108 if ((num
< 0) || (num
> 16))
2109 return ERROR_INVALID_ARGUMENTS
;
2111 if ((mode
!= ARMV4_5_MODE_ANY
)
2112 && (mode
!= armv4_5
->core_mode
)
2113 && (reg_mode
!= ARMV4_5_MODE_ANY
))
2117 /* change processor mode (mask T bit) */
2118 tmp_cpsr
= buf_get_u32(armv4_5
->core_cache
->reg_list
[ARMV4_5_CPSR
].value
, 0, 8) & 0xE0;
2121 arm7_9
->write_xpsr_im8(target
, tmp_cpsr
& 0xff, 0, 0);
2124 if ((num
>= 0) && (num
<= 15))
2126 /* read a normal core register */
2127 reg_p
[num
] = &value
;
2129 arm7_9
->read_core_regs(target
, 1 << num
, reg_p
);
2133 /* read a program status register
2134 * if the register mode is MODE_ANY, we read the cpsr, otherwise a spsr
2136 armv4_5_core_reg_t
*arch_info
= ARMV4_5_CORE_REG_MODE(armv4_5
->core_cache
, mode
, num
).arch_info
;
2137 int spsr
= (arch_info
->mode
== ARMV4_5_MODE_ANY
) ? 0 : 1;
2139 arm7_9
->read_xpsr(target
, &value
, spsr
);
2142 if ((retval
= jtag_execute_queue()) != ERROR_OK
)
2147 ARMV4_5_CORE_REG_MODE(armv4_5
->core_cache
, mode
, num
).valid
= 1;
2148 ARMV4_5_CORE_REG_MODE(armv4_5
->core_cache
, mode
, num
).dirty
= 0;
2149 buf_set_u32(ARMV4_5_CORE_REG_MODE(armv4_5
->core_cache
, mode
, num
).value
, 0, 32, value
);
2151 if ((mode
!= ARMV4_5_MODE_ANY
)
2152 && (mode
!= armv4_5
->core_mode
)
2153 && (reg_mode
!= ARMV4_5_MODE_ANY
)) {
2154 /* restore processor mode (mask T bit) */
2155 arm7_9
->write_xpsr_im8(target
, buf_get_u32(armv4_5
->core_cache
->reg_list
[ARMV4_5_CPSR
].value
, 0, 8) & ~0x20, 0, 0);
2161 int arm7_9_write_core_reg(struct target_s
*target
, int num
, enum armv4_5_mode mode
, uint32_t value
)
2164 armv4_5_common_t
*armv4_5
= target
->arch_info
;
2165 arm7_9_common_t
*arm7_9
= armv4_5
->arch_info
;
2167 if (armv4_5_mode_to_number(armv4_5
->core_mode
)==-1)
2170 enum armv4_5_mode reg_mode
= ((armv4_5_core_reg_t
*)ARMV4_5_CORE_REG_MODE(armv4_5
->core_cache
, mode
, num
).arch_info
)->mode
;
2172 if ((num
< 0) || (num
> 16))
2173 return ERROR_INVALID_ARGUMENTS
;
2175 if ((mode
!= ARMV4_5_MODE_ANY
)
2176 && (mode
!= armv4_5
->core_mode
)
2177 && (reg_mode
!= ARMV4_5_MODE_ANY
)) {
2180 /* change processor mode (mask T bit) */
2181 tmp_cpsr
= buf_get_u32(armv4_5
->core_cache
->reg_list
[ARMV4_5_CPSR
].value
, 0, 8) & 0xE0;
2184 arm7_9
->write_xpsr_im8(target
, tmp_cpsr
& 0xff, 0, 0);
2187 if ((num
>= 0) && (num
<= 15))
2189 /* write a normal core register */
2192 arm7_9
->write_core_regs(target
, 1 << num
, reg
);
2196 /* write a program status register
2197 * if the register mode is MODE_ANY, we write the cpsr, otherwise a spsr
2199 armv4_5_core_reg_t
*arch_info
= ARMV4_5_CORE_REG_MODE(armv4_5
->core_cache
, mode
, num
).arch_info
;
2200 int spsr
= (arch_info
->mode
== ARMV4_5_MODE_ANY
) ? 0 : 1;
2202 /* if we're writing the CPSR, mask the T bit */
2206 arm7_9
->write_xpsr(target
, value
, spsr
);
2209 ARMV4_5_CORE_REG_MODE(armv4_5
->core_cache
, mode
, num
).valid
= 1;
2210 ARMV4_5_CORE_REG_MODE(armv4_5
->core_cache
, mode
, num
).dirty
= 0;
2212 if ((mode
!= ARMV4_5_MODE_ANY
)
2213 && (mode
!= armv4_5
->core_mode
)
2214 && (reg_mode
!= ARMV4_5_MODE_ANY
)) {
2215 /* restore processor mode (mask T bit) */
2216 arm7_9
->write_xpsr_im8(target
, buf_get_u32(armv4_5
->core_cache
->reg_list
[ARMV4_5_CPSR
].value
, 0, 8) & ~0x20, 0, 0);
2219 return jtag_execute_queue();
2222 int arm7_9_read_memory(struct target_s
*target
, uint32_t address
, uint32_t size
, uint32_t count
, uint8_t *buffer
)
2224 armv4_5_common_t
*armv4_5
= target
->arch_info
;
2225 arm7_9_common_t
*arm7_9
= armv4_5
->arch_info
;
2228 uint32_t num_accesses
= 0;
2229 int thisrun_accesses
;
2235 LOG_DEBUG("address: 0x%8.8" PRIx32
", size: 0x%8.8" PRIx32
", count: 0x%8.8" PRIx32
"", address
, size
, count
);
2237 if (target
->state
!= TARGET_HALTED
)
2239 LOG_WARNING("target not halted");
2240 return ERROR_TARGET_NOT_HALTED
;
2243 /* sanitize arguments */
2244 if (((size
!= 4) && (size
!= 2) && (size
!= 1)) || (count
== 0) || !(buffer
))
2245 return ERROR_INVALID_ARGUMENTS
;
2247 if (((size
== 4) && (address
& 0x3u
)) || ((size
== 2) && (address
& 0x1u
)))
2248 return ERROR_TARGET_UNALIGNED_ACCESS
;
2250 /* load the base register with the address of the first word */
2252 arm7_9
->write_core_regs(target
, 0x1, reg
);
2259 while (num_accesses
< count
)
2262 thisrun_accesses
= ((count
- num_accesses
) >= 14) ? 14 : (count
- num_accesses
);
2263 reg_list
= (0xffff >> (15 - thisrun_accesses
)) & 0xfffe;
2265 if (last_reg
<= thisrun_accesses
)
2266 last_reg
= thisrun_accesses
;
2268 arm7_9
->load_word_regs(target
, reg_list
);
2270 /* fast memory reads are only safe when the target is running
2271 * from a sufficiently high clock (32 kHz is usually too slow)
2273 if (arm7_9
->fast_memory_access
)
2274 retval
= arm7_9_execute_fast_sys_speed(target
);
2276 retval
= arm7_9_execute_sys_speed(target
);
2277 if (retval
!= ERROR_OK
)
2280 arm7_9
->read_core_regs_target_buffer(target
, reg_list
, buffer
, 4);
2282 /* advance buffer, count number of accesses */
2283 buffer
+= thisrun_accesses
* 4;
2284 num_accesses
+= thisrun_accesses
;
2286 if ((j
++%1024) == 0)
2293 while (num_accesses
< count
)
2296 thisrun_accesses
= ((count
- num_accesses
) >= 14) ? 14 : (count
- num_accesses
);
2297 reg_list
= (0xffff >> (15 - thisrun_accesses
)) & 0xfffe;
2299 for (i
= 1; i
<= thisrun_accesses
; i
++)
2303 arm7_9
->load_hword_reg(target
, i
);
2304 /* fast memory reads are only safe when the target is running
2305 * from a sufficiently high clock (32 kHz is usually too slow)
2307 if (arm7_9
->fast_memory_access
)
2308 retval
= arm7_9_execute_fast_sys_speed(target
);
2310 retval
= arm7_9_execute_sys_speed(target
);
2311 if (retval
!= ERROR_OK
)
2318 arm7_9
->read_core_regs_target_buffer(target
, reg_list
, buffer
, 2);
2320 /* advance buffer, count number of accesses */
2321 buffer
+= thisrun_accesses
* 2;
2322 num_accesses
+= thisrun_accesses
;
2324 if ((j
++%1024) == 0)
2331 while (num_accesses
< count
)
2334 thisrun_accesses
= ((count
- num_accesses
) >= 14) ? 14 : (count
- num_accesses
);
2335 reg_list
= (0xffff >> (15 - thisrun_accesses
)) & 0xfffe;
2337 for (i
= 1; i
<= thisrun_accesses
; i
++)
2341 arm7_9
->load_byte_reg(target
, i
);
2342 /* fast memory reads are only safe when the target is running
2343 * from a sufficiently high clock (32 kHz is usually too slow)
2345 if (arm7_9
->fast_memory_access
)
2346 retval
= arm7_9_execute_fast_sys_speed(target
);
2348 retval
= arm7_9_execute_sys_speed(target
);
2349 if (retval
!= ERROR_OK
)
2355 arm7_9
->read_core_regs_target_buffer(target
, reg_list
, buffer
, 1);
2357 /* advance buffer, count number of accesses */
2358 buffer
+= thisrun_accesses
* 1;
2359 num_accesses
+= thisrun_accesses
;
2361 if ((j
++%1024) == 0)
2368 LOG_ERROR("BUG: we shouldn't get here");
2373 if (armv4_5_mode_to_number(armv4_5
->core_mode
)==-1)
2376 for (i
= 0; i
<= last_reg
; i
++)
2377 ARMV4_5_CORE_REG_MODE(armv4_5
->core_cache
, armv4_5
->core_mode
, i
).dirty
= ARMV4_5_CORE_REG_MODE(armv4_5
->core_cache
, armv4_5
->core_mode
, i
).valid
;
2379 arm7_9
->read_xpsr(target
, &cpsr
, 0);
2380 if ((retval
= jtag_execute_queue()) != ERROR_OK
)
2382 LOG_ERROR("JTAG error while reading cpsr");
2383 return ERROR_TARGET_DATA_ABORT
;
2386 if (((cpsr
& 0x1f) == ARMV4_5_MODE_ABT
) && (armv4_5
->core_mode
!= ARMV4_5_MODE_ABT
))
2388 LOG_WARNING("memory read caused data abort (address: 0x%8.8" PRIx32
", size: 0x%" PRIx32
", count: 0x%" PRIx32
")", address
, size
, count
);
2390 arm7_9
->write_xpsr_im8(target
, buf_get_u32(armv4_5
->core_cache
->reg_list
[ARMV4_5_CPSR
].value
, 0, 8) & ~0x20, 0, 0);
2392 return ERROR_TARGET_DATA_ABORT
;
2398 int arm7_9_write_memory(struct target_s
*target
, uint32_t address
, uint32_t size
, uint32_t count
, uint8_t *buffer
)
2400 armv4_5_common_t
*armv4_5
= target
->arch_info
;
2401 arm7_9_common_t
*arm7_9
= armv4_5
->arch_info
;
2402 reg_t
*dbg_ctrl
= &arm7_9
->eice_cache
->reg_list
[EICE_DBG_CTRL
];
2405 uint32_t num_accesses
= 0;
2406 int thisrun_accesses
;
2412 #ifdef _DEBUG_ARM7_9_
2413 LOG_DEBUG("address: 0x%8.8x, size: 0x%8.8x, count: 0x%8.8x", address
, size
, count
);
2416 if (target
->state
!= TARGET_HALTED
)
2418 LOG_WARNING("target not halted");
2419 return ERROR_TARGET_NOT_HALTED
;
2422 /* sanitize arguments */
2423 if (((size
!= 4) && (size
!= 2) && (size
!= 1)) || (count
== 0) || !(buffer
))
2424 return ERROR_INVALID_ARGUMENTS
;
2426 if (((size
== 4) && (address
& 0x3u
)) || ((size
== 2) && (address
& 0x1u
)))
2427 return ERROR_TARGET_UNALIGNED_ACCESS
;
2429 /* load the base register with the address of the first word */
2431 arm7_9
->write_core_regs(target
, 0x1, reg
);
2433 /* Clear DBGACK, to make sure memory fetches work as expected */
2434 buf_set_u32(dbg_ctrl
->value
, EICE_DBG_CONTROL_DBGACK
, 1, 0);
2435 embeddedice_store_reg(dbg_ctrl
);
2440 while (num_accesses
< count
)
2443 thisrun_accesses
= ((count
- num_accesses
) >= 14) ? 14 : (count
- num_accesses
);
2444 reg_list
= (0xffff >> (15 - thisrun_accesses
)) & 0xfffe;
2446 for (i
= 1; i
<= thisrun_accesses
; i
++)
2450 reg
[i
] = target_buffer_get_u32(target
, buffer
);
2454 arm7_9
->write_core_regs(target
, reg_list
, reg
);
2456 arm7_9
->store_word_regs(target
, reg_list
);
2458 /* fast memory writes are only safe when the target is running
2459 * from a sufficiently high clock (32 kHz is usually too slow)
2461 if (arm7_9
->fast_memory_access
)
2462 retval
= arm7_9_execute_fast_sys_speed(target
);
2464 retval
= arm7_9_execute_sys_speed(target
);
2465 if (retval
!= ERROR_OK
)
2470 num_accesses
+= thisrun_accesses
;
2474 while (num_accesses
< count
)
2477 thisrun_accesses
= ((count
- num_accesses
) >= 14) ? 14 : (count
- num_accesses
);
2478 reg_list
= (0xffff >> (15 - thisrun_accesses
)) & 0xfffe;
2480 for (i
= 1; i
<= thisrun_accesses
; i
++)
2484 reg
[i
] = target_buffer_get_u16(target
, buffer
) & 0xffff;
2488 arm7_9
->write_core_regs(target
, reg_list
, reg
);
2490 for (i
= 1; i
<= thisrun_accesses
; i
++)
2492 arm7_9
->store_hword_reg(target
, i
);
2494 /* fast memory writes are only safe when the target is running
2495 * from a sufficiently high clock (32 kHz is usually too slow)
2497 if (arm7_9
->fast_memory_access
)
2498 retval
= arm7_9_execute_fast_sys_speed(target
);
2500 retval
= arm7_9_execute_sys_speed(target
);
2501 if (retval
!= ERROR_OK
)
2507 num_accesses
+= thisrun_accesses
;
2511 while (num_accesses
< count
)
2514 thisrun_accesses
= ((count
- num_accesses
) >= 14) ? 14 : (count
- num_accesses
);
2515 reg_list
= (0xffff >> (15 - thisrun_accesses
)) & 0xfffe;
2517 for (i
= 1; i
<= thisrun_accesses
; i
++)
2521 reg
[i
] = *buffer
++ & 0xff;
2524 arm7_9
->write_core_regs(target
, reg_list
, reg
);
2526 for (i
= 1; i
<= thisrun_accesses
; i
++)
2528 arm7_9
->store_byte_reg(target
, i
);
2529 /* fast memory writes are only safe when the target is running
2530 * from a sufficiently high clock (32 kHz is usually too slow)
2532 if (arm7_9
->fast_memory_access
)
2533 retval
= arm7_9_execute_fast_sys_speed(target
);
2535 retval
= arm7_9_execute_sys_speed(target
);
2536 if (retval
!= ERROR_OK
)
2543 num_accesses
+= thisrun_accesses
;
2547 LOG_ERROR("BUG: we shouldn't get here");
2553 buf_set_u32(dbg_ctrl
->value
, EICE_DBG_CONTROL_DBGACK
, 1, 1);
2554 embeddedice_store_reg(dbg_ctrl
);
2556 if (armv4_5_mode_to_number(armv4_5
->core_mode
)==-1)
2559 for (i
= 0; i
<= last_reg
; i
++)
2560 ARMV4_5_CORE_REG_MODE(armv4_5
->core_cache
, armv4_5
->core_mode
, i
).dirty
= ARMV4_5_CORE_REG_MODE(armv4_5
->core_cache
, armv4_5
->core_mode
, i
).valid
;
2562 arm7_9
->read_xpsr(target
, &cpsr
, 0);
2563 if ((retval
= jtag_execute_queue()) != ERROR_OK
)
2565 LOG_ERROR("JTAG error while reading cpsr");
2566 return ERROR_TARGET_DATA_ABORT
;
2569 if (((cpsr
& 0x1f) == ARMV4_5_MODE_ABT
) && (armv4_5
->core_mode
!= ARMV4_5_MODE_ABT
))
2571 LOG_WARNING("memory write caused data abort (address: 0x%8.8" PRIx32
", size: 0x%" PRIx32
", count: 0x%" PRIx32
")", address
, size
, count
);
2573 arm7_9
->write_xpsr_im8(target
, buf_get_u32(armv4_5
->core_cache
->reg_list
[ARMV4_5_CPSR
].value
, 0, 8) & ~0x20, 0, 0);
2575 return ERROR_TARGET_DATA_ABORT
;
2581 static int dcc_count
;
2582 static uint8_t *dcc_buffer
;
2584 static int arm7_9_dcc_completion(struct target_s
*target
, uint32_t exit_point
, int timeout_ms
, void *arch_info
)
2586 int retval
= ERROR_OK
;
2587 armv4_5_common_t
*armv4_5
= target
->arch_info
;
2588 arm7_9_common_t
*arm7_9
= armv4_5
->arch_info
;
2590 if ((retval
= target_wait_state(target
, TARGET_DEBUG_RUNNING
, 500)) != ERROR_OK
)
2593 int little
= target
->endianness
== TARGET_LITTLE_ENDIAN
;
2594 int count
= dcc_count
;
2595 uint8_t *buffer
= dcc_buffer
;
2598 /* Handle first & last using standard embeddedice_write_reg and the middle ones w/the
2599 * core function repeated. */
2600 embeddedice_write_reg(&arm7_9
->eice_cache
->reg_list
[EICE_COMMS_DATA
], fast_target_buffer_get_u32(buffer
, little
));
2603 embeddedice_reg_t
*ice_reg
= arm7_9
->eice_cache
->reg_list
[EICE_COMMS_DATA
].arch_info
;
2604 uint8_t reg_addr
= ice_reg
->addr
& 0x1f;
2606 tap
= ice_reg
->jtag_info
->tap
;
2608 embeddedice_write_dcc(tap
, reg_addr
, buffer
, little
, count
-2);
2609 buffer
+= (count
-2)*4;
2611 embeddedice_write_reg(&arm7_9
->eice_cache
->reg_list
[EICE_COMMS_DATA
], fast_target_buffer_get_u32(buffer
, little
));
2615 for (i
= 0; i
< count
; i
++)
2617 embeddedice_write_reg(&arm7_9
->eice_cache
->reg_list
[EICE_COMMS_DATA
], fast_target_buffer_get_u32(buffer
, little
));
2622 if ((retval
= target_halt(target
))!= ERROR_OK
)
2626 return target_wait_state(target
, TARGET_HALTED
, 500);
2629 static const uint32_t dcc_code
[] =
2631 /* MRC TST BNE MRC STR B */
2632 0xee101e10, 0xe3110001, 0x0afffffc, 0xee111e10, 0xe4801004, 0xeafffff9
2635 int armv4_5_run_algorithm_inner(struct target_s
*target
, int num_mem_params
, mem_param_t
*mem_params
, int num_reg_params
, reg_param_t
*reg_params
, uint32_t entry_point
, uint32_t exit_point
, int timeout_ms
, void *arch_info
, int (*run_it
)(struct target_s
*target
, uint32_t exit_point
, int timeout_ms
, void *arch_info
));
2637 int arm7_9_bulk_write_memory(target_t
*target
, uint32_t address
, uint32_t count
, uint8_t *buffer
)
2640 armv4_5_common_t
*armv4_5
= target
->arch_info
;
2641 arm7_9_common_t
*arm7_9
= armv4_5
->arch_info
;
2644 if (!arm7_9
->dcc_downloads
)
2645 return target_write_memory(target
, address
, 4, count
, buffer
);
2647 /* regrab previously allocated working_area, or allocate a new one */
2648 if (!arm7_9
->dcc_working_area
)
2650 uint8_t dcc_code_buf
[6 * 4];
2652 /* make sure we have a working area */
2653 if (target_alloc_working_area(target
, 24, &arm7_9
->dcc_working_area
) != ERROR_OK
)
2655 LOG_INFO("no working area available, falling back to memory writes");
2656 return target_write_memory(target
, address
, 4, count
, buffer
);
2659 /* copy target instructions to target endianness */
2660 for (i
= 0; i
< 6; i
++)
2662 target_buffer_set_u32(target
, dcc_code_buf
+ i
*4, dcc_code
[i
]);
2665 /* write DCC code to working area */
2666 if ((retval
= target_write_memory(target
, arm7_9
->dcc_working_area
->address
, 4, 6, dcc_code_buf
)) != ERROR_OK
)
2672 armv4_5_algorithm_t armv4_5_info
;
2673 reg_param_t reg_params
[1];
2675 armv4_5_info
.common_magic
= ARMV4_5_COMMON_MAGIC
;
2676 armv4_5_info
.core_mode
= ARMV4_5_MODE_SVC
;
2677 armv4_5_info
.core_state
= ARMV4_5_STATE_ARM
;
2679 init_reg_param(®_params
[0], "r0", 32, PARAM_IN_OUT
);
2681 buf_set_u32(reg_params
[0].value
, 0, 32, address
);
2684 dcc_buffer
= buffer
;
2685 retval
= armv4_5_run_algorithm_inner(target
, 0, NULL
, 1, reg_params
,
2686 arm7_9
->dcc_working_area
->address
, arm7_9
->dcc_working_area
->address
+ 6*4, 20*1000, &armv4_5_info
, arm7_9_dcc_completion
);
2688 if (retval
== ERROR_OK
)
2690 uint32_t endaddress
= buf_get_u32(reg_params
[0].value
, 0, 32);
2691 if (endaddress
!= (address
+ count
*4))
2693 LOG_ERROR("DCC write failed, expected end address 0x%08" PRIx32
" got 0x%0" PRIx32
"", (address
+ count
*4), endaddress
);
2694 retval
= ERROR_FAIL
;
2698 destroy_reg_param(®_params
[0]);
2703 int arm7_9_checksum_memory(struct target_s
*target
, uint32_t address
, uint32_t count
, uint32_t* checksum
)
2705 working_area_t
*crc_algorithm
;
2706 armv4_5_algorithm_t armv4_5_info
;
2707 reg_param_t reg_params
[2];
2710 uint32_t arm7_9_crc_code
[] = {
2711 0xE1A02000, /* mov r2, r0 */
2712 0xE3E00000, /* mov r0, #0xffffffff */
2713 0xE1A03001, /* mov r3, r1 */
2714 0xE3A04000, /* mov r4, #0 */
2715 0xEA00000B, /* b ncomp */
2717 0xE7D21004, /* ldrb r1, [r2, r4] */
2718 0xE59F7030, /* ldr r7, CRC32XOR */
2719 0xE0200C01, /* eor r0, r0, r1, asl 24 */
2720 0xE3A05000, /* mov r5, #0 */
2722 0xE3500000, /* cmp r0, #0 */
2723 0xE1A06080, /* mov r6, r0, asl #1 */
2724 0xE2855001, /* add r5, r5, #1 */
2725 0xE1A00006, /* mov r0, r6 */
2726 0xB0260007, /* eorlt r0, r6, r7 */
2727 0xE3550008, /* cmp r5, #8 */
2728 0x1AFFFFF8, /* bne loop */
2729 0xE2844001, /* add r4, r4, #1 */
2731 0xE1540003, /* cmp r4, r3 */
2732 0x1AFFFFF1, /* bne nbyte */
2734 0xEAFFFFFE, /* b end */
2735 0x04C11DB7 /* CRC32XOR: .word 0x04C11DB7 */
2740 if (target_alloc_working_area(target
, sizeof(arm7_9_crc_code
), &crc_algorithm
) != ERROR_OK
)
2742 return ERROR_TARGET_RESOURCE_NOT_AVAILABLE
;
2745 /* convert flash writing code into a buffer in target endianness */
2746 for (i
= 0; i
< (sizeof(arm7_9_crc_code
)/sizeof(uint32_t)); i
++)
2748 if ((retval
= target_write_u32(target
, crc_algorithm
->address
+ i
*sizeof(uint32_t), arm7_9_crc_code
[i
])) != ERROR_OK
)
2754 armv4_5_info
.common_magic
= ARMV4_5_COMMON_MAGIC
;
2755 armv4_5_info
.core_mode
= ARMV4_5_MODE_SVC
;
2756 armv4_5_info
.core_state
= ARMV4_5_STATE_ARM
;
2758 init_reg_param(®_params
[0], "r0", 32, PARAM_IN_OUT
);
2759 init_reg_param(®_params
[1], "r1", 32, PARAM_OUT
);
2761 buf_set_u32(reg_params
[0].value
, 0, 32, address
);
2762 buf_set_u32(reg_params
[1].value
, 0, 32, count
);
2764 if ((retval
= target_run_algorithm(target
, 0, NULL
, 2, reg_params
,
2765 crc_algorithm
->address
, crc_algorithm
->address
+ (sizeof(arm7_9_crc_code
) - 8), 20000, &armv4_5_info
)) != ERROR_OK
)
2767 LOG_ERROR("error executing arm7_9 crc algorithm");
2768 destroy_reg_param(®_params
[0]);
2769 destroy_reg_param(®_params
[1]);
2770 target_free_working_area(target
, crc_algorithm
);
2774 *checksum
= buf_get_u32(reg_params
[0].value
, 0, 32);
2776 destroy_reg_param(®_params
[0]);
2777 destroy_reg_param(®_params
[1]);
2779 target_free_working_area(target
, crc_algorithm
);
2784 int arm7_9_blank_check_memory(struct target_s
*target
, uint32_t address
, uint32_t count
, uint32_t* blank
)
2786 working_area_t
*erase_check_algorithm
;
2787 reg_param_t reg_params
[3];
2788 armv4_5_algorithm_t armv4_5_info
;
2792 uint32_t erase_check_code
[] =
2795 0xe4d03001, /* ldrb r3, [r0], #1 */
2796 0xe0022003, /* and r2, r2, r3 */
2797 0xe2511001, /* subs r1, r1, #1 */
2798 0x1afffffb, /* bne loop */
2800 0xeafffffe /* b end */
2803 /* make sure we have a working area */
2804 if (target_alloc_working_area(target
, sizeof(erase_check_code
), &erase_check_algorithm
) != ERROR_OK
)
2806 return ERROR_TARGET_RESOURCE_NOT_AVAILABLE
;
2809 /* convert flash writing code into a buffer in target endianness */
2810 for (i
= 0; i
< (sizeof(erase_check_code
)/sizeof(uint32_t)); i
++)
2811 if ((retval
= target_write_u32(target
, erase_check_algorithm
->address
+ i
*sizeof(uint32_t), erase_check_code
[i
])) != ERROR_OK
)
2816 armv4_5_info
.common_magic
= ARMV4_5_COMMON_MAGIC
;
2817 armv4_5_info
.core_mode
= ARMV4_5_MODE_SVC
;
2818 armv4_5_info
.core_state
= ARMV4_5_STATE_ARM
;
2820 init_reg_param(®_params
[0], "r0", 32, PARAM_OUT
);
2821 buf_set_u32(reg_params
[0].value
, 0, 32, address
);
2823 init_reg_param(®_params
[1], "r1", 32, PARAM_OUT
);
2824 buf_set_u32(reg_params
[1].value
, 0, 32, count
);
2826 init_reg_param(®_params
[2], "r2", 32, PARAM_IN_OUT
);
2827 buf_set_u32(reg_params
[2].value
, 0, 32, 0xff);
2829 if ((retval
= target_run_algorithm(target
, 0, NULL
, 3, reg_params
,
2830 erase_check_algorithm
->address
, erase_check_algorithm
->address
+ (sizeof(erase_check_code
) - 4), 10000, &armv4_5_info
)) != ERROR_OK
)
2832 destroy_reg_param(®_params
[0]);
2833 destroy_reg_param(®_params
[1]);
2834 destroy_reg_param(®_params
[2]);
2835 target_free_working_area(target
, erase_check_algorithm
);
2839 *blank
= buf_get_u32(reg_params
[2].value
, 0, 32);
2841 destroy_reg_param(®_params
[0]);
2842 destroy_reg_param(®_params
[1]);
2843 destroy_reg_param(®_params
[2]);
2845 target_free_working_area(target
, erase_check_algorithm
);
2850 int arm7_9_register_commands(struct command_context_s
*cmd_ctx
)
2852 command_t
*arm7_9_cmd
;
2854 arm7_9_cmd
= register_command(cmd_ctx
, NULL
, "arm7_9", NULL
, COMMAND_ANY
, "arm7/9 specific commands");
2856 register_command(cmd_ctx
, arm7_9_cmd
, "write_xpsr", handle_arm7_9_write_xpsr_command
, COMMAND_EXEC
, "write program status register <value> <not cpsr | spsr>");
2857 register_command(cmd_ctx
, arm7_9_cmd
, "write_xpsr_im8", handle_arm7_9_write_xpsr_im8_command
, COMMAND_EXEC
, "write program status register <8bit immediate> <rotate> <not cpsr | spsr>");
2859 register_command(cmd_ctx
, arm7_9_cmd
, "write_core_reg", handle_arm7_9_write_core_reg_command
, COMMAND_EXEC
, "write core register <num> <mode> <value>");
2861 register_command(cmd_ctx
, arm7_9_cmd
, "dbgrq", handle_arm7_9_dbgrq_command
,
2862 COMMAND_ANY
, "use EmbeddedICE dbgrq instead of breakpoint for target halt requests <enable | disable>");
2863 register_command(cmd_ctx
, arm7_9_cmd
, "fast_memory_access", handle_arm7_9_fast_memory_access_command
,
2864 COMMAND_ANY
, "use fast memory accesses instead of slower but potentially safer accesses <enable | disable>");
2865 register_command(cmd_ctx
, arm7_9_cmd
, "dcc_downloads", handle_arm7_9_dcc_downloads_command
,
2866 COMMAND_ANY
, "use DCC downloads for larger memory writes <enable | disable>");
2868 armv4_5_register_commands(cmd_ctx
);
2870 etm_register_commands(cmd_ctx
);
2875 int handle_arm7_9_write_xpsr_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2880 target_t
*target
= get_current_target(cmd_ctx
);
2881 armv4_5_common_t
*armv4_5
;
2882 arm7_9_common_t
*arm7_9
;
2884 if (arm7_9_get_arch_pointers(target
, &armv4_5
, &arm7_9
) != ERROR_OK
)
2886 command_print(cmd_ctx
, "current target isn't an ARM7/ARM9 target");
2890 if (target
->state
!= TARGET_HALTED
)
2892 command_print(cmd_ctx
, "can't write registers while running");
2898 command_print(cmd_ctx
, "usage: write_xpsr <value> <not cpsr | spsr>");
2902 value
= strtoul(args
[0], NULL
, 0);
2903 spsr
= strtol(args
[1], NULL
, 0);
2905 /* if we're writing the CPSR, mask the T bit */
2909 arm7_9
->write_xpsr(target
, value
, spsr
);
2910 if ((retval
= jtag_execute_queue()) != ERROR_OK
)
2912 LOG_ERROR("JTAG error while writing to xpsr");
2919 int handle_arm7_9_write_xpsr_im8_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2925 target_t
*target
= get_current_target(cmd_ctx
);
2926 armv4_5_common_t
*armv4_5
;
2927 arm7_9_common_t
*arm7_9
;
2929 if (arm7_9_get_arch_pointers(target
, &armv4_5
, &arm7_9
) != ERROR_OK
)
2931 command_print(cmd_ctx
, "current target isn't an ARM7/ARM9 target");
2935 if (target
->state
!= TARGET_HALTED
)
2937 command_print(cmd_ctx
, "can't write registers while running");
2943 command_print(cmd_ctx
, "usage: write_xpsr_im8 <im8> <rotate> <not cpsr | spsr>");
2947 value
= strtoul(args
[0], NULL
, 0);
2948 rotate
= strtol(args
[1], NULL
, 0);
2949 spsr
= strtol(args
[2], NULL
, 0);
2951 arm7_9
->write_xpsr_im8(target
, value
, rotate
, spsr
);
2952 if ((retval
= jtag_execute_queue()) != ERROR_OK
)
2954 LOG_ERROR("JTAG error while writing 8-bit immediate to xpsr");
2961 int handle_arm7_9_write_core_reg_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2966 target_t
*target
= get_current_target(cmd_ctx
);
2967 armv4_5_common_t
*armv4_5
;
2968 arm7_9_common_t
*arm7_9
;
2970 if (arm7_9_get_arch_pointers(target
, &armv4_5
, &arm7_9
) != ERROR_OK
)
2972 command_print(cmd_ctx
, "current target isn't an ARM7/ARM9 target");
2976 if (target
->state
!= TARGET_HALTED
)
2978 command_print(cmd_ctx
, "can't write registers while running");
2984 command_print(cmd_ctx
, "usage: write_core_reg <num> <mode> <value>");
2988 num
= strtol(args
[0], NULL
, 0);
2989 mode
= strtoul(args
[1], NULL
, 0);
2990 value
= strtoul(args
[2], NULL
, 0);
2992 return arm7_9_write_core_reg(target
, num
, mode
, value
);
2995 int handle_arm7_9_dbgrq_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2997 target_t
*target
= get_current_target(cmd_ctx
);
2998 armv4_5_common_t
*armv4_5
;
2999 arm7_9_common_t
*arm7_9
;
3001 if (arm7_9_get_arch_pointers(target
, &armv4_5
, &arm7_9
) != ERROR_OK
)
3003 command_print(cmd_ctx
, "current target isn't an ARM7/ARM9 target");
3009 if (strcmp("enable", args
[0]) == 0)
3011 arm7_9
->use_dbgrq
= 1;
3013 else if (strcmp("disable", args
[0]) == 0)
3015 arm7_9
->use_dbgrq
= 0;
3019 command_print(cmd_ctx
, "usage: arm7_9 dbgrq <enable | disable>");
3023 command_print(cmd_ctx
, "use of EmbeddedICE dbgrq instead of breakpoint for target halt %s", (arm7_9
->use_dbgrq
) ? "enabled" : "disabled");
3028 int handle_arm7_9_fast_memory_access_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
3030 target_t
*target
= get_current_target(cmd_ctx
);
3031 armv4_5_common_t
*armv4_5
;
3032 arm7_9_common_t
*arm7_9
;
3034 if (arm7_9_get_arch_pointers(target
, &armv4_5
, &arm7_9
) != ERROR_OK
)
3036 command_print(cmd_ctx
, "current target isn't an ARM7/ARM9 target");
3042 if (strcmp("enable", args
[0]) == 0)
3044 arm7_9
->fast_memory_access
= 1;
3046 else if (strcmp("disable", args
[0]) == 0)
3048 arm7_9
->fast_memory_access
= 0;
3052 command_print(cmd_ctx
, "usage: arm7_9 fast_memory_access <enable | disable>");
3056 command_print(cmd_ctx
, "fast memory access is %s", (arm7_9
->fast_memory_access
) ? "enabled" : "disabled");
3061 int handle_arm7_9_dcc_downloads_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
3063 target_t
*target
= get_current_target(cmd_ctx
);
3064 armv4_5_common_t
*armv4_5
;
3065 arm7_9_common_t
*arm7_9
;
3067 if (arm7_9_get_arch_pointers(target
, &armv4_5
, &arm7_9
) != ERROR_OK
)
3069 command_print(cmd_ctx
, "current target isn't an ARM7/ARM9 target");
3075 if (strcmp("enable", args
[0]) == 0)
3077 arm7_9
->dcc_downloads
= 1;
3079 else if (strcmp("disable", args
[0]) == 0)
3081 arm7_9
->dcc_downloads
= 0;
3085 command_print(cmd_ctx
, "usage: arm7_9 dcc_downloads <enable | disable>");
3089 command_print(cmd_ctx
, "dcc downloads are %s", (arm7_9
->dcc_downloads
) ? "enabled" : "disabled");
3094 int arm7_9_init_arch_info(target_t
*target
, arm7_9_common_t
*arm7_9
)
3096 int retval
= ERROR_OK
;
3097 armv4_5_common_t
*armv4_5
= &arm7_9
->armv4_5_common
;
3099 arm7_9
->common_magic
= ARM7_9_COMMON_MAGIC
;
3101 if ((retval
= arm_jtag_setup_connection(&arm7_9
->jtag_info
)) != ERROR_OK
)
3106 arm7_9
->wp_available
= 0; /* this is set up in arm7_9_clear_watchpoints() */
3107 arm7_9
->wp_available_max
= 2;
3108 arm7_9
->sw_breakpoints_added
= 0;
3109 arm7_9
->breakpoint_count
= 0;
3110 arm7_9
->wp0_used
= 0;
3111 arm7_9
->wp1_used
= 0;
3112 arm7_9
->wp1_used_default
= 0;
3113 arm7_9
->use_dbgrq
= 0;
3115 arm7_9
->etm_ctx
= NULL
;
3116 arm7_9
->has_single_step
= 0;
3117 arm7_9
->has_monitor_mode
= 0;
3118 arm7_9
->has_vector_catch
= 0;
3120 arm7_9
->debug_entry_from_reset
= 0;
3122 arm7_9
->dcc_working_area
= NULL
;
3124 arm7_9
->fast_memory_access
= fast_and_dangerous
;
3125 arm7_9
->dcc_downloads
= fast_and_dangerous
;
3127 arm7_9
->need_bypass_before_restart
= 0;
3129 armv4_5
->arch_info
= arm7_9
;
3130 armv4_5
->read_core_reg
= arm7_9_read_core_reg
;
3131 armv4_5
->write_core_reg
= arm7_9_write_core_reg
;
3132 armv4_5
->full_context
= arm7_9_full_context
;
3134 if ((retval
= armv4_5_init_arch_info(target
, armv4_5
)) != ERROR_OK
)
3139 if ((retval
= target_register_timer_callback(arm7_9_handle_target_request
, 1, 1, target
)) != ERROR_OK
)
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)