1 /***************************************************************************
2 * Copyright (C) 2005 by Dominic Rath *
3 * Dominic.Rath@gmx.de *
5 * This program is free software; you can redistribute it and/or modify *
6 * it under the terms of the GNU General Public License as published by *
7 * the Free Software Foundation; either version 2 of the License, or *
8 * (at your option) any later version. *
10 * This program is distributed in the hope that it will be useful, *
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
13 * GNU General Public License for more details. *
15 * You should have received a copy of the GNU General Public License *
16 * along with this program; if not, write to the *
17 * Free Software Foundation, Inc., *
18 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
19 ***************************************************************************/
24 #include "replacements.h"
26 #include "embeddedice.h"
32 #include "arm7_9_common.h"
33 #include "breakpoints.h"
39 #include <sys/types.h>
44 int arm7_9_debug_entry(target_t
*target
);
45 int arm7_9_enable_sw_bkpts(struct target_s
*target
);
47 /* command handler forward declarations */
48 int handle_arm7_9_write_xpsr_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
49 int handle_arm7_9_write_xpsr_im8_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
50 int handle_arm7_9_read_core_reg_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
51 int handle_arm7_9_write_core_reg_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
52 int handle_arm7_9_sw_bkpts_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
53 int handle_arm7_9_force_hw_bkpts_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
54 int handle_arm7_9_dbgrq_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
55 int handle_arm7_9_fast_memory_access_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
56 int handle_arm7_9_dcc_downloads_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
58 int arm7_9_reinit_embeddedice(target_t
*target
)
60 armv4_5_common_t
*armv4_5
= target
->arch_info
;
61 arm7_9_common_t
*arm7_9
= armv4_5
->arch_info
;
63 breakpoint_t
*breakpoint
= target
->breakpoints
;
65 arm7_9
->wp_available
= 2;
69 /* mark all hardware breakpoints as unset */
72 if (breakpoint
->type
== BKPT_HARD
)
76 breakpoint
= breakpoint
->next
;
79 if (arm7_9
->sw_bkpts_enabled
&& arm7_9
->sw_bkpts_use_wp
)
81 arm7_9
->sw_bkpts_enabled
= 0;
82 arm7_9_enable_sw_bkpts(target
);
85 arm7_9
->reinit_embeddedice
= 0;
90 int arm7_9_jtag_callback(enum jtag_event event
, void *priv
)
92 target_t
*target
= priv
;
93 armv4_5_common_t
*armv4_5
= target
->arch_info
;
94 arm7_9_common_t
*arm7_9
= armv4_5
->arch_info
;
96 /* a test-logic reset occured
97 * the EmbeddedICE registers have been reset
98 * hardware breakpoints have been cleared
100 if (event
== JTAG_TRST_ASSERTED
)
102 arm7_9
->reinit_embeddedice
= 1;
108 int arm7_9_get_arch_pointers(target_t
*target
, armv4_5_common_t
**armv4_5_p
, arm7_9_common_t
**arm7_9_p
)
110 armv4_5_common_t
*armv4_5
= target
->arch_info
;
111 arm7_9_common_t
*arm7_9
= armv4_5
->arch_info
;
113 if (armv4_5
->common_magic
!= ARMV4_5_COMMON_MAGIC
)
118 if (arm7_9
->common_magic
!= ARM7_9_COMMON_MAGIC
)
123 *armv4_5_p
= armv4_5
;
129 int arm7_9_set_breakpoint(struct target_s
*target
, breakpoint_t
*breakpoint
)
131 armv4_5_common_t
*armv4_5
= target
->arch_info
;
132 arm7_9_common_t
*arm7_9
= armv4_5
->arch_info
;
134 if (target
->state
!= TARGET_HALTED
)
136 WARNING("target not halted");
137 return ERROR_TARGET_NOT_HALTED
;
140 if (arm7_9
->force_hw_bkpts
)
141 breakpoint
->type
= BKPT_HARD
;
145 WARNING("breakpoint already set");
149 if (breakpoint
->type
== BKPT_HARD
)
151 /* either an ARM (4 byte) or Thumb (2 byte) breakpoint */
152 u32 mask
= (breakpoint
->length
== 4) ? 0x3u
: 0x1u
;
153 if (!arm7_9
->wp0_used
)
155 embeddedice_set_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W0_ADDR_VALUE
], breakpoint
->address
);
156 embeddedice_set_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W0_ADDR_MASK
], mask
);
157 embeddedice_set_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W0_DATA_MASK
], 0xffffffffu
);
158 embeddedice_set_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W0_CONTROL_MASK
], ~EICE_W_CTRL_nOPC
& 0xff);
159 embeddedice_set_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W0_CONTROL_VALUE
], EICE_W_CTRL_ENABLE
);
161 jtag_execute_queue();
162 arm7_9
->wp0_used
= 1;
165 else if (!arm7_9
->wp1_used
)
167 embeddedice_set_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W1_ADDR_VALUE
], breakpoint
->address
);
168 embeddedice_set_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W1_ADDR_MASK
], mask
);
169 embeddedice_set_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W1_DATA_MASK
], 0xffffffffu
);
170 embeddedice_set_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W1_CONTROL_MASK
], ~EICE_W_CTRL_nOPC
& 0xff);
171 embeddedice_set_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W1_CONTROL_VALUE
], EICE_W_CTRL_ENABLE
);
173 jtag_execute_queue();
174 arm7_9
->wp1_used
= 1;
179 ERROR("BUG: no hardware comparator available");
183 else if (breakpoint
->type
== BKPT_SOFT
)
185 if (breakpoint
->length
== 4)
187 /* keep the original instruction in target endianness */
188 target
->type
->read_memory(target
, breakpoint
->address
, 4, 1, breakpoint
->orig_instr
);
189 /* write the original instruction in target endianness (arm7_9->arm_bkpt is host endian) */
190 target_write_u32(target
, breakpoint
->address
, arm7_9
->arm_bkpt
);
194 /* keep the original instruction in target endianness */
195 target
->type
->read_memory(target
, breakpoint
->address
, 2, 1, breakpoint
->orig_instr
);
196 /* write the original instruction in target endianness (arm7_9->arm_bkpt is host endian) */
197 target_write_u32(target
, breakpoint
->address
, arm7_9
->thumb_bkpt
);
206 int arm7_9_unset_breakpoint(struct target_s
*target
, breakpoint_t
*breakpoint
)
208 armv4_5_common_t
*armv4_5
= target
->arch_info
;
209 arm7_9_common_t
*arm7_9
= armv4_5
->arch_info
;
211 if (target
->state
!= TARGET_HALTED
)
213 WARNING("target not halted");
214 return ERROR_TARGET_NOT_HALTED
;
217 if (!breakpoint
->set
)
219 WARNING("breakpoint not set");
223 if (breakpoint
->type
== BKPT_HARD
)
225 if (breakpoint
->set
== 1)
227 embeddedice_set_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W0_CONTROL_VALUE
], 0x0);
228 jtag_execute_queue();
229 arm7_9
->wp0_used
= 0;
231 else if (breakpoint
->set
== 2)
233 embeddedice_set_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W1_CONTROL_VALUE
], 0x0);
234 jtag_execute_queue();
235 arm7_9
->wp1_used
= 0;
241 /* restore original instruction (kept in target endianness) */
242 if (breakpoint
->length
== 4)
244 target
->type
->write_memory(target
, breakpoint
->address
, 4, 1, breakpoint
->orig_instr
);
248 target
->type
->write_memory(target
, breakpoint
->address
, 2, 1, breakpoint
->orig_instr
);
256 int arm7_9_add_breakpoint(struct target_s
*target
, u32 address
, u32 length
, enum breakpoint_type type
)
258 armv4_5_common_t
*armv4_5
= target
->arch_info
;
259 arm7_9_common_t
*arm7_9
= armv4_5
->arch_info
;
261 if (target
->state
!= TARGET_HALTED
)
263 WARNING("target not halted");
264 return ERROR_TARGET_NOT_HALTED
;
267 if (arm7_9
->force_hw_bkpts
)
272 if ((type
== BKPT_SOFT
) && (arm7_9
->sw_bkpts_enabled
== 0))
274 INFO("sw breakpoint requested, but software breakpoints not enabled");
275 return ERROR_TARGET_RESOURCE_NOT_AVAILABLE
;
278 if ((type
== BKPT_HARD
) && (arm7_9
->wp_available
< 1))
280 INFO("no watchpoint unit available for hardware breakpoint");
281 return ERROR_TARGET_RESOURCE_NOT_AVAILABLE
;
284 if (type
== BKPT_HARD
)
285 arm7_9
->wp_available
--;
287 if ((length
!= 2) && (length
!= 4))
289 INFO("only breakpoints of two (Thumb) or four (ARM) bytes length supported");
290 return ERROR_TARGET_RESOURCE_NOT_AVAILABLE
;
296 int arm7_9_remove_breakpoint(struct target_s
*target
, breakpoint_t
*breakpoint
)
298 armv4_5_common_t
*armv4_5
= target
->arch_info
;
299 arm7_9_common_t
*arm7_9
= armv4_5
->arch_info
;
301 if (target
->state
!= TARGET_HALTED
)
303 WARNING("target not halted");
304 return ERROR_TARGET_NOT_HALTED
;
309 arm7_9_unset_breakpoint(target
, breakpoint
);
312 if (breakpoint
->type
== BKPT_HARD
)
313 arm7_9
->wp_available
++;
318 int arm7_9_set_watchpoint(struct target_s
*target
, watchpoint_t
*watchpoint
)
320 armv4_5_common_t
*armv4_5
= target
->arch_info
;
321 arm7_9_common_t
*arm7_9
= armv4_5
->arch_info
;
325 mask
= watchpoint
->length
- 1;
327 if (target
->state
!= TARGET_HALTED
)
329 WARNING("target not halted");
330 return ERROR_TARGET_NOT_HALTED
;
333 if (watchpoint
->rw
== WPT_ACCESS
)
338 if (!arm7_9
->wp0_used
)
340 embeddedice_set_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W0_ADDR_VALUE
], watchpoint
->address
);
341 embeddedice_set_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W0_ADDR_MASK
], mask
);
342 embeddedice_set_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W0_DATA_MASK
], watchpoint
->mask
);
343 if( watchpoint
->mask
!= 0xffffffffu
)
344 embeddedice_set_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W0_DATA_VALUE
], watchpoint
->value
);
345 embeddedice_set_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W0_CONTROL_MASK
], 0xff & ~EICE_W_CTRL_nOPC
& ~rw_mask
);
346 embeddedice_set_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W0_CONTROL_VALUE
], EICE_W_CTRL_ENABLE
| EICE_W_CTRL_nOPC
| (watchpoint
->rw
& 1));
348 jtag_execute_queue();
350 arm7_9
->wp0_used
= 2;
352 else if (!arm7_9
->wp1_used
)
354 embeddedice_set_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W1_ADDR_VALUE
], watchpoint
->address
);
355 embeddedice_set_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W1_ADDR_MASK
], mask
);
356 embeddedice_set_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W1_DATA_MASK
], watchpoint
->mask
);
357 if( watchpoint
->mask
!= 0xffffffffu
)
358 embeddedice_set_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W1_DATA_VALUE
], watchpoint
->value
);
359 embeddedice_set_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W1_CONTROL_MASK
], 0xff & ~EICE_W_CTRL_nOPC
& ~rw_mask
);
360 embeddedice_set_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W1_CONTROL_VALUE
], EICE_W_CTRL_ENABLE
| EICE_W_CTRL_nOPC
| (watchpoint
->rw
& 1));
362 jtag_execute_queue();
364 arm7_9
->wp1_used
= 2;
368 ERROR("BUG: no hardware comparator available");
375 int arm7_9_unset_watchpoint(struct target_s
*target
, watchpoint_t
*watchpoint
)
377 armv4_5_common_t
*armv4_5
= target
->arch_info
;
378 arm7_9_common_t
*arm7_9
= armv4_5
->arch_info
;
380 if (target
->state
!= TARGET_HALTED
)
382 WARNING("target not halted");
383 return ERROR_TARGET_NOT_HALTED
;
386 if (!watchpoint
->set
)
388 WARNING("breakpoint not set");
392 if (watchpoint
->set
== 1)
394 embeddedice_set_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W0_CONTROL_VALUE
], 0x0);
395 jtag_execute_queue();
396 arm7_9
->wp0_used
= 0;
398 else if (watchpoint
->set
== 2)
400 embeddedice_set_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W1_CONTROL_VALUE
], 0x0);
401 jtag_execute_queue();
402 arm7_9
->wp1_used
= 0;
409 int arm7_9_add_watchpoint(struct target_s
*target
, u32 address
, u32 length
, enum watchpoint_rw rw
)
411 armv4_5_common_t
*armv4_5
= target
->arch_info
;
412 arm7_9_common_t
*arm7_9
= armv4_5
->arch_info
;
414 if (target
->state
!= TARGET_HALTED
)
416 WARNING("target not halted");
417 return ERROR_TARGET_NOT_HALTED
;
420 if (arm7_9
->wp_available
< 1)
422 return ERROR_TARGET_RESOURCE_NOT_AVAILABLE
;
425 if ((length
!= 1) && (length
!= 2) && (length
!= 4))
427 return ERROR_TARGET_RESOURCE_NOT_AVAILABLE
;
430 arm7_9
->wp_available
--;
435 int arm7_9_remove_watchpoint(struct target_s
*target
, watchpoint_t
*watchpoint
)
437 armv4_5_common_t
*armv4_5
= target
->arch_info
;
438 arm7_9_common_t
*arm7_9
= armv4_5
->arch_info
;
440 if (target
->state
!= TARGET_HALTED
)
442 WARNING("target not halted");
443 return ERROR_TARGET_NOT_HALTED
;
448 arm7_9_unset_watchpoint(target
, watchpoint
);
451 arm7_9
->wp_available
++;
456 int arm7_9_enable_sw_bkpts(struct target_s
*target
)
458 armv4_5_common_t
*armv4_5
= target
->arch_info
;
459 arm7_9_common_t
*arm7_9
= armv4_5
->arch_info
;
462 if (arm7_9
->sw_bkpts_enabled
)
465 if (arm7_9
->wp_available
< 1)
467 WARNING("can't enable sw breakpoints with no watchpoint unit available");
468 return ERROR_TARGET_RESOURCE_NOT_AVAILABLE
;
470 arm7_9
->wp_available
--;
472 if (!arm7_9
->wp0_used
)
474 embeddedice_set_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W0_DATA_VALUE
], arm7_9
->arm_bkpt
);
475 embeddedice_set_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W0_DATA_MASK
], 0x0);
476 embeddedice_set_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W0_ADDR_MASK
], 0xffffffffu
);
477 embeddedice_set_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W0_CONTROL_MASK
], ~EICE_W_CTRL_nOPC
& 0xff);
478 embeddedice_set_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W0_CONTROL_VALUE
], EICE_W_CTRL_ENABLE
);
479 arm7_9
->sw_bkpts_enabled
= 1;
480 arm7_9
->wp0_used
= 3;
482 else if (!arm7_9
->wp1_used
)
484 embeddedice_set_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W1_DATA_VALUE
], arm7_9
->arm_bkpt
);
485 embeddedice_set_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W1_DATA_MASK
], 0x0);
486 embeddedice_set_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W1_ADDR_MASK
], 0xffffffffu
);
487 embeddedice_set_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W1_CONTROL_MASK
], ~EICE_W_CTRL_nOPC
& 0xff);
488 embeddedice_set_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W1_CONTROL_VALUE
], EICE_W_CTRL_ENABLE
);
489 arm7_9
->sw_bkpts_enabled
= 2;
490 arm7_9
->wp1_used
= 3;
494 ERROR("BUG: both watchpoints used, but wp_available >= 1");
498 if ((retval
= jtag_execute_queue()) != ERROR_OK
)
500 ERROR("error writing EmbeddedICE registers to enable sw breakpoints");
507 int arm7_9_disable_sw_bkpts(struct target_s
*target
)
509 armv4_5_common_t
*armv4_5
= target
->arch_info
;
510 arm7_9_common_t
*arm7_9
= armv4_5
->arch_info
;
512 if (!arm7_9
->sw_bkpts_enabled
)
515 if (arm7_9
->sw_bkpts_enabled
== 1)
517 embeddedice_write_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W0_CONTROL_VALUE
], 0x0);
518 arm7_9
->sw_bkpts_enabled
= 0;
519 arm7_9
->wp0_used
= 0;
520 arm7_9
->wp_available
++;
522 else if (arm7_9
->sw_bkpts_enabled
== 2)
524 embeddedice_write_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W1_CONTROL_VALUE
], 0x0);
525 arm7_9
->sw_bkpts_enabled
= 0;
526 arm7_9
->wp1_used
= 0;
527 arm7_9
->wp_available
++;
533 int arm7_9_execute_sys_speed(struct target_s
*target
)
538 armv4_5_common_t
*armv4_5
= target
->arch_info
;
539 arm7_9_common_t
*arm7_9
= armv4_5
->arch_info
;
540 arm_jtag_t
*jtag_info
= &arm7_9
->jtag_info
;
541 reg_t
*dbg_stat
= &arm7_9
->eice_cache
->reg_list
[EICE_DBG_STAT
];
543 /* set RESTART instruction */
544 jtag_add_end_state(TAP_RTI
);
545 arm_jtag_set_instr(jtag_info
, 0x4);
547 for (timeout
=0; timeout
<50; timeout
++)
549 /* read debug status register */
550 embeddedice_read_reg(dbg_stat
);
551 if ((retval
= jtag_execute_queue()) != ERROR_OK
)
553 if ((buf_get_u32(dbg_stat
->value
, EICE_DBG_STATUS_DBGACK
, 1))
554 && (buf_get_u32(dbg_stat
->value
, EICE_DBG_STATUS_SYSCOMP
, 1)))
560 ERROR("timeout waiting for SYSCOMP & DBGACK, last DBG_STATUS: %x", buf_get_u32(dbg_stat
->value
, 0, dbg_stat
->size
));
561 return ERROR_TARGET_TIMEOUT
;
567 int arm7_9_execute_fast_sys_speed(struct target_s
*target
)
569 u8 check_value
[4], check_mask
[4];
571 armv4_5_common_t
*armv4_5
= target
->arch_info
;
572 arm7_9_common_t
*arm7_9
= armv4_5
->arch_info
;
573 arm_jtag_t
*jtag_info
= &arm7_9
->jtag_info
;
574 reg_t
*dbg_stat
= &arm7_9
->eice_cache
->reg_list
[EICE_DBG_STAT
];
576 /* set RESTART instruction */
577 jtag_add_end_state(TAP_RTI
);
578 arm_jtag_set_instr(jtag_info
, 0x4);
580 /* check for DBGACK and SYSCOMP set (others don't care) */
581 buf_set_u32(check_value
, 0, 32, 0x9);
582 buf_set_u32(check_mask
, 0, 32, 0x9);
584 /* read debug status register */
585 embeddedice_read_reg_w_check(dbg_stat
, check_value
, check_value
);
590 enum target_state
arm7_9_poll(target_t
*target
)
593 armv4_5_common_t
*armv4_5
= target
->arch_info
;
594 arm7_9_common_t
*arm7_9
= armv4_5
->arch_info
;
595 reg_t
*dbg_stat
= &arm7_9
->eice_cache
->reg_list
[EICE_DBG_STAT
];
597 if (arm7_9
->reinit_embeddedice
)
599 arm7_9_reinit_embeddedice(target
);
602 /* read debug status register */
603 embeddedice_read_reg(dbg_stat
);
604 if ((retval
= jtag_execute_queue()) != ERROR_OK
)
608 case ERROR_JTAG_QUEUE_FAILED
:
609 ERROR("JTAG queue failed while reading EmbeddedICE status register");
617 if (buf_get_u32(dbg_stat
->value
, EICE_DBG_STATUS_DBGACK
, 1))
619 DEBUG("DBGACK set, dbg_state->value: 0x%x", buf_get_u32(dbg_stat
->value
, 0, 32));
620 if ((target
->state
== TARGET_UNKNOWN
))
622 WARNING("DBGACK set while target was in unknown state. Reset or initialize target before resuming");
623 target
->state
= TARGET_RUNNING
;
625 if ((target
->state
== TARGET_RUNNING
) || (target
->state
== TARGET_RESET
))
627 target
->state
= TARGET_HALTED
;
628 if ((retval
= arm7_9_debug_entry(target
)) != ERROR_OK
)
631 target_call_event_callbacks(target
, TARGET_EVENT_HALTED
);
633 if (target
->state
== TARGET_DEBUG_RUNNING
)
635 target
->state
= TARGET_HALTED
;
636 if ((retval
= arm7_9_debug_entry(target
)) != ERROR_OK
)
639 target_call_event_callbacks(target
, TARGET_EVENT_DEBUG_HALTED
);
644 if (target
->state
!= TARGET_DEBUG_RUNNING
)
645 target
->state
= TARGET_RUNNING
;
648 return target
->state
;
651 int arm7_9_assert_reset(target_t
*target
)
655 DEBUG("target->state: %s", target_state_strings
[target
->state
]);
657 if (target
->state
== TARGET_HALTED
|| target
->state
== TARGET_UNKNOWN
)
659 /* assert SRST and TRST */
660 /* system would get ouf sync if we didn't reset test-logic, too */
661 if ((retval
= jtag_add_reset(1, 1)) != ERROR_OK
)
663 if (retval
== ERROR_JTAG_RESET_CANT_SRST
)
665 WARNING("can't assert srst");
670 ERROR("unknown error");
674 jtag_add_sleep(5000);
675 if ((retval
= jtag_add_reset(0, 1)) != ERROR_OK
)
677 if (retval
== ERROR_JTAG_RESET_WOULD_ASSERT_TRST
)
679 WARNING("srst resets test logic, too");
680 retval
= jtag_add_reset(1, 1);
686 if ((retval
= jtag_add_reset(0, 1)) != ERROR_OK
)
688 if (retval
== ERROR_JTAG_RESET_WOULD_ASSERT_TRST
)
690 WARNING("srst resets test logic, too");
691 retval
= jtag_add_reset(1, 1);
694 if (retval
== ERROR_JTAG_RESET_CANT_SRST
)
696 WARNING("can't assert srst");
699 else if (retval
!= ERROR_OK
)
701 ERROR("unknown error");
707 target
->state
= TARGET_RESET
;
708 jtag_add_sleep(50000);
710 armv4_5_invalidate_core_regs(target
);
716 int arm7_9_deassert_reset(target_t
*target
)
718 DEBUG("target->state: %s", target_state_strings
[target
->state
]);
720 /* deassert reset lines */
721 jtag_add_reset(0, 0);
727 int arm7_9_soft_reset_halt(struct target_s
*target
)
729 armv4_5_common_t
*armv4_5
= target
->arch_info
;
730 arm7_9_common_t
*arm7_9
= armv4_5
->arch_info
;
731 reg_t
*dbg_stat
= &arm7_9
->eice_cache
->reg_list
[EICE_DBG_STAT
];
734 if (target
->state
== TARGET_RUNNING
)
736 target
->type
->halt(target
);
739 while (buf_get_u32(dbg_stat
->value
, EICE_DBG_CONTROL_DBGACK
, 1) == 0)
741 embeddedice_read_reg(dbg_stat
);
742 jtag_execute_queue();
744 target
->state
= TARGET_HALTED
;
746 /* all register content is now invalid */
747 armv4_5_invalidate_core_regs(target
);
749 /* SVC, ARM state, IRQ and FIQ disabled */
750 buf_set_u32(armv4_5
->core_cache
->reg_list
[ARMV4_5_CPSR
].value
, 0, 8, 0xd3);
751 armv4_5
->core_cache
->reg_list
[ARMV4_5_CPSR
].dirty
= 1;
752 armv4_5
->core_cache
->reg_list
[ARMV4_5_CPSR
].valid
= 1;
754 /* start fetching from 0x0 */
755 buf_set_u32(armv4_5
->core_cache
->reg_list
[15].value
, 0, 32, 0x0);
756 armv4_5
->core_cache
->reg_list
[15].dirty
= 1;
757 armv4_5
->core_cache
->reg_list
[15].valid
= 1;
759 armv4_5
->core_mode
= ARMV4_5_MODE_SVC
;
760 armv4_5
->core_state
= ARMV4_5_STATE_ARM
;
762 /* reset registers */
763 for (i
= 0; i
<= 14; i
++)
765 buf_set_u32(ARMV4_5_CORE_REG_MODE(armv4_5
->core_cache
, armv4_5
->core_mode
, i
).value
, 0, 32, 0xffffffff);
766 ARMV4_5_CORE_REG_MODE(armv4_5
->core_cache
, armv4_5
->core_mode
, i
).dirty
= 1;
767 ARMV4_5_CORE_REG_MODE(armv4_5
->core_cache
, armv4_5
->core_mode
, i
).valid
= 1;
770 target_call_event_callbacks(target
, TARGET_EVENT_HALTED
);
775 int arm7_9_halt(target_t
*target
)
777 armv4_5_common_t
*armv4_5
= target
->arch_info
;
778 arm7_9_common_t
*arm7_9
= armv4_5
->arch_info
;
779 reg_t
*dbg_ctrl
= &arm7_9
->eice_cache
->reg_list
[EICE_DBG_CTRL
];
781 DEBUG("target->state: %s", target_state_strings
[target
->state
]);
783 if (target
->state
== TARGET_HALTED
)
785 WARNING("target was already halted");
786 return ERROR_TARGET_ALREADY_HALTED
;
789 if (target
->state
== TARGET_UNKNOWN
)
791 WARNING("target was in unknown state when halt was requested");
794 if ((target
->state
== TARGET_RESET
) && (jtag_reset_config
& RESET_SRST_PULLS_TRST
) && (jtag_srst
))
796 ERROR("can't request a halt while in reset if nSRST pulls nTRST");
797 return ERROR_TARGET_FAILURE
;
800 if (arm7_9
->use_dbgrq
)
802 /* program EmbeddedICE Debug Control Register to assert DBGRQ
804 buf_set_u32(dbg_ctrl
->value
, EICE_DBG_CONTROL_DBGRQ
, 1, 1);
805 embeddedice_store_reg(dbg_ctrl
);
809 /* program watchpoint unit to match on any address
811 embeddedice_write_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W0_ADDR_MASK
], 0xffffffff);
812 embeddedice_write_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W0_DATA_MASK
], 0xffffffff);
813 embeddedice_write_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W0_CONTROL_VALUE
], 0x100);
814 embeddedice_write_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W0_CONTROL_MASK
], 0xf7);
817 target
->debug_reason
= DBG_REASON_DBGRQ
;
822 int arm7_9_clear_halt(target_t
*target
)
824 armv4_5_common_t
*armv4_5
= target
->arch_info
;
825 arm7_9_common_t
*arm7_9
= armv4_5
->arch_info
;
826 reg_t
*dbg_ctrl
= &arm7_9
->eice_cache
->reg_list
[EICE_DBG_CTRL
];
828 if (arm7_9
->use_dbgrq
)
830 /* program EmbeddedICE Debug Control Register to deassert DBGRQ
832 buf_set_u32(dbg_ctrl
->value
, EICE_DBG_CONTROL_DBGRQ
, 1, 0);
833 embeddedice_store_reg(dbg_ctrl
);
837 /* restore registers if watchpoint unit 0 was in use
839 if (arm7_9
->wp0_used
)
841 embeddedice_store_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W0_ADDR_MASK
]);
842 embeddedice_store_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W0_DATA_MASK
]);
843 embeddedice_store_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W0_CONTROL_MASK
]);
845 /* control value always has to be restored, as it was either disabled,
846 * or enabled with possibly different bits
848 embeddedice_store_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W0_CONTROL_VALUE
]);
854 int arm7_9_debug_entry(target_t
*target
)
859 u32 r0_thumb
, pc_thumb
;
862 /* get pointers to arch-specific information */
863 armv4_5_common_t
*armv4_5
= target
->arch_info
;
864 arm7_9_common_t
*arm7_9
= armv4_5
->arch_info
;
865 reg_t
*dbg_stat
= &arm7_9
->eice_cache
->reg_list
[EICE_DBG_STAT
];
866 reg_t
*dbg_ctrl
= &arm7_9
->eice_cache
->reg_list
[EICE_DBG_CTRL
];
868 #ifdef _DEBUG_ARM7_9_
872 if (arm7_9
->pre_debug_entry
)
873 arm7_9
->pre_debug_entry(target
);
875 /* program EmbeddedICE Debug Control Register to assert DBGACK and INTDIS
876 * ensure that DBGRQ is cleared
878 buf_set_u32(dbg_ctrl
->value
, EICE_DBG_CONTROL_DBGACK
, 1, 1);
879 buf_set_u32(dbg_ctrl
->value
, EICE_DBG_CONTROL_DBGRQ
, 1, 0);
880 buf_set_u32(dbg_ctrl
->value
, EICE_DBG_CONTROL_INTDIS
, 1, 1);
881 embeddedice_store_reg(dbg_ctrl
);
883 arm7_9_clear_halt(target
);
885 if ((retval
= jtag_execute_queue()) != ERROR_OK
)
889 case ERROR_JTAG_QUEUE_FAILED
:
890 ERROR("JTAG queue failed while writing EmbeddedICE control register");
898 if ((retval
= arm7_9
->examine_debug_reason(target
)) != ERROR_OK
)
902 if (target
->state
!= TARGET_HALTED
)
904 WARNING("target not halted");
905 return ERROR_TARGET_NOT_HALTED
;
908 /* if the target is in Thumb state, change to ARM state */
909 if (buf_get_u32(dbg_stat
->value
, EICE_DBG_STATUS_ITBIT
, 1))
911 DEBUG("target entered debug from Thumb state");
912 /* Entered debug from Thumb mode */
913 armv4_5
->core_state
= ARMV4_5_STATE_THUMB
;
914 arm7_9
->change_to_arm(target
, &r0_thumb
, &pc_thumb
);
915 DEBUG("r0_thumb: 0x%8.8x, pc_thumb: 0x%8.8x", r0_thumb
, pc_thumb
);
919 DEBUG("target entered debug from ARM state");
920 /* Entered debug from ARM mode */
921 armv4_5
->core_state
= ARMV4_5_STATE_ARM
;
924 for (i
= 0; i
< 16; i
++)
925 context_p
[i
] = &context
[i
];
926 /* save core registers (r0 - r15 of current core mode) */
927 arm7_9
->read_core_regs(target
, 0xffff, context_p
);
929 arm7_9
->read_xpsr(target
, &cpsr
, 0);
931 if ((retval
= jtag_execute_queue()) != ERROR_OK
)
934 /* if the core has been executing in Thumb state, set the T bit */
935 if (armv4_5
->core_state
== ARMV4_5_STATE_THUMB
)
938 buf_set_u32(armv4_5
->core_cache
->reg_list
[ARMV4_5_CPSR
].value
, 0, 32, cpsr
);
939 armv4_5
->core_cache
->reg_list
[ARMV4_5_CPSR
].dirty
= 0;
940 armv4_5
->core_cache
->reg_list
[ARMV4_5_CPSR
].valid
= 1;
942 armv4_5
->core_mode
= cpsr
& 0x1f;
944 if (armv4_5_mode_to_number(armv4_5
->core_mode
) == -1)
946 target
->state
= TARGET_UNKNOWN
;
947 ERROR("cpsr contains invalid mode value - communication failure");
948 return ERROR_TARGET_FAILURE
;
951 DEBUG("target entered debug state in %s mode", armv4_5_mode_strings
[armv4_5_mode_to_number(armv4_5
->core_mode
)]);
953 if (armv4_5
->core_state
== ARMV4_5_STATE_THUMB
)
955 DEBUG("thumb state, applying fixups");
956 context
[0] = r0_thumb
;
957 context
[15] = pc_thumb
;
958 } else if (armv4_5
->core_state
== ARMV4_5_STATE_ARM
)
960 /* adjust value stored by STM */
961 context
[15] -= 3 * 4;
964 if ((target
->debug_reason
== DBG_REASON_BREAKPOINT
)
965 || (target
->debug_reason
== DBG_REASON_SINGLESTEP
)
966 || (target
->debug_reason
== DBG_REASON_WATCHPOINT
)
967 || (target
->debug_reason
== DBG_REASON_WPTANDBKPT
)
968 || ((target
->debug_reason
== DBG_REASON_DBGRQ
) && (arm7_9
->use_dbgrq
== 0)))
969 context
[15] -= 3 * ((armv4_5
->core_state
== ARMV4_5_STATE_ARM
) ? 4 : 2);
970 else if (target
->debug_reason
== DBG_REASON_DBGRQ
)
971 context
[15] -= arm7_9
->dbgreq_adjust_pc
* ((armv4_5
->core_state
== ARMV4_5_STATE_ARM
) ? 4 : 2);
974 ERROR("unknown debug reason: %i", target
->debug_reason
);
978 for (i
=0; i
<=15; i
++)
980 DEBUG("r%i: 0x%8.8x", i
, context
[i
]);
981 buf_set_u32(ARMV4_5_CORE_REG_MODE(armv4_5
->core_cache
, armv4_5
->core_mode
, i
).value
, 0, 32, context
[i
]);
982 ARMV4_5_CORE_REG_MODE(armv4_5
->core_cache
, armv4_5
->core_mode
, i
).dirty
= 0;
983 ARMV4_5_CORE_REG_MODE(armv4_5
->core_cache
, armv4_5
->core_mode
, i
).valid
= 1;
986 DEBUG("entered debug state at PC 0x%x", context
[15]);
988 /* exceptions other than USR & SYS have a saved program status register */
989 if ((armv4_5_mode_to_number(armv4_5
->core_mode
) != ARMV4_5_MODE_USR
) && (armv4_5_mode_to_number(armv4_5
->core_mode
) != ARMV4_5_MODE_SYS
))
992 arm7_9
->read_xpsr(target
, &spsr
, 1);
993 jtag_execute_queue();
994 buf_set_u32(ARMV4_5_CORE_REG_MODE(armv4_5
->core_cache
, armv4_5
->core_mode
, 16).value
, 0, 32, spsr
);
995 ARMV4_5_CORE_REG_MODE(armv4_5
->core_cache
, armv4_5
->core_mode
, 16).dirty
= 0;
996 ARMV4_5_CORE_REG_MODE(armv4_5
->core_cache
, armv4_5
->core_mode
, 16).valid
= 1;
999 /* r0 and r15 (pc) have to be restored later */
1000 ARMV4_5_CORE_REG_MODE(armv4_5
->core_cache
, armv4_5
->core_mode
, 0).dirty
= 1;
1001 ARMV4_5_CORE_REG_MODE(armv4_5
->core_cache
, armv4_5
->core_mode
, 15).dirty
= 1;
1003 if ((retval
= jtag
->execute_queue()) != ERROR_OK
)
1006 if (arm7_9
->post_debug_entry
)
1007 arm7_9
->post_debug_entry(target
);
1012 int arm7_9_full_context(target_t
*target
)
1016 armv4_5_common_t
*armv4_5
= target
->arch_info
;
1017 arm7_9_common_t
*arm7_9
= armv4_5
->arch_info
;
1021 if (target
->state
!= TARGET_HALTED
)
1023 WARNING("target not halted");
1024 return ERROR_TARGET_NOT_HALTED
;
1027 /* iterate through processor modes (User, FIQ, IRQ, SVC, ABT, UND)
1028 * SYS shares registers with User, so we don't touch SYS
1030 for(i
= 0; i
< 6; i
++)
1037 /* check if there are invalid registers in the current mode
1039 for (j
= 0; j
<= 16; j
++)
1041 if (ARMV4_5_CORE_REG_MODE(armv4_5
->core_cache
, armv4_5_number_to_mode(i
), j
).valid
== 0)
1049 /* change processor mode (and mask T bit) */
1050 tmp_cpsr
= buf_get_u32(armv4_5
->core_cache
->reg_list
[ARMV4_5_CPSR
].value
, 0, 8) & 0xE0;
1051 tmp_cpsr
|= armv4_5_number_to_mode(i
);
1053 arm7_9
->write_xpsr_im8(target
, tmp_cpsr
& 0xff, 0, 0);
1055 for (j
= 0; j
< 15; j
++)
1057 if (ARMV4_5_CORE_REG_MODE(armv4_5
->core_cache
, armv4_5_number_to_mode(i
), j
).valid
== 0)
1059 reg_p
[j
] = (u32
*)ARMV4_5_CORE_REG_MODE(armv4_5
->core_cache
, armv4_5_number_to_mode(i
), j
).value
;
1061 ARMV4_5_CORE_REG_MODE(armv4_5
->core_cache
, armv4_5_number_to_mode(i
), j
).valid
= 1;
1062 ARMV4_5_CORE_REG_MODE(armv4_5
->core_cache
, armv4_5_number_to_mode(i
), j
).dirty
= 0;
1066 /* if only the PSR is invalid, mask is all zeroes */
1068 arm7_9
->read_core_regs(target
, mask
, reg_p
);
1070 /* check if the PSR has to be read */
1071 if (ARMV4_5_CORE_REG_MODE(armv4_5
->core_cache
, armv4_5_number_to_mode(i
), 16).valid
== 0)
1073 arm7_9
->read_xpsr(target
, (u32
*)ARMV4_5_CORE_REG_MODE(armv4_5
->core_cache
, armv4_5_number_to_mode(i
), 16).value
, 1);
1074 ARMV4_5_CORE_REG_MODE(armv4_5
->core_cache
, armv4_5_number_to_mode(i
), 16).valid
= 1;
1075 ARMV4_5_CORE_REG_MODE(armv4_5
->core_cache
, armv4_5_number_to_mode(i
), 16).dirty
= 0;
1080 /* restore processor mode (mask T bit) */
1081 arm7_9
->write_xpsr_im8(target
, buf_get_u32(armv4_5
->core_cache
->reg_list
[ARMV4_5_CPSR
].value
, 0, 8) & ~0x20, 0, 0);
1083 if ((retval
= jtag_execute_queue()) != ERROR_OK
)
1085 ERROR("JTAG failure");
1091 int arm7_9_restore_context(target_t
*target
)
1093 armv4_5_common_t
*armv4_5
= target
->arch_info
;
1094 arm7_9_common_t
*arm7_9
= armv4_5
->arch_info
;
1096 armv4_5_core_reg_t
*reg_arch_info
;
1097 enum armv4_5_mode current_mode
= armv4_5
->core_mode
;
1104 if (target
->state
!= TARGET_HALTED
)
1106 WARNING("target not halted");
1107 return ERROR_TARGET_NOT_HALTED
;
1110 if (arm7_9
->pre_restore_context
)
1111 arm7_9
->pre_restore_context(target
);
1113 /* iterate through processor modes (User, FIQ, IRQ, SVC, ABT, UND)
1114 * SYS shares registers with User, so we don't touch SYS
1116 for (i
= 0; i
< 6; i
++)
1118 DEBUG("examining %s mode", armv4_5_mode_strings
[i
]);
1121 /* check if there are dirty registers in the current mode
1123 for (j
= 0; j
<= 16; j
++)
1125 reg
= &ARMV4_5_CORE_REG_MODE(armv4_5
->core_cache
, armv4_5_number_to_mode(i
), j
);
1126 reg_arch_info
= reg
->arch_info
;
1127 if (reg
->dirty
== 1)
1129 if (reg
->valid
== 1)
1132 DEBUG("examining dirty reg: %s", reg
->name
);
1133 if ((reg_arch_info
->mode
!= ARMV4_5_MODE_ANY
)
1134 && (reg_arch_info
->mode
!= current_mode
)
1135 && !((reg_arch_info
->mode
== ARMV4_5_MODE_USR
) && (armv4_5
->core_mode
== ARMV4_5_MODE_SYS
))
1136 && !((reg_arch_info
->mode
== ARMV4_5_MODE_SYS
) && (armv4_5
->core_mode
== ARMV4_5_MODE_USR
)))
1139 DEBUG("require mode change");
1144 ERROR("BUG: dirty register '%s', but no valid data", reg
->name
);
1160 /* change processor mode (mask T bit) */
1161 tmp_cpsr
= buf_get_u32(armv4_5
->core_cache
->reg_list
[ARMV4_5_CPSR
].value
, 0, 8) & 0xE0;
1162 tmp_cpsr
|= armv4_5_number_to_mode(i
);
1164 arm7_9
->write_xpsr_im8(target
, tmp_cpsr
& 0xff, 0, 0);
1165 current_mode
= armv4_5_number_to_mode(i
);
1168 for (j
= 0; j
<= 14; j
++)
1170 reg
= &ARMV4_5_CORE_REG_MODE(armv4_5
->core_cache
, armv4_5_number_to_mode(i
), j
);
1171 reg_arch_info
= reg
->arch_info
;
1174 if (reg
->dirty
== 1)
1176 regs
[j
] = buf_get_u32(reg
->value
, 0, 32);
1181 DEBUG("writing register %i of mode %s with value 0x%8.8x", j
, armv4_5_mode_strings
[i
], regs
[j
]);
1187 arm7_9
->write_core_regs(target
, mask
, regs
);
1190 reg
= &ARMV4_5_CORE_REG_MODE(armv4_5
->core_cache
, armv4_5_number_to_mode(i
), 16);
1191 reg_arch_info
= reg
->arch_info
;
1192 if ((reg
->dirty
) && (reg_arch_info
->mode
!= ARMV4_5_MODE_ANY
))
1194 DEBUG("writing SPSR of mode %i with value 0x%8.8x", i
, buf_get_u32(reg
->value
, 0, 32));
1195 arm7_9
->write_xpsr(target
, buf_get_u32(reg
->value
, 0, 32), 1);
1200 if ((armv4_5
->core_cache
->reg_list
[ARMV4_5_CPSR
].dirty
== 0) && (armv4_5
->core_mode
!= current_mode
))
1202 /* restore processor mode (mask T bit) */
1205 tmp_cpsr
= buf_get_u32(armv4_5
->core_cache
->reg_list
[ARMV4_5_CPSR
].value
, 0, 8) & 0xE0;
1206 tmp_cpsr
|= armv4_5_number_to_mode(i
);
1208 DEBUG("writing lower 8 bit of cpsr with value 0x%2.2x", tmp_cpsr
);
1209 arm7_9
->write_xpsr_im8(target
, tmp_cpsr
& 0xff, 0, 0);
1211 else if (armv4_5
->core_cache
->reg_list
[ARMV4_5_CPSR
].dirty
== 1)
1213 /* CPSR has been changed, full restore necessary (mask T bit) */
1214 DEBUG("writing cpsr with value 0x%8.8x", buf_get_u32(armv4_5
->core_cache
->reg_list
[ARMV4_5_CPSR
].value
, 0, 32));
1215 arm7_9
->write_xpsr(target
, buf_get_u32(armv4_5
->core_cache
->reg_list
[ARMV4_5_CPSR
].value
, 0, 32) & ~0x20, 0);
1216 armv4_5
->core_cache
->reg_list
[ARMV4_5_CPSR
].dirty
= 0;
1217 armv4_5
->core_cache
->reg_list
[ARMV4_5_CPSR
].valid
= 1;
1221 DEBUG("writing PC with value 0x%8.8x", buf_get_u32(armv4_5
->core_cache
->reg_list
[15].value
, 0, 32));
1222 arm7_9
->write_pc(target
, buf_get_u32(armv4_5
->core_cache
->reg_list
[15].value
, 0, 32));
1223 armv4_5
->core_cache
->reg_list
[15].dirty
= 0;
1225 if (arm7_9
->post_restore_context
)
1226 arm7_9
->post_restore_context(target
);
1231 int arm7_9_restart_core(struct target_s
*target
)
1233 armv4_5_common_t
*armv4_5
= target
->arch_info
;
1234 arm7_9_common_t
*arm7_9
= armv4_5
->arch_info
;
1235 arm_jtag_t
*jtag_info
= &arm7_9
->jtag_info
;
1237 /* set RESTART instruction */
1238 jtag_add_end_state(TAP_RTI
);
1239 arm_jtag_set_instr(jtag_info
, 0x4);
1241 jtag_add_runtest(1, TAP_RTI
);
1242 if ((jtag_execute_queue()) != ERROR_OK
)
1250 void arm7_9_enable_watchpoints(struct target_s
*target
)
1252 watchpoint_t
*watchpoint
= target
->watchpoints
;
1256 if (watchpoint
->set
== 0)
1257 arm7_9_set_watchpoint(target
, watchpoint
);
1258 watchpoint
= watchpoint
->next
;
1262 void arm7_9_enable_breakpoints(struct target_s
*target
)
1264 breakpoint_t
*breakpoint
= target
->breakpoints
;
1266 /* set any pending breakpoints */
1269 if (breakpoint
->set
== 0)
1270 arm7_9_set_breakpoint(target
, breakpoint
);
1271 breakpoint
= breakpoint
->next
;
1275 void arm7_9_disable_bkpts_and_wpts(struct target_s
*target
)
1277 breakpoint_t
*breakpoint
= target
->breakpoints
;
1278 watchpoint_t
*watchpoint
= target
->watchpoints
;
1280 /* set any pending breakpoints */
1283 if (breakpoint
->set
!= 0)
1284 arm7_9_unset_breakpoint(target
, breakpoint
);
1285 breakpoint
= breakpoint
->next
;
1290 if (watchpoint
->set
!= 0)
1291 arm7_9_unset_watchpoint(target
, watchpoint
);
1292 watchpoint
= watchpoint
->next
;
1296 int arm7_9_resume(struct target_s
*target
, int current
, u32 address
, int handle_breakpoints
, int debug_execution
)
1298 armv4_5_common_t
*armv4_5
= target
->arch_info
;
1299 arm7_9_common_t
*arm7_9
= armv4_5
->arch_info
;
1300 breakpoint_t
*breakpoint
= target
->breakpoints
;
1301 reg_t
*dbg_ctrl
= &arm7_9
->eice_cache
->reg_list
[EICE_DBG_CTRL
];
1305 if (target
->state
!= TARGET_HALTED
)
1307 WARNING("target not halted");
1308 return ERROR_TARGET_NOT_HALTED
;
1311 if (!debug_execution
)
1313 target_free_all_working_areas(target
);
1316 /* current = 1: continue on current pc, otherwise continue at <address> */
1318 buf_set_u32(armv4_5
->core_cache
->reg_list
[15].value
, 0, 32, address
);
1320 /* the front-end may request us not to handle breakpoints */
1321 if (handle_breakpoints
)
1323 if ((breakpoint
= breakpoint_find(target
, buf_get_u32(armv4_5
->core_cache
->reg_list
[15].value
, 0, 32))))
1325 DEBUG("unset breakpoint at 0x%8.8x", breakpoint
->address
);
1326 arm7_9_unset_breakpoint(target
, breakpoint
);
1328 DEBUG("enable single-step");
1329 arm7_9
->enable_single_step(target
);
1331 target
->debug_reason
= DBG_REASON_SINGLESTEP
;
1333 arm7_9_restore_context(target
);
1335 if (armv4_5
->core_state
== ARMV4_5_STATE_ARM
)
1336 arm7_9
->branch_resume(target
);
1337 else if (armv4_5
->core_state
== ARMV4_5_STATE_THUMB
)
1339 arm7_9
->branch_resume_thumb(target
);
1343 ERROR("unhandled core state");
1347 buf_set_u32(dbg_ctrl
->value
, EICE_DBG_CONTROL_DBGACK
, 1, 0);
1348 embeddedice_write_reg(dbg_ctrl
, buf_get_u32(dbg_ctrl
->value
, 0, dbg_ctrl
->size
));
1349 arm7_9_execute_sys_speed(target
);
1351 DEBUG("disable single-step");
1352 arm7_9
->disable_single_step(target
);
1354 arm7_9_debug_entry(target
);
1355 DEBUG("new PC after step: 0x%8.8x", buf_get_u32(armv4_5
->core_cache
->reg_list
[15].value
, 0, 32));
1357 DEBUG("set breakpoint at 0x%8.8x", breakpoint
->address
);
1358 arm7_9_set_breakpoint(target
, breakpoint
);
1362 /* enable any pending breakpoints and watchpoints */
1363 arm7_9_enable_breakpoints(target
);
1364 arm7_9_enable_watchpoints(target
);
1366 arm7_9_restore_context(target
);
1368 if (armv4_5
->core_state
== ARMV4_5_STATE_ARM
)
1370 arm7_9
->branch_resume(target
);
1372 else if (armv4_5
->core_state
== ARMV4_5_STATE_THUMB
)
1374 arm7_9
->branch_resume_thumb(target
);
1378 ERROR("unhandled core state");
1382 /* deassert DBGACK and INTDIS */
1383 buf_set_u32(dbg_ctrl
->value
, EICE_DBG_CONTROL_DBGACK
, 1, 0);
1384 /* INTDIS only when we really resume, not during debug execution */
1385 if (!debug_execution
)
1386 buf_set_u32(dbg_ctrl
->value
, EICE_DBG_CONTROL_INTDIS
, 1, 0);
1387 embeddedice_write_reg(dbg_ctrl
, buf_get_u32(dbg_ctrl
->value
, 0, dbg_ctrl
->size
));
1389 arm7_9_restart_core(target
);
1391 target
->debug_reason
= DBG_REASON_NOTHALTED
;
1393 if (!debug_execution
)
1395 /* registers are now invalid */
1396 armv4_5_invalidate_core_regs(target
);
1397 target
->state
= TARGET_RUNNING
;
1398 target_call_event_callbacks(target
, TARGET_EVENT_RESUMED
);
1402 target
->state
= TARGET_DEBUG_RUNNING
;
1403 target_call_event_callbacks(target
, TARGET_EVENT_DEBUG_RESUMED
);
1406 DEBUG("target resumed");
1411 void arm7_9_enable_eice_step(target_t
*target
)
1413 armv4_5_common_t
*armv4_5
= target
->arch_info
;
1414 arm7_9_common_t
*arm7_9
= armv4_5
->arch_info
;
1416 /* setup an inverse breakpoint on the current PC
1417 * - comparator 1 matches the current address
1418 * - rangeout from comparator 1 is connected to comparator 0 rangein
1419 * - comparator 0 matches any address, as long as rangein is low */
1420 embeddedice_write_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W0_ADDR_MASK
], 0xffffffff);
1421 embeddedice_write_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W0_DATA_MASK
], 0xffffffff);
1422 embeddedice_write_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W0_CONTROL_VALUE
], 0x100);
1423 embeddedice_write_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W0_CONTROL_MASK
], 0x77);
1424 embeddedice_write_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W1_ADDR_VALUE
], buf_get_u32(armv4_5
->core_cache
->reg_list
[15].value
, 0, 32));
1425 embeddedice_write_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W1_ADDR_MASK
], 0);
1426 embeddedice_write_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W1_DATA_MASK
], 0xffffffff);
1427 embeddedice_write_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W1_CONTROL_VALUE
], 0x0);
1428 embeddedice_write_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W1_CONTROL_MASK
], 0xf7);
1431 void arm7_9_disable_eice_step(target_t
*target
)
1433 armv4_5_common_t
*armv4_5
= target
->arch_info
;
1434 arm7_9_common_t
*arm7_9
= armv4_5
->arch_info
;
1436 embeddedice_store_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W0_ADDR_MASK
]);
1437 embeddedice_store_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W0_DATA_MASK
]);
1438 embeddedice_store_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W0_CONTROL_VALUE
]);
1439 embeddedice_store_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W0_CONTROL_MASK
]);
1440 embeddedice_store_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W1_ADDR_VALUE
]);
1441 embeddedice_store_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W1_ADDR_MASK
]);
1442 embeddedice_store_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W1_DATA_MASK
]);
1443 embeddedice_store_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W1_CONTROL_MASK
]);
1444 embeddedice_store_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W1_CONTROL_VALUE
]);
1447 int arm7_9_step(struct target_s
*target
, int current
, u32 address
, int handle_breakpoints
)
1449 armv4_5_common_t
*armv4_5
= target
->arch_info
;
1450 arm7_9_common_t
*arm7_9
= armv4_5
->arch_info
;
1451 breakpoint_t
*breakpoint
= target
->breakpoints
;
1453 if (target
->state
!= TARGET_HALTED
)
1455 WARNING("target not halted");
1456 return ERROR_TARGET_NOT_HALTED
;
1459 /* current = 1: continue on current pc, otherwise continue at <address> */
1461 buf_set_u32(armv4_5
->core_cache
->reg_list
[15].value
, 0, 32, address
);
1463 /* the front-end may request us not to handle breakpoints */
1464 if (handle_breakpoints
)
1465 if ((breakpoint
= breakpoint_find(target
, buf_get_u32(armv4_5
->core_cache
->reg_list
[15].value
, 0, 32))))
1466 arm7_9_unset_breakpoint(target
, breakpoint
);
1468 target
->debug_reason
= DBG_REASON_SINGLESTEP
;
1470 arm7_9_restore_context(target
);
1472 arm7_9
->enable_single_step(target
);
1474 if (armv4_5
->core_state
== ARMV4_5_STATE_ARM
)
1476 arm7_9
->branch_resume(target
);
1478 else if (armv4_5
->core_state
== ARMV4_5_STATE_THUMB
)
1480 arm7_9
->branch_resume_thumb(target
);
1484 ERROR("unhandled core state");
1488 target_call_event_callbacks(target
, TARGET_EVENT_RESUMED
);
1490 arm7_9_execute_sys_speed(target
);
1491 arm7_9
->disable_single_step(target
);
1493 /* registers are now invalid */
1494 armv4_5_invalidate_core_regs(target
);
1496 arm7_9_debug_entry(target
);
1498 target_call_event_callbacks(target
, TARGET_EVENT_HALTED
);
1501 arm7_9_set_breakpoint(target
, breakpoint
);
1503 DEBUG("target stepped");
1509 int arm7_9_read_core_reg(struct target_s
*target
, int num
, enum armv4_5_mode mode
)
1513 armv4_5_common_t
*armv4_5
= target
->arch_info
;
1514 arm7_9_common_t
*arm7_9
= armv4_5
->arch_info
;
1515 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
;
1517 if ((num
< 0) || (num
> 16))
1518 return ERROR_INVALID_ARGUMENTS
;
1520 if ((mode
!= ARMV4_5_MODE_ANY
)
1521 && (mode
!= armv4_5
->core_mode
)
1522 && (reg_mode
!= ARMV4_5_MODE_ANY
))
1526 /* change processor mode (mask T bit) */
1527 tmp_cpsr
= buf_get_u32(armv4_5
->core_cache
->reg_list
[ARMV4_5_CPSR
].value
, 0, 8) & 0xE0;
1530 arm7_9
->write_xpsr_im8(target
, tmp_cpsr
& 0xff, 0, 0);
1533 if ((num
>= 0) && (num
<= 15))
1535 /* read a normal core register */
1536 reg_p
[num
] = (u32
*)ARMV4_5_CORE_REG_MODE(armv4_5
->core_cache
, mode
, num
).value
;
1538 arm7_9
->read_core_regs(target
, 1 << num
, reg_p
);
1542 /* read a program status register
1543 * if the register mode is MODE_ANY, we read the cpsr, otherwise a spsr
1545 armv4_5_core_reg_t
*arch_info
= ARMV4_5_CORE_REG_MODE(armv4_5
->core_cache
, mode
, num
).arch_info
;
1546 int spsr
= (arch_info
->mode
== ARMV4_5_MODE_ANY
) ? 0 : 1;
1548 arm7_9
->read_xpsr(target
, (u32
*)ARMV4_5_CORE_REG_MODE(armv4_5
->core_cache
, mode
, num
).value
, spsr
);
1551 ARMV4_5_CORE_REG_MODE(armv4_5
->core_cache
, mode
, num
).valid
= 1;
1552 ARMV4_5_CORE_REG_MODE(armv4_5
->core_cache
, mode
, num
).dirty
= 0;
1554 if ((mode
!= ARMV4_5_MODE_ANY
)
1555 && (mode
!= armv4_5
->core_mode
)
1556 && (reg_mode
!= ARMV4_5_MODE_ANY
)) {
1557 /* restore processor mode (mask T bit) */
1558 arm7_9
->write_xpsr_im8(target
, buf_get_u32(armv4_5
->core_cache
->reg_list
[ARMV4_5_CPSR
].value
, 0, 8) & ~0x20, 0, 0);
1561 if ((retval
= jtag_execute_queue()) != ERROR_OK
)
1563 ERROR("JTAG failure");
1571 int arm7_9_write_core_reg(struct target_s
*target
, int num
, enum armv4_5_mode mode
, u32 value
)
1575 armv4_5_common_t
*armv4_5
= target
->arch_info
;
1576 arm7_9_common_t
*arm7_9
= armv4_5
->arch_info
;
1577 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
;
1579 if ((num
< 0) || (num
> 16))
1580 return ERROR_INVALID_ARGUMENTS
;
1582 if ((mode
!= ARMV4_5_MODE_ANY
)
1583 && (mode
!= armv4_5
->core_mode
)
1584 && (reg_mode
!= ARMV4_5_MODE_ANY
)) {
1587 /* change processor mode (mask T bit) */
1588 tmp_cpsr
= buf_get_u32(armv4_5
->core_cache
->reg_list
[ARMV4_5_CPSR
].value
, 0, 8) & 0xE0;
1591 arm7_9
->write_xpsr_im8(target
, tmp_cpsr
& 0xff, 0, 0);
1594 if ((num
>= 0) && (num
<= 15))
1596 /* write a normal core register */
1599 arm7_9
->write_core_regs(target
, 1 << num
, reg
);
1603 /* write a program status register
1604 * if the register mode is MODE_ANY, we write the cpsr, otherwise a spsr
1606 armv4_5_core_reg_t
*arch_info
= ARMV4_5_CORE_REG_MODE(armv4_5
->core_cache
, mode
, num
).arch_info
;
1607 int spsr
= (arch_info
->mode
== ARMV4_5_MODE_ANY
) ? 0 : 1;
1609 /* if we're writing the CPSR, mask the T bit */
1613 arm7_9
->write_xpsr(target
, value
, spsr
);
1616 ARMV4_5_CORE_REG_MODE(armv4_5
->core_cache
, mode
, num
).valid
= 1;
1617 ARMV4_5_CORE_REG_MODE(armv4_5
->core_cache
, mode
, num
).dirty
= 0;
1619 if ((mode
!= ARMV4_5_MODE_ANY
)
1620 && (mode
!= armv4_5
->core_mode
)
1621 && (reg_mode
!= ARMV4_5_MODE_ANY
)) {
1622 /* restore processor mode (mask T bit) */
1623 arm7_9
->write_xpsr_im8(target
, buf_get_u32(armv4_5
->core_cache
->reg_list
[ARMV4_5_CPSR
].value
, 0, 8) & ~0x20, 0, 0);
1626 if ((retval
= jtag_execute_queue()) != ERROR_OK
)
1628 ERROR("JTAG failure");
1636 int arm7_9_read_memory(struct target_s
*target
, u32 address
, u32 size
, u32 count
, u8
*buffer
)
1638 armv4_5_common_t
*armv4_5
= target
->arch_info
;
1639 arm7_9_common_t
*arm7_9
= armv4_5
->arch_info
;
1642 int num_accesses
= 0;
1643 int thisrun_accesses
;
1649 DEBUG("address: 0x%8.8x, size: 0x%8.8x, count: 0x%8.8x", address
, size
, count
);
1651 if (target
->state
!= TARGET_HALTED
)
1653 WARNING("target not halted");
1654 return ERROR_TARGET_NOT_HALTED
;
1657 /* sanitize arguments */
1658 if (((size
!= 4) && (size
!= 2) && (size
!= 1)) || (count
== 0) || !(buffer
))
1659 return ERROR_INVALID_ARGUMENTS
;
1661 if (((size
== 4) && (address
& 0x3u
)) || ((size
== 2) && (address
& 0x1u
)))
1662 return ERROR_TARGET_UNALIGNED_ACCESS
;
1664 /* load the base register with the address of the first word */
1666 arm7_9
->write_core_regs(target
, 0x1, reg
);
1671 while (num_accesses
< count
)
1674 thisrun_accesses
= ((count
- num_accesses
) >= 14) ? 14 : (count
- num_accesses
);
1675 reg_list
= (0xffff >> (15 - thisrun_accesses
)) & 0xfffe;
1677 if (last_reg
<= thisrun_accesses
)
1678 last_reg
= thisrun_accesses
;
1680 arm7_9
->load_word_regs(target
, reg_list
);
1682 /* fast memory reads are only safe when the target is running
1683 * from a sufficiently high clock (32 kHz is usually too slow)
1685 if (arm7_9
->fast_memory_access
)
1686 arm7_9_execute_fast_sys_speed(target
);
1688 arm7_9_execute_sys_speed(target
);
1690 arm7_9
->read_core_regs_target_buffer(target
, reg_list
, buffer
, 4);
1692 /* advance buffer, count number of accesses */
1693 buffer
+= thisrun_accesses
* 4;
1694 num_accesses
+= thisrun_accesses
;
1698 while (num_accesses
< count
)
1701 thisrun_accesses
= ((count
- num_accesses
) >= 14) ? 14 : (count
- num_accesses
);
1702 reg_list
= (0xffff >> (15 - thisrun_accesses
)) & 0xfffe;
1704 for (i
= 1; i
<= thisrun_accesses
; i
++)
1708 arm7_9
->load_hword_reg(target
, i
);
1709 /* fast memory reads are only safe when the target is running
1710 * from a sufficiently high clock (32 kHz is usually too slow)
1712 if (arm7_9
->fast_memory_access
)
1713 arm7_9_execute_fast_sys_speed(target
);
1715 arm7_9_execute_sys_speed(target
);
1718 arm7_9
->read_core_regs_target_buffer(target
, reg_list
, buffer
, 2);
1720 /* advance buffer, count number of accesses */
1721 buffer
+= thisrun_accesses
* 2;
1722 num_accesses
+= thisrun_accesses
;
1726 while (num_accesses
< count
)
1729 thisrun_accesses
= ((count
- num_accesses
) >= 14) ? 14 : (count
- num_accesses
);
1730 reg_list
= (0xffff >> (15 - thisrun_accesses
)) & 0xfffe;
1732 for (i
= 1; i
<= thisrun_accesses
; i
++)
1736 arm7_9
->load_byte_reg(target
, i
);
1737 /* fast memory reads are only safe when the target is running
1738 * from a sufficiently high clock (32 kHz is usually too slow)
1740 if (arm7_9
->fast_memory_access
)
1741 arm7_9_execute_fast_sys_speed(target
);
1743 arm7_9_execute_sys_speed(target
);
1746 arm7_9
->read_core_regs_target_buffer(target
, reg_list
, buffer
, 1);
1748 /* advance buffer, count number of accesses */
1749 buffer
+= thisrun_accesses
* 1;
1750 num_accesses
+= thisrun_accesses
;
1754 ERROR("BUG: we shouldn't get here");
1759 for (i
=0; i
<=last_reg
; i
++)
1760 ARMV4_5_CORE_REG_MODE(armv4_5
->core_cache
, armv4_5
->core_mode
, i
).dirty
= 1;
1762 arm7_9
->read_xpsr(target
, &cpsr
, 0);
1763 if ((retval
= jtag_execute_queue()) != ERROR_OK
)
1765 ERROR("JTAG error while reading cpsr");
1769 if (((cpsr
& 0x1f) == ARMV4_5_MODE_ABT
) && (armv4_5
->core_mode
!= ARMV4_5_MODE_ABT
))
1771 ERROR("memory read caused data abort (address: 0x%8.8x, size: 0x%x, count: 0x%x)", address
, size
, count
);
1773 arm7_9
->write_xpsr_im8(target
, buf_get_u32(armv4_5
->core_cache
->reg_list
[ARMV4_5_CPSR
].value
, 0, 8) & ~0x20, 0, 0);
1775 return ERROR_TARGET_DATA_ABORT
;
1781 int arm7_9_write_memory(struct target_s
*target
, u32 address
, u32 size
, u32 count
, u8
*buffer
)
1783 armv4_5_common_t
*armv4_5
= target
->arch_info
;
1784 arm7_9_common_t
*arm7_9
= armv4_5
->arch_info
;
1785 reg_t
*dbg_ctrl
= &arm7_9
->eice_cache
->reg_list
[EICE_DBG_CTRL
];
1788 int num_accesses
= 0;
1789 int thisrun_accesses
;
1795 DEBUG("address: 0x%8.8x, size: 0x%8.8x, count: 0x%8.8x", address
, size
, count
);
1797 if (target
->state
!= TARGET_HALTED
)
1799 WARNING("target not halted");
1800 return ERROR_TARGET_NOT_HALTED
;
1803 /* sanitize arguments */
1804 if (((size
!= 4) && (size
!= 2) && (size
!= 1)) || (count
== 0) || !(buffer
))
1805 return ERROR_INVALID_ARGUMENTS
;
1807 if (((size
== 4) && (address
& 0x3u
)) || ((size
== 2) && (address
& 0x1u
)))
1808 return ERROR_TARGET_UNALIGNED_ACCESS
;
1810 /* load the base register with the address of the first word */
1812 arm7_9
->write_core_regs(target
, 0x1, reg
);
1814 /* Clear DBGACK, to make sure memory fetches work as expected */
1815 buf_set_u32(dbg_ctrl
->value
, EICE_DBG_CONTROL_DBGACK
, 1, 0);
1816 embeddedice_store_reg(dbg_ctrl
);
1821 while (num_accesses
< count
)
1824 thisrun_accesses
= ((count
- num_accesses
) >= 14) ? 14 : (count
- num_accesses
);
1825 reg_list
= (0xffff >> (15 - thisrun_accesses
)) & 0xfffe;
1827 for (i
= 1; i
<= thisrun_accesses
; i
++)
1831 reg
[i
] = target_buffer_get_u32(target
, buffer
);
1835 arm7_9
->write_core_regs(target
, reg_list
, reg
);
1837 arm7_9
->store_word_regs(target
, reg_list
);
1839 /* fast memory writes are only safe when the target is running
1840 * from a sufficiently high clock (32 kHz is usually too slow)
1842 if (arm7_9
->fast_memory_access
)
1843 arm7_9_execute_fast_sys_speed(target
);
1845 arm7_9_execute_sys_speed(target
);
1847 num_accesses
+= thisrun_accesses
;
1851 while (num_accesses
< count
)
1854 thisrun_accesses
= ((count
- num_accesses
) >= 14) ? 14 : (count
- num_accesses
);
1855 reg_list
= (0xffff >> (15 - thisrun_accesses
)) & 0xfffe;
1857 for (i
= 1; i
<= thisrun_accesses
; i
++)
1861 reg
[i
] = target_buffer_get_u16(target
, buffer
) & 0xffff;
1865 arm7_9
->write_core_regs(target
, reg_list
, reg
);
1867 for (i
= 1; i
<= thisrun_accesses
; i
++)
1869 arm7_9
->store_hword_reg(target
, i
);
1871 /* fast memory writes are only safe when the target is running
1872 * from a sufficiently high clock (32 kHz is usually too slow)
1874 if (arm7_9
->fast_memory_access
)
1875 arm7_9_execute_fast_sys_speed(target
);
1877 arm7_9_execute_sys_speed(target
);
1880 num_accesses
+= thisrun_accesses
;
1884 while (num_accesses
< count
)
1887 thisrun_accesses
= ((count
- num_accesses
) >= 14) ? 14 : (count
- num_accesses
);
1888 reg_list
= (0xffff >> (15 - thisrun_accesses
)) & 0xfffe;
1890 for (i
= 1; i
<= thisrun_accesses
; i
++)
1894 reg
[i
] = *buffer
++ & 0xff;
1897 arm7_9
->write_core_regs(target
, reg_list
, reg
);
1899 for (i
= 1; i
<= thisrun_accesses
; i
++)
1901 arm7_9
->store_byte_reg(target
, i
);
1902 /* fast memory writes are only safe when the target is running
1903 * from a sufficiently high clock (32 kHz is usually too slow)
1905 if (arm7_9
->fast_memory_access
)
1906 arm7_9_execute_fast_sys_speed(target
);
1908 arm7_9_execute_sys_speed(target
);
1911 num_accesses
+= thisrun_accesses
;
1915 ERROR("BUG: we shouldn't get here");
1921 buf_set_u32(dbg_ctrl
->value
, EICE_DBG_CONTROL_DBGACK
, 1, 1);
1922 embeddedice_store_reg(dbg_ctrl
);
1924 for (i
=0; i
<=last_reg
; i
++)
1925 ARMV4_5_CORE_REG_MODE(armv4_5
->core_cache
, armv4_5
->core_mode
, i
).dirty
= 1;
1927 arm7_9
->read_xpsr(target
, &cpsr
, 0);
1928 if ((retval
= jtag_execute_queue()) != ERROR_OK
)
1930 ERROR("JTAG error while reading cpsr");
1934 if (((cpsr
& 0x1f) == ARMV4_5_MODE_ABT
) && (armv4_5
->core_mode
!= ARMV4_5_MODE_ABT
))
1936 ERROR("memory write caused data abort (address: 0x%8.8x, size: 0x%x, count: 0x%x)", address
, size
, count
);
1938 arm7_9
->write_xpsr_im8(target
, buf_get_u32(armv4_5
->core_cache
->reg_list
[ARMV4_5_CPSR
].value
, 0, 8) & ~0x20, 0, 0);
1940 return ERROR_TARGET_DATA_ABORT
;
1946 int arm7_9_bulk_write_memory(target_t
*target
, u32 address
, u32 count
, u8
*buffer
)
1948 armv4_5_common_t
*armv4_5
= target
->arch_info
;
1949 arm7_9_common_t
*arm7_9
= armv4_5
->arch_info
;
1950 enum armv4_5_state core_state
= armv4_5
->core_state
;
1951 u32 r0
= buf_get_u32(armv4_5
->core_cache
->reg_list
[0].value
, 0, 32);
1952 u32 r1
= buf_get_u32(armv4_5
->core_cache
->reg_list
[1].value
, 0, 32);
1953 u32 pc
= buf_get_u32(armv4_5
->core_cache
->reg_list
[15].value
, 0, 32);
1958 /* MRC TST BNE MRC STR B */
1959 0xee101e10, 0xe3110001, 0x0afffffc, 0xee111e10, 0xe4801004, 0xeafffff9
1962 if (!arm7_9
->dcc_downloads
)
1963 return target
->type
->write_memory(target
, address
, 4, count
, buffer
);
1965 /* regrab previously allocated working_area, or allocate a new one */
1966 if (!arm7_9
->dcc_working_area
)
1968 u8 dcc_code_buf
[6 * 4];
1970 /* make sure we have a working area */
1971 if (target_alloc_working_area(target
, 24, &arm7_9
->dcc_working_area
) != ERROR_OK
)
1973 INFO("no working area available, falling back to memory writes");
1974 return target
->type
->write_memory(target
, address
, 4, count
, buffer
);
1977 /* copy target instructions to target endianness */
1978 for (i
= 0; i
< 6; i
++)
1980 target_buffer_set_u32(target
, dcc_code_buf
+ i
*4, dcc_code
[i
]);
1983 /* write DCC code to working area */
1984 target
->type
->write_memory(target
, arm7_9
->dcc_working_area
->address
, 4, 6, dcc_code_buf
);
1987 buf_set_u32(armv4_5
->core_cache
->reg_list
[0].value
, 0, 32, address
);
1988 armv4_5
->core_cache
->reg_list
[0].valid
= 1;
1989 armv4_5
->core_cache
->reg_list
[0].dirty
= 1;
1990 armv4_5
->core_state
= ARMV4_5_STATE_ARM
;
1992 arm7_9_resume(target
, 0, arm7_9
->dcc_working_area
->address
, 1, 1);
1994 for (i
= 0; i
< count
; i
++)
1996 embeddedice_write_reg(&arm7_9
->eice_cache
->reg_list
[EICE_COMMS_DATA
], target_buffer_get_u32(target
, buffer
));
2000 target
->type
->halt(target
);
2002 while (target
->state
!= TARGET_HALTED
)
2003 target
->type
->poll(target
);
2005 /* restore target state */
2006 buf_set_u32(armv4_5
->core_cache
->reg_list
[0].value
, 0, 32, r0
);
2007 armv4_5
->core_cache
->reg_list
[0].valid
= 1;
2008 armv4_5
->core_cache
->reg_list
[0].dirty
= 1;
2009 buf_set_u32(armv4_5
->core_cache
->reg_list
[1].value
, 0, 32, r1
);
2010 armv4_5
->core_cache
->reg_list
[1].valid
= 1;
2011 armv4_5
->core_cache
->reg_list
[1].dirty
= 1;
2012 buf_set_u32(armv4_5
->core_cache
->reg_list
[15].value
, 0, 32, pc
);
2013 armv4_5
->core_cache
->reg_list
[15].valid
= 1;
2014 armv4_5
->core_cache
->reg_list
[15].dirty
= 1;
2015 armv4_5
->core_state
= core_state
;
2020 int arm7_9_register_commands(struct command_context_s
*cmd_ctx
)
2022 command_t
*arm7_9_cmd
;
2024 arm7_9_cmd
= register_command(cmd_ctx
, NULL
, "arm7_9", NULL
, COMMAND_ANY
, "arm7/9 specific commands");
2026 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>");
2027 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>");
2029 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>");
2031 register_command(cmd_ctx
, arm7_9_cmd
, "sw_bkpts", handle_arm7_9_sw_bkpts_command
, COMMAND_EXEC
, "support for software breakpoints <enable|disable>");
2032 register_command(cmd_ctx
, arm7_9_cmd
, "force_hw_bkpts", handle_arm7_9_force_hw_bkpts_command
, COMMAND_EXEC
, "use hardware breakpoints for all breakpoints (disables sw breakpoint support) <enable|disable>");
2033 register_command(cmd_ctx
, arm7_9_cmd
, "dbgrq", handle_arm7_9_dbgrq_command
,
2034 COMMAND_ANY
, "use EmbeddedICE dbgrq instead of breakpoint for target halt requests <enable|disable>");
2035 register_command(cmd_ctx
, arm7_9_cmd
, "fast_writes", handle_arm7_9_fast_memory_access_command
,
2036 COMMAND_ANY
, "(deprecated, see: arm7_9 fast_memory_access)");
2037 register_command(cmd_ctx
, arm7_9_cmd
, "fast_memory_access", handle_arm7_9_fast_memory_access_command
,
2038 COMMAND_ANY
, "use fast memory accesses instead of slower but potentially unsafe slow accesses <enable|disable>");
2039 register_command(cmd_ctx
, arm7_9_cmd
, "dcc_downloads", handle_arm7_9_dcc_downloads_command
,
2040 COMMAND_ANY
, "use DCC downloads for larger memory writes <enable|disable>");
2042 armv4_5_register_commands(cmd_ctx
);
2047 int handle_arm7_9_write_xpsr_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2052 target_t
*target
= get_current_target(cmd_ctx
);
2053 armv4_5_common_t
*armv4_5
;
2054 arm7_9_common_t
*arm7_9
;
2056 if (arm7_9_get_arch_pointers(target
, &armv4_5
, &arm7_9
) != ERROR_OK
)
2058 command_print(cmd_ctx
, "current target isn't an ARM7/ARM9 target");
2062 if (target
->state
!= TARGET_HALTED
)
2064 command_print(cmd_ctx
, "can't write registers while running");
2070 command_print(cmd_ctx
, "usage: write_xpsr <value> <not cpsr|spsr>");
2074 value
= strtoul(args
[0], NULL
, 0);
2075 spsr
= strtol(args
[1], NULL
, 0);
2077 /* if we're writing the CPSR, mask the T bit */
2081 arm7_9
->write_xpsr(target
, value
, spsr
);
2082 if ((retval
= jtag_execute_queue()) != ERROR_OK
)
2084 ERROR("JTAG error while writing to xpsr");
2091 int handle_arm7_9_write_xpsr_im8_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2097 target_t
*target
= get_current_target(cmd_ctx
);
2098 armv4_5_common_t
*armv4_5
;
2099 arm7_9_common_t
*arm7_9
;
2101 if (arm7_9_get_arch_pointers(target
, &armv4_5
, &arm7_9
) != ERROR_OK
)
2103 command_print(cmd_ctx
, "current target isn't an ARM7/ARM9 target");
2107 if (target
->state
!= TARGET_HALTED
)
2109 command_print(cmd_ctx
, "can't write registers while running");
2115 command_print(cmd_ctx
, "usage: write_xpsr_im8 <im8> <rotate> <not cpsr|spsr>");
2119 value
= strtoul(args
[0], NULL
, 0);
2120 rotate
= strtol(args
[1], NULL
, 0);
2121 spsr
= strtol(args
[2], NULL
, 0);
2123 arm7_9
->write_xpsr_im8(target
, value
, rotate
, spsr
);
2124 if ((retval
= jtag_execute_queue()) != ERROR_OK
)
2126 ERROR("JTAG error while writing 8-bit immediate to xpsr");
2133 int handle_arm7_9_write_core_reg_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2138 target_t
*target
= get_current_target(cmd_ctx
);
2139 armv4_5_common_t
*armv4_5
;
2140 arm7_9_common_t
*arm7_9
;
2142 if (arm7_9_get_arch_pointers(target
, &armv4_5
, &arm7_9
) != ERROR_OK
)
2144 command_print(cmd_ctx
, "current target isn't an ARM7/ARM9 target");
2148 if (target
->state
!= TARGET_HALTED
)
2150 command_print(cmd_ctx
, "can't write registers while running");
2156 command_print(cmd_ctx
, "usage: write_core_reg <num> <mode> <value>");
2160 num
= strtol(args
[0], NULL
, 0);
2161 mode
= strtoul(args
[1], NULL
, 0);
2162 value
= strtoul(args
[2], NULL
, 0);
2164 arm7_9_write_core_reg(target
, num
, mode
, value
);
2169 int handle_arm7_9_sw_bkpts_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2171 target_t
*target
= get_current_target(cmd_ctx
);
2172 armv4_5_common_t
*armv4_5
;
2173 arm7_9_common_t
*arm7_9
;
2175 if (arm7_9_get_arch_pointers(target
, &armv4_5
, &arm7_9
) != ERROR_OK
)
2177 command_print(cmd_ctx
, "current target isn't an ARM7/ARM9 target");
2183 command_print(cmd_ctx
, "software breakpoints %s", (arm7_9
->sw_bkpts_enabled
) ? "enabled" : "disabled");
2187 if (strcmp("enable", args
[0]) == 0)
2189 if (arm7_9
->sw_bkpts_use_wp
)
2191 arm7_9_enable_sw_bkpts(target
);
2195 arm7_9
->sw_bkpts_enabled
= 1;
2198 else if (strcmp("disable", args
[0]) == 0)
2200 if (arm7_9
->sw_bkpts_use_wp
)
2202 arm7_9_disable_sw_bkpts(target
);
2206 arm7_9
->sw_bkpts_enabled
= 0;
2211 command_print(cmd_ctx
, "usage: arm7_9 sw_bkpts <enable|disable>");
2214 command_print(cmd_ctx
, "software breakpoints %s", (arm7_9
->sw_bkpts_enabled
) ? "enabled" : "disabled");
2219 int handle_arm7_9_force_hw_bkpts_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2221 target_t
*target
= get_current_target(cmd_ctx
);
2222 armv4_5_common_t
*armv4_5
;
2223 arm7_9_common_t
*arm7_9
;
2225 if (arm7_9_get_arch_pointers(target
, &armv4_5
, &arm7_9
) != ERROR_OK
)
2227 command_print(cmd_ctx
, "current target isn't an ARM7/ARM9 target");
2231 if ((argc
>= 1) && (strcmp("enable", args
[0]) == 0))
2233 arm7_9
->force_hw_bkpts
= 1;
2234 if (arm7_9
->sw_bkpts_use_wp
)
2236 arm7_9_disable_sw_bkpts(target
);
2239 else if ((argc
>= 1) && (strcmp("disable", args
[0]) == 0))
2241 arm7_9
->force_hw_bkpts
= 0;
2245 command_print(cmd_ctx
, "usage: arm7_9 force_hw_bkpts <enable|disable>");
2248 command_print(cmd_ctx
, "force hardware breakpoints %s", (arm7_9
->force_hw_bkpts
) ? "enabled" : "disabled");
2253 int handle_arm7_9_dbgrq_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2255 target_t
*target
= get_current_target(cmd_ctx
);
2256 armv4_5_common_t
*armv4_5
;
2257 arm7_9_common_t
*arm7_9
;
2259 if (arm7_9_get_arch_pointers(target
, &armv4_5
, &arm7_9
) != ERROR_OK
)
2261 command_print(cmd_ctx
, "current target isn't an ARM7/ARM9 target");
2267 if (strcmp("enable", args
[0]) == 0)
2269 arm7_9
->use_dbgrq
= 1;
2271 else if (strcmp("disable", args
[0]) == 0)
2273 arm7_9
->use_dbgrq
= 0;
2277 command_print(cmd_ctx
, "usage: arm7_9 dbgrq <enable|disable>");
2281 command_print(cmd_ctx
, "use of EmbeddedICE dbgrq instead of breakpoint for target halt %s", (arm7_9
->use_dbgrq
) ? "enabled" : "disabled");
2286 int handle_arm7_9_fast_memory_access_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2288 target_t
*target
= get_current_target(cmd_ctx
);
2289 armv4_5_common_t
*armv4_5
;
2290 arm7_9_common_t
*arm7_9
;
2292 if (arm7_9_get_arch_pointers(target
, &armv4_5
, &arm7_9
) != ERROR_OK
)
2294 command_print(cmd_ctx
, "current target isn't an ARM7/ARM9 target");
2300 if (strcmp("enable", args
[0]) == 0)
2302 arm7_9
->fast_memory_access
= 1;
2304 else if (strcmp("disable", args
[0]) == 0)
2306 arm7_9
->fast_memory_access
= 0;
2310 command_print(cmd_ctx
, "usage: arm7_9 fast_memory_access <enable|disable>");
2314 command_print(cmd_ctx
, "fast memory access is %s", (arm7_9
->fast_memory_access
) ? "enabled" : "disabled");
2319 int handle_arm7_9_dcc_downloads_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2321 target_t
*target
= get_current_target(cmd_ctx
);
2322 armv4_5_common_t
*armv4_5
;
2323 arm7_9_common_t
*arm7_9
;
2325 if (arm7_9_get_arch_pointers(target
, &armv4_5
, &arm7_9
) != ERROR_OK
)
2327 command_print(cmd_ctx
, "current target isn't an ARM7/ARM9 target");
2333 if (strcmp("enable", args
[0]) == 0)
2335 arm7_9
->dcc_downloads
= 1;
2337 else if (strcmp("disable", args
[0]) == 0)
2339 arm7_9
->dcc_downloads
= 0;
2343 command_print(cmd_ctx
, "usage: arm7_9 dcc_downloads <enable|disable>");
2347 command_print(cmd_ctx
, "dcc downloads are %s", (arm7_9
->dcc_downloads
) ? "enabled" : "disabled");
2352 int arm7_9_init_arch_info(target_t
*target
, arm7_9_common_t
*arm7_9
)
2354 armv4_5_common_t
*armv4_5
= &arm7_9
->armv4_5_common
;
2356 arm7_9
->common_magic
= ARM7_9_COMMON_MAGIC
;
2358 arm_jtag_setup_connection(&arm7_9
->jtag_info
);
2359 arm7_9
->wp_available
= 2;
2360 arm7_9
->wp0_used
= 0;
2361 arm7_9
->wp1_used
= 0;
2362 arm7_9
->force_hw_bkpts
= 0;
2363 arm7_9
->use_dbgrq
= 0;
2364 arm7_9
->has_etm
= 0;
2366 arm7_9
->reinit_embeddedice
= 0;
2368 arm7_9
->dcc_working_area
= NULL
;
2370 arm7_9
->fast_memory_access
= 0;
2371 arm7_9
->dcc_downloads
= 0;
2373 jtag_register_event_callback(arm7_9_jtag_callback
, target
);
2375 armv4_5
->arch_info
= arm7_9
;
2376 armv4_5
->read_core_reg
= arm7_9_read_core_reg
;
2377 armv4_5
->write_core_reg
= arm7_9_write_core_reg
;
2378 armv4_5
->full_context
= arm7_9_full_context
;
2380 armv4_5_init_arch_info(target
, armv4_5
);
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)