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 ***************************************************************************/
25 #include <helper/time_support.h>
26 #include "target_type.h"
28 #include "arm_opcodes.h"
32 * For information about the ARM920T, see ARM DDI 0151C especially
33 * Chapter 9 about debug support, which shows how to manipulate each
34 * of the different scan chains:
36 * 0 ... ARM920 signals, e.g. to rest of SOC (unused here)
37 * 1 ... debugging; watchpoint and breakpoint status, etc; also
38 * MMU and cache access in conjunction with scan chain 15
40 * 3 ... external boundary scan (SoC-specific, unused here)
41 * 4 ... access to cache tag RAM
43 * 15 ... access coprocessor 15, "physical" or "interpreted" modes
44 * "interpreted" works with a few actual MRC/MCR instructions
45 * "physical" provides register-like behaviors. Section 9.6.7
46 * covers these details.
48 * The ARM922T is similar, but with smaller caches (8K each, vs 16K).
52 #define _DEBUG_INSTRUCTION_EXECUTION_
55 /* Table 9-8 shows scan chain 15 format during physical access mode, using a
56 * dedicated 6-bit address space (encoded in bits 33:38). Writes use one
57 * JTAG scan, while reads use two.
59 * Table 9-9 lists the thirteen registers which support physical access.
60 * ARM920T_CP15_PHYS_ADDR() constructs the 6-bit reg_addr parameter passed
61 * to arm920t_read_cp15_physical() and arm920t_write_cp15_physical().
67 #define ARM920T_CP15_PHYS_ADDR(x, y, z) ((x << 5) | (y << 1) << (z))
69 /* Registers supporting physical Read access (from table 9-9) */
70 #define CP15PHYS_CACHETYPE ARM920T_CP15_PHYS_ADDR(0, 0x0, 1)
71 #define CP15PHYS_ICACHE_IDX ARM920T_CP15_PHYS_ADDR(1, 0xd, 1)
72 #define CP15PHYS_DCACHE_IDX ARM920T_CP15_PHYS_ADDR(1, 0xe, 1)
73 /* NOTE: several more registers support only physical read access */
75 /* Registers supporting physical Read/Write access (from table 9-9) */
76 #define CP15PHYS_CTRL ARM920T_CP15_PHYS_ADDR(0, 0x1, 0)
77 #define CP15PHYS_PID ARM920T_CP15_PHYS_ADDR(0, 0xd, 0)
78 #define CP15PHYS_TESTSTATE ARM920T_CP15_PHYS_ADDR(0, 0xf, 0)
79 #define CP15PHYS_ICACHE ARM920T_CP15_PHYS_ADDR(1, 0x1, 1)
80 #define CP15PHYS_DCACHE ARM920T_CP15_PHYS_ADDR(1, 0x2, 1)
82 static int arm920t_read_cp15_physical(struct target
*target
,
83 int reg_addr
, uint32_t *value
)
85 struct arm920t_common
*arm920t
= target_to_arm920(target
);
86 struct arm_jtag
*jtag_info
;
87 struct scan_field fields
[4];
88 uint8_t access_type_buf
= 1;
89 uint8_t reg_addr_buf
= reg_addr
& 0x3f;
92 jtag_info
= &arm920t
->arm7_9_common
.jtag_info
;
94 arm_jtag_scann(jtag_info
, 0xf, TAP_IDLE
);
95 arm_jtag_set_instr(jtag_info
, jtag_info
->intest_instr
, NULL
, TAP_IDLE
);
97 fields
[0].num_bits
= 1;
98 fields
[0].out_value
= &access_type_buf
;
99 fields
[0].in_value
= NULL
;
101 fields
[1].num_bits
= 32;
102 fields
[1].out_value
= NULL
;
103 fields
[1].in_value
= NULL
;
105 fields
[2].num_bits
= 6;
106 fields
[2].out_value
= ®_addr_buf
;
107 fields
[2].in_value
= NULL
;
109 fields
[3].num_bits
= 1;
110 fields
[3].out_value
= &nr_w_buf
;
111 fields
[3].in_value
= NULL
;
113 jtag_add_dr_scan(jtag_info
->tap
, 4, fields
, TAP_IDLE
);
115 fields
[1].in_value
= (uint8_t *)value
;
117 jtag_add_dr_scan(jtag_info
->tap
, 4, fields
, TAP_IDLE
);
119 jtag_add_callback(arm_le_to_h_u32
, (jtag_callback_data_t
)value
);
121 #ifdef _DEBUG_INSTRUCTION_EXECUTION_
122 jtag_execute_queue();
123 LOG_DEBUG("addr: 0x%x value: %8.8x", reg_addr
, *value
);
129 static int arm920t_write_cp15_physical(struct target
*target
,
130 int reg_addr
, uint32_t value
)
132 struct arm920t_common
*arm920t
= target_to_arm920(target
);
133 struct arm_jtag
*jtag_info
;
134 struct scan_field fields
[4];
135 uint8_t access_type_buf
= 1;
136 uint8_t reg_addr_buf
= reg_addr
& 0x3f;
137 uint8_t nr_w_buf
= 1;
138 uint8_t value_buf
[4];
140 jtag_info
= &arm920t
->arm7_9_common
.jtag_info
;
142 buf_set_u32(value_buf
, 0, 32, value
);
144 arm_jtag_scann(jtag_info
, 0xf, TAP_IDLE
);
145 arm_jtag_set_instr(jtag_info
, jtag_info
->intest_instr
, NULL
, TAP_IDLE
);
147 fields
[0].num_bits
= 1;
148 fields
[0].out_value
= &access_type_buf
;
149 fields
[0].in_value
= NULL
;
151 fields
[1].num_bits
= 32;
152 fields
[1].out_value
= value_buf
;
153 fields
[1].in_value
= NULL
;
155 fields
[2].num_bits
= 6;
156 fields
[2].out_value
= ®_addr_buf
;
157 fields
[2].in_value
= NULL
;
159 fields
[3].num_bits
= 1;
160 fields
[3].out_value
= &nr_w_buf
;
161 fields
[3].in_value
= NULL
;
163 jtag_add_dr_scan(jtag_info
->tap
, 4, fields
, TAP_IDLE
);
165 #ifdef _DEBUG_INSTRUCTION_EXECUTION_
166 LOG_DEBUG("addr: 0x%x value: %8.8x", reg_addr
, value
);
172 /* See table 9-10 for scan chain 15 format during interpreted access mode.
173 * If the TESTSTATE register is set for interpreted access, certain CP15
174 * MRC and MCR instructions may be executed through scan chain 15.
176 * Tables 9-11, 9-12, and 9-13 show which MRC and MCR instructions can be
177 * executed using scan chain 15 interpreted mode.
179 static int arm920t_execute_cp15(struct target
*target
, uint32_t cp15_opcode
,
183 struct arm920t_common
*arm920t
= target_to_arm920(target
);
184 struct arm_jtag
*jtag_info
;
185 struct scan_field fields
[4];
186 uint8_t access_type_buf
= 0; /* interpreted access */
187 uint8_t reg_addr_buf
= 0x0;
188 uint8_t nr_w_buf
= 0;
189 uint8_t cp15_opcode_buf
[4];
191 jtag_info
= &arm920t
->arm7_9_common
.jtag_info
;
193 arm_jtag_scann(jtag_info
, 0xf, TAP_IDLE
);
194 arm_jtag_set_instr(jtag_info
, jtag_info
->intest_instr
, NULL
, TAP_IDLE
);
196 buf_set_u32(cp15_opcode_buf
, 0, 32, cp15_opcode
);
198 fields
[0].num_bits
= 1;
199 fields
[0].out_value
= &access_type_buf
;
200 fields
[0].in_value
= NULL
;
202 fields
[1].num_bits
= 32;
203 fields
[1].out_value
= cp15_opcode_buf
;
204 fields
[1].in_value
= NULL
;
206 fields
[2].num_bits
= 6;
207 fields
[2].out_value
= ®_addr_buf
;
208 fields
[2].in_value
= NULL
;
210 fields
[3].num_bits
= 1;
211 fields
[3].out_value
= &nr_w_buf
;
212 fields
[3].in_value
= NULL
;
214 jtag_add_dr_scan(jtag_info
->tap
, 4, fields
, TAP_IDLE
);
216 arm9tdmi_clock_out(jtag_info
, arm_opcode
, 0, NULL
, 0);
217 arm9tdmi_clock_out(jtag_info
, ARMV4_5_NOP
, 0, NULL
, 1);
218 retval
= arm7_9_execute_sys_speed(target
);
219 if (retval
!= ERROR_OK
)
222 if ((retval
= jtag_execute_queue()) != ERROR_OK
)
224 LOG_ERROR("failed executing JTAG queue");
231 static int arm920t_read_cp15_interpreted(struct target
*target
,
232 uint32_t cp15_opcode
, uint32_t address
, uint32_t *value
)
234 struct arm
*armv4_5
= target_to_arm(target
);
237 uint32_t cp15c15
= 0x0;
238 struct reg
*r
= armv4_5
->core_cache
->reg_list
;
240 /* load address into R1 */
242 arm9tdmi_write_core_regs(target
, 0x2, regs
);
244 /* read-modify-write CP15 test state register
245 * to enable interpreted access mode */
246 arm920t_read_cp15_physical(target
, CP15PHYS_TESTSTATE
, &cp15c15
);
247 jtag_execute_queue();
248 cp15c15
|= 1; /* set interpret mode */
249 arm920t_write_cp15_physical(target
, CP15PHYS_TESTSTATE
, cp15c15
);
251 /* execute CP15 instruction and ARM load (reading from coprocessor) */
252 arm920t_execute_cp15(target
, cp15_opcode
, ARMV4_5_LDR(0, 1));
254 /* disable interpreted access mode */
255 cp15c15
&= ~1U; /* clear interpret mode */
256 arm920t_write_cp15_physical(target
, CP15PHYS_TESTSTATE
, cp15c15
);
258 /* retrieve value from R0 */
260 arm9tdmi_read_core_regs(target
, 0x1, regs_p
);
261 jtag_execute_queue();
263 #ifdef _DEBUG_INSTRUCTION_EXECUTION_
264 LOG_DEBUG("cp15_opcode: %8.8x, address: %8.8x, value: %8.8x",
265 cp15_opcode
, address
, *value
);
268 if (!is_arm_mode(armv4_5
->core_mode
))
278 int arm920t_write_cp15_interpreted(struct target
*target
,
279 uint32_t cp15_opcode
, uint32_t value
, uint32_t address
)
281 uint32_t cp15c15
= 0x0;
282 struct arm
*armv4_5
= target_to_arm(target
);
284 struct reg
*r
= armv4_5
->core_cache
->reg_list
;
286 /* load value, address into R0, R1 */
289 arm9tdmi_write_core_regs(target
, 0x3, regs
);
291 /* read-modify-write CP15 test state register
292 * to enable interpreted access mode */
293 arm920t_read_cp15_physical(target
, CP15PHYS_TESTSTATE
, &cp15c15
);
294 jtag_execute_queue();
295 cp15c15
|= 1; /* set interpret mode */
296 arm920t_write_cp15_physical(target
, CP15PHYS_TESTSTATE
, cp15c15
);
298 /* execute CP15 instruction and ARM store (writing to coprocessor) */
299 arm920t_execute_cp15(target
, cp15_opcode
, ARMV4_5_STR(0, 1));
301 /* disable interpreted access mode */
302 cp15c15
&= ~1U; /* set interpret mode */
303 arm920t_write_cp15_physical(target
, CP15PHYS_TESTSTATE
, cp15c15
);
305 #ifdef _DEBUG_INSTRUCTION_EXECUTION_
306 LOG_DEBUG("cp15_opcode: %8.8x, value: %8.8x, address: %8.8x",
307 cp15_opcode
, value
, address
);
310 if (!is_arm_mode(armv4_5
->core_mode
))
320 uint32_t arm920t_get_ttb(struct target
*target
)
325 if ((retval
= arm920t_read_cp15_interpreted(target
,
326 /* FIXME use opcode macro */
327 0xeebf0f51, 0x0, &ttb
)) != ERROR_OK
)
334 void arm920t_disable_mmu_caches(struct target
*target
, int mmu
,
335 int d_u_cache
, int i_cache
)
337 uint32_t cp15_control
;
339 /* read cp15 control register */
340 arm920t_read_cp15_physical(target
, CP15PHYS_CTRL
, &cp15_control
);
341 jtag_execute_queue();
344 cp15_control
&= ~0x1U
;
347 cp15_control
&= ~0x4U
;
350 cp15_control
&= ~0x1000U
;
352 arm920t_write_cp15_physical(target
, CP15PHYS_CTRL
, cp15_control
);
356 void arm920t_enable_mmu_caches(struct target
*target
, int mmu
,
357 int d_u_cache
, int i_cache
)
359 uint32_t cp15_control
;
361 /* read cp15 control register */
362 arm920t_read_cp15_physical(target
, CP15PHYS_CTRL
, &cp15_control
);
363 jtag_execute_queue();
366 cp15_control
|= 0x1U
;
369 cp15_control
|= 0x4U
;
372 cp15_control
|= 0x1000U
;
374 arm920t_write_cp15_physical(target
, CP15PHYS_CTRL
, cp15_control
);
378 void arm920t_post_debug_entry(struct target
*target
)
381 struct arm920t_common
*arm920t
= target_to_arm920(target
);
383 /* examine cp15 control reg */
384 arm920t_read_cp15_physical(target
,
385 CP15PHYS_CTRL
, &arm920t
->cp15_control_reg
);
386 jtag_execute_queue();
387 LOG_DEBUG("cp15_control_reg: %8.8" PRIx32
, arm920t
->cp15_control_reg
);
389 if (arm920t
->armv4_5_mmu
.armv4_5_cache
.ctype
== -1)
391 uint32_t cache_type_reg
;
392 /* identify caches */
393 arm920t_read_cp15_physical(target
,
394 CP15PHYS_CACHETYPE
, &cache_type_reg
);
395 jtag_execute_queue();
396 armv4_5_identify_cache(cache_type_reg
,
397 &arm920t
->armv4_5_mmu
.armv4_5_cache
);
400 arm920t
->armv4_5_mmu
.mmu_enabled
=
401 (arm920t
->cp15_control_reg
& 0x1U
) ? 1 : 0;
402 arm920t
->armv4_5_mmu
.armv4_5_cache
.d_u_cache_enabled
=
403 (arm920t
->cp15_control_reg
& 0x4U
) ? 1 : 0;
404 arm920t
->armv4_5_mmu
.armv4_5_cache
.i_cache_enabled
=
405 (arm920t
->cp15_control_reg
& 0x1000U
) ? 1 : 0;
407 /* save i/d fault status and address register */
408 /* FIXME use opcode macros */
409 arm920t_read_cp15_interpreted(target
, 0xee150f10, 0x0, &arm920t
->d_fsr
);
410 arm920t_read_cp15_interpreted(target
, 0xee150f30, 0x0, &arm920t
->i_fsr
);
411 arm920t_read_cp15_interpreted(target
, 0xee160f10, 0x0, &arm920t
->d_far
);
412 arm920t_read_cp15_interpreted(target
, 0xee160f30, 0x0, &arm920t
->i_far
);
414 LOG_DEBUG("D FSR: 0x%8.8" PRIx32
", D FAR: 0x%8.8" PRIx32
415 ", I FSR: 0x%8.8" PRIx32
", I FAR: 0x%8.8" PRIx32
,
416 arm920t
->d_fsr
, arm920t
->d_far
, arm920t
->i_fsr
, arm920t
->i_far
);
418 if (arm920t
->preserve_cache
)
420 /* read-modify-write CP15 test state register
421 * to disable I/D-cache linefills */
422 arm920t_read_cp15_physical(target
,
423 CP15PHYS_TESTSTATE
, &cp15c15
);
424 jtag_execute_queue();
426 arm920t_write_cp15_physical(target
,
427 CP15PHYS_TESTSTATE
, cp15c15
);
432 void arm920t_pre_restore_context(struct target
*target
)
435 struct arm920t_common
*arm920t
= target_to_arm920(target
);
437 /* restore i/d fault status and address register */
438 arm920t_write_cp15_interpreted(target
, 0xee050f10, arm920t
->d_fsr
, 0x0);
439 arm920t_write_cp15_interpreted(target
, 0xee050f30, arm920t
->i_fsr
, 0x0);
440 arm920t_write_cp15_interpreted(target
, 0xee060f10, arm920t
->d_far
, 0x0);
441 arm920t_write_cp15_interpreted(target
, 0xee060f30, arm920t
->i_far
, 0x0);
443 /* read-modify-write CP15 test state register
444 * to reenable I/D-cache linefills */
445 if (arm920t
->preserve_cache
)
447 arm920t_read_cp15_physical(target
,
448 CP15PHYS_TESTSTATE
, &cp15c15
);
449 jtag_execute_queue();
451 arm920t_write_cp15_physical(target
,
452 CP15PHYS_TESTSTATE
, cp15c15
);
456 static const char arm920_not
[] = "target is not an ARM920";
458 static int arm920t_verify_pointer(struct command_context
*cmd_ctx
,
459 struct arm920t_common
*arm920t
)
461 if (arm920t
->common_magic
!= ARM920T_COMMON_MAGIC
) {
462 command_print(cmd_ctx
, arm920_not
);
463 return ERROR_TARGET_INVALID
;
469 /** Logs summary of ARM920 state for a halted target. */
470 int arm920t_arch_state(struct target
*target
)
472 static const char *state
[] =
474 "disabled", "enabled"
477 struct arm920t_common
*arm920t
= target_to_arm920(target
);
480 if (arm920t
->common_magic
!= ARM920T_COMMON_MAGIC
)
482 LOG_ERROR("BUG: %s", arm920_not
);
483 return ERROR_TARGET_INVALID
;
486 armv4_5
= &arm920t
->arm7_9_common
.armv4_5_common
;
488 arm_arch_state(target
);
489 LOG_USER("MMU: %s, D-Cache: %s, I-Cache: %s",
490 state
[arm920t
->armv4_5_mmu
.mmu_enabled
],
491 state
[arm920t
->armv4_5_mmu
.armv4_5_cache
.d_u_cache_enabled
],
492 state
[arm920t
->armv4_5_mmu
.armv4_5_cache
.i_cache_enabled
]);
497 static int arm920_mmu(struct target
*target
, int *enabled
)
499 if (target
->state
!= TARGET_HALTED
) {
500 LOG_ERROR("%s: target not halted", __func__
);
501 return ERROR_TARGET_INVALID
;
504 *enabled
= target_to_arm920(target
)->armv4_5_mmu
.mmu_enabled
;
508 static int arm920_virt2phys(struct target
*target
,
509 uint32_t virt
, uint32_t *phys
)
515 struct arm920t_common
*arm920t
= target_to_arm920(target
);
517 uint32_t ret
= armv4_5_mmu_translate_va(target
,
518 &arm920t
->armv4_5_mmu
, virt
, &type
, &cb
, &domain
, &ap
);
527 /** Reads a buffer, in the specified word size, with current MMU settings. */
528 int arm920t_read_memory(struct target
*target
, uint32_t address
,
529 uint32_t size
, uint32_t count
, uint8_t *buffer
)
533 retval
= arm7_9_read_memory(target
, address
, size
, count
, buffer
);
539 static int arm920t_read_phys_memory(struct target
*target
,
540 uint32_t address
, uint32_t size
,
541 uint32_t count
, uint8_t *buffer
)
543 struct arm920t_common
*arm920t
= target_to_arm920(target
);
545 return armv4_5_mmu_read_physical(target
, &arm920t
->armv4_5_mmu
,
546 address
, size
, count
, buffer
);
549 static int arm920t_write_phys_memory(struct target
*target
,
550 uint32_t address
, uint32_t size
,
551 uint32_t count
, uint8_t *buffer
)
553 struct arm920t_common
*arm920t
= target_to_arm920(target
);
555 return armv4_5_mmu_write_physical(target
, &arm920t
->armv4_5_mmu
,
556 address
, size
, count
, buffer
);
560 /** Writes a buffer, in the specified word size, with current MMU settings. */
561 int arm920t_write_memory(struct target
*target
, uint32_t address
,
562 uint32_t size
, uint32_t count
, uint8_t *buffer
)
565 const uint32_t cache_mask
= ~0x1f; /* cache line size : 32 byte */
566 struct arm920t_common
*arm920t
= target_to_arm920(target
);
568 /* FIX!!!! this should be cleaned up and made much more general. The
569 * plan is to write up and test on arm920t specifically and
570 * then generalize and clean up afterwards.
572 * Also it should be moved to the callbacks that handle breakpoints
573 * specifically and not the generic memory write fn's. See XScale code.
575 if (arm920t
->armv4_5_mmu
.mmu_enabled
&& (count
== 1) &&
576 ((size
==2) || (size
==4)))
578 /* special case the handling of single word writes to
579 * bypass MMU, to allow implementation of breakpoints
580 * in memory marked read only
590 * We need physical address and cb
592 pa
= armv4_5_mmu_translate_va(target
, &arm920t
->armv4_5_mmu
,
593 address
, &type
, &cb
, &domain
, &ap
);
597 if (arm920t
->armv4_5_mmu
.armv4_5_cache
.d_u_cache_enabled
)
601 LOG_DEBUG("D-Cache buffered, "
602 "drain write buffer");
605 * Drain write buffer - MCR p15,0,Rd,c7,c10,4
608 retval
= arm920t_write_cp15_interpreted(target
,
609 ARMV4_5_MCR(15, 0, 0, 7, 10, 4),
611 if (retval
!= ERROR_OK
)
618 * Write back memory ? -> clean cache
620 * There is no way to clean cache lines using
621 * cp15 scan chain, so copy the full cache
622 * line from cache to physical memory.
626 LOG_DEBUG("D-Cache in 'write back' mode, "
629 retval
= target_read_memory(target
,
630 address
& cache_mask
, 1,
631 sizeof(data
), &data
[0]);
632 if (retval
!= ERROR_OK
)
635 retval
= armv4_5_mmu_write_physical(target
,
636 &arm920t
->armv4_5_mmu
,
638 sizeof(data
), &data
[0]);
639 if (retval
!= ERROR_OK
)
647 * Cached ? -> Invalidate data cache using MVA
649 * MCR p15,0,Rd,c7,c6,1
651 LOG_DEBUG("D-Cache enabled, "
652 "invalidate cache line");
654 retval
= arm920t_write_cp15_interpreted(target
,
655 ARMV4_5_MCR(15, 0, 0, 7, 6, 1), 0x0,
656 address
& cache_mask
);
657 if (retval
!= ERROR_OK
)
662 /* write directly to physical memory,
663 * bypassing any read only MMU bits, etc.
665 retval
= armv4_5_mmu_write_physical(target
,
666 &arm920t
->armv4_5_mmu
, pa
, size
,
668 if (retval
!= ERROR_OK
)
672 if ((retval
= arm7_9_write_memory(target
, address
,
673 size
, count
, buffer
)) != ERROR_OK
)
677 /* If ICache is enabled, we have to invalidate affected ICache lines
678 * the DCache is forced to write-through,
679 * so we don't have to clean it here
681 if (arm920t
->armv4_5_mmu
.armv4_5_cache
.i_cache_enabled
)
685 /* invalidate ICache single entry with MVA
686 * mcr 15, 0, r0, cr7, cr5, {1}
688 LOG_DEBUG("I-Cache enabled, "
689 "invalidating affected I-Cache line");
690 retval
= arm920t_write_cp15_interpreted(target
,
691 ARMV4_5_MCR(15, 0, 0, 7, 5, 1),
692 0x0, address
& cache_mask
);
693 if (retval
!= ERROR_OK
)
699 * mcr 15, 0, r0, cr7, cr5, {0}
701 retval
= arm920t_write_cp15_interpreted(target
,
702 ARMV4_5_MCR(15, 0, 0, 7, 5, 0),
704 if (retval
!= ERROR_OK
)
713 int arm920t_soft_reset_halt(struct target
*target
)
715 int retval
= ERROR_OK
;
716 struct arm920t_common
*arm920t
= target_to_arm920(target
);
717 struct arm7_9_common
*arm7_9
= target_to_arm7_9(target
);
718 struct arm
*armv4_5
= &arm7_9
->armv4_5_common
;
719 struct reg
*dbg_stat
= &arm7_9
->eice_cache
->reg_list
[EICE_DBG_STAT
];
721 if ((retval
= target_halt(target
)) != ERROR_OK
)
726 long long then
= timeval_ms();
728 while (!(timeout
= ((timeval_ms()-then
) > 1000)))
730 if (buf_get_u32(dbg_stat
->value
, EICE_DBG_STATUS_DBGACK
, 1)
733 embeddedice_read_reg(dbg_stat
);
734 if ((retval
= jtag_execute_queue()) != ERROR_OK
)
742 if (debug_level
>= 3)
744 /* do not eat all CPU, time out after 1 se*/
753 LOG_ERROR("Failed to halt CPU after 1 sec");
754 return ERROR_TARGET_TIMEOUT
;
757 target
->state
= TARGET_HALTED
;
759 /* SVC, ARM state, IRQ and FIQ disabled */
762 cpsr
= buf_get_u32(armv4_5
->cpsr
->value
, 0, 32);
765 arm_set_cpsr(armv4_5
, cpsr
);
766 armv4_5
->cpsr
->dirty
= 1;
768 /* start fetching from 0x0 */
769 buf_set_u32(armv4_5
->pc
->value
, 0, 32, 0x0);
770 armv4_5
->pc
->dirty
= 1;
771 armv4_5
->pc
->valid
= 1;
773 arm920t_disable_mmu_caches(target
, 1, 1, 1);
774 arm920t
->armv4_5_mmu
.mmu_enabled
= 0;
775 arm920t
->armv4_5_mmu
.armv4_5_cache
.d_u_cache_enabled
= 0;
776 arm920t
->armv4_5_mmu
.armv4_5_cache
.i_cache_enabled
= 0;
778 return target_call_event_callbacks(target
, TARGET_EVENT_HALTED
);
781 /* FIXME remove forward decls */
782 static int arm920t_mrc(struct target
*target
, int cpnum
,
783 uint32_t op1
, uint32_t op2
,
784 uint32_t CRn
, uint32_t CRm
,
786 static int arm920t_mcr(struct target
*target
, int cpnum
,
787 uint32_t op1
, uint32_t op2
,
788 uint32_t CRn
, uint32_t CRm
,
791 static int arm920t_init_arch_info(struct target
*target
,
792 struct arm920t_common
*arm920t
, struct jtag_tap
*tap
)
794 struct arm7_9_common
*arm7_9
= &arm920t
->arm7_9_common
;
796 arm7_9
->armv4_5_common
.mrc
= arm920t_mrc
;
797 arm7_9
->armv4_5_common
.mcr
= arm920t_mcr
;
799 /* initialize arm7/arm9 specific info (including armv4_5) */
800 arm9tdmi_init_arch_info(target
, arm7_9
, tap
);
802 arm920t
->common_magic
= ARM920T_COMMON_MAGIC
;
804 arm7_9
->post_debug_entry
= arm920t_post_debug_entry
;
805 arm7_9
->pre_restore_context
= arm920t_pre_restore_context
;
807 arm920t
->armv4_5_mmu
.armv4_5_cache
.ctype
= -1;
808 arm920t
->armv4_5_mmu
.get_ttb
= arm920t_get_ttb
;
809 arm920t
->armv4_5_mmu
.read_memory
= arm7_9_read_memory
;
810 arm920t
->armv4_5_mmu
.write_memory
= arm7_9_write_memory
;
811 arm920t
->armv4_5_mmu
.disable_mmu_caches
= arm920t_disable_mmu_caches
;
812 arm920t
->armv4_5_mmu
.enable_mmu_caches
= arm920t_enable_mmu_caches
;
813 arm920t
->armv4_5_mmu
.has_tiny_pages
= 1;
814 arm920t
->armv4_5_mmu
.mmu_enabled
= 0;
816 /* disabling linefills leads to lockups, so keep them enabled for now
817 * this doesn't affect correctness, but might affect timing issues, if
818 * important data is evicted from the cache during the debug session
820 arm920t
->preserve_cache
= 0;
822 /* override hw single-step capability from ARM9TDMI */
823 arm7_9
->has_single_step
= 1;
828 static int arm920t_target_create(struct target
*target
, Jim_Interp
*interp
)
830 struct arm920t_common
*arm920t
;
832 arm920t
= calloc(1,sizeof(struct arm920t_common
));
833 return arm920t_init_arch_info(target
, arm920t
, target
->tap
);
836 COMMAND_HANDLER(arm920t_handle_read_cache_command
)
838 int retval
= ERROR_OK
;
839 struct target
*target
= get_current_target(CMD_CTX
);
840 struct arm920t_common
*arm920t
= target_to_arm920(target
);
841 struct arm7_9_common
*arm7_9
= target_to_arm7_9(target
);
842 struct arm
*armv4_5
= &arm7_9
->armv4_5_common
;
844 uint32_t cp15_ctrl
, cp15_ctrl_saved
;
846 uint32_t *regs_p
[16];
847 uint32_t C15_C_D_Ind
, C15_C_I_Ind
;
850 struct arm920t_cache_line d_cache
[8][64], i_cache
[8][64];
854 retval
= arm920t_verify_pointer(CMD_CTX
, arm920t
);
855 if (retval
!= ERROR_OK
)
860 command_print(CMD_CTX
, "usage: arm920t read_cache <filename>");
864 if ((output
= fopen(CMD_ARGV
[0], "w")) == NULL
)
866 LOG_DEBUG("error opening cache content file");
870 for (i
= 0; i
< 16; i
++)
871 regs_p
[i
] = ®s
[i
];
873 /* disable MMU and Caches */
874 arm920t_read_cp15_physical(target
, CP15PHYS_CTRL
, &cp15_ctrl
);
875 if ((retval
= jtag_execute_queue()) != ERROR_OK
)
879 cp15_ctrl_saved
= cp15_ctrl
;
880 cp15_ctrl
&= ~(ARMV4_5_MMU_ENABLED
881 | ARMV4_5_D_U_CACHE_ENABLED
| ARMV4_5_I_CACHE_ENABLED
);
882 arm920t_write_cp15_physical(target
, CP15PHYS_CTRL
, cp15_ctrl
);
884 /* read CP15 test state register */
885 arm920t_read_cp15_physical(target
, CP15PHYS_TESTSTATE
, &cp15c15
);
886 jtag_execute_queue();
888 /* read DCache content */
889 fprintf(output
, "DCache:\n");
891 /* go through segments 0 to nsets (8 on ARM920T, 4 on ARM922T) */
893 segment
< arm920t
->armv4_5_mmu
.armv4_5_cache
.d_u_size
.nsets
;
896 fprintf(output
, "\nsegment: %i\n----------", segment
);
898 /* Ra: r0 = SBZ(31:8):segment(7:5):SBZ(4:0) */
899 regs
[0] = 0x0 | (segment
<< 5);
900 arm9tdmi_write_core_regs(target
, 0x1, regs
);
902 /* set interpret mode */
904 arm920t_write_cp15_physical(target
,
905 CP15PHYS_TESTSTATE
, cp15c15
);
907 /* D CAM Read, loads current victim into C15.C.D.Ind */
908 arm920t_execute_cp15(target
,
909 ARMV4_5_MCR(15,2,0,15,6,2), ARMV4_5_LDR(1, 0));
911 /* read current victim */
912 arm920t_read_cp15_physical(target
,
913 CP15PHYS_DCACHE_IDX
, &C15_C_D_Ind
);
915 /* clear interpret mode */
917 arm920t_write_cp15_physical(target
,
918 CP15PHYS_TESTSTATE
, cp15c15
);
920 for (index
= 0; index
< 64; index
++)
923 * r0 = index(31:26):SBZ(25:8):segment(7:5):SBZ(4:0)
925 regs
[0] = 0x0 | (segment
<< 5) | (index
<< 26);
926 arm9tdmi_write_core_regs(target
, 0x1, regs
);
928 /* set interpret mode */
930 arm920t_write_cp15_physical(target
,
931 CP15PHYS_TESTSTATE
, cp15c15
);
933 /* Write DCache victim */
934 arm920t_execute_cp15(target
,
935 ARMV4_5_MCR(15,0,0,9,1,0), ARMV4_5_LDR(1, 0));
938 arm920t_execute_cp15(target
,
939 ARMV4_5_MCR(15,2,0,15,10,2),
940 ARMV4_5_LDMIA(0, 0x1fe, 0, 0));
943 arm920t_execute_cp15(target
,
944 ARMV4_5_MCR(15,2,0,15,6,2),
947 /* clear interpret mode */
949 arm920t_write_cp15_physical(target
,
950 CP15PHYS_TESTSTATE
, cp15c15
);
952 /* read D RAM and CAM content */
953 arm9tdmi_read_core_regs(target
, 0x3fe, regs_p
);
954 if ((retval
= jtag_execute_queue()) != ERROR_OK
)
959 d_cache
[segment
][index
].cam
= regs
[9];
962 regs
[9] &= 0xfffffffe;
963 fprintf(output
, "\nsegment: %i, index: %i, CAM: 0x%8.8"
964 PRIx32
", content (%s):\n",
965 segment
, index
, regs
[9],
966 (regs
[9] & 0x10) ? "valid" : "invalid");
968 for (i
= 1; i
< 9; i
++)
970 d_cache
[segment
][index
].data
[i
] = regs
[i
];
971 fprintf(output
, "%i: 0x%8.8" PRIx32
"\n",
977 /* Ra: r0 = index(31:26):SBZ(25:8):segment(7:5):SBZ(4:0) */
978 regs
[0] = 0x0 | (segment
<< 5) | (C15_C_D_Ind
<< 26);
979 arm9tdmi_write_core_regs(target
, 0x1, regs
);
981 /* set interpret mode */
983 arm920t_write_cp15_physical(target
,
984 CP15PHYS_TESTSTATE
, cp15c15
);
986 /* Write DCache victim */
987 arm920t_execute_cp15(target
,
988 ARMV4_5_MCR(15,0,0,9,1,0), ARMV4_5_LDR(1, 0));
990 /* clear interpret mode */
992 arm920t_write_cp15_physical(target
,
993 CP15PHYS_TESTSTATE
, cp15c15
);
996 /* read ICache content */
997 fprintf(output
, "ICache:\n");
999 /* go through segments 0 to nsets (8 on ARM920T, 4 on ARM922T) */
1001 segment
< arm920t
->armv4_5_mmu
.armv4_5_cache
.d_u_size
.nsets
;
1004 fprintf(output
, "segment: %i\n----------", segment
);
1006 /* Ra: r0 = SBZ(31:8):segment(7:5):SBZ(4:0) */
1007 regs
[0] = 0x0 | (segment
<< 5);
1008 arm9tdmi_write_core_regs(target
, 0x1, regs
);
1010 /* set interpret mode */
1012 arm920t_write_cp15_physical(target
,
1013 CP15PHYS_TESTSTATE
, cp15c15
);
1015 /* I CAM Read, loads current victim into C15.C.I.Ind */
1016 arm920t_execute_cp15(target
,
1017 ARMV4_5_MCR(15,2,0,15,5,2), ARMV4_5_LDR(1, 0));
1019 /* read current victim */
1020 arm920t_read_cp15_physical(target
, CP15PHYS_ICACHE_IDX
,
1023 /* clear interpret mode */
1025 arm920t_write_cp15_physical(target
,
1026 CP15PHYS_TESTSTATE
, cp15c15
);
1028 for (index
= 0; index
< 64; index
++)
1031 * r0 = index(31:26):SBZ(25:8):segment(7:5):SBZ(4:0)
1033 regs
[0] = 0x0 | (segment
<< 5) | (index
<< 26);
1034 arm9tdmi_write_core_regs(target
, 0x1, regs
);
1036 /* set interpret mode */
1038 arm920t_write_cp15_physical(target
,
1039 CP15PHYS_TESTSTATE
, cp15c15
);
1041 /* Write ICache victim */
1042 arm920t_execute_cp15(target
,
1043 ARMV4_5_MCR(15,0,0,9,1,1), ARMV4_5_LDR(1, 0));
1046 arm920t_execute_cp15(target
,
1047 ARMV4_5_MCR(15,2,0,15,9,2),
1048 ARMV4_5_LDMIA(0, 0x1fe, 0, 0));
1051 arm920t_execute_cp15(target
,
1052 ARMV4_5_MCR(15,2,0,15,5,2),
1055 /* clear interpret mode */
1057 arm920t_write_cp15_physical(target
,
1058 CP15PHYS_TESTSTATE
, cp15c15
);
1060 /* read I RAM and CAM content */
1061 arm9tdmi_read_core_regs(target
, 0x3fe, regs_p
);
1062 if ((retval
= jtag_execute_queue()) != ERROR_OK
)
1067 i_cache
[segment
][index
].cam
= regs
[9];
1070 regs
[9] &= 0xfffffffe;
1071 fprintf(output
, "\nsegment: %i, index: %i, "
1072 "CAM: 0x%8.8" PRIx32
", content (%s):\n",
1073 segment
, index
, regs
[9],
1074 (regs
[9] & 0x10) ? "valid" : "invalid");
1076 for (i
= 1; i
< 9; i
++)
1078 i_cache
[segment
][index
].data
[i
] = regs
[i
];
1079 fprintf(output
, "%i: 0x%8.8" PRIx32
"\n",
1084 /* Ra: r0 = index(31:26):SBZ(25:8):segment(7:5):SBZ(4:0) */
1085 regs
[0] = 0x0 | (segment
<< 5) | (C15_C_D_Ind
<< 26);
1086 arm9tdmi_write_core_regs(target
, 0x1, regs
);
1088 /* set interpret mode */
1090 arm920t_write_cp15_physical(target
,
1091 CP15PHYS_TESTSTATE
, cp15c15
);
1093 /* Write ICache victim */
1094 arm920t_execute_cp15(target
,
1095 ARMV4_5_MCR(15,0,0,9,1,1), ARMV4_5_LDR(1, 0));
1097 /* clear interpret mode */
1099 arm920t_write_cp15_physical(target
,
1100 CP15PHYS_TESTSTATE
, cp15c15
);
1103 /* restore CP15 MMU and Cache settings */
1104 arm920t_write_cp15_physical(target
, CP15PHYS_CTRL
, cp15_ctrl_saved
);
1106 command_print(CMD_CTX
, "cache content successfully output to %s",
1111 if (!is_arm_mode(armv4_5
->core_mode
))
1114 /* force writeback of the valid data */
1115 r
= armv4_5
->core_cache
->reg_list
;
1116 r
[0].dirty
= r
[0].valid
;
1117 r
[1].dirty
= r
[1].valid
;
1118 r
[2].dirty
= r
[2].valid
;
1119 r
[3].dirty
= r
[3].valid
;
1120 r
[4].dirty
= r
[4].valid
;
1121 r
[5].dirty
= r
[5].valid
;
1122 r
[6].dirty
= r
[6].valid
;
1123 r
[7].dirty
= r
[7].valid
;
1125 r
= arm_reg_current(armv4_5
, 8);
1126 r
->dirty
= r
->valid
;
1128 r
= arm_reg_current(armv4_5
, 9);
1129 r
->dirty
= r
->valid
;
1134 COMMAND_HANDLER(arm920t_handle_read_mmu_command
)
1136 int retval
= ERROR_OK
;
1137 struct target
*target
= get_current_target(CMD_CTX
);
1138 struct arm920t_common
*arm920t
= target_to_arm920(target
);
1139 struct arm7_9_common
*arm7_9
= target_to_arm7_9(target
);
1140 struct arm
*armv4_5
= &arm7_9
->armv4_5_common
;
1142 uint32_t cp15_ctrl
, cp15_ctrl_saved
;
1144 uint32_t *regs_p
[16];
1147 uint32_t Dlockdown
, Ilockdown
;
1148 struct arm920t_tlb_entry d_tlb
[64], i_tlb
[64];
1152 retval
= arm920t_verify_pointer(CMD_CTX
, arm920t
);
1153 if (retval
!= ERROR_OK
)
1158 command_print(CMD_CTX
, "usage: arm920t read_mmu <filename>");
1162 if ((output
= fopen(CMD_ARGV
[0], "w")) == NULL
)
1164 LOG_DEBUG("error opening mmu content file");
1168 for (i
= 0; i
< 16; i
++)
1169 regs_p
[i
] = ®s
[i
];
1171 /* disable MMU and Caches */
1172 arm920t_read_cp15_physical(target
, CP15PHYS_CTRL
, &cp15_ctrl
);
1173 if ((retval
= jtag_execute_queue()) != ERROR_OK
)
1177 cp15_ctrl_saved
= cp15_ctrl
;
1178 cp15_ctrl
&= ~(ARMV4_5_MMU_ENABLED
1179 | ARMV4_5_D_U_CACHE_ENABLED
| ARMV4_5_I_CACHE_ENABLED
);
1180 arm920t_write_cp15_physical(target
, CP15PHYS_CTRL
, cp15_ctrl
);
1182 /* read CP15 test state register */
1183 arm920t_read_cp15_physical(target
, CP15PHYS_TESTSTATE
, &cp15c15
);
1184 if ((retval
= jtag_execute_queue()) != ERROR_OK
)
1189 /* prepare reading D TLB content
1192 /* set interpret mode */
1194 arm920t_write_cp15_physical(target
, CP15PHYS_TESTSTATE
, cp15c15
);
1196 /* Read D TLB lockdown */
1197 arm920t_execute_cp15(target
,
1198 ARMV4_5_MRC(15,0,0,10,0,0), ARMV4_5_LDR(1, 0));
1200 /* clear interpret mode */
1202 arm920t_write_cp15_physical(target
, CP15PHYS_TESTSTATE
, cp15c15
);
1204 /* read D TLB lockdown stored to r1 */
1205 arm9tdmi_read_core_regs(target
, 0x2, regs_p
);
1206 if ((retval
= jtag_execute_queue()) != ERROR_OK
)
1210 Dlockdown
= regs
[1];
1212 for (victim
= 0; victim
< 64; victim
+= 8)
1214 /* new lockdown value: base[31:26]:victim[25:20]:SBZ[19:1]:p[0]
1215 * base remains unchanged, victim goes through entries 0 to 63
1217 regs
[1] = (Dlockdown
& 0xfc000000) | (victim
<< 20);
1218 arm9tdmi_write_core_regs(target
, 0x2, regs
);
1220 /* set interpret mode */
1222 arm920t_write_cp15_physical(target
,
1223 CP15PHYS_TESTSTATE
, cp15c15
);
1225 /* Write D TLB lockdown */
1226 arm920t_execute_cp15(target
,
1227 ARMV4_5_MCR(15,0,0,10,0,0),
1230 /* Read D TLB CAM */
1231 arm920t_execute_cp15(target
,
1232 ARMV4_5_MCR(15,4,0,15,6,4),
1233 ARMV4_5_LDMIA(0, 0x3fc, 0, 0));
1235 /* clear interpret mode */
1237 arm920t_write_cp15_physical(target
,
1238 CP15PHYS_TESTSTATE
, cp15c15
);
1240 /* read D TLB CAM content stored to r2-r9 */
1241 arm9tdmi_read_core_regs(target
, 0x3fc, regs_p
);
1242 if ((retval
= jtag_execute_queue()) != ERROR_OK
)
1247 for (i
= 0; i
< 8; i
++)
1248 d_tlb
[victim
+ i
].cam
= regs
[i
+ 2];
1251 for (victim
= 0; victim
< 64; victim
++)
1253 /* new lockdown value: base[31:26]:victim[25:20]:SBZ[19:1]:p[0]
1254 * base remains unchanged, victim goes through entries 0 to 63
1256 regs
[1] = (Dlockdown
& 0xfc000000) | (victim
<< 20);
1257 arm9tdmi_write_core_regs(target
, 0x2, regs
);
1259 /* set interpret mode */
1261 arm920t_write_cp15_physical(target
,
1262 CP15PHYS_TESTSTATE
, cp15c15
);
1264 /* Write D TLB lockdown */
1265 arm920t_execute_cp15(target
,
1266 ARMV4_5_MCR(15,0,0,10,0,0), ARMV4_5_STR(1, 0));
1268 /* Read D TLB RAM1 */
1269 arm920t_execute_cp15(target
,
1270 ARMV4_5_MCR(15,4,0,15,10,4), ARMV4_5_LDR(2,0));
1272 /* Read D TLB RAM2 */
1273 arm920t_execute_cp15(target
,
1274 ARMV4_5_MCR(15,4,0,15,2,5), ARMV4_5_LDR(3,0));
1276 /* clear interpret mode */
1278 arm920t_write_cp15_physical(target
,
1279 CP15PHYS_TESTSTATE
, cp15c15
);
1281 /* read D TLB RAM content stored to r2 and r3 */
1282 arm9tdmi_read_core_regs(target
, 0xc, regs_p
);
1283 if ((retval
= jtag_execute_queue()) != ERROR_OK
)
1288 d_tlb
[victim
].ram1
= regs
[2];
1289 d_tlb
[victim
].ram2
= regs
[3];
1292 /* restore D TLB lockdown */
1293 regs
[1] = Dlockdown
;
1294 arm9tdmi_write_core_regs(target
, 0x2, regs
);
1296 /* Write D TLB lockdown */
1297 arm920t_execute_cp15(target
,
1298 ARMV4_5_MCR(15,0,0,10,0,0), ARMV4_5_STR(1, 0));
1300 /* prepare reading I TLB content
1303 /* set interpret mode */
1305 arm920t_write_cp15_physical(target
, CP15PHYS_TESTSTATE
, cp15c15
);
1307 /* Read I TLB lockdown */
1308 arm920t_execute_cp15(target
,
1309 ARMV4_5_MRC(15,0,0,10,0,1), ARMV4_5_LDR(1, 0));
1311 /* clear interpret mode */
1313 arm920t_write_cp15_physical(target
, CP15PHYS_TESTSTATE
, cp15c15
);
1315 /* read I TLB lockdown stored to r1 */
1316 arm9tdmi_read_core_regs(target
, 0x2, regs_p
);
1317 if ((retval
= jtag_execute_queue()) != ERROR_OK
)
1321 Ilockdown
= regs
[1];
1323 for (victim
= 0; victim
< 64; victim
+= 8)
1325 /* new lockdown value: base[31:26]:victim[25:20]:SBZ[19:1]:p[0]
1326 * base remains unchanged, victim goes through entries 0 to 63
1328 regs
[1] = (Ilockdown
& 0xfc000000) | (victim
<< 20);
1329 arm9tdmi_write_core_regs(target
, 0x2, regs
);
1331 /* set interpret mode */
1333 arm920t_write_cp15_physical(target
,
1334 CP15PHYS_TESTSTATE
, cp15c15
);
1336 /* Write I TLB lockdown */
1337 arm920t_execute_cp15(target
,
1338 ARMV4_5_MCR(15,0,0,10,0,1),
1341 /* Read I TLB CAM */
1342 arm920t_execute_cp15(target
,
1343 ARMV4_5_MCR(15,4,0,15,5,4),
1344 ARMV4_5_LDMIA(0, 0x3fc, 0, 0));
1346 /* clear interpret mode */
1348 arm920t_write_cp15_physical(target
,
1349 CP15PHYS_TESTSTATE
, cp15c15
);
1351 /* read I TLB CAM content stored to r2-r9 */
1352 arm9tdmi_read_core_regs(target
, 0x3fc, regs_p
);
1353 if ((retval
= jtag_execute_queue()) != ERROR_OK
)
1358 for (i
= 0; i
< 8; i
++)
1359 i_tlb
[i
+ victim
].cam
= regs
[i
+ 2];
1362 for (victim
= 0; victim
< 64; victim
++)
1364 /* new lockdown value: base[31:26]:victim[25:20]:SBZ[19:1]:p[0]
1365 * base remains unchanged, victim goes through entries 0 to 63
1367 regs
[1] = (Dlockdown
& 0xfc000000) | (victim
<< 20);
1368 arm9tdmi_write_core_regs(target
, 0x2, regs
);
1370 /* set interpret mode */
1372 arm920t_write_cp15_physical(target
,
1373 CP15PHYS_TESTSTATE
, cp15c15
);
1375 /* Write I TLB lockdown */
1376 arm920t_execute_cp15(target
,
1377 ARMV4_5_MCR(15,0,0,10,0,1), ARMV4_5_STR(1, 0));
1379 /* Read I TLB RAM1 */
1380 arm920t_execute_cp15(target
,
1381 ARMV4_5_MCR(15,4,0,15,9,4), ARMV4_5_LDR(2,0));
1383 /* Read I TLB RAM2 */
1384 arm920t_execute_cp15(target
,
1385 ARMV4_5_MCR(15,4,0,15,1,5), ARMV4_5_LDR(3,0));
1387 /* clear interpret mode */
1389 arm920t_write_cp15_physical(target
,
1390 CP15PHYS_TESTSTATE
, cp15c15
);
1392 /* read I TLB RAM content stored to r2 and r3 */
1393 arm9tdmi_read_core_regs(target
, 0xc, regs_p
);
1394 if ((retval
= jtag_execute_queue()) != ERROR_OK
)
1399 i_tlb
[victim
].ram1
= regs
[2];
1400 i_tlb
[victim
].ram2
= regs
[3];
1403 /* restore I TLB lockdown */
1404 regs
[1] = Ilockdown
;
1405 arm9tdmi_write_core_regs(target
, 0x2, regs
);
1407 /* Write I TLB lockdown */
1408 arm920t_execute_cp15(target
,
1409 ARMV4_5_MCR(15,0,0,10,0,1), ARMV4_5_STR(1, 0));
1411 /* restore CP15 MMU and Cache settings */
1412 arm920t_write_cp15_physical(target
, CP15PHYS_CTRL
, cp15_ctrl_saved
);
1414 /* output data to file */
1415 fprintf(output
, "D TLB content:\n");
1416 for (i
= 0; i
< 64; i
++)
1418 fprintf(output
, "%i: 0x%8.8" PRIx32
" 0x%8.8" PRIx32
1419 " 0x%8.8" PRIx32
" %s\n",
1420 i
, d_tlb
[i
].cam
, d_tlb
[i
].ram1
, d_tlb
[i
].ram2
,
1421 (d_tlb
[i
].cam
& 0x20) ? "(valid)" : "(invalid)");
1424 fprintf(output
, "\n\nI TLB content:\n");
1425 for (i
= 0; i
< 64; i
++)
1427 fprintf(output
, "%i: 0x%8.8" PRIx32
" 0x%8.8" PRIx32
1428 " 0x%8.8" PRIx32
" %s\n",
1429 i
, i_tlb
[i
].cam
, i_tlb
[i
].ram1
, i_tlb
[i
].ram2
,
1430 (i_tlb
[i
].cam
& 0x20) ? "(valid)" : "(invalid)");
1433 command_print(CMD_CTX
, "mmu content successfully output to %s",
1438 if (!is_arm_mode(armv4_5
->core_mode
))
1441 /* force writeback of the valid data */
1442 r
= armv4_5
->core_cache
->reg_list
;
1443 r
[0].dirty
= r
[0].valid
;
1444 r
[1].dirty
= r
[1].valid
;
1445 r
[2].dirty
= r
[2].valid
;
1446 r
[3].dirty
= r
[3].valid
;
1447 r
[4].dirty
= r
[4].valid
;
1448 r
[5].dirty
= r
[5].valid
;
1449 r
[6].dirty
= r
[6].valid
;
1450 r
[7].dirty
= r
[7].valid
;
1452 r
= arm_reg_current(armv4_5
, 8);
1453 r
->dirty
= r
->valid
;
1455 r
= arm_reg_current(armv4_5
, 9);
1456 r
->dirty
= r
->valid
;
1461 COMMAND_HANDLER(arm920t_handle_cp15_command
)
1464 struct target
*target
= get_current_target(CMD_CTX
);
1465 struct arm920t_common
*arm920t
= target_to_arm920(target
);
1467 retval
= arm920t_verify_pointer(CMD_CTX
, arm920t
);
1468 if (retval
!= ERROR_OK
)
1471 if (target
->state
!= TARGET_HALTED
)
1473 command_print(CMD_CTX
, "target must be stopped for "
1474 "\"%s\" command", CMD_NAME
);
1478 /* one argument, read a register.
1479 * two arguments, write it.
1484 COMMAND_PARSE_NUMBER(int, CMD_ARGV
[0], address
);
1489 if ((retval
= arm920t_read_cp15_physical(target
,
1490 address
, &value
)) != ERROR_OK
)
1492 command_print(CMD_CTX
,
1493 "couldn't access reg %i", address
);
1496 if ((retval
= jtag_execute_queue()) != ERROR_OK
)
1501 command_print(CMD_CTX
, "%i: %8.8" PRIx32
,
1504 else if (CMD_ARGC
== 2)
1507 COMMAND_PARSE_NUMBER(u32
, CMD_ARGV
[1], value
);
1508 retval
= arm920t_write_cp15_physical(target
,
1510 if (retval
!= ERROR_OK
)
1512 command_print(CMD_CTX
,
1513 "couldn't access reg %i", address
);
1514 /* REVISIT why lie? "return retval"? */
1517 command_print(CMD_CTX
, "%i: %8.8" PRIx32
,
1525 COMMAND_HANDLER(arm920t_handle_cp15i_command
)
1528 struct target
*target
= get_current_target(CMD_CTX
);
1529 struct arm920t_common
*arm920t
= target_to_arm920(target
);
1531 retval
= arm920t_verify_pointer(CMD_CTX
, arm920t
);
1532 if (retval
!= ERROR_OK
)
1536 if (target
->state
!= TARGET_HALTED
)
1538 command_print(CMD_CTX
, "target must be stopped for "
1539 "\"%s\" command", CMD_NAME
);
1543 /* one argument, read a register.
1544 * two arguments, write it.
1549 COMMAND_PARSE_NUMBER(u32
, CMD_ARGV
[0], opcode
);
1554 retval
= arm920t_read_cp15_interpreted(target
,
1555 opcode
, 0x0, &value
);
1556 if (retval
!= ERROR_OK
)
1558 command_print(CMD_CTX
,
1559 "couldn't execute %8.8" PRIx32
,
1561 /* REVISIT why lie? "return retval"? */
1565 command_print(CMD_CTX
, "%8.8" PRIx32
": %8.8" PRIx32
,
1568 else if (CMD_ARGC
== 2)
1571 COMMAND_PARSE_NUMBER(u32
, CMD_ARGV
[1], value
);
1572 retval
= arm920t_write_cp15_interpreted(target
,
1574 if (retval
!= ERROR_OK
)
1576 command_print(CMD_CTX
,
1577 "couldn't execute %8.8" PRIx32
,
1579 /* REVISIT why lie? "return retval"? */
1582 command_print(CMD_CTX
, "%8.8" PRIx32
": %8.8" PRIx32
,
1585 else if (CMD_ARGC
== 3)
1588 COMMAND_PARSE_NUMBER(u32
, CMD_ARGV
[1], value
);
1590 COMMAND_PARSE_NUMBER(u32
, CMD_ARGV
[2], address
);
1591 retval
= arm920t_write_cp15_interpreted(target
,
1592 opcode
, value
, address
);
1593 if (retval
!= ERROR_OK
)
1595 command_print(CMD_CTX
,
1596 "couldn't execute %8.8" PRIx32
, opcode
);
1597 /* REVISIT why lie? "return retval"? */
1600 command_print(CMD_CTX
, "%8.8" PRIx32
": %8.8" PRIx32
1601 " %8.8" PRIx32
, opcode
, value
, address
);
1606 command_print(CMD_CTX
,
1607 "usage: arm920t cp15i <opcode> [value] [address]");
1613 COMMAND_HANDLER(arm920t_handle_cache_info_command
)
1616 struct target
*target
= get_current_target(CMD_CTX
);
1617 struct arm920t_common
*arm920t
= target_to_arm920(target
);
1619 retval
= arm920t_verify_pointer(CMD_CTX
, arm920t
);
1620 if (retval
!= ERROR_OK
)
1623 return armv4_5_handle_cache_info_command(CMD_CTX
,
1624 &arm920t
->armv4_5_mmu
.armv4_5_cache
);
1628 static int arm920t_mrc(struct target
*target
, int cpnum
,
1629 uint32_t op1
, uint32_t op2
,
1630 uint32_t CRn
, uint32_t CRm
,
1635 LOG_ERROR("Only cp15 is supported");
1640 return arm920t_read_cp15_interpreted(target
,
1641 ARMV4_5_MRC(cpnum
, op1
, 0, CRn
, CRm
, op2
),
1645 static int arm920t_mcr(struct target
*target
, int cpnum
,
1646 uint32_t op1
, uint32_t op2
,
1647 uint32_t CRn
, uint32_t CRm
,
1652 LOG_ERROR("Only cp15 is supported");
1656 /* write "from" r0 */
1657 return arm920t_write_cp15_interpreted(target
,
1658 ARMV4_5_MCR(cpnum
, op1
, 0, CRn
, CRm
, op2
),
1662 static const struct command_registration arm920t_exec_command_handlers
[] = {
1665 .handler
= arm920t_handle_cp15_command
,
1666 .mode
= COMMAND_EXEC
,
1667 .help
= "display/modify cp15 register",
1668 .usage
= "regnum [value]",
1672 .handler
= arm920t_handle_cp15i_command
,
1673 .mode
= COMMAND_EXEC
,
1674 /* prefer using less error-prone "arm mcr" or "arm mrc" */
1675 .help
= "display/modify cp15 register using ARM opcode"
1677 .usage
= "instruction [value [address]]",
1680 .name
= "cache_info",
1681 .handler
= arm920t_handle_cache_info_command
,
1682 .mode
= COMMAND_EXEC
,
1683 .help
= "display information about target caches",
1686 .name
= "read_cache",
1687 .handler
= arm920t_handle_read_cache_command
,
1688 .mode
= COMMAND_EXEC
,
1689 .help
= "dump I/D cache content to file",
1690 .usage
= "filename",
1694 .handler
= arm920t_handle_read_mmu_command
,
1695 .mode
= COMMAND_EXEC
,
1696 .help
= "dump I/D mmu content to file",
1697 .usage
= "filename",
1699 COMMAND_REGISTRATION_DONE
1701 const struct command_registration arm920t_command_handlers
[] = {
1703 .chain
= arm9tdmi_command_handlers
,
1707 .mode
= COMMAND_ANY
,
1708 .help
= "arm920t command group",
1709 .chain
= arm920t_exec_command_handlers
,
1711 COMMAND_REGISTRATION_DONE
1714 /** Holds methods for ARM920 targets. */
1715 struct target_type arm920t_target
=
1719 .poll
= arm7_9_poll
,
1720 .arch_state
= arm920t_arch_state
,
1722 .target_request_data
= arm7_9_target_request_data
,
1724 .halt
= arm7_9_halt
,
1725 .resume
= arm7_9_resume
,
1726 .step
= arm7_9_step
,
1728 .assert_reset
= arm7_9_assert_reset
,
1729 .deassert_reset
= arm7_9_deassert_reset
,
1730 .soft_reset_halt
= arm920t_soft_reset_halt
,
1732 .get_gdb_reg_list
= arm_get_gdb_reg_list
,
1734 .read_memory
= arm920t_read_memory
,
1735 .write_memory
= arm920t_write_memory
,
1736 .read_phys_memory
= arm920t_read_phys_memory
,
1737 .write_phys_memory
= arm920t_write_phys_memory
,
1739 .virt2phys
= arm920_virt2phys
,
1741 .bulk_write_memory
= arm7_9_bulk_write_memory
,
1743 .checksum_memory
= arm_checksum_memory
,
1744 .blank_check_memory
= arm_blank_check_memory
,
1746 .run_algorithm
= armv4_5_run_algorithm
,
1748 .add_breakpoint
= arm7_9_add_breakpoint
,
1749 .remove_breakpoint
= arm7_9_remove_breakpoint
,
1750 .add_watchpoint
= arm7_9_add_watchpoint
,
1751 .remove_watchpoint
= arm7_9_remove_watchpoint
,
1753 .commands
= arm920t_command_handlers
,
1754 .target_create
= arm920t_target_create
,
1755 .init_target
= arm9tdmi_init_target
,
1756 .examine
= arm7_9_examine
,
1757 .check_reset
= arm7_9_check_reset
,
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)