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 "replacements.h"
35 #include "embeddedice.h"
37 #include "target_request.h"
42 #include "arm7_9_common.h"
43 #include "breakpoints.h"
44 #include "time_support.h"
45 #include "arm_simulator.h"
55 int arm7_9_debug_entry(target_t
*target
);
56 int arm7_9_enable_sw_bkpts(struct target_s
*target
);
58 /* command handler forward declarations */
59 int handle_arm7_9_write_xpsr_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
60 int handle_arm7_9_write_xpsr_im8_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
61 int handle_arm7_9_read_core_reg_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
62 int handle_arm7_9_write_core_reg_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
63 int handle_arm7_9_dbgrq_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
64 int handle_arm7_9_fast_memory_access_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
65 int handle_arm7_9_dcc_downloads_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
66 int handle_arm7_9_etm_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
68 static int arm7_9_clear_watchpoints(arm7_9_common_t
*arm7_9
)
70 embeddedice_write_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W0_CONTROL_VALUE
], 0x0);
71 embeddedice_write_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W1_CONTROL_VALUE
], 0x0);
72 arm7_9
->sw_breakpoints_added
= 0;
74 arm7_9
->wp1_used
= arm7_9
->wp1_used_default
;
75 arm7_9
->wp_available
= arm7_9
->wp_available_max
;
77 return jtag_execute_queue();
80 static void arm7_9_assign_wp(arm7_9_common_t
*arm7_9
, breakpoint_t
*breakpoint
)
82 if (!arm7_9
->wp0_used
)
86 arm7_9
->wp_available
--;
88 else if (!arm7_9
->wp1_used
)
92 arm7_9
->wp_available
--;
96 LOG_ERROR("BUG: no hardware comparator available");
100 /* set up embedded ice registers */
101 static int arm7_9_set_software_breakpoints(arm7_9_common_t
*arm7_9
)
103 if (arm7_9
->sw_breakpoints_added
)
107 if (arm7_9
->wp_available
< 1)
109 LOG_WARNING("can't enable sw breakpoints with no watchpoint unit available");
110 return ERROR_TARGET_RESOURCE_NOT_AVAILABLE
;
112 arm7_9
->wp_available
--;
114 /* pick a breakpoint unit */
115 if (!arm7_9
->wp0_used
)
117 arm7_9
->sw_breakpoints_added
=1;
118 arm7_9
->wp0_used
= 3;
119 } else if (!arm7_9
->wp1_used
)
121 arm7_9
->sw_breakpoints_added
=2;
122 arm7_9
->wp1_used
= 3;
126 LOG_ERROR("BUG: both watchpoints used, but wp_available >= 1");
130 if (arm7_9
->sw_breakpoints_added
==1)
132 embeddedice_set_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W0_DATA_VALUE
], arm7_9
->arm_bkpt
);
133 embeddedice_set_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W0_DATA_MASK
], 0x0);
134 embeddedice_set_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W0_ADDR_MASK
], 0xffffffffu
);
135 embeddedice_set_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W0_CONTROL_MASK
], ~EICE_W_CTRL_nOPC
& 0xff);
136 embeddedice_set_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W0_CONTROL_VALUE
], EICE_W_CTRL_ENABLE
);
138 else if (arm7_9
->sw_breakpoints_added
==2)
140 embeddedice_set_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W1_DATA_VALUE
], arm7_9
->arm_bkpt
);
141 embeddedice_set_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W1_DATA_MASK
], 0x0);
142 embeddedice_set_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W1_ADDR_MASK
], 0xffffffffu
);
143 embeddedice_set_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W1_CONTROL_MASK
], ~EICE_W_CTRL_nOPC
& 0xff);
144 embeddedice_set_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W1_CONTROL_VALUE
], EICE_W_CTRL_ENABLE
);
148 LOG_ERROR("BUG: both watchpoints used, but wp_available >= 1");
152 return jtag_execute_queue();
155 /* set things up after a reset / on startup */
156 int arm7_9_setup(target_t
*target
)
158 armv4_5_common_t
*armv4_5
= target
->arch_info
;
159 arm7_9_common_t
*arm7_9
= armv4_5
->arch_info
;
161 return arm7_9_clear_watchpoints(arm7_9
);
164 int arm7_9_get_arch_pointers(target_t
*target
, armv4_5_common_t
**armv4_5_p
, arm7_9_common_t
**arm7_9_p
)
166 armv4_5_common_t
*armv4_5
= target
->arch_info
;
167 arm7_9_common_t
*arm7_9
= armv4_5
->arch_info
;
169 if (armv4_5
->common_magic
!= ARMV4_5_COMMON_MAGIC
)
174 if (arm7_9
->common_magic
!= ARM7_9_COMMON_MAGIC
)
179 *armv4_5_p
= armv4_5
;
185 /* we set up the breakpoint even if it is already set. Some action, e.g. reset
186 * might have erased the values in embedded ice
188 int arm7_9_set_breakpoint(struct target_s
*target
, breakpoint_t
*breakpoint
)
190 armv4_5_common_t
*armv4_5
= target
->arch_info
;
191 arm7_9_common_t
*arm7_9
= armv4_5
->arch_info
;
194 if (target
->state
!= TARGET_HALTED
)
196 LOG_WARNING("target not halted");
197 return ERROR_TARGET_NOT_HALTED
;
200 if (breakpoint
->type
== BKPT_HARD
)
202 /* either an ARM (4 byte) or Thumb (2 byte) breakpoint */
203 u32 mask
= (breakpoint
->length
== 4) ? 0x3u
: 0x1u
;
205 /* reassign a hw breakpoint */
206 if (breakpoint
->set
==0)
208 arm7_9_assign_wp(arm7_9
, breakpoint
);
211 if (breakpoint
->set
==1)
213 embeddedice_set_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W0_ADDR_VALUE
], breakpoint
->address
);
214 embeddedice_set_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W0_ADDR_MASK
], mask
);
215 embeddedice_set_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W0_DATA_MASK
], 0xffffffffu
);
216 embeddedice_set_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W0_CONTROL_MASK
], ~EICE_W_CTRL_nOPC
& 0xff);
217 embeddedice_set_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W0_CONTROL_VALUE
], EICE_W_CTRL_ENABLE
);
219 else if (breakpoint
->set
==2)
221 embeddedice_set_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W1_ADDR_VALUE
], breakpoint
->address
);
222 embeddedice_set_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W1_ADDR_MASK
], mask
);
223 embeddedice_set_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W1_DATA_MASK
], 0xffffffffu
);
224 embeddedice_set_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W1_CONTROL_MASK
], ~EICE_W_CTRL_nOPC
& 0xff);
225 embeddedice_set_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W1_CONTROL_VALUE
], EICE_W_CTRL_ENABLE
);
229 LOG_ERROR("BUG: no hardware comparator available");
233 retval
=jtag_execute_queue();
235 else if (breakpoint
->type
== BKPT_SOFT
)
237 if ((retval
=arm7_9_set_software_breakpoints(arm7_9
))!=ERROR_OK
)
240 /* did we already set this breakpoint? */
244 if (breakpoint
->length
== 4)
246 u32 verify
= 0xffffffff;
247 /* keep the original instruction in target endianness */
248 if ((retval
= target
->type
->read_memory(target
, breakpoint
->address
, 4, 1, breakpoint
->orig_instr
)) != ERROR_OK
)
252 /* write the breakpoint instruction in target endianness (arm7_9->arm_bkpt is host endian) */
253 if ((retval
= target_write_u32(target
, breakpoint
->address
, arm7_9
->arm_bkpt
)) != ERROR_OK
)
258 if ((retval
= target_read_u32(target
, breakpoint
->address
, &verify
)) != ERROR_OK
)
262 if (verify
!= arm7_9
->arm_bkpt
)
264 LOG_ERROR("Unable to set 32 bit software breakpoint at address %08x - check that memory is read/writable", breakpoint
->address
);
271 /* keep the original instruction in target endianness */
272 if ((retval
= target
->type
->read_memory(target
, breakpoint
->address
, 2, 1, breakpoint
->orig_instr
)) != ERROR_OK
)
276 /* write the breakpoint instruction in target endianness (arm7_9->thumb_bkpt is host endian) */
277 if ((retval
= target_write_u16(target
, breakpoint
->address
, arm7_9
->thumb_bkpt
)) != ERROR_OK
)
282 if ((retval
= target_read_u16(target
, breakpoint
->address
, &verify
)) != ERROR_OK
)
286 if (verify
!= arm7_9
->thumb_bkpt
)
288 LOG_ERROR("Unable to set thumb software breakpoint at address %08x - check that memory is read/writable", breakpoint
->address
);
298 int arm7_9_unset_breakpoint(struct target_s
*target
, breakpoint_t
*breakpoint
)
300 int retval
= ERROR_OK
;
302 armv4_5_common_t
*armv4_5
= target
->arch_info
;
303 arm7_9_common_t
*arm7_9
= armv4_5
->arch_info
;
305 if (!breakpoint
->set
)
307 LOG_WARNING("breakpoint not set");
311 if (breakpoint
->type
== BKPT_HARD
)
313 if (breakpoint
->set
== 1)
315 embeddedice_set_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W0_CONTROL_VALUE
], 0x0);
316 arm7_9
->wp0_used
= 0;
317 arm7_9
->wp_available
++;
319 else if (breakpoint
->set
== 2)
321 embeddedice_set_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W1_CONTROL_VALUE
], 0x0);
322 arm7_9
->wp1_used
= 0;
323 arm7_9
->wp_available
++;
325 retval
= jtag_execute_queue();
330 /* restore original instruction (kept in target endianness) */
331 if (breakpoint
->length
== 4)
334 /* check that user program as not modified breakpoint instruction */
335 if ((retval
= target
->type
->read_memory(target
, breakpoint
->address
, 4, 1, (u8
*)¤t_instr
)) != ERROR_OK
)
339 if (current_instr
==arm7_9
->arm_bkpt
)
340 if ((retval
= target
->type
->write_memory(target
, breakpoint
->address
, 4, 1, breakpoint
->orig_instr
)) != ERROR_OK
)
348 /* check that user program as not modified breakpoint instruction */
349 if ((retval
= target
->type
->read_memory(target
, breakpoint
->address
, 2, 1, (u8
*)¤t_instr
)) != ERROR_OK
)
353 if (current_instr
==arm7_9
->thumb_bkpt
)
354 if ((retval
= target
->type
->write_memory(target
, breakpoint
->address
, 2, 1, breakpoint
->orig_instr
)) != ERROR_OK
)
365 int arm7_9_add_breakpoint(struct target_s
*target
, breakpoint_t
*breakpoint
)
367 armv4_5_common_t
*armv4_5
= target
->arch_info
;
368 arm7_9_common_t
*arm7_9
= armv4_5
->arch_info
;
370 if (target
->state
!= TARGET_HALTED
)
372 LOG_WARNING("target not halted");
373 return ERROR_TARGET_NOT_HALTED
;
376 if (arm7_9
->breakpoint_count
==0)
378 /* make sure we don't have any dangling breakpoints. This is vital upon
379 * GDB connect/disconnect
381 arm7_9_clear_watchpoints(arm7_9
);
384 if ((breakpoint
->type
== BKPT_HARD
) && (arm7_9
->wp_available
< 1))
386 LOG_INFO("no watchpoint unit available for hardware breakpoint");
387 return ERROR_TARGET_RESOURCE_NOT_AVAILABLE
;
390 if ((breakpoint
->length
!= 2) && (breakpoint
->length
!= 4))
392 LOG_INFO("only breakpoints of two (Thumb) or four (ARM) bytes length supported");
393 return ERROR_TARGET_RESOURCE_NOT_AVAILABLE
;
396 if (breakpoint
->type
== BKPT_HARD
)
398 arm7_9_assign_wp(arm7_9
, breakpoint
);
401 arm7_9
->breakpoint_count
++;
403 return arm7_9_set_breakpoint(target
, breakpoint
);
406 int arm7_9_remove_breakpoint(struct target_s
*target
, breakpoint_t
*breakpoint
)
408 int retval
= ERROR_OK
;
409 armv4_5_common_t
*armv4_5
= target
->arch_info
;
410 arm7_9_common_t
*arm7_9
= armv4_5
->arch_info
;
412 if((retval
= arm7_9_unset_breakpoint(target
, breakpoint
)) != ERROR_OK
)
417 if (breakpoint
->type
== BKPT_HARD
)
418 arm7_9
->wp_available
++;
420 arm7_9
->breakpoint_count
--;
421 if (arm7_9
->breakpoint_count
==0)
423 /* make sure we don't have any dangling breakpoints */
424 if((retval
= arm7_9_clear_watchpoints(arm7_9
)) != ERROR_OK
)
433 int arm7_9_set_watchpoint(struct target_s
*target
, watchpoint_t
*watchpoint
)
435 int retval
= ERROR_OK
;
436 armv4_5_common_t
*armv4_5
= target
->arch_info
;
437 arm7_9_common_t
*arm7_9
= armv4_5
->arch_info
;
441 mask
= watchpoint
->length
- 1;
443 if (target
->state
!= TARGET_HALTED
)
445 LOG_WARNING("target not halted");
446 return ERROR_TARGET_NOT_HALTED
;
449 if (watchpoint
->rw
== WPT_ACCESS
)
454 if (!arm7_9
->wp0_used
)
456 embeddedice_set_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W0_ADDR_VALUE
], watchpoint
->address
);
457 embeddedice_set_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W0_ADDR_MASK
], mask
);
458 embeddedice_set_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W0_DATA_MASK
], watchpoint
->mask
);
459 if( watchpoint
->mask
!= 0xffffffffu
)
460 embeddedice_set_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W0_DATA_VALUE
], watchpoint
->value
);
461 embeddedice_set_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W0_CONTROL_MASK
], 0xff & ~EICE_W_CTRL_nOPC
& ~rw_mask
);
462 embeddedice_set_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W0_CONTROL_VALUE
], EICE_W_CTRL_ENABLE
| EICE_W_CTRL_nOPC
| (watchpoint
->rw
& 1));
464 if((retval
= jtag_execute_queue()) != ERROR_OK
)
469 arm7_9
->wp0_used
= 2;
471 else if (!arm7_9
->wp1_used
)
473 embeddedice_set_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W1_ADDR_VALUE
], watchpoint
->address
);
474 embeddedice_set_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W1_ADDR_MASK
], mask
);
475 embeddedice_set_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W1_DATA_MASK
], watchpoint
->mask
);
476 if( watchpoint
->mask
!= 0xffffffffu
)
477 embeddedice_set_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W1_DATA_VALUE
], watchpoint
->value
);
478 embeddedice_set_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W1_CONTROL_MASK
], 0xff & ~EICE_W_CTRL_nOPC
& ~rw_mask
);
479 embeddedice_set_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W1_CONTROL_VALUE
], EICE_W_CTRL_ENABLE
| EICE_W_CTRL_nOPC
| (watchpoint
->rw
& 1));
481 if((retval
= jtag_execute_queue()) != ERROR_OK
)
486 arm7_9
->wp1_used
= 2;
490 LOG_ERROR("BUG: no hardware comparator available");
497 int arm7_9_unset_watchpoint(struct target_s
*target
, watchpoint_t
*watchpoint
)
499 int retval
= ERROR_OK
;
500 armv4_5_common_t
*armv4_5
= target
->arch_info
;
501 arm7_9_common_t
*arm7_9
= armv4_5
->arch_info
;
503 if (target
->state
!= TARGET_HALTED
)
505 LOG_WARNING("target not halted");
506 return ERROR_TARGET_NOT_HALTED
;
509 if (!watchpoint
->set
)
511 LOG_WARNING("breakpoint not set");
515 if (watchpoint
->set
== 1)
517 embeddedice_set_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W0_CONTROL_VALUE
], 0x0);
518 if((retval
= jtag_execute_queue()) != ERROR_OK
)
522 arm7_9
->wp0_used
= 0;
524 else if (watchpoint
->set
== 2)
526 embeddedice_set_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W1_CONTROL_VALUE
], 0x0);
527 if((retval
= jtag_execute_queue()) != ERROR_OK
)
531 arm7_9
->wp1_used
= 0;
538 int arm7_9_add_watchpoint(struct target_s
*target
, watchpoint_t
*watchpoint
)
540 armv4_5_common_t
*armv4_5
= target
->arch_info
;
541 arm7_9_common_t
*arm7_9
= armv4_5
->arch_info
;
543 if (target
->state
!= TARGET_HALTED
)
545 LOG_WARNING("target not halted");
546 return ERROR_TARGET_NOT_HALTED
;
549 if (arm7_9
->wp_available
< 1)
551 return ERROR_TARGET_RESOURCE_NOT_AVAILABLE
;
554 if ((watchpoint
->length
!= 1) && (watchpoint
->length
!= 2) && (watchpoint
->length
!= 4))
556 return ERROR_TARGET_RESOURCE_NOT_AVAILABLE
;
559 arm7_9
->wp_available
--;
564 int arm7_9_remove_watchpoint(struct target_s
*target
, watchpoint_t
*watchpoint
)
566 int retval
= ERROR_OK
;
567 armv4_5_common_t
*armv4_5
= target
->arch_info
;
568 arm7_9_common_t
*arm7_9
= armv4_5
->arch_info
;
572 if((retval
= arm7_9_unset_watchpoint(target
, watchpoint
)) != ERROR_OK
)
578 arm7_9
->wp_available
++;
583 int arm7_9_execute_sys_speed(struct target_s
*target
)
587 armv4_5_common_t
*armv4_5
= target
->arch_info
;
588 arm7_9_common_t
*arm7_9
= armv4_5
->arch_info
;
589 arm_jtag_t
*jtag_info
= &arm7_9
->jtag_info
;
590 reg_t
*dbg_stat
= &arm7_9
->eice_cache
->reg_list
[EICE_DBG_STAT
];
592 /* set RESTART instruction */
593 jtag_add_end_state(TAP_IDLE
);
594 if (arm7_9
->need_bypass_before_restart
) {
595 arm7_9
->need_bypass_before_restart
= 0;
596 arm_jtag_set_instr(jtag_info
, 0xf, NULL
);
598 arm_jtag_set_instr(jtag_info
, 0x4, NULL
);
600 long long then
=timeval_ms();
602 while (!(timeout
=((timeval_ms()-then
)>1000)))
604 /* read debug status register */
605 embeddedice_read_reg(dbg_stat
);
606 if ((retval
= jtag_execute_queue()) != ERROR_OK
)
608 if ((buf_get_u32(dbg_stat
->value
, EICE_DBG_STATUS_DBGACK
, 1))
609 && (buf_get_u32(dbg_stat
->value
, EICE_DBG_STATUS_SYSCOMP
, 1)))
621 LOG_ERROR("timeout waiting for SYSCOMP & DBGACK, last DBG_STATUS: %x", buf_get_u32(dbg_stat
->value
, 0, dbg_stat
->size
));
622 return ERROR_TARGET_TIMEOUT
;
628 int arm7_9_execute_fast_sys_speed(struct target_s
*target
)
631 static u8 check_value
[4], check_mask
[4];
633 armv4_5_common_t
*armv4_5
= target
->arch_info
;
634 arm7_9_common_t
*arm7_9
= armv4_5
->arch_info
;
635 arm_jtag_t
*jtag_info
= &arm7_9
->jtag_info
;
636 reg_t
*dbg_stat
= &arm7_9
->eice_cache
->reg_list
[EICE_DBG_STAT
];
638 /* set RESTART instruction */
639 jtag_add_end_state(TAP_IDLE
);
640 if (arm7_9
->need_bypass_before_restart
) {
641 arm7_9
->need_bypass_before_restart
= 0;
642 arm_jtag_set_instr(jtag_info
, 0xf, NULL
);
644 arm_jtag_set_instr(jtag_info
, 0x4, NULL
);
648 /* check for DBGACK and SYSCOMP set (others don't care) */
650 /* NB! These are constants that must be available until after next jtag_execute() and
651 * we evaluate the values upon first execution in lieu of setting up these constants
652 * during early setup.
654 buf_set_u32(check_value
, 0, 32, 0x9);
655 buf_set_u32(check_mask
, 0, 32, 0x9);
659 /* read debug status register */
660 embeddedice_read_reg_w_check(dbg_stat
, check_value
, check_value
);
665 int arm7_9_target_request_data(target_t
*target
, u32 size
, u8
*buffer
)
667 armv4_5_common_t
*armv4_5
= target
->arch_info
;
668 arm7_9_common_t
*arm7_9
= armv4_5
->arch_info
;
669 arm_jtag_t
*jtag_info
= &arm7_9
->jtag_info
;
671 int retval
= ERROR_OK
;
674 data
= malloc(size
* (sizeof(u32
)));
676 retval
= embeddedice_receive(jtag_info
, data
, size
);
678 for (i
= 0; i
< size
; i
++)
680 h_u32_to_le(buffer
+ (i
* 4), data
[i
]);
688 int arm7_9_handle_target_request(void *priv
)
690 int retval
= ERROR_OK
;
691 target_t
*target
= priv
;
692 if (!target
->type
->examined
)
694 armv4_5_common_t
*armv4_5
= target
->arch_info
;
695 arm7_9_common_t
*arm7_9
= armv4_5
->arch_info
;
696 arm_jtag_t
*jtag_info
= &arm7_9
->jtag_info
;
697 reg_t
*dcc_control
= &arm7_9
->eice_cache
->reg_list
[EICE_COMMS_CTRL
];
699 if (!target
->dbg_msg_enabled
)
702 if (target
->state
== TARGET_RUNNING
)
704 /* read DCC control register */
705 embeddedice_read_reg(dcc_control
);
706 if ((retval
= jtag_execute_queue()) != ERROR_OK
)
712 if (buf_get_u32(dcc_control
->value
, 1, 1) == 1)
716 if ((retval
= embeddedice_receive(jtag_info
, &request
, 1)) != ERROR_OK
)
720 if ((retval
= target_request(target
, request
)) != ERROR_OK
)
730 int arm7_9_poll(target_t
*target
)
733 armv4_5_common_t
*armv4_5
= target
->arch_info
;
734 arm7_9_common_t
*arm7_9
= armv4_5
->arch_info
;
735 reg_t
*dbg_stat
= &arm7_9
->eice_cache
->reg_list
[EICE_DBG_STAT
];
737 /* read debug status register */
738 embeddedice_read_reg(dbg_stat
);
739 if ((retval
= jtag_execute_queue()) != ERROR_OK
)
744 if (buf_get_u32(dbg_stat
->value
, EICE_DBG_STATUS_DBGACK
, 1))
746 /* LOG_DEBUG("DBGACK set, dbg_state->value: 0x%x", buf_get_u32(dbg_stat->value, 0, 32));*/
747 if (target
->state
== TARGET_UNKNOWN
)
749 target
->state
= TARGET_RUNNING
;
750 LOG_WARNING("DBGACK set while target was in unknown state. Reset or initialize target.");
752 if ((target
->state
== TARGET_RUNNING
) || (target
->state
== TARGET_RESET
))
755 if (target
->state
== TARGET_RESET
)
757 if (target
->reset_halt
)
759 if ((jtag_reset_config
& RESET_SRST_PULLS_TRST
)==0)
766 target
->state
= TARGET_HALTED
;
768 if ((retval
= arm7_9_debug_entry(target
)) != ERROR_OK
)
773 reg_t
*reg
= register_get_by_name(target
->reg_cache
, "pc", 1);
774 u32 t
=*((u32
*)reg
->value
);
777 LOG_ERROR("PC was not 0. Does this target need srst_pulls_trst?");
781 if ((retval
= target_call_event_callbacks(target
, TARGET_EVENT_HALTED
)) != ERROR_OK
)
786 if (target
->state
== TARGET_DEBUG_RUNNING
)
788 target
->state
= TARGET_HALTED
;
789 if ((retval
= arm7_9_debug_entry(target
)) != ERROR_OK
)
792 if ((retval
= target_call_event_callbacks(target
, TARGET_EVENT_DEBUG_HALTED
)) != ERROR_OK
)
797 if (target
->state
!= TARGET_HALTED
)
799 LOG_WARNING("DBGACK set, but the target did not end up in the halted stated %d", target
->state
);
804 if (target
->state
!= TARGET_DEBUG_RUNNING
)
805 target
->state
= TARGET_RUNNING
;
812 Some -S targets (ARM966E-S in the STR912 isn't affected, ARM926EJ-S
813 in the LPC3180 and AT91SAM9260 is affected) completely stop the JTAG clock
814 while the core is held in reset(SRST). It isn't possible to program the halt
815 condition once reset was asserted, hence a hook that allows the target to set
816 up its reset-halt condition prior to asserting reset.
819 int arm7_9_assert_reset(target_t
*target
)
821 armv4_5_common_t
*armv4_5
= target
->arch_info
;
822 arm7_9_common_t
*arm7_9
= armv4_5
->arch_info
;
823 LOG_DEBUG("target->state: %s",
824 Jim_Nvp_value2name_simple( nvp_target_state
,target
->state
)->name
);
826 if (!(jtag_reset_config
& RESET_HAS_SRST
))
828 LOG_ERROR("Can't assert SRST");
832 if (target
->reset_halt
)
835 * Some targets do not support communication while SRST is asserted. We need to
836 * set up the reset vector catch here.
838 * If TRST is asserted, then these settings will be reset anyway, so setting them
841 if (arm7_9
->has_vector_catch
)
843 /* program vector catch register to catch reset vector */
844 embeddedice_write_reg(&arm7_9
->eice_cache
->reg_list
[EICE_VEC_CATCH
], 0x1);
848 /* program watchpoint unit to match on reset vector address */
849 embeddedice_write_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W0_ADDR_VALUE
], 0x0);
850 embeddedice_write_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W0_ADDR_MASK
], 0x3);
851 embeddedice_write_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W0_DATA_MASK
], 0xffffffff);
852 embeddedice_write_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W0_CONTROL_VALUE
], EICE_W_CTRL_ENABLE
);
853 embeddedice_write_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W0_CONTROL_MASK
], ~EICE_W_CTRL_nOPC
& 0xff);
857 /* here we should issue a srst only, but we may have to assert trst as well */
858 if (jtag_reset_config
& RESET_SRST_PULLS_TRST
)
860 jtag_add_reset(1, 1);
863 jtag_add_reset(0, 1);
866 target
->state
= TARGET_RESET
;
867 jtag_add_sleep(50000);
869 armv4_5_invalidate_core_regs(target
);
871 if ((target
->reset_halt
)&&((jtag_reset_config
& RESET_SRST_PULLS_TRST
)==0))
873 /* debug entry was already prepared in arm7_9_assert_reset() */
874 target
->debug_reason
= DBG_REASON_DBGRQ
;
880 int arm7_9_deassert_reset(target_t
*target
)
883 LOG_DEBUG("target->state: %s",
884 Jim_Nvp_value2name_simple( nvp_target_state
,target
->state
)->name
);
886 /* deassert reset lines */
887 jtag_add_reset(0, 0);
889 if (target
->reset_halt
&&(jtag_reset_config
& RESET_SRST_PULLS_TRST
)!=0)
891 LOG_WARNING("srst pulls trst - can not reset into halted mode. Issuing halt after reset.");
892 /* set up embedded ice registers again */
893 if ((retval
=target
->type
->examine(target
))!=ERROR_OK
)
896 if ((retval
=target_poll(target
))!=ERROR_OK
)
901 if ((retval
=target_halt(target
))!=ERROR_OK
)
910 int arm7_9_clear_halt(target_t
*target
)
912 armv4_5_common_t
*armv4_5
= target
->arch_info
;
913 arm7_9_common_t
*arm7_9
= armv4_5
->arch_info
;
914 reg_t
*dbg_ctrl
= &arm7_9
->eice_cache
->reg_list
[EICE_DBG_CTRL
];
916 /* we used DBGRQ only if we didn't come out of reset */
917 if (!arm7_9
->debug_entry_from_reset
&& arm7_9
->use_dbgrq
)
919 /* program EmbeddedICE Debug Control Register to deassert DBGRQ
921 buf_set_u32(dbg_ctrl
->value
, EICE_DBG_CONTROL_DBGRQ
, 1, 0);
922 embeddedice_store_reg(dbg_ctrl
);
926 if (arm7_9
->debug_entry_from_reset
&& arm7_9
->has_vector_catch
)
928 /* if we came out of reset, and vector catch is supported, we used
929 * vector catch to enter debug state
930 * restore the register in that case
932 embeddedice_store_reg(&arm7_9
->eice_cache
->reg_list
[EICE_VEC_CATCH
]);
936 /* restore registers if watchpoint unit 0 was in use
938 if (arm7_9
->wp0_used
)
940 if (arm7_9
->debug_entry_from_reset
)
942 embeddedice_store_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W0_ADDR_VALUE
]);
944 embeddedice_store_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W0_ADDR_MASK
]);
945 embeddedice_store_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W0_DATA_MASK
]);
946 embeddedice_store_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W0_CONTROL_MASK
]);
948 /* control value always has to be restored, as it was either disabled,
949 * or enabled with possibly different bits
951 embeddedice_store_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W0_CONTROL_VALUE
]);
958 int arm7_9_soft_reset_halt(struct target_s
*target
)
960 armv4_5_common_t
*armv4_5
= target
->arch_info
;
961 arm7_9_common_t
*arm7_9
= armv4_5
->arch_info
;
962 reg_t
*dbg_stat
= &arm7_9
->eice_cache
->reg_list
[EICE_DBG_STAT
];
963 reg_t
*dbg_ctrl
= &arm7_9
->eice_cache
->reg_list
[EICE_DBG_CTRL
];
967 if ((retval
=target_halt(target
))!=ERROR_OK
)
970 long long then
=timeval_ms();
972 while (!(timeout
=((timeval_ms()-then
)>1000)))
974 if (buf_get_u32(dbg_stat
->value
, EICE_DBG_STATUS_DBGACK
, 1) != 0)
976 embeddedice_read_reg(dbg_stat
);
977 if ((retval
=jtag_execute_queue())!=ERROR_OK
)
989 LOG_ERROR("Failed to halt CPU after 1 sec");
990 return ERROR_TARGET_TIMEOUT
;
992 target
->state
= TARGET_HALTED
;
994 /* program EmbeddedICE Debug Control Register to assert DBGACK and INTDIS
995 * ensure that DBGRQ is cleared
997 buf_set_u32(dbg_ctrl
->value
, EICE_DBG_CONTROL_DBGACK
, 1, 1);
998 buf_set_u32(dbg_ctrl
->value
, EICE_DBG_CONTROL_DBGRQ
, 1, 0);
999 buf_set_u32(dbg_ctrl
->value
, EICE_DBG_CONTROL_INTDIS
, 1, 1);
1000 embeddedice_store_reg(dbg_ctrl
);
1002 if ((retval
= arm7_9_clear_halt(target
)) != ERROR_OK
)
1007 /* if the target is in Thumb state, change to ARM state */
1008 if (buf_get_u32(dbg_stat
->value
, EICE_DBG_STATUS_ITBIT
, 1))
1010 u32 r0_thumb
, pc_thumb
;
1011 LOG_DEBUG("target entered debug from Thumb state, changing to ARM");
1012 /* Entered debug from Thumb mode */
1013 armv4_5
->core_state
= ARMV4_5_STATE_THUMB
;
1014 arm7_9
->change_to_arm(target
, &r0_thumb
, &pc_thumb
);
1017 /* all register content is now invalid */
1018 if ((retval
= armv4_5_invalidate_core_regs(target
)) != ERROR_OK
)
1023 /* SVC, ARM state, IRQ and FIQ disabled */
1024 buf_set_u32(armv4_5
->core_cache
->reg_list
[ARMV4_5_CPSR
].value
, 0, 8, 0xd3);
1025 armv4_5
->core_cache
->reg_list
[ARMV4_5_CPSR
].dirty
= 1;
1026 armv4_5
->core_cache
->reg_list
[ARMV4_5_CPSR
].valid
= 1;
1028 /* start fetching from 0x0 */
1029 buf_set_u32(armv4_5
->core_cache
->reg_list
[15].value
, 0, 32, 0x0);
1030 armv4_5
->core_cache
->reg_list
[15].dirty
= 1;
1031 armv4_5
->core_cache
->reg_list
[15].valid
= 1;
1033 armv4_5
->core_mode
= ARMV4_5_MODE_SVC
;
1034 armv4_5
->core_state
= ARMV4_5_STATE_ARM
;
1036 if (armv4_5_mode_to_number(armv4_5
->core_mode
)==-1)
1039 /* reset registers */
1040 for (i
= 0; i
<= 14; i
++)
1042 buf_set_u32(ARMV4_5_CORE_REG_MODE(armv4_5
->core_cache
, armv4_5
->core_mode
, i
).value
, 0, 32, 0xffffffff);
1043 ARMV4_5_CORE_REG_MODE(armv4_5
->core_cache
, armv4_5
->core_mode
, i
).dirty
= 1;
1044 ARMV4_5_CORE_REG_MODE(armv4_5
->core_cache
, armv4_5
->core_mode
, i
).valid
= 1;
1047 if ((retval
= target_call_event_callbacks(target
, TARGET_EVENT_HALTED
)) != ERROR_OK
)
1055 int arm7_9_halt(target_t
*target
)
1057 if (target
->state
==TARGET_RESET
)
1059 LOG_ERROR("BUG: arm7/9 does not support halt during reset. This is handled in arm7_9_assert_reset()");
1063 armv4_5_common_t
*armv4_5
= target
->arch_info
;
1064 arm7_9_common_t
*arm7_9
= armv4_5
->arch_info
;
1065 reg_t
*dbg_ctrl
= &arm7_9
->eice_cache
->reg_list
[EICE_DBG_CTRL
];
1067 LOG_DEBUG("target->state: %s",
1068 Jim_Nvp_value2name_simple( nvp_target_state
,target
->state
)->name
);
1070 if (target
->state
== TARGET_HALTED
)
1072 LOG_DEBUG("target was already halted");
1076 if (target
->state
== TARGET_UNKNOWN
)
1078 LOG_WARNING("target was in unknown state when halt was requested");
1081 if (arm7_9
->use_dbgrq
)
1083 /* program EmbeddedICE Debug Control Register to assert DBGRQ
1085 if (arm7_9
->set_special_dbgrq
) {
1086 arm7_9
->set_special_dbgrq(target
);
1088 buf_set_u32(dbg_ctrl
->value
, EICE_DBG_CONTROL_DBGRQ
, 1, 1);
1089 embeddedice_store_reg(dbg_ctrl
);
1094 /* program watchpoint unit to match on any address
1096 embeddedice_write_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W0_ADDR_MASK
], 0xffffffff);
1097 embeddedice_write_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W0_DATA_MASK
], 0xffffffff);
1098 embeddedice_write_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W0_CONTROL_VALUE
], EICE_W_CTRL_ENABLE
);
1099 embeddedice_write_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W0_CONTROL_MASK
], ~EICE_W_CTRL_nOPC
& 0xff);
1102 target
->debug_reason
= DBG_REASON_DBGRQ
;
1107 int arm7_9_debug_entry(target_t
*target
)
1112 u32 r0_thumb
, pc_thumb
;
1115 /* get pointers to arch-specific information */
1116 armv4_5_common_t
*armv4_5
= target
->arch_info
;
1117 arm7_9_common_t
*arm7_9
= armv4_5
->arch_info
;
1118 reg_t
*dbg_stat
= &arm7_9
->eice_cache
->reg_list
[EICE_DBG_STAT
];
1119 reg_t
*dbg_ctrl
= &arm7_9
->eice_cache
->reg_list
[EICE_DBG_CTRL
];
1121 #ifdef _DEBUG_ARM7_9_
1125 if (arm7_9
->pre_debug_entry
)
1126 arm7_9
->pre_debug_entry(target
);
1128 /* program EmbeddedICE Debug Control Register to assert DBGACK and INTDIS
1129 * ensure that DBGRQ is cleared
1131 buf_set_u32(dbg_ctrl
->value
, EICE_DBG_CONTROL_DBGACK
, 1, 1);
1132 buf_set_u32(dbg_ctrl
->value
, EICE_DBG_CONTROL_DBGRQ
, 1, 0);
1133 buf_set_u32(dbg_ctrl
->value
, EICE_DBG_CONTROL_INTDIS
, 1, 1);
1134 embeddedice_store_reg(dbg_ctrl
);
1136 if ((retval
= arm7_9_clear_halt(target
)) != ERROR_OK
)
1141 if ((retval
= jtag_execute_queue()) != ERROR_OK
)
1146 if ((retval
= arm7_9
->examine_debug_reason(target
)) != ERROR_OK
)
1150 if (target
->state
!= TARGET_HALTED
)
1152 LOG_WARNING("target not halted");
1153 return ERROR_TARGET_NOT_HALTED
;
1156 /* if the target is in Thumb state, change to ARM state */
1157 if (buf_get_u32(dbg_stat
->value
, EICE_DBG_STATUS_ITBIT
, 1))
1159 LOG_DEBUG("target entered debug from Thumb state");
1160 /* Entered debug from Thumb mode */
1161 armv4_5
->core_state
= ARMV4_5_STATE_THUMB
;
1162 arm7_9
->change_to_arm(target
, &r0_thumb
, &pc_thumb
);
1163 LOG_DEBUG("r0_thumb: 0x%8.8x, pc_thumb: 0x%8.8x", r0_thumb
, pc_thumb
);
1167 LOG_DEBUG("target entered debug from ARM state");
1168 /* Entered debug from ARM mode */
1169 armv4_5
->core_state
= ARMV4_5_STATE_ARM
;
1172 for (i
= 0; i
< 16; i
++)
1173 context_p
[i
] = &context
[i
];
1174 /* save core registers (r0 - r15 of current core mode) */
1175 arm7_9
->read_core_regs(target
, 0xffff, context_p
);
1177 arm7_9
->read_xpsr(target
, &cpsr
, 0);
1179 if ((retval
= jtag_execute_queue()) != ERROR_OK
)
1182 /* if the core has been executing in Thumb state, set the T bit */
1183 if (armv4_5
->core_state
== ARMV4_5_STATE_THUMB
)
1186 buf_set_u32(armv4_5
->core_cache
->reg_list
[ARMV4_5_CPSR
].value
, 0, 32, cpsr
);
1187 armv4_5
->core_cache
->reg_list
[ARMV4_5_CPSR
].dirty
= 0;
1188 armv4_5
->core_cache
->reg_list
[ARMV4_5_CPSR
].valid
= 1;
1190 armv4_5
->core_mode
= cpsr
& 0x1f;
1192 if (armv4_5_mode_to_number(armv4_5
->core_mode
) == -1)
1194 target
->state
= TARGET_UNKNOWN
;
1195 LOG_ERROR("cpsr contains invalid mode value - communication failure");
1196 return ERROR_TARGET_FAILURE
;
1199 LOG_DEBUG("target entered debug state in %s mode", armv4_5_mode_strings
[armv4_5_mode_to_number(armv4_5
->core_mode
)]);
1201 if (armv4_5
->core_state
== ARMV4_5_STATE_THUMB
)
1203 LOG_DEBUG("thumb state, applying fixups");
1204 context
[0] = r0_thumb
;
1205 context
[15] = pc_thumb
;
1206 } else if (armv4_5
->core_state
== ARMV4_5_STATE_ARM
)
1208 /* adjust value stored by STM */
1209 context
[15] -= 3 * 4;
1212 if ((target
->debug_reason
== DBG_REASON_BREAKPOINT
)
1213 || (target
->debug_reason
== DBG_REASON_SINGLESTEP
)
1214 || (target
->debug_reason
== DBG_REASON_WATCHPOINT
)
1215 || (target
->debug_reason
== DBG_REASON_WPTANDBKPT
)
1216 || ((target
->debug_reason
== DBG_REASON_DBGRQ
) && (arm7_9
->use_dbgrq
== 0)))
1217 context
[15] -= 3 * ((armv4_5
->core_state
== ARMV4_5_STATE_ARM
) ? 4 : 2);
1218 else if (target
->debug_reason
== DBG_REASON_DBGRQ
)
1219 context
[15] -= arm7_9
->dbgreq_adjust_pc
* ((armv4_5
->core_state
== ARMV4_5_STATE_ARM
) ? 4 : 2);
1222 LOG_ERROR("unknown debug reason: %i", target
->debug_reason
);
1225 if (armv4_5_mode_to_number(armv4_5
->core_mode
)==-1)
1228 for (i
=0; i
<=15; i
++)
1230 LOG_DEBUG("r%i: 0x%8.8x", i
, context
[i
]);
1231 buf_set_u32(ARMV4_5_CORE_REG_MODE(armv4_5
->core_cache
, armv4_5
->core_mode
, i
).value
, 0, 32, context
[i
]);
1232 ARMV4_5_CORE_REG_MODE(armv4_5
->core_cache
, armv4_5
->core_mode
, i
).dirty
= 0;
1233 ARMV4_5_CORE_REG_MODE(armv4_5
->core_cache
, armv4_5
->core_mode
, i
).valid
= 1;
1236 LOG_DEBUG("entered debug state at PC 0x%x", context
[15]);
1238 if (armv4_5_mode_to_number(armv4_5
->core_mode
)==-1)
1241 /* exceptions other than USR & SYS have a saved program status register */
1242 if ((armv4_5
->core_mode
!= ARMV4_5_MODE_USR
) && (armv4_5
->core_mode
!= ARMV4_5_MODE_SYS
))
1245 arm7_9
->read_xpsr(target
, &spsr
, 1);
1246 if ((retval
= jtag_execute_queue()) != ERROR_OK
)
1250 buf_set_u32(ARMV4_5_CORE_REG_MODE(armv4_5
->core_cache
, armv4_5
->core_mode
, 16).value
, 0, 32, spsr
);
1251 ARMV4_5_CORE_REG_MODE(armv4_5
->core_cache
, armv4_5
->core_mode
, 16).dirty
= 0;
1252 ARMV4_5_CORE_REG_MODE(armv4_5
->core_cache
, armv4_5
->core_mode
, 16).valid
= 1;
1255 /* r0 and r15 (pc) have to be restored later */
1256 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
;
1257 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
;
1259 if ((retval
= jtag_execute_queue()) != ERROR_OK
)
1262 if (arm7_9
->post_debug_entry
)
1263 arm7_9
->post_debug_entry(target
);
1268 int arm7_9_full_context(target_t
*target
)
1272 armv4_5_common_t
*armv4_5
= target
->arch_info
;
1273 arm7_9_common_t
*arm7_9
= armv4_5
->arch_info
;
1277 if (target
->state
!= TARGET_HALTED
)
1279 LOG_WARNING("target not halted");
1280 return ERROR_TARGET_NOT_HALTED
;
1283 if (armv4_5_mode_to_number(armv4_5
->core_mode
)==-1)
1286 /* iterate through processor modes (User, FIQ, IRQ, SVC, ABT, UND)
1287 * SYS shares registers with User, so we don't touch SYS
1289 for (i
= 0; i
< 6; i
++)
1296 /* check if there are invalid registers in the current mode
1298 for (j
= 0; j
<= 16; j
++)
1300 if (ARMV4_5_CORE_REG_MODE(armv4_5
->core_cache
, armv4_5_number_to_mode(i
), j
).valid
== 0)
1308 /* change processor mode (and mask T bit) */
1309 tmp_cpsr
= buf_get_u32(armv4_5
->core_cache
->reg_list
[ARMV4_5_CPSR
].value
, 0, 8) & 0xE0;
1310 tmp_cpsr
|= armv4_5_number_to_mode(i
);
1312 arm7_9
->write_xpsr_im8(target
, tmp_cpsr
& 0xff, 0, 0);
1314 for (j
= 0; j
< 15; j
++)
1316 if (ARMV4_5_CORE_REG_MODE(armv4_5
->core_cache
, armv4_5_number_to_mode(i
), j
).valid
== 0)
1318 reg_p
[j
] = (u32
*)ARMV4_5_CORE_REG_MODE(armv4_5
->core_cache
, armv4_5_number_to_mode(i
), j
).value
;
1320 ARMV4_5_CORE_REG_MODE(armv4_5
->core_cache
, armv4_5_number_to_mode(i
), j
).valid
= 1;
1321 ARMV4_5_CORE_REG_MODE(armv4_5
->core_cache
, armv4_5_number_to_mode(i
), j
).dirty
= 0;
1325 /* if only the PSR is invalid, mask is all zeroes */
1327 arm7_9
->read_core_regs(target
, mask
, reg_p
);
1329 /* check if the PSR has to be read */
1330 if (ARMV4_5_CORE_REG_MODE(armv4_5
->core_cache
, armv4_5_number_to_mode(i
), 16).valid
== 0)
1332 arm7_9
->read_xpsr(target
, (u32
*)ARMV4_5_CORE_REG_MODE(armv4_5
->core_cache
, armv4_5_number_to_mode(i
), 16).value
, 1);
1333 ARMV4_5_CORE_REG_MODE(armv4_5
->core_cache
, armv4_5_number_to_mode(i
), 16).valid
= 1;
1334 ARMV4_5_CORE_REG_MODE(armv4_5
->core_cache
, armv4_5_number_to_mode(i
), 16).dirty
= 0;
1339 /* restore processor mode (mask T bit) */
1340 arm7_9
->write_xpsr_im8(target
, buf_get_u32(armv4_5
->core_cache
->reg_list
[ARMV4_5_CPSR
].value
, 0, 8) & ~0x20, 0, 0);
1342 if ((retval
= jtag_execute_queue()) != ERROR_OK
)
1349 int arm7_9_restore_context(target_t
*target
)
1351 armv4_5_common_t
*armv4_5
= target
->arch_info
;
1352 arm7_9_common_t
*arm7_9
= armv4_5
->arch_info
;
1354 armv4_5_core_reg_t
*reg_arch_info
;
1355 enum armv4_5_mode current_mode
= armv4_5
->core_mode
;
1362 if (target
->state
!= TARGET_HALTED
)
1364 LOG_WARNING("target not halted");
1365 return ERROR_TARGET_NOT_HALTED
;
1368 if (arm7_9
->pre_restore_context
)
1369 arm7_9
->pre_restore_context(target
);
1371 if (armv4_5_mode_to_number(armv4_5
->core_mode
)==-1)
1374 /* iterate through processor modes (User, FIQ, IRQ, SVC, ABT, UND)
1375 * SYS shares registers with User, so we don't touch SYS
1377 for (i
= 0; i
< 6; i
++)
1379 LOG_DEBUG("examining %s mode", armv4_5_mode_strings
[i
]);
1382 /* check if there are dirty registers in the current mode
1384 for (j
= 0; j
<= 16; j
++)
1386 reg
= &ARMV4_5_CORE_REG_MODE(armv4_5
->core_cache
, armv4_5_number_to_mode(i
), j
);
1387 reg_arch_info
= reg
->arch_info
;
1388 if (reg
->dirty
== 1)
1390 if (reg
->valid
== 1)
1393 LOG_DEBUG("examining dirty reg: %s", reg
->name
);
1394 if ((reg_arch_info
->mode
!= ARMV4_5_MODE_ANY
)
1395 && (reg_arch_info
->mode
!= current_mode
)
1396 && !((reg_arch_info
->mode
== ARMV4_5_MODE_USR
) && (armv4_5
->core_mode
== ARMV4_5_MODE_SYS
))
1397 && !((reg_arch_info
->mode
== ARMV4_5_MODE_SYS
) && (armv4_5
->core_mode
== ARMV4_5_MODE_USR
)))
1400 LOG_DEBUG("require mode change");
1405 LOG_ERROR("BUG: dirty register '%s', but no valid data", reg
->name
);
1420 /* change processor mode (mask T bit) */
1421 tmp_cpsr
= buf_get_u32(armv4_5
->core_cache
->reg_list
[ARMV4_5_CPSR
].value
, 0, 8) & 0xE0;
1422 tmp_cpsr
|= armv4_5_number_to_mode(i
);
1424 arm7_9
->write_xpsr_im8(target
, tmp_cpsr
& 0xff, 0, 0);
1425 current_mode
= armv4_5_number_to_mode(i
);
1428 for (j
= 0; j
<= 14; j
++)
1430 reg
= &ARMV4_5_CORE_REG_MODE(armv4_5
->core_cache
, armv4_5_number_to_mode(i
), j
);
1431 reg_arch_info
= reg
->arch_info
;
1434 if (reg
->dirty
== 1)
1436 regs
[j
] = buf_get_u32(reg
->value
, 0, 32);
1441 LOG_DEBUG("writing register %i of mode %s with value 0x%8.8x", j
, armv4_5_mode_strings
[i
], regs
[j
]);
1447 arm7_9
->write_core_regs(target
, mask
, regs
);
1450 reg
= &ARMV4_5_CORE_REG_MODE(armv4_5
->core_cache
, armv4_5_number_to_mode(i
), 16);
1451 reg_arch_info
= reg
->arch_info
;
1452 if ((reg
->dirty
) && (reg_arch_info
->mode
!= ARMV4_5_MODE_ANY
))
1454 LOG_DEBUG("writing SPSR of mode %i with value 0x%8.8x", i
, buf_get_u32(reg
->value
, 0, 32));
1455 arm7_9
->write_xpsr(target
, buf_get_u32(reg
->value
, 0, 32), 1);
1460 if ((armv4_5
->core_cache
->reg_list
[ARMV4_5_CPSR
].dirty
== 0) && (armv4_5
->core_mode
!= current_mode
))
1462 /* restore processor mode (mask T bit) */
1465 tmp_cpsr
= buf_get_u32(armv4_5
->core_cache
->reg_list
[ARMV4_5_CPSR
].value
, 0, 8) & 0xE0;
1466 tmp_cpsr
|= armv4_5_number_to_mode(i
);
1468 LOG_DEBUG("writing lower 8 bit of cpsr with value 0x%2.2x", tmp_cpsr
);
1469 arm7_9
->write_xpsr_im8(target
, tmp_cpsr
& 0xff, 0, 0);
1471 else if (armv4_5
->core_cache
->reg_list
[ARMV4_5_CPSR
].dirty
== 1)
1473 /* CPSR has been changed, full restore necessary (mask T bit) */
1474 LOG_DEBUG("writing cpsr with value 0x%8.8x", buf_get_u32(armv4_5
->core_cache
->reg_list
[ARMV4_5_CPSR
].value
, 0, 32));
1475 arm7_9
->write_xpsr(target
, buf_get_u32(armv4_5
->core_cache
->reg_list
[ARMV4_5_CPSR
].value
, 0, 32) & ~0x20, 0);
1476 armv4_5
->core_cache
->reg_list
[ARMV4_5_CPSR
].dirty
= 0;
1477 armv4_5
->core_cache
->reg_list
[ARMV4_5_CPSR
].valid
= 1;
1481 LOG_DEBUG("writing PC with value 0x%8.8x", buf_get_u32(armv4_5
->core_cache
->reg_list
[15].value
, 0, 32));
1482 arm7_9
->write_pc(target
, buf_get_u32(armv4_5
->core_cache
->reg_list
[15].value
, 0, 32));
1483 armv4_5
->core_cache
->reg_list
[15].dirty
= 0;
1485 if (arm7_9
->post_restore_context
)
1486 arm7_9
->post_restore_context(target
);
1491 int arm7_9_restart_core(struct target_s
*target
)
1493 armv4_5_common_t
*armv4_5
= target
->arch_info
;
1494 arm7_9_common_t
*arm7_9
= armv4_5
->arch_info
;
1495 arm_jtag_t
*jtag_info
= &arm7_9
->jtag_info
;
1497 /* set RESTART instruction */
1498 jtag_add_end_state(TAP_IDLE
);
1499 if (arm7_9
->need_bypass_before_restart
) {
1500 arm7_9
->need_bypass_before_restart
= 0;
1501 arm_jtag_set_instr(jtag_info
, 0xf, NULL
);
1503 arm_jtag_set_instr(jtag_info
, 0x4, NULL
);
1505 jtag_add_runtest(1, TAP_IDLE
);
1506 return jtag_execute_queue();
1509 void arm7_9_enable_watchpoints(struct target_s
*target
)
1511 watchpoint_t
*watchpoint
= target
->watchpoints
;
1515 if (watchpoint
->set
== 0)
1516 arm7_9_set_watchpoint(target
, watchpoint
);
1517 watchpoint
= watchpoint
->next
;
1521 void arm7_9_enable_breakpoints(struct target_s
*target
)
1523 breakpoint_t
*breakpoint
= target
->breakpoints
;
1525 /* set any pending breakpoints */
1528 arm7_9_set_breakpoint(target
, breakpoint
);
1529 breakpoint
= breakpoint
->next
;
1533 int arm7_9_resume(struct target_s
*target
, int current
, u32 address
, int handle_breakpoints
, int debug_execution
)
1535 armv4_5_common_t
*armv4_5
= target
->arch_info
;
1536 arm7_9_common_t
*arm7_9
= armv4_5
->arch_info
;
1537 breakpoint_t
*breakpoint
= target
->breakpoints
;
1538 reg_t
*dbg_ctrl
= &arm7_9
->eice_cache
->reg_list
[EICE_DBG_CTRL
];
1539 int err
, retval
= ERROR_OK
;
1543 if (target
->state
!= TARGET_HALTED
)
1545 LOG_WARNING("target not halted");
1546 return ERROR_TARGET_NOT_HALTED
;
1549 if (!debug_execution
)
1551 target_free_all_working_areas(target
);
1554 /* current = 1: continue on current pc, otherwise continue at <address> */
1556 buf_set_u32(armv4_5
->core_cache
->reg_list
[15].value
, 0, 32, address
);
1559 current_pc
= buf_get_u32(armv4_5
->core_cache
->reg_list
[15].value
, 0, 32);
1561 /* the front-end may request us not to handle breakpoints */
1562 if (handle_breakpoints
)
1564 if ((breakpoint
= breakpoint_find(target
, buf_get_u32(armv4_5
->core_cache
->reg_list
[15].value
, 0, 32))))
1566 LOG_DEBUG("unset breakpoint at 0x%8.8x", breakpoint
->address
);
1567 if ((retval
= arm7_9_unset_breakpoint(target
, breakpoint
)) != ERROR_OK
)
1572 /* calculate PC of next instruction */
1574 if ((retval
= arm_simulate_step(target
, &next_pc
)) != ERROR_OK
)
1577 target_read_u32(target
, current_pc
, ¤t_opcode
);
1578 LOG_ERROR("BUG: couldn't calculate PC of next instruction, current opcode was 0x%8.8x", current_opcode
);
1582 LOG_DEBUG("enable single-step");
1583 arm7_9
->enable_single_step(target
, next_pc
);
1585 target
->debug_reason
= DBG_REASON_SINGLESTEP
;
1587 if ((retval
= arm7_9_restore_context(target
)) != ERROR_OK
)
1592 if (armv4_5
->core_state
== ARMV4_5_STATE_ARM
)
1593 arm7_9
->branch_resume(target
);
1594 else if (armv4_5
->core_state
== ARMV4_5_STATE_THUMB
)
1596 arm7_9
->branch_resume_thumb(target
);
1600 LOG_ERROR("unhandled core state");
1604 buf_set_u32(dbg_ctrl
->value
, EICE_DBG_CONTROL_DBGACK
, 1, 0);
1605 embeddedice_write_reg(dbg_ctrl
, buf_get_u32(dbg_ctrl
->value
, 0, dbg_ctrl
->size
));
1606 err
= arm7_9_execute_sys_speed(target
);
1608 LOG_DEBUG("disable single-step");
1609 arm7_9
->disable_single_step(target
);
1611 if (err
!= ERROR_OK
)
1613 if ((retval
= arm7_9_set_breakpoint(target
, breakpoint
)) != ERROR_OK
)
1617 target
->state
= TARGET_UNKNOWN
;
1621 arm7_9_debug_entry(target
);
1622 LOG_DEBUG("new PC after step: 0x%8.8x", buf_get_u32(armv4_5
->core_cache
->reg_list
[15].value
, 0, 32));
1624 LOG_DEBUG("set breakpoint at 0x%8.8x", breakpoint
->address
);
1625 if ((retval
= arm7_9_set_breakpoint(target
, breakpoint
)) != ERROR_OK
)
1632 /* enable any pending breakpoints and watchpoints */
1633 arm7_9_enable_breakpoints(target
);
1634 arm7_9_enable_watchpoints(target
);
1636 if ((retval
= arm7_9_restore_context(target
)) != ERROR_OK
)
1641 if (armv4_5
->core_state
== ARMV4_5_STATE_ARM
)
1643 arm7_9
->branch_resume(target
);
1645 else if (armv4_5
->core_state
== ARMV4_5_STATE_THUMB
)
1647 arm7_9
->branch_resume_thumb(target
);
1651 LOG_ERROR("unhandled core state");
1655 /* deassert DBGACK and INTDIS */
1656 buf_set_u32(dbg_ctrl
->value
, EICE_DBG_CONTROL_DBGACK
, 1, 0);
1657 /* INTDIS only when we really resume, not during debug execution */
1658 if (!debug_execution
)
1659 buf_set_u32(dbg_ctrl
->value
, EICE_DBG_CONTROL_INTDIS
, 1, 0);
1660 embeddedice_write_reg(dbg_ctrl
, buf_get_u32(dbg_ctrl
->value
, 0, dbg_ctrl
->size
));
1662 if ((retval
= arm7_9_restart_core(target
)) != ERROR_OK
)
1667 target
->debug_reason
= DBG_REASON_NOTHALTED
;
1669 if (!debug_execution
)
1671 /* registers are now invalid */
1672 armv4_5_invalidate_core_regs(target
);
1673 target
->state
= TARGET_RUNNING
;
1674 if ((retval
= target_call_event_callbacks(target
, TARGET_EVENT_RESUMED
)) != ERROR_OK
)
1681 target
->state
= TARGET_DEBUG_RUNNING
;
1682 if ((retval
= target_call_event_callbacks(target
, TARGET_EVENT_DEBUG_RESUMED
)) != ERROR_OK
)
1688 LOG_DEBUG("target resumed");
1693 void arm7_9_enable_eice_step(target_t
*target
, u32 next_pc
)
1695 armv4_5_common_t
*armv4_5
= target
->arch_info
;
1696 arm7_9_common_t
*arm7_9
= armv4_5
->arch_info
;
1699 current_pc
= buf_get_u32(armv4_5
->core_cache
->reg_list
[15].value
, 0, 32);
1701 if(next_pc
!= current_pc
)
1703 /* setup an inverse breakpoint on the current PC
1704 * - comparator 1 matches the current address
1705 * - rangeout from comparator 1 is connected to comparator 0 rangein
1706 * - comparator 0 matches any address, as long as rangein is low */
1707 embeddedice_write_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W0_ADDR_MASK
], 0xffffffff);
1708 embeddedice_write_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W0_DATA_MASK
], 0xffffffff);
1709 embeddedice_write_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W0_CONTROL_VALUE
], EICE_W_CTRL_ENABLE
);
1710 embeddedice_write_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W0_CONTROL_MASK
], ~(EICE_W_CTRL_RANGE
|EICE_W_CTRL_nOPC
) & 0xff);
1711 embeddedice_write_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W1_ADDR_VALUE
], current_pc
);
1712 embeddedice_write_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W1_ADDR_MASK
], 0);
1713 embeddedice_write_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W1_DATA_MASK
], 0xffffffff);
1714 embeddedice_write_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W1_CONTROL_VALUE
], 0x0);
1715 embeddedice_write_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W1_CONTROL_MASK
], ~EICE_W_CTRL_nOPC
& 0xff);
1719 embeddedice_write_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W0_ADDR_MASK
], 0xffffffff);
1720 embeddedice_write_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W0_DATA_MASK
], 0xffffffff);
1721 embeddedice_write_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W0_CONTROL_VALUE
], 0x0);
1722 embeddedice_write_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W0_CONTROL_MASK
], 0xff);
1723 embeddedice_write_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W1_ADDR_VALUE
], next_pc
);
1724 embeddedice_write_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W1_ADDR_MASK
], 0);
1725 embeddedice_write_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W1_DATA_MASK
], 0xffffffff);
1726 embeddedice_write_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W1_CONTROL_VALUE
], EICE_W_CTRL_ENABLE
);
1727 embeddedice_write_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W1_CONTROL_MASK
], ~EICE_W_CTRL_nOPC
& 0xff);
1731 void arm7_9_disable_eice_step(target_t
*target
)
1733 armv4_5_common_t
*armv4_5
= target
->arch_info
;
1734 arm7_9_common_t
*arm7_9
= armv4_5
->arch_info
;
1736 embeddedice_store_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W0_ADDR_MASK
]);
1737 embeddedice_store_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W0_DATA_MASK
]);
1738 embeddedice_store_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W0_CONTROL_VALUE
]);
1739 embeddedice_store_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W0_CONTROL_MASK
]);
1740 embeddedice_store_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W1_ADDR_VALUE
]);
1741 embeddedice_store_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W1_ADDR_MASK
]);
1742 embeddedice_store_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W1_DATA_MASK
]);
1743 embeddedice_store_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W1_CONTROL_MASK
]);
1744 embeddedice_store_reg(&arm7_9
->eice_cache
->reg_list
[EICE_W1_CONTROL_VALUE
]);
1747 int arm7_9_step(struct target_s
*target
, int current
, u32 address
, int handle_breakpoints
)
1749 armv4_5_common_t
*armv4_5
= target
->arch_info
;
1750 arm7_9_common_t
*arm7_9
= armv4_5
->arch_info
;
1751 breakpoint_t
*breakpoint
= NULL
;
1754 if (target
->state
!= TARGET_HALTED
)
1756 LOG_WARNING("target not halted");
1757 return ERROR_TARGET_NOT_HALTED
;
1760 /* current = 1: continue on current pc, otherwise continue at <address> */
1762 buf_set_u32(armv4_5
->core_cache
->reg_list
[15].value
, 0, 32, address
);
1765 current_pc
= buf_get_u32(armv4_5
->core_cache
->reg_list
[15].value
, 0, 32);
1767 /* the front-end may request us not to handle breakpoints */
1768 if (handle_breakpoints
)
1769 if ((breakpoint
= breakpoint_find(target
, buf_get_u32(armv4_5
->core_cache
->reg_list
[15].value
, 0, 32))))
1770 if ((retval
= arm7_9_unset_breakpoint(target
, breakpoint
)) != ERROR_OK
)
1775 target
->debug_reason
= DBG_REASON_SINGLESTEP
;
1777 /* calculate PC of next instruction */
1779 if ((retval
= arm_simulate_step(target
, &next_pc
)) != ERROR_OK
)
1782 target_read_u32(target
, current_pc
, ¤t_opcode
);
1783 LOG_ERROR("BUG: couldn't calculate PC of next instruction, current opcode was 0x%8.8x", current_opcode
);
1787 if ((retval
= arm7_9_restore_context(target
)) != ERROR_OK
)
1792 arm7_9
->enable_single_step(target
, next_pc
);
1794 if (armv4_5
->core_state
== ARMV4_5_STATE_ARM
)
1796 arm7_9
->branch_resume(target
);
1798 else if (armv4_5
->core_state
== ARMV4_5_STATE_THUMB
)
1800 arm7_9
->branch_resume_thumb(target
);
1804 LOG_ERROR("unhandled core state");
1808 if ((retval
= target_call_event_callbacks(target
, TARGET_EVENT_RESUMED
)) != ERROR_OK
)
1813 err
= arm7_9_execute_sys_speed(target
);
1814 arm7_9
->disable_single_step(target
);
1816 /* registers are now invalid */
1817 armv4_5_invalidate_core_regs(target
);
1819 if (err
!= ERROR_OK
)
1821 target
->state
= TARGET_UNKNOWN
;
1823 arm7_9_debug_entry(target
);
1824 if ((retval
= target_call_event_callbacks(target
, TARGET_EVENT_HALTED
)) != ERROR_OK
)
1828 LOG_DEBUG("target stepped");
1832 if ((retval
= arm7_9_set_breakpoint(target
, breakpoint
)) != ERROR_OK
)
1840 int arm7_9_read_core_reg(struct target_s
*target
, int num
, enum armv4_5_mode mode
)
1845 armv4_5_common_t
*armv4_5
= target
->arch_info
;
1846 arm7_9_common_t
*arm7_9
= armv4_5
->arch_info
;
1848 if (armv4_5_mode_to_number(armv4_5
->core_mode
)==-1)
1851 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
;
1853 if ((num
< 0) || (num
> 16))
1854 return ERROR_INVALID_ARGUMENTS
;
1856 if ((mode
!= ARMV4_5_MODE_ANY
)
1857 && (mode
!= armv4_5
->core_mode
)
1858 && (reg_mode
!= ARMV4_5_MODE_ANY
))
1862 /* change processor mode (mask T bit) */
1863 tmp_cpsr
= buf_get_u32(armv4_5
->core_cache
->reg_list
[ARMV4_5_CPSR
].value
, 0, 8) & 0xE0;
1866 arm7_9
->write_xpsr_im8(target
, tmp_cpsr
& 0xff, 0, 0);
1869 if ((num
>= 0) && (num
<= 15))
1871 /* read a normal core register */
1872 reg_p
[num
] = &value
;
1874 arm7_9
->read_core_regs(target
, 1 << num
, reg_p
);
1878 /* read a program status register
1879 * if the register mode is MODE_ANY, we read the cpsr, otherwise a spsr
1881 armv4_5_core_reg_t
*arch_info
= ARMV4_5_CORE_REG_MODE(armv4_5
->core_cache
, mode
, num
).arch_info
;
1882 int spsr
= (arch_info
->mode
== ARMV4_5_MODE_ANY
) ? 0 : 1;
1884 arm7_9
->read_xpsr(target
, &value
, spsr
);
1887 if ((retval
= jtag_execute_queue()) != ERROR_OK
)
1892 ARMV4_5_CORE_REG_MODE(armv4_5
->core_cache
, mode
, num
).valid
= 1;
1893 ARMV4_5_CORE_REG_MODE(armv4_5
->core_cache
, mode
, num
).dirty
= 0;
1894 buf_set_u32(ARMV4_5_CORE_REG_MODE(armv4_5
->core_cache
, mode
, num
).value
, 0, 32, value
);
1896 if ((mode
!= ARMV4_5_MODE_ANY
)
1897 && (mode
!= armv4_5
->core_mode
)
1898 && (reg_mode
!= ARMV4_5_MODE_ANY
)) {
1899 /* restore processor mode (mask T bit) */
1900 arm7_9
->write_xpsr_im8(target
, buf_get_u32(armv4_5
->core_cache
->reg_list
[ARMV4_5_CPSR
].value
, 0, 8) & ~0x20, 0, 0);
1906 int arm7_9_write_core_reg(struct target_s
*target
, int num
, enum armv4_5_mode mode
, u32 value
)
1909 armv4_5_common_t
*armv4_5
= target
->arch_info
;
1910 arm7_9_common_t
*arm7_9
= armv4_5
->arch_info
;
1912 if (armv4_5_mode_to_number(armv4_5
->core_mode
)==-1)
1915 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
;
1917 if ((num
< 0) || (num
> 16))
1918 return ERROR_INVALID_ARGUMENTS
;
1920 if ((mode
!= ARMV4_5_MODE_ANY
)
1921 && (mode
!= armv4_5
->core_mode
)
1922 && (reg_mode
!= ARMV4_5_MODE_ANY
)) {
1925 /* change processor mode (mask T bit) */
1926 tmp_cpsr
= buf_get_u32(armv4_5
->core_cache
->reg_list
[ARMV4_5_CPSR
].value
, 0, 8) & 0xE0;
1929 arm7_9
->write_xpsr_im8(target
, tmp_cpsr
& 0xff, 0, 0);
1932 if ((num
>= 0) && (num
<= 15))
1934 /* write a normal core register */
1937 arm7_9
->write_core_regs(target
, 1 << num
, reg
);
1941 /* write a program status register
1942 * if the register mode is MODE_ANY, we write the cpsr, otherwise a spsr
1944 armv4_5_core_reg_t
*arch_info
= ARMV4_5_CORE_REG_MODE(armv4_5
->core_cache
, mode
, num
).arch_info
;
1945 int spsr
= (arch_info
->mode
== ARMV4_5_MODE_ANY
) ? 0 : 1;
1947 /* if we're writing the CPSR, mask the T bit */
1951 arm7_9
->write_xpsr(target
, value
, spsr
);
1954 ARMV4_5_CORE_REG_MODE(armv4_5
->core_cache
, mode
, num
).valid
= 1;
1955 ARMV4_5_CORE_REG_MODE(armv4_5
->core_cache
, mode
, num
).dirty
= 0;
1957 if ((mode
!= ARMV4_5_MODE_ANY
)
1958 && (mode
!= armv4_5
->core_mode
)
1959 && (reg_mode
!= ARMV4_5_MODE_ANY
)) {
1960 /* restore processor mode (mask T bit) */
1961 arm7_9
->write_xpsr_im8(target
, buf_get_u32(armv4_5
->core_cache
->reg_list
[ARMV4_5_CPSR
].value
, 0, 8) & ~0x20, 0, 0);
1964 return jtag_execute_queue();
1967 int arm7_9_read_memory(struct target_s
*target
, u32 address
, u32 size
, u32 count
, u8
*buffer
)
1969 armv4_5_common_t
*armv4_5
= target
->arch_info
;
1970 arm7_9_common_t
*arm7_9
= armv4_5
->arch_info
;
1973 u32 num_accesses
= 0;
1974 int thisrun_accesses
;
1980 LOG_DEBUG("address: 0x%8.8x, size: 0x%8.8x, count: 0x%8.8x", address
, size
, count
);
1982 if (target
->state
!= TARGET_HALTED
)
1984 LOG_WARNING("target not halted");
1985 return ERROR_TARGET_NOT_HALTED
;
1988 /* sanitize arguments */
1989 if (((size
!= 4) && (size
!= 2) && (size
!= 1)) || (count
== 0) || !(buffer
))
1990 return ERROR_INVALID_ARGUMENTS
;
1992 if (((size
== 4) && (address
& 0x3u
)) || ((size
== 2) && (address
& 0x1u
)))
1993 return ERROR_TARGET_UNALIGNED_ACCESS
;
1995 /* load the base register with the address of the first word */
1997 arm7_9
->write_core_regs(target
, 0x1, reg
);
2004 while (num_accesses
< count
)
2007 thisrun_accesses
= ((count
- num_accesses
) >= 14) ? 14 : (count
- num_accesses
);
2008 reg_list
= (0xffff >> (15 - thisrun_accesses
)) & 0xfffe;
2010 if (last_reg
<= thisrun_accesses
)
2011 last_reg
= thisrun_accesses
;
2013 arm7_9
->load_word_regs(target
, reg_list
);
2015 /* fast memory reads are only safe when the target is running
2016 * from a sufficiently high clock (32 kHz is usually too slow)
2018 if (arm7_9
->fast_memory_access
)
2019 retval
= arm7_9_execute_fast_sys_speed(target
);
2021 retval
= arm7_9_execute_sys_speed(target
);
2022 if (retval
!= ERROR_OK
)
2025 arm7_9
->read_core_regs_target_buffer(target
, reg_list
, buffer
, 4);
2027 /* advance buffer, count number of accesses */
2028 buffer
+= thisrun_accesses
* 4;
2029 num_accesses
+= thisrun_accesses
;
2038 while (num_accesses
< count
)
2041 thisrun_accesses
= ((count
- num_accesses
) >= 14) ? 14 : (count
- num_accesses
);
2042 reg_list
= (0xffff >> (15 - thisrun_accesses
)) & 0xfffe;
2044 for (i
= 1; i
<= thisrun_accesses
; i
++)
2048 arm7_9
->load_hword_reg(target
, i
);
2049 /* fast memory reads are only safe when the target is running
2050 * from a sufficiently high clock (32 kHz is usually too slow)
2052 if (arm7_9
->fast_memory_access
)
2053 retval
= arm7_9_execute_fast_sys_speed(target
);
2055 retval
= arm7_9_execute_sys_speed(target
);
2056 if(retval
!= ERROR_OK
)
2063 arm7_9
->read_core_regs_target_buffer(target
, reg_list
, buffer
, 2);
2065 /* advance buffer, count number of accesses */
2066 buffer
+= thisrun_accesses
* 2;
2067 num_accesses
+= thisrun_accesses
;
2076 while (num_accesses
< count
)
2079 thisrun_accesses
= ((count
- num_accesses
) >= 14) ? 14 : (count
- num_accesses
);
2080 reg_list
= (0xffff >> (15 - thisrun_accesses
)) & 0xfffe;
2082 for (i
= 1; i
<= thisrun_accesses
; i
++)
2086 arm7_9
->load_byte_reg(target
, i
);
2087 /* fast memory reads are only safe when the target is running
2088 * from a sufficiently high clock (32 kHz is usually too slow)
2090 if (arm7_9
->fast_memory_access
)
2091 retval
= arm7_9_execute_fast_sys_speed(target
);
2093 retval
= arm7_9_execute_sys_speed(target
);
2094 if(retval
!= ERROR_OK
)
2100 arm7_9
->read_core_regs_target_buffer(target
, reg_list
, buffer
, 1);
2102 /* advance buffer, count number of accesses */
2103 buffer
+= thisrun_accesses
* 1;
2104 num_accesses
+= thisrun_accesses
;
2113 LOG_ERROR("BUG: we shouldn't get here");
2118 if (armv4_5_mode_to_number(armv4_5
->core_mode
)==-1)
2121 for (i
=0; i
<=last_reg
; i
++)
2122 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
;
2124 arm7_9
->read_xpsr(target
, &cpsr
, 0);
2125 if ((retval
= jtag_execute_queue()) != ERROR_OK
)
2127 LOG_ERROR("JTAG error while reading cpsr");
2128 return ERROR_TARGET_DATA_ABORT
;
2131 if (((cpsr
& 0x1f) == ARMV4_5_MODE_ABT
) && (armv4_5
->core_mode
!= ARMV4_5_MODE_ABT
))
2133 LOG_WARNING("memory read caused data abort (address: 0x%8.8x, size: 0x%x, count: 0x%x)", address
, size
, count
);
2135 arm7_9
->write_xpsr_im8(target
, buf_get_u32(armv4_5
->core_cache
->reg_list
[ARMV4_5_CPSR
].value
, 0, 8) & ~0x20, 0, 0);
2137 return ERROR_TARGET_DATA_ABORT
;
2143 int arm7_9_write_memory(struct target_s
*target
, u32 address
, u32 size
, u32 count
, u8
*buffer
)
2145 armv4_5_common_t
*armv4_5
= target
->arch_info
;
2146 arm7_9_common_t
*arm7_9
= armv4_5
->arch_info
;
2147 reg_t
*dbg_ctrl
= &arm7_9
->eice_cache
->reg_list
[EICE_DBG_CTRL
];
2150 u32 num_accesses
= 0;
2151 int thisrun_accesses
;
2157 #ifdef _DEBUG_ARM7_9_
2158 LOG_DEBUG("address: 0x%8.8x, size: 0x%8.8x, count: 0x%8.8x", address
, size
, count
);
2161 if (target
->state
!= TARGET_HALTED
)
2163 LOG_WARNING("target not halted");
2164 return ERROR_TARGET_NOT_HALTED
;
2167 /* sanitize arguments */
2168 if (((size
!= 4) && (size
!= 2) && (size
!= 1)) || (count
== 0) || !(buffer
))
2169 return ERROR_INVALID_ARGUMENTS
;
2171 if (((size
== 4) && (address
& 0x3u
)) || ((size
== 2) && (address
& 0x1u
)))
2172 return ERROR_TARGET_UNALIGNED_ACCESS
;
2174 /* load the base register with the address of the first word */
2176 arm7_9
->write_core_regs(target
, 0x1, reg
);
2178 /* Clear DBGACK, to make sure memory fetches work as expected */
2179 buf_set_u32(dbg_ctrl
->value
, EICE_DBG_CONTROL_DBGACK
, 1, 0);
2180 embeddedice_store_reg(dbg_ctrl
);
2185 while (num_accesses
< count
)
2188 thisrun_accesses
= ((count
- num_accesses
) >= 14) ? 14 : (count
- num_accesses
);
2189 reg_list
= (0xffff >> (15 - thisrun_accesses
)) & 0xfffe;
2191 for (i
= 1; i
<= thisrun_accesses
; i
++)
2195 reg
[i
] = target_buffer_get_u32(target
, buffer
);
2199 arm7_9
->write_core_regs(target
, reg_list
, reg
);
2201 arm7_9
->store_word_regs(target
, reg_list
);
2203 /* fast memory writes are only safe when the target is running
2204 * from a sufficiently high clock (32 kHz is usually too slow)
2206 if (arm7_9
->fast_memory_access
)
2207 retval
= arm7_9_execute_fast_sys_speed(target
);
2209 retval
= arm7_9_execute_sys_speed(target
);
2210 if(retval
!= ERROR_OK
)
2215 num_accesses
+= thisrun_accesses
;
2219 while (num_accesses
< count
)
2222 thisrun_accesses
= ((count
- num_accesses
) >= 14) ? 14 : (count
- num_accesses
);
2223 reg_list
= (0xffff >> (15 - thisrun_accesses
)) & 0xfffe;
2225 for (i
= 1; i
<= thisrun_accesses
; i
++)
2229 reg
[i
] = target_buffer_get_u16(target
, buffer
) & 0xffff;
2233 arm7_9
->write_core_regs(target
, reg_list
, reg
);
2235 for (i
= 1; i
<= thisrun_accesses
; i
++)
2237 arm7_9
->store_hword_reg(target
, i
);
2239 /* fast memory writes are only safe when the target is running
2240 * from a sufficiently high clock (32 kHz is usually too slow)
2242 if (arm7_9
->fast_memory_access
)
2243 retval
= arm7_9_execute_fast_sys_speed(target
);
2245 retval
= arm7_9_execute_sys_speed(target
);
2246 if(retval
!= ERROR_OK
)
2252 num_accesses
+= thisrun_accesses
;
2256 while (num_accesses
< count
)
2259 thisrun_accesses
= ((count
- num_accesses
) >= 14) ? 14 : (count
- num_accesses
);
2260 reg_list
= (0xffff >> (15 - thisrun_accesses
)) & 0xfffe;
2262 for (i
= 1; i
<= thisrun_accesses
; i
++)
2266 reg
[i
] = *buffer
++ & 0xff;
2269 arm7_9
->write_core_regs(target
, reg_list
, reg
);
2271 for (i
= 1; i
<= thisrun_accesses
; i
++)
2273 arm7_9
->store_byte_reg(target
, i
);
2274 /* fast memory writes are only safe when the target is running
2275 * from a sufficiently high clock (32 kHz is usually too slow)
2277 if (arm7_9
->fast_memory_access
)
2278 retval
= arm7_9_execute_fast_sys_speed(target
);
2280 retval
= arm7_9_execute_sys_speed(target
);
2281 if(retval
!= ERROR_OK
)
2288 num_accesses
+= thisrun_accesses
;
2292 LOG_ERROR("BUG: we shouldn't get here");
2298 buf_set_u32(dbg_ctrl
->value
, EICE_DBG_CONTROL_DBGACK
, 1, 1);
2299 embeddedice_store_reg(dbg_ctrl
);
2301 if (armv4_5_mode_to_number(armv4_5
->core_mode
)==-1)
2304 for (i
=0; i
<=last_reg
; i
++)
2305 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
;
2307 arm7_9
->read_xpsr(target
, &cpsr
, 0);
2308 if ((retval
= jtag_execute_queue()) != ERROR_OK
)
2310 LOG_ERROR("JTAG error while reading cpsr");
2311 return ERROR_TARGET_DATA_ABORT
;
2314 if (((cpsr
& 0x1f) == ARMV4_5_MODE_ABT
) && (armv4_5
->core_mode
!= ARMV4_5_MODE_ABT
))
2316 LOG_WARNING("memory write caused data abort (address: 0x%8.8x, size: 0x%x, count: 0x%x)", address
, size
, count
);
2318 arm7_9
->write_xpsr_im8(target
, buf_get_u32(armv4_5
->core_cache
->reg_list
[ARMV4_5_CPSR
].value
, 0, 8) & ~0x20, 0, 0);
2320 return ERROR_TARGET_DATA_ABORT
;
2326 static int dcc_count
;
2327 static u8
*dcc_buffer
;
2329 static int arm7_9_dcc_completion(struct target_s
*target
, u32 exit_point
, int timeout_ms
, void *arch_info
)
2331 int retval
= ERROR_OK
;
2332 armv4_5_common_t
*armv4_5
= target
->arch_info
;
2333 arm7_9_common_t
*arm7_9
= armv4_5
->arch_info
;
2335 if ((retval
=target_wait_state(target
, TARGET_DEBUG_RUNNING
, 500))!=ERROR_OK
)
2338 int little
=target
->endianness
==TARGET_LITTLE_ENDIAN
;
2339 int count
=dcc_count
;
2340 u8
*buffer
=dcc_buffer
;
2343 /* Handle first & last using standard embeddedice_write_reg and the middle ones w/the
2344 * core function repeated. */
2345 embeddedice_write_reg(&arm7_9
->eice_cache
->reg_list
[EICE_COMMS_DATA
], fast_target_buffer_get_u32(buffer
, little
));
2348 embeddedice_reg_t
*ice_reg
= arm7_9
->eice_cache
->reg_list
[EICE_COMMS_DATA
].arch_info
;
2349 u8 reg_addr
= ice_reg
->addr
& 0x1f;
2351 tap
= ice_reg
->jtag_info
->tap
;
2353 embeddedice_write_dcc(tap
, reg_addr
, buffer
, little
, count
-2);
2354 buffer
+= (count
-2)*4;
2356 embeddedice_write_reg(&arm7_9
->eice_cache
->reg_list
[EICE_COMMS_DATA
], fast_target_buffer_get_u32(buffer
, little
));
2360 for (i
= 0; i
< count
; i
++)
2362 embeddedice_write_reg(&arm7_9
->eice_cache
->reg_list
[EICE_COMMS_DATA
], fast_target_buffer_get_u32(buffer
, little
));
2367 if((retval
= target_halt(target
))!= ERROR_OK
)
2371 return target_wait_state(target
, TARGET_HALTED
, 500);
2374 static const u32 dcc_code
[] =
2376 /* MRC TST BNE MRC STR B */
2377 0xee101e10, 0xe3110001, 0x0afffffc, 0xee111e10, 0xe4801004, 0xeafffff9
2380 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
, u32 entry_point
, u32 exit_point
, int timeout_ms
, void *arch_info
, int (*run_it
)(struct target_s
*target
, u32 exit_point
, int timeout_ms
, void *arch_info
));
2382 int arm7_9_bulk_write_memory(target_t
*target
, u32 address
, u32 count
, u8
*buffer
)
2385 armv4_5_common_t
*armv4_5
= target
->arch_info
;
2386 arm7_9_common_t
*arm7_9
= armv4_5
->arch_info
;
2389 if (!arm7_9
->dcc_downloads
)
2390 return target
->type
->write_memory(target
, address
, 4, count
, buffer
);
2392 /* regrab previously allocated working_area, or allocate a new one */
2393 if (!arm7_9
->dcc_working_area
)
2395 u8 dcc_code_buf
[6 * 4];
2397 /* make sure we have a working area */
2398 if (target_alloc_working_area(target
, 24, &arm7_9
->dcc_working_area
) != ERROR_OK
)
2400 LOG_INFO("no working area available, falling back to memory writes");
2401 return target
->type
->write_memory(target
, address
, 4, count
, buffer
);
2404 /* copy target instructions to target endianness */
2405 for (i
= 0; i
< 6; i
++)
2407 target_buffer_set_u32(target
, dcc_code_buf
+ i
*4, dcc_code
[i
]);
2410 /* write DCC code to working area */
2411 if ((retval
= target
->type
->write_memory(target
, arm7_9
->dcc_working_area
->address
, 4, 6, dcc_code_buf
)) != ERROR_OK
)
2417 armv4_5_algorithm_t armv4_5_info
;
2418 reg_param_t reg_params
[1];
2420 armv4_5_info
.common_magic
= ARMV4_5_COMMON_MAGIC
;
2421 armv4_5_info
.core_mode
= ARMV4_5_MODE_SVC
;
2422 armv4_5_info
.core_state
= ARMV4_5_STATE_ARM
;
2424 init_reg_param(®_params
[0], "r0", 32, PARAM_IN_OUT
);
2426 buf_set_u32(reg_params
[0].value
, 0, 32, address
);
2430 retval
= armv4_5_run_algorithm_inner(target
, 0, NULL
, 1, reg_params
,
2431 arm7_9
->dcc_working_area
->address
, arm7_9
->dcc_working_area
->address
+6*4, 20*1000, &armv4_5_info
, arm7_9_dcc_completion
);
2433 if (retval
==ERROR_OK
)
2435 u32 endaddress
=buf_get_u32(reg_params
[0].value
, 0, 32);
2436 if (endaddress
!=(address
+count
*4))
2438 LOG_ERROR("DCC write failed, expected end address 0x%08x got 0x%0x", (address
+count
*4), endaddress
);
2443 destroy_reg_param(®_params
[0]);
2448 int arm7_9_checksum_memory(struct target_s
*target
, u32 address
, u32 count
, u32
* checksum
)
2450 working_area_t
*crc_algorithm
;
2451 armv4_5_algorithm_t armv4_5_info
;
2452 reg_param_t reg_params
[2];
2455 u32 arm7_9_crc_code
[] = {
2456 0xE1A02000, /* mov r2, r0 */
2457 0xE3E00000, /* mov r0, #0xffffffff */
2458 0xE1A03001, /* mov r3, r1 */
2459 0xE3A04000, /* mov r4, #0 */
2460 0xEA00000B, /* b ncomp */
2462 0xE7D21004, /* ldrb r1, [r2, r4] */
2463 0xE59F7030, /* ldr r7, CRC32XOR */
2464 0xE0200C01, /* eor r0, r0, r1, asl 24 */
2465 0xE3A05000, /* mov r5, #0 */
2467 0xE3500000, /* cmp r0, #0 */
2468 0xE1A06080, /* mov r6, r0, asl #1 */
2469 0xE2855001, /* add r5, r5, #1 */
2470 0xE1A00006, /* mov r0, r6 */
2471 0xB0260007, /* eorlt r0, r6, r7 */
2472 0xE3550008, /* cmp r5, #8 */
2473 0x1AFFFFF8, /* bne loop */
2474 0xE2844001, /* add r4, r4, #1 */
2476 0xE1540003, /* cmp r4, r3 */
2477 0x1AFFFFF1, /* bne nbyte */
2479 0xEAFFFFFE, /* b end */
2480 0x04C11DB7 /* CRC32XOR: .word 0x04C11DB7 */
2485 if (target_alloc_working_area(target
, sizeof(arm7_9_crc_code
), &crc_algorithm
) != ERROR_OK
)
2487 return ERROR_TARGET_RESOURCE_NOT_AVAILABLE
;
2490 /* convert flash writing code into a buffer in target endianness */
2491 for (i
= 0; i
< (sizeof(arm7_9_crc_code
)/sizeof(u32
)); i
++)
2493 if ((retval
=target_write_u32(target
, crc_algorithm
->address
+ i
*sizeof(u32
), arm7_9_crc_code
[i
]))!=ERROR_OK
)
2499 armv4_5_info
.common_magic
= ARMV4_5_COMMON_MAGIC
;
2500 armv4_5_info
.core_mode
= ARMV4_5_MODE_SVC
;
2501 armv4_5_info
.core_state
= ARMV4_5_STATE_ARM
;
2503 init_reg_param(®_params
[0], "r0", 32, PARAM_IN_OUT
);
2504 init_reg_param(®_params
[1], "r1", 32, PARAM_OUT
);
2506 buf_set_u32(reg_params
[0].value
, 0, 32, address
);
2507 buf_set_u32(reg_params
[1].value
, 0, 32, count
);
2509 if ((retval
= target
->type
->run_algorithm(target
, 0, NULL
, 2, reg_params
,
2510 crc_algorithm
->address
, crc_algorithm
->address
+ (sizeof(arm7_9_crc_code
) - 8), 20000, &armv4_5_info
)) != ERROR_OK
)
2512 LOG_ERROR("error executing arm7_9 crc algorithm");
2513 destroy_reg_param(®_params
[0]);
2514 destroy_reg_param(®_params
[1]);
2515 target_free_working_area(target
, crc_algorithm
);
2519 *checksum
= buf_get_u32(reg_params
[0].value
, 0, 32);
2521 destroy_reg_param(®_params
[0]);
2522 destroy_reg_param(®_params
[1]);
2524 target_free_working_area(target
, crc_algorithm
);
2529 int arm7_9_blank_check_memory(struct target_s
*target
, u32 address
, u32 count
, u32
* blank
)
2531 working_area_t
*erase_check_algorithm
;
2532 reg_param_t reg_params
[3];
2533 armv4_5_algorithm_t armv4_5_info
;
2537 u32 erase_check_code
[] =
2540 0xe4d03001, /* ldrb r3, [r0], #1 */
2541 0xe0022003, /* and r2, r2, r3 */
2542 0xe2511001, /* subs r1, r1, #1 */
2543 0x1afffffb, /* bne loop */
2545 0xeafffffe /* b end */
2548 /* make sure we have a working area */
2549 if (target_alloc_working_area(target
, sizeof(erase_check_code
), &erase_check_algorithm
) != ERROR_OK
)
2551 return ERROR_TARGET_RESOURCE_NOT_AVAILABLE
;
2554 /* convert flash writing code into a buffer in target endianness */
2555 for (i
= 0; i
< (sizeof(erase_check_code
)/sizeof(u32
)); i
++)
2556 if ((retval
= target_write_u32(target
, erase_check_algorithm
->address
+ i
*sizeof(u32
), erase_check_code
[i
])) != ERROR_OK
)
2561 armv4_5_info
.common_magic
= ARMV4_5_COMMON_MAGIC
;
2562 armv4_5_info
.core_mode
= ARMV4_5_MODE_SVC
;
2563 armv4_5_info
.core_state
= ARMV4_5_STATE_ARM
;
2565 init_reg_param(®_params
[0], "r0", 32, PARAM_OUT
);
2566 buf_set_u32(reg_params
[0].value
, 0, 32, address
);
2568 init_reg_param(®_params
[1], "r1", 32, PARAM_OUT
);
2569 buf_set_u32(reg_params
[1].value
, 0, 32, count
);
2571 init_reg_param(®_params
[2], "r2", 32, PARAM_IN_OUT
);
2572 buf_set_u32(reg_params
[2].value
, 0, 32, 0xff);
2574 if ((retval
= target
->type
->run_algorithm(target
, 0, NULL
, 3, reg_params
,
2575 erase_check_algorithm
->address
, erase_check_algorithm
->address
+ (sizeof(erase_check_code
) - 4), 10000, &armv4_5_info
)) != ERROR_OK
)
2577 destroy_reg_param(®_params
[0]);
2578 destroy_reg_param(®_params
[1]);
2579 destroy_reg_param(®_params
[2]);
2580 target_free_working_area(target
, erase_check_algorithm
);
2584 *blank
= buf_get_u32(reg_params
[2].value
, 0, 32);
2586 destroy_reg_param(®_params
[0]);
2587 destroy_reg_param(®_params
[1]);
2588 destroy_reg_param(®_params
[2]);
2590 target_free_working_area(target
, erase_check_algorithm
);
2595 int arm7_9_register_commands(struct command_context_s
*cmd_ctx
)
2597 command_t
*arm7_9_cmd
;
2599 arm7_9_cmd
= register_command(cmd_ctx
, NULL
, "arm7_9", NULL
, COMMAND_ANY
, "arm7/9 specific commands");
2601 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>");
2602 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>");
2604 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>");
2606 register_command(cmd_ctx
, arm7_9_cmd
, "dbgrq", handle_arm7_9_dbgrq_command
,
2607 COMMAND_ANY
, "use EmbeddedICE dbgrq instead of breakpoint for target halt requests <enable|disable>");
2608 register_command(cmd_ctx
, arm7_9_cmd
, "fast_memory_access", handle_arm7_9_fast_memory_access_command
,
2609 COMMAND_ANY
, "use fast memory accesses instead of slower but potentially unsafe slow accesses <enable|disable>");
2610 register_command(cmd_ctx
, arm7_9_cmd
, "dcc_downloads", handle_arm7_9_dcc_downloads_command
,
2611 COMMAND_ANY
, "use DCC downloads for larger memory writes <enable|disable>");
2613 armv4_5_register_commands(cmd_ctx
);
2615 etm_register_commands(cmd_ctx
);
2620 int handle_arm7_9_write_xpsr_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2625 target_t
*target
= get_current_target(cmd_ctx
);
2626 armv4_5_common_t
*armv4_5
;
2627 arm7_9_common_t
*arm7_9
;
2629 if (arm7_9_get_arch_pointers(target
, &armv4_5
, &arm7_9
) != ERROR_OK
)
2631 command_print(cmd_ctx
, "current target isn't an ARM7/ARM9 target");
2635 if (target
->state
!= TARGET_HALTED
)
2637 command_print(cmd_ctx
, "can't write registers while running");
2643 command_print(cmd_ctx
, "usage: write_xpsr <value> <not cpsr|spsr>");
2647 value
= strtoul(args
[0], NULL
, 0);
2648 spsr
= strtol(args
[1], NULL
, 0);
2650 /* if we're writing the CPSR, mask the T bit */
2654 arm7_9
->write_xpsr(target
, value
, spsr
);
2655 if ((retval
= jtag_execute_queue()) != ERROR_OK
)
2657 LOG_ERROR("JTAG error while writing to xpsr");
2664 int handle_arm7_9_write_xpsr_im8_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2670 target_t
*target
= get_current_target(cmd_ctx
);
2671 armv4_5_common_t
*armv4_5
;
2672 arm7_9_common_t
*arm7_9
;
2674 if (arm7_9_get_arch_pointers(target
, &armv4_5
, &arm7_9
) != ERROR_OK
)
2676 command_print(cmd_ctx
, "current target isn't an ARM7/ARM9 target");
2680 if (target
->state
!= TARGET_HALTED
)
2682 command_print(cmd_ctx
, "can't write registers while running");
2688 command_print(cmd_ctx
, "usage: write_xpsr_im8 <im8> <rotate> <not cpsr|spsr>");
2692 value
= strtoul(args
[0], NULL
, 0);
2693 rotate
= strtol(args
[1], NULL
, 0);
2694 spsr
= strtol(args
[2], NULL
, 0);
2696 arm7_9
->write_xpsr_im8(target
, value
, rotate
, spsr
);
2697 if ((retval
= jtag_execute_queue()) != ERROR_OK
)
2699 LOG_ERROR("JTAG error while writing 8-bit immediate to xpsr");
2706 int handle_arm7_9_write_core_reg_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2711 target_t
*target
= get_current_target(cmd_ctx
);
2712 armv4_5_common_t
*armv4_5
;
2713 arm7_9_common_t
*arm7_9
;
2715 if (arm7_9_get_arch_pointers(target
, &armv4_5
, &arm7_9
) != ERROR_OK
)
2717 command_print(cmd_ctx
, "current target isn't an ARM7/ARM9 target");
2721 if (target
->state
!= TARGET_HALTED
)
2723 command_print(cmd_ctx
, "can't write registers while running");
2729 command_print(cmd_ctx
, "usage: write_core_reg <num> <mode> <value>");
2733 num
= strtol(args
[0], NULL
, 0);
2734 mode
= strtoul(args
[1], NULL
, 0);
2735 value
= strtoul(args
[2], NULL
, 0);
2737 return arm7_9_write_core_reg(target
, num
, mode
, value
);
2740 int handle_arm7_9_dbgrq_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2742 target_t
*target
= get_current_target(cmd_ctx
);
2743 armv4_5_common_t
*armv4_5
;
2744 arm7_9_common_t
*arm7_9
;
2746 if (arm7_9_get_arch_pointers(target
, &armv4_5
, &arm7_9
) != ERROR_OK
)
2748 command_print(cmd_ctx
, "current target isn't an ARM7/ARM9 target");
2754 if (strcmp("enable", args
[0]) == 0)
2756 arm7_9
->use_dbgrq
= 1;
2758 else if (strcmp("disable", args
[0]) == 0)
2760 arm7_9
->use_dbgrq
= 0;
2764 command_print(cmd_ctx
, "usage: arm7_9 dbgrq <enable|disable>");
2768 command_print(cmd_ctx
, "use of EmbeddedICE dbgrq instead of breakpoint for target halt %s", (arm7_9
->use_dbgrq
) ? "enabled" : "disabled");
2773 int handle_arm7_9_fast_memory_access_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2775 target_t
*target
= get_current_target(cmd_ctx
);
2776 armv4_5_common_t
*armv4_5
;
2777 arm7_9_common_t
*arm7_9
;
2779 if (arm7_9_get_arch_pointers(target
, &armv4_5
, &arm7_9
) != ERROR_OK
)
2781 command_print(cmd_ctx
, "current target isn't an ARM7/ARM9 target");
2787 if (strcmp("enable", args
[0]) == 0)
2789 arm7_9
->fast_memory_access
= 1;
2791 else if (strcmp("disable", args
[0]) == 0)
2793 arm7_9
->fast_memory_access
= 0;
2797 command_print(cmd_ctx
, "usage: arm7_9 fast_memory_access <enable|disable>");
2801 command_print(cmd_ctx
, "fast memory access is %s", (arm7_9
->fast_memory_access
) ? "enabled" : "disabled");
2806 int handle_arm7_9_dcc_downloads_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2808 target_t
*target
= get_current_target(cmd_ctx
);
2809 armv4_5_common_t
*armv4_5
;
2810 arm7_9_common_t
*arm7_9
;
2812 if (arm7_9_get_arch_pointers(target
, &armv4_5
, &arm7_9
) != ERROR_OK
)
2814 command_print(cmd_ctx
, "current target isn't an ARM7/ARM9 target");
2820 if (strcmp("enable", args
[0]) == 0)
2822 arm7_9
->dcc_downloads
= 1;
2824 else if (strcmp("disable", args
[0]) == 0)
2826 arm7_9
->dcc_downloads
= 0;
2830 command_print(cmd_ctx
, "usage: arm7_9 dcc_downloads <enable|disable>");
2834 command_print(cmd_ctx
, "dcc downloads are %s", (arm7_9
->dcc_downloads
) ? "enabled" : "disabled");
2839 int arm7_9_init_arch_info(target_t
*target
, arm7_9_common_t
*arm7_9
)
2841 int retval
= ERROR_OK
;
2842 armv4_5_common_t
*armv4_5
= &arm7_9
->armv4_5_common
;
2844 arm7_9
->common_magic
= ARM7_9_COMMON_MAGIC
;
2846 if((retval
= arm_jtag_setup_connection(&arm7_9
->jtag_info
)) != ERROR_OK
)
2851 arm7_9
->wp_available
= 0; /* this is set up in arm7_9_clear_watchpoints() */
2852 arm7_9
->wp_available_max
= 2;
2853 arm7_9
->sw_breakpoints_added
= 0;
2854 arm7_9
->breakpoint_count
= 0;
2855 arm7_9
->wp0_used
= 0;
2856 arm7_9
->wp1_used
= 0;
2857 arm7_9
->wp1_used_default
= 0;
2858 arm7_9
->use_dbgrq
= 0;
2860 arm7_9
->etm_ctx
= NULL
;
2861 arm7_9
->has_single_step
= 0;
2862 arm7_9
->has_monitor_mode
= 0;
2863 arm7_9
->has_vector_catch
= 0;
2865 arm7_9
->debug_entry_from_reset
= 0;
2867 arm7_9
->dcc_working_area
= NULL
;
2869 arm7_9
->fast_memory_access
= fast_and_dangerous
;
2870 arm7_9
->dcc_downloads
= fast_and_dangerous
;
2872 arm7_9
->need_bypass_before_restart
= 0;
2874 armv4_5
->arch_info
= arm7_9
;
2875 armv4_5
->read_core_reg
= arm7_9_read_core_reg
;
2876 armv4_5
->write_core_reg
= arm7_9_write_core_reg
;
2877 armv4_5
->full_context
= arm7_9_full_context
;
2879 if((retval
= armv4_5_init_arch_info(target
, armv4_5
)) != ERROR_OK
)
2884 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)