1 /***************************************************************************
2 * Copyright (C) 2008 digenius technology GmbH. *
5 * Copyright (C) 2008 Oyvind Harboe oyvind.harboe@zylin.com *
7 * Copyright (C) 2008 Georg Acher <acher@in.tum.de> *
9 * This program is free software; you can redistribute it and/or modify *
10 * it under the terms of the GNU General Public License as published by *
11 * the Free Software Foundation; either version 2 of the License, or *
12 * (at your option) any later version. *
14 * This program is distributed in the hope that it will be useful, *
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
17 * GNU General Public License for more details. *
19 * You should have received a copy of the GNU General Public License *
20 * along with this program; if not, write to the *
21 * Free Software Foundation, Inc., *
22 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
23 ***************************************************************************/
31 #include "arm_simulator.h"
32 #include "target_type.h"
36 #define _DEBUG_INSTRUCTION_EXECUTION_
40 #define FNC_INFO LOG_DEBUG("-")
46 #define FNC_INFO_NOTIMPLEMENTED do { LOG_DEBUG("NOT IMPLEMENTED"); /*exit(-1);*/ } while (0)
48 #define FNC_INFO_NOTIMPLEMENTED
51 static int arm11_on_enter_debug_state(arm11_common_t
* arm11
);
53 bool arm11_config_memwrite_burst
= true;
54 bool arm11_config_memwrite_error_fatal
= true;
55 uint32_t arm11_vcr
= 0;
56 bool arm11_config_memrw_no_increment
= false;
57 bool arm11_config_step_irq_enable
= false;
59 #define ARM11_HANDLER(x) \
62 target_type_t arm11_target
=
67 ARM11_HANDLER(arch_state
),
69 ARM11_HANDLER(target_request_data
),
72 ARM11_HANDLER(resume
),
75 ARM11_HANDLER(assert_reset
),
76 ARM11_HANDLER(deassert_reset
),
77 ARM11_HANDLER(soft_reset_halt
),
79 ARM11_HANDLER(get_gdb_reg_list
),
81 ARM11_HANDLER(read_memory
),
82 ARM11_HANDLER(write_memory
),
84 ARM11_HANDLER(bulk_write_memory
),
86 ARM11_HANDLER(checksum_memory
),
88 ARM11_HANDLER(add_breakpoint
),
89 ARM11_HANDLER(remove_breakpoint
),
90 ARM11_HANDLER(add_watchpoint
),
91 ARM11_HANDLER(remove_watchpoint
),
93 ARM11_HANDLER(run_algorithm
),
95 ARM11_HANDLER(register_commands
),
96 ARM11_HANDLER(target_create
),
97 ARM11_HANDLER(init_target
),
98 ARM11_HANDLER(examine
),
102 int arm11_regs_arch_type
= -1;
120 ARM11_REGISTER_SPSR_FIQ
,
121 ARM11_REGISTER_SPSR_SVC
,
122 ARM11_REGISTER_SPSR_ABT
,
123 ARM11_REGISTER_SPSR_IRQ
,
124 ARM11_REGISTER_SPSR_UND
,
125 ARM11_REGISTER_SPSR_MON
,
134 typedef struct arm11_reg_defs_s
139 enum arm11_regtype type
;
142 /* update arm11_regcache_ids when changing this */
143 static const arm11_reg_defs_t arm11_reg_defs
[] =
145 {"r0", 0, 0, ARM11_REGISTER_CORE
},
146 {"r1", 1, 1, ARM11_REGISTER_CORE
},
147 {"r2", 2, 2, ARM11_REGISTER_CORE
},
148 {"r3", 3, 3, ARM11_REGISTER_CORE
},
149 {"r4", 4, 4, ARM11_REGISTER_CORE
},
150 {"r5", 5, 5, ARM11_REGISTER_CORE
},
151 {"r6", 6, 6, ARM11_REGISTER_CORE
},
152 {"r7", 7, 7, ARM11_REGISTER_CORE
},
153 {"r8", 8, 8, ARM11_REGISTER_CORE
},
154 {"r9", 9, 9, ARM11_REGISTER_CORE
},
155 {"r10", 10, 10, ARM11_REGISTER_CORE
},
156 {"r11", 11, 11, ARM11_REGISTER_CORE
},
157 {"r12", 12, 12, ARM11_REGISTER_CORE
},
158 {"sp", 13, 13, ARM11_REGISTER_CORE
},
159 {"lr", 14, 14, ARM11_REGISTER_CORE
},
160 {"pc", 15, 15, ARM11_REGISTER_CORE
},
162 #if ARM11_REGCACHE_FREGS
163 {"f0", 0, 16, ARM11_REGISTER_FX
},
164 {"f1", 1, 17, ARM11_REGISTER_FX
},
165 {"f2", 2, 18, ARM11_REGISTER_FX
},
166 {"f3", 3, 19, ARM11_REGISTER_FX
},
167 {"f4", 4, 20, ARM11_REGISTER_FX
},
168 {"f5", 5, 21, ARM11_REGISTER_FX
},
169 {"f6", 6, 22, ARM11_REGISTER_FX
},
170 {"f7", 7, 23, ARM11_REGISTER_FX
},
171 {"fps", 0, 24, ARM11_REGISTER_FPS
},
174 {"cpsr", 0, 25, ARM11_REGISTER_CPSR
},
176 #if ARM11_REGCACHE_MODEREGS
177 {"r8_fiq", 8, -1, ARM11_REGISTER_FIQ
},
178 {"r9_fiq", 9, -1, ARM11_REGISTER_FIQ
},
179 {"r10_fiq", 10, -1, ARM11_REGISTER_FIQ
},
180 {"r11_fiq", 11, -1, ARM11_REGISTER_FIQ
},
181 {"r12_fiq", 12, -1, ARM11_REGISTER_FIQ
},
182 {"r13_fiq", 13, -1, ARM11_REGISTER_FIQ
},
183 {"r14_fiq", 14, -1, ARM11_REGISTER_FIQ
},
184 {"spsr_fiq", 0, -1, ARM11_REGISTER_SPSR_FIQ
},
186 {"r13_svc", 13, -1, ARM11_REGISTER_SVC
},
187 {"r14_svc", 14, -1, ARM11_REGISTER_SVC
},
188 {"spsr_svc", 0, -1, ARM11_REGISTER_SPSR_SVC
},
190 {"r13_abt", 13, -1, ARM11_REGISTER_ABT
},
191 {"r14_abt", 14, -1, ARM11_REGISTER_ABT
},
192 {"spsr_abt", 0, -1, ARM11_REGISTER_SPSR_ABT
},
194 {"r13_irq", 13, -1, ARM11_REGISTER_IRQ
},
195 {"r14_irq", 14, -1, ARM11_REGISTER_IRQ
},
196 {"spsr_irq", 0, -1, ARM11_REGISTER_SPSR_IRQ
},
198 {"r13_und", 13, -1, ARM11_REGISTER_UND
},
199 {"r14_und", 14, -1, ARM11_REGISTER_UND
},
200 {"spsr_und", 0, -1, ARM11_REGISTER_SPSR_UND
},
203 {"r13_mon", 13, -1, ARM11_REGISTER_MON
},
204 {"r14_mon", 14, -1, ARM11_REGISTER_MON
},
205 {"spsr_mon", 0, -1, ARM11_REGISTER_SPSR_MON
},
208 /* Debug Registers */
209 {"dscr", 0, -1, ARM11_REGISTER_DSCR
},
210 {"wdtr", 0, -1, ARM11_REGISTER_WDTR
},
211 {"rdtr", 0, -1, ARM11_REGISTER_RDTR
},
214 enum arm11_regcache_ids
217 ARM11_RC_RX
= ARM11_RC_R0
,
232 ARM11_RC_SP
= ARM11_RC_R13
,
234 ARM11_RC_LR
= ARM11_RC_R14
,
236 ARM11_RC_PC
= ARM11_RC_R15
,
238 #if ARM11_REGCACHE_FREGS
240 ARM11_RC_FX
= ARM11_RC_F0
,
253 #if ARM11_REGCACHE_MODEREGS
291 #define ARM11_GDB_REGISTER_COUNT 26
293 uint8_t arm11_gdb_dummy_fp_value
[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
295 reg_t arm11_gdb_dummy_fp_reg
=
297 "GDB dummy floating-point register", arm11_gdb_dummy_fp_value
, 0, 1, 96, NULL
, 0, NULL
, 0
300 uint8_t arm11_gdb_dummy_fps_value
[] = {0, 0, 0, 0};
302 reg_t arm11_gdb_dummy_fps_reg
=
304 "GDB dummy floating-point status register", arm11_gdb_dummy_fps_value
, 0, 1, 32, NULL
, 0, NULL
, 0
309 /** Check and if necessary take control of the system
311 * \param arm11 Target state variable.
312 * \param dscr If the current DSCR content is
313 * available a pointer to a word holding the
314 * DSCR can be passed. Otherwise use NULL.
316 int arm11_check_init(arm11_common_t
* arm11
, uint32_t * dscr
)
320 uint32_t dscr_local_tmp_copy
;
324 dscr
= &dscr_local_tmp_copy
;
326 CHECK_RETVAL(arm11_read_DSCR(arm11
, dscr
));
329 if (!(*dscr
& ARM11_DSCR_MODE_SELECT
))
331 LOG_DEBUG("Bringing target into debug mode");
333 *dscr
|= ARM11_DSCR_MODE_SELECT
; /* Halt debug-mode */
334 arm11_write_DSCR(arm11
, *dscr
);
336 /* add further reset initialization here */
338 arm11
->simulate_reset_on_next_halt
= true;
340 if (*dscr
& ARM11_DSCR_CORE_HALTED
)
342 /** \todo TODO: this needs further scrutiny because
343 * arm11_on_enter_debug_state() never gets properly called.
344 * As a result we don't read the actual register states from
348 arm11
->target
->state
= TARGET_HALTED
;
349 arm11
->target
->debug_reason
= arm11_get_DSCR_debug_reason(*dscr
);
353 arm11
->target
->state
= TARGET_RUNNING
;
354 arm11
->target
->debug_reason
= DBG_REASON_NOTHALTED
;
357 arm11_sc7_clear_vbw(arm11
);
366 (arm11->reg_values[ARM11_RC_##x])
368 /** Save processor state.
370 * This is called when the HALT instruction has succeeded
371 * or on other occasions that stop the processor.
374 static int arm11_on_enter_debug_state(arm11_common_t
* arm11
)
378 for (size_t i
= 0; i
< asizeof(arm11
->reg_values
); i
++)
380 arm11
->reg_list
[i
].valid
= 1;
381 arm11
->reg_list
[i
].dirty
= 0;
385 CHECK_RETVAL(arm11_read_DSCR(arm11
, &R(DSCR
)));
389 if (R(DSCR
) & ARM11_DSCR_WDTR_FULL
)
391 arm11_add_debug_SCAN_N(arm11
, 0x05, ARM11_TAP_DEFAULT
);
393 arm11_add_IR(arm11
, ARM11_INTEST
, ARM11_TAP_DEFAULT
);
395 scan_field_t chain5_fields
[3];
397 arm11_setup_field(arm11
, 32, NULL
, &R(WDTR
), chain5_fields
+ 0);
398 arm11_setup_field(arm11
, 1, NULL
, NULL
, chain5_fields
+ 1);
399 arm11_setup_field(arm11
, 1, NULL
, NULL
, chain5_fields
+ 2);
401 arm11_add_dr_scan_vc(asizeof(chain5_fields
), chain5_fields
, TAP_DRPAUSE
);
405 arm11
->reg_list
[ARM11_RC_WDTR
].valid
= 0;
409 /* DSCR: set ARM11_DSCR_EXECUTE_ARM_INSTRUCTION_ENABLE */
410 /* ARM1176 spec says this is needed only for wDTR/rDTR's "ITR mode", but not to issue ITRs
411 ARM1136 seems to require this to issue ITR's as well */
413 uint32_t new_dscr
= R(DSCR
) | ARM11_DSCR_EXECUTE_ARM_INSTRUCTION_ENABLE
;
415 /* this executes JTAG queue: */
417 arm11_write_DSCR(arm11
, new_dscr
);
421 Before executing any instruction in debug state you have to drain the write buffer.
422 This ensures that no imprecise Data Aborts can return at a later point:*/
424 /** \todo TODO: Test drain write buffer. */
429 /* MRC p14,0,R0,c5,c10,0 */
430 // arm11_run_instr_no_data1(arm11, /*0xee150e1a*/0xe320f000);
432 /* mcr 15, 0, r0, cr7, cr10, {4} */
433 arm11_run_instr_no_data1(arm11
, 0xee070f9a);
435 uint32_t dscr
= arm11_read_DSCR(arm11
);
437 LOG_DEBUG("DRAIN, DSCR %08x", dscr
);
439 if (dscr
& ARM11_DSCR_STICKY_IMPRECISE_DATA_ABORT
)
441 arm11_run_instr_no_data1(arm11
, 0xe320f000);
443 dscr
= arm11_read_DSCR(arm11
);
445 LOG_DEBUG("DRAIN, DSCR %08x (DONE)", dscr
);
452 arm11_run_instr_data_prepare(arm11
);
456 /** \todo TODO: handle other mode registers */
458 for (size_t i
= 0; i
< 15; i
++)
460 /* MCR p14,0,R?,c0,c5,0 */
461 arm11_run_instr_data_from_core(arm11
, 0xEE000E15 | (i
<< 12), &R(RX
+ i
), 1);
466 /* check rDTRfull in DSCR */
468 if (R(DSCR
) & ARM11_DSCR_RDTR_FULL
)
470 /* MRC p14,0,R0,c0,c5,0 (move rDTR -> r0 (-> wDTR -> local var)) */
471 arm11_run_instr_data_from_core_via_r0(arm11
, 0xEE100E15, &R(RDTR
));
475 arm11
->reg_list
[ARM11_RC_RDTR
].valid
= 0;
480 /* MRS r0,CPSR (move CPSR -> r0 (-> wDTR -> local var)) */
481 arm11_run_instr_data_from_core_via_r0(arm11
, 0xE10F0000, &R(CPSR
));
485 /* MOV R0,PC (move PC -> r0 (-> wDTR -> local var)) */
486 arm11_run_instr_data_from_core_via_r0(arm11
, 0xE1A0000F, &R(PC
));
488 /* adjust PC depending on ARM state */
490 if (R(CPSR
) & ARM11_CPSR_J
) /* Java state */
492 arm11
->reg_values
[ARM11_RC_PC
] -= 0;
494 else if (R(CPSR
) & ARM11_CPSR_T
) /* Thumb state */
496 arm11
->reg_values
[ARM11_RC_PC
] -= 4;
500 arm11
->reg_values
[ARM11_RC_PC
] -= 8;
503 if (arm11
->simulate_reset_on_next_halt
)
505 arm11
->simulate_reset_on_next_halt
= false;
507 LOG_DEBUG("Reset c1 Control Register");
509 /* Write 0 (reset value) to Control register 0 to disable MMU/Cache etc. */
511 /* MCR p15,0,R0,c1,c0,0 */
512 arm11_run_instr_data_to_core_via_r0(arm11
, 0xee010f10, 0);
516 arm11_run_instr_data_finish(arm11
);
518 arm11_dump_reg_changes(arm11
);
523 void arm11_dump_reg_changes(arm11_common_t
* arm11
)
526 if (!(debug_level
>= LOG_LVL_DEBUG
))
531 for (size_t i
= 0; i
< ARM11_REGCACHE_COUNT
; i
++)
533 if (!arm11
->reg_list
[i
].valid
)
535 if (arm11
->reg_history
[i
].valid
)
536 LOG_DEBUG("%8s INVALID (%08" PRIx32
")", arm11_reg_defs
[i
].name
, arm11
->reg_history
[i
].value
);
540 if (arm11
->reg_history
[i
].valid
)
542 if (arm11
->reg_history
[i
].value
!= arm11
->reg_values
[i
])
543 LOG_DEBUG("%8s %08" PRIx32
" (%08" PRIx32
")", arm11_reg_defs
[i
].name
, arm11
->reg_values
[i
], arm11
->reg_history
[i
].value
);
547 LOG_DEBUG("%8s %08" PRIx32
" (INVALID)", arm11_reg_defs
[i
].name
, arm11
->reg_values
[i
]);
553 /** Restore processor state
555 * This is called in preparation for the RESTART function.
558 int arm11_leave_debug_state(arm11_common_t
* arm11
)
562 arm11_run_instr_data_prepare(arm11
);
564 /** \todo TODO: handle other mode registers */
566 /* restore R1 - R14 */
568 for (size_t i
= 1; i
< 15; i
++)
570 if (!arm11
->reg_list
[ARM11_RC_RX
+ i
].dirty
)
573 /* MRC p14,0,r?,c0,c5,0 */
574 arm11_run_instr_data_to_core1(arm11
, 0xee100e15 | (i
<< 12), R(RX
+ i
));
576 // LOG_DEBUG("RESTORE R" ZU " %08x", i, R(RX + i));
579 arm11_run_instr_data_finish(arm11
);
581 /* spec says clear wDTR and rDTR; we assume they are clear as
582 otherwise our programming would be sloppy */
586 CHECK_RETVAL(arm11_read_DSCR(arm11
, &DSCR
));
588 if (DSCR
& (ARM11_DSCR_RDTR_FULL
| ARM11_DSCR_WDTR_FULL
))
590 LOG_ERROR("wDTR/rDTR inconsistent (DSCR %08" PRIx32
")", DSCR
);
594 arm11_run_instr_data_prepare(arm11
);
596 /* restore original wDTR */
598 if ((R(DSCR
) & ARM11_DSCR_WDTR_FULL
) || arm11
->reg_list
[ARM11_RC_WDTR
].dirty
)
600 /* MCR p14,0,R0,c0,c5,0 */
601 arm11_run_instr_data_to_core_via_r0(arm11
, 0xee000e15, R(WDTR
));
607 arm11_run_instr_data_to_core_via_r0(arm11
, 0xe129f000, R(CPSR
));
612 arm11_run_instr_data_to_core_via_r0(arm11
, 0xe1a0f000, R(PC
));
616 /* MRC p14,0,r0,c0,c5,0 */
617 arm11_run_instr_data_to_core1(arm11
, 0xee100e15, R(R0
));
619 arm11_run_instr_data_finish(arm11
);
623 arm11_write_DSCR(arm11
, R(DSCR
));
627 if (R(DSCR
) & ARM11_DSCR_RDTR_FULL
|| arm11
->reg_list
[ARM11_RC_RDTR
].dirty
)
629 arm11_add_debug_SCAN_N(arm11
, 0x05, ARM11_TAP_DEFAULT
);
631 arm11_add_IR(arm11
, ARM11_EXTEST
, ARM11_TAP_DEFAULT
);
633 scan_field_t chain5_fields
[3];
635 uint8_t Ready
= 0; /* ignored */
636 uint8_t Valid
= 0; /* ignored */
638 arm11_setup_field(arm11
, 32, &R(RDTR
), NULL
, chain5_fields
+ 0);
639 arm11_setup_field(arm11
, 1, &Ready
, NULL
, chain5_fields
+ 1);
640 arm11_setup_field(arm11
, 1, &Valid
, NULL
, chain5_fields
+ 2);
642 arm11_add_dr_scan_vc(asizeof(chain5_fields
), chain5_fields
, TAP_DRPAUSE
);
645 arm11_record_register_history(arm11
);
650 void arm11_record_register_history(arm11_common_t
* arm11
)
652 for (size_t i
= 0; i
< ARM11_REGCACHE_COUNT
; i
++)
654 arm11
->reg_history
[i
].value
= arm11
->reg_values
[i
];
655 arm11
->reg_history
[i
].valid
= arm11
->reg_list
[i
].valid
;
657 arm11
->reg_list
[i
].valid
= 0;
658 arm11
->reg_list
[i
].dirty
= 0;
663 /* poll current target status */
664 int arm11_poll(struct target_s
*target
)
668 arm11_common_t
* arm11
= target
->arch_info
;
670 if (arm11
->trst_active
)
675 CHECK_RETVAL(arm11_read_DSCR(arm11
, &dscr
));
677 LOG_DEBUG("DSCR %08" PRIx32
"", dscr
);
679 CHECK_RETVAL(arm11_check_init(arm11
, &dscr
));
681 if (dscr
& ARM11_DSCR_CORE_HALTED
)
683 if (target
->state
!= TARGET_HALTED
)
685 enum target_state old_state
= target
->state
;
687 LOG_DEBUG("enter TARGET_HALTED");
688 target
->state
= TARGET_HALTED
;
689 target
->debug_reason
= arm11_get_DSCR_debug_reason(dscr
);
690 arm11_on_enter_debug_state(arm11
);
692 target_call_event_callbacks(target
,
693 old_state
== TARGET_DEBUG_RUNNING
? TARGET_EVENT_DEBUG_HALTED
: TARGET_EVENT_HALTED
);
698 if (target
->state
!= TARGET_RUNNING
&& target
->state
!= TARGET_DEBUG_RUNNING
)
700 LOG_DEBUG("enter TARGET_RUNNING");
701 target
->state
= TARGET_RUNNING
;
702 target
->debug_reason
= DBG_REASON_NOTHALTED
;
708 /* architecture specific status reply */
709 int arm11_arch_state(struct target_s
*target
)
711 arm11_common_t
* arm11
= target
->arch_info
;
713 LOG_USER("target halted due to %s\ncpsr: 0x%8.8" PRIx32
" pc: 0x%8.8" PRIx32
"",
714 Jim_Nvp_value2name_simple(nvp_target_debug_reason
, target
->debug_reason
)->name
,
721 /* target request support */
722 int arm11_target_request_data(struct target_s
*target
, uint32_t size
, uint8_t *buffer
)
724 FNC_INFO_NOTIMPLEMENTED
;
729 /* target execution control */
730 int arm11_halt(struct target_s
*target
)
734 arm11_common_t
* arm11
= target
->arch_info
;
736 LOG_DEBUG("target->state: %s",
737 target_state_name(target
));
739 if (target
->state
== TARGET_UNKNOWN
)
741 arm11
->simulate_reset_on_next_halt
= true;
744 if (target
->state
== TARGET_HALTED
)
746 LOG_DEBUG("target was already halted");
750 if (arm11
->trst_active
)
752 arm11
->halt_requested
= true;
756 arm11_add_IR(arm11
, ARM11_HALT
, TAP_IDLE
);
758 CHECK_RETVAL(jtag_execute_queue());
764 CHECK_RETVAL(arm11_read_DSCR(arm11
, &dscr
));
766 if (dscr
& ARM11_DSCR_CORE_HALTED
)
770 arm11_on_enter_debug_state(arm11
);
772 enum target_state old_state
= target
->state
;
774 target
->state
= TARGET_HALTED
;
775 target
->debug_reason
= arm11_get_DSCR_debug_reason(dscr
);
778 target_call_event_callbacks(target
,
779 old_state
== TARGET_DEBUG_RUNNING
? TARGET_EVENT_DEBUG_HALTED
: TARGET_EVENT_HALTED
));
784 int arm11_resume(struct target_s
*target
, int current
, uint32_t address
, int handle_breakpoints
, int debug_execution
)
788 // LOG_DEBUG("current %d address %08x handle_breakpoints %d debug_execution %d",
789 // current, address, handle_breakpoints, debug_execution);
791 arm11_common_t
* arm11
= target
->arch_info
;
793 LOG_DEBUG("target->state: %s",
794 target_state_name(target
));
797 if (target
->state
!= TARGET_HALTED
)
799 LOG_ERROR("Target not halted");
800 return ERROR_TARGET_NOT_HALTED
;
806 LOG_DEBUG("RESUME PC %08" PRIx32
"%s", R(PC
), !current
? "!" : "");
808 /* clear breakpoints/watchpoints and VCR*/
809 arm11_sc7_clear_vbw(arm11
);
811 /* Set up breakpoints */
812 if (!debug_execution
)
814 /* check if one matches PC and step over it if necessary */
818 for (bp
= target
->breakpoints
; bp
; bp
= bp
->next
)
820 if (bp
->address
== R(PC
))
822 LOG_DEBUG("must step over %08" PRIx32
"", bp
->address
);
823 arm11_step(target
, 1, 0, 0);
828 /* set all breakpoints */
832 for (bp
= target
->breakpoints
; bp
; bp
= bp
->next
)
834 arm11_sc7_action_t brp
[2];
837 brp
[0].address
= ARM11_SC7_BVR0
+ brp_num
;
838 brp
[0].value
= bp
->address
;
840 brp
[1].address
= ARM11_SC7_BCR0
+ brp_num
;
841 brp
[1].value
= 0x1 | (3 << 1) | (0x0F << 5) | (0 << 14) | (0 << 16) | (0 << 20) | (0 << 21);
843 arm11_sc7_run(arm11
, brp
, asizeof(brp
));
845 LOG_DEBUG("Add BP " ZU
" at %08" PRIx32
"", brp_num
, bp
->address
);
850 arm11_sc7_set_vcr(arm11
, arm11_vcr
);
853 arm11_leave_debug_state(arm11
);
855 arm11_add_IR(arm11
, ARM11_RESTART
, TAP_IDLE
);
857 CHECK_RETVAL(jtag_execute_queue());
863 CHECK_RETVAL(arm11_read_DSCR(arm11
, &dscr
));
865 LOG_DEBUG("DSCR %08" PRIx32
"", dscr
);
867 if (dscr
& ARM11_DSCR_CORE_RESTARTED
)
871 if (!debug_execution
)
873 target
->state
= TARGET_RUNNING
;
874 target
->debug_reason
= DBG_REASON_NOTHALTED
;
876 CHECK_RETVAL(target_call_event_callbacks(target
, TARGET_EVENT_RESUMED
));
880 target
->state
= TARGET_DEBUG_RUNNING
;
881 target
->debug_reason
= DBG_REASON_NOTHALTED
;
883 CHECK_RETVAL(target_call_event_callbacks(target
, TARGET_EVENT_RESUMED
));
890 static int armv4_5_to_arm11(int reg
)
897 return ARM11_RC_CPSR
;
899 /* FIX!!! handle thumb better! */
900 return ARM11_RC_CPSR
;
902 LOG_ERROR("BUG: register translation from armv4_5 to arm11 not supported %d", reg
);
908 static uint32_t arm11_sim_get_reg(struct arm_sim_interface
*sim
, int reg
)
910 arm11_common_t
* arm11
= (arm11_common_t
*)sim
->user_data
;
912 reg
=armv4_5_to_arm11(reg
);
914 return buf_get_u32(arm11
->reg_list
[reg
].value
, 0, 32);
917 static void arm11_sim_set_reg(struct arm_sim_interface
*sim
, int reg
, uint32_t value
)
919 arm11_common_t
* arm11
= (arm11_common_t
*)sim
->user_data
;
921 reg
=armv4_5_to_arm11(reg
);
923 buf_set_u32(arm11
->reg_list
[reg
].value
, 0, 32, value
);
926 static uint32_t arm11_sim_get_cpsr(struct arm_sim_interface
*sim
, int pos
, int bits
)
928 arm11_common_t
* arm11
= (arm11_common_t
*)sim
->user_data
;
930 return buf_get_u32(arm11
->reg_list
[ARM11_RC_CPSR
].value
, pos
, bits
);
933 static enum armv4_5_state
arm11_sim_get_state(struct arm_sim_interface
*sim
)
935 // arm11_common_t * arm11 = (arm11_common_t *)sim->user_data;
937 /* FIX!!!! we should implement thumb for arm11 */
938 return ARMV4_5_STATE_ARM
;
941 static void arm11_sim_set_state(struct arm_sim_interface
*sim
, enum armv4_5_state mode
)
943 // arm11_common_t * arm11 = (arm11_common_t *)sim->user_data;
945 /* FIX!!!! we should implement thumb for arm11 */
946 LOG_ERROR("Not implemetned!");
950 static enum armv4_5_mode
arm11_sim_get_mode(struct arm_sim_interface
*sim
)
952 //arm11_common_t * arm11 = (arm11_common_t *)sim->user_data;
954 /* FIX!!!! we should implement something that returns the current mode here!!! */
955 return ARMV4_5_MODE_USR
;
958 static int arm11_simulate_step(target_t
*target
, uint32_t *dry_run_pc
)
960 struct arm_sim_interface sim
;
962 sim
.user_data
=target
->arch_info
;
963 sim
.get_reg
=&arm11_sim_get_reg
;
964 sim
.set_reg
=&arm11_sim_set_reg
;
965 sim
.get_reg_mode
=&arm11_sim_get_reg
;
966 sim
.set_reg_mode
=&arm11_sim_set_reg
;
967 sim
.get_cpsr
=&arm11_sim_get_cpsr
;
968 sim
.get_mode
=&arm11_sim_get_mode
;
969 sim
.get_state
=&arm11_sim_get_state
;
970 sim
.set_state
=&arm11_sim_set_state
;
972 return arm_simulate_step_core(target
, dry_run_pc
, &sim
);
976 int arm11_step(struct target_s
*target
, int current
, uint32_t address
, int handle_breakpoints
)
981 LOG_DEBUG("target->state: %s",
982 target_state_name(target
));
984 if (target
->state
!= TARGET_HALTED
)
986 LOG_WARNING("target was not halted");
987 return ERROR_TARGET_NOT_HALTED
;
990 arm11_common_t
* arm11
= target
->arch_info
;
995 LOG_DEBUG("STEP PC %08" PRIx32
"%s", R(PC
), !current
? "!" : "");
998 retval
= arm11_simulate_step(target
, &next_pc
);
999 if (retval
!= ERROR_OK
)
1003 /** \todo TODO: Thumb not supported here */
1005 uint32_t next_instruction
;
1007 CHECK_RETVAL(arm11_read_memory_word(arm11
, R(PC
), &next_instruction
));
1009 /* skip over BKPT */
1010 if ((next_instruction
& 0xFFF00070) == 0xe1200070)
1013 arm11
->reg_list
[ARM11_RC_PC
].valid
= 1;
1014 arm11
->reg_list
[ARM11_RC_PC
].dirty
= 0;
1015 LOG_DEBUG("Skipping BKPT");
1017 /* skip over Wait for interrupt / Standby */
1018 /* mcr 15, 0, r?, cr7, cr0, {4} */
1019 else if ((next_instruction
& 0xFFFF0FFF) == 0xee070f90)
1022 arm11
->reg_list
[ARM11_RC_PC
].valid
= 1;
1023 arm11
->reg_list
[ARM11_RC_PC
].dirty
= 0;
1024 LOG_DEBUG("Skipping WFI");
1026 /* ignore B to self */
1027 else if ((next_instruction
& 0xFEFFFFFF) == 0xeafffffe)
1029 LOG_DEBUG("Not stepping jump to self");
1033 /** \todo TODO: check if break-/watchpoints make any sense at all in combination
1036 /** \todo TODO: check if disabling IRQs might be a good idea here. Alternatively
1037 * the VCR might be something worth looking into. */
1040 /* Set up breakpoint for stepping */
1042 arm11_sc7_action_t brp
[2];
1045 brp
[0].address
= ARM11_SC7_BVR0
;
1046 brp
[0].value
= R(PC
);
1048 brp
[1].address
= ARM11_SC7_BCR0
;
1049 brp
[1].value
= 0x1 | (3 << 1) | (0x0F << 5) | (0 << 14) | (0 << 16) | (0 << 20) | (2 << 21);
1051 CHECK_RETVAL(arm11_sc7_run(arm11
, brp
, asizeof(brp
)));
1056 if (arm11_config_step_irq_enable
)
1057 R(DSCR
) &= ~ARM11_DSCR_INTERRUPTS_DISABLE
; /* should be redundant */
1059 R(DSCR
) |= ARM11_DSCR_INTERRUPTS_DISABLE
;
1062 CHECK_RETVAL(arm11_leave_debug_state(arm11
));
1064 arm11_add_IR(arm11
, ARM11_RESTART
, TAP_IDLE
);
1066 CHECK_RETVAL(jtag_execute_queue());
1068 /** \todo TODO: add a timeout */
1076 CHECK_RETVAL(arm11_read_DSCR(arm11
, &dscr
));
1078 LOG_DEBUG("DSCR %08" PRIx32
"e", dscr
);
1080 if ((dscr
& (ARM11_DSCR_CORE_RESTARTED
| ARM11_DSCR_CORE_HALTED
)) ==
1081 (ARM11_DSCR_CORE_RESTARTED
| ARM11_DSCR_CORE_HALTED
))
1085 /* clear breakpoint */
1086 arm11_sc7_clear_vbw(arm11
);
1089 CHECK_RETVAL(arm11_on_enter_debug_state(arm11
));
1091 /* restore default state */
1092 R(DSCR
) &= ~ARM11_DSCR_INTERRUPTS_DISABLE
;
1096 // target->state = TARGET_HALTED;
1097 target
->debug_reason
= DBG_REASON_SINGLESTEP
;
1099 CHECK_RETVAL(target_call_event_callbacks(target
, TARGET_EVENT_HALTED
));
1101 if (R(PC
) != next_pc
)
1103 LOG_WARNING("next pc != simulated address %08" PRIx32
"!=%08" PRIx32
, R(PC
), next_pc
);
1109 /* target reset control */
1110 int arm11_assert_reset(struct target_s
*target
)
1115 /* assert reset lines */
1116 /* resets only the DBGTAP, not the ARM */
1118 jtag_add_reset(1, 0);
1119 jtag_add_sleep(5000);
1121 arm11_common_t
* arm11
= target
->arch_info
;
1122 arm11
->trst_active
= true;
1125 if (target
->reset_halt
)
1127 CHECK_RETVAL(target_halt(target
));
1133 int arm11_deassert_reset(struct target_s
*target
)
1138 LOG_DEBUG("target->state: %s",
1139 target_state_name(target
));
1142 /* deassert reset lines */
1143 jtag_add_reset(0, 0);
1145 arm11_common_t
* arm11
= target
->arch_info
;
1146 arm11
->trst_active
= false;
1148 if (arm11
->halt_requested
)
1149 return arm11_halt(target
);
1155 int arm11_soft_reset_halt(struct target_s
*target
)
1157 FNC_INFO_NOTIMPLEMENTED
;
1162 /* target register access for gdb */
1163 int arm11_get_gdb_reg_list(struct target_s
*target
, struct reg_s
**reg_list
[], int *reg_list_size
)
1167 arm11_common_t
* arm11
= target
->arch_info
;
1169 *reg_list_size
= ARM11_GDB_REGISTER_COUNT
;
1170 *reg_list
= malloc(sizeof(reg_t
*) * ARM11_GDB_REGISTER_COUNT
);
1172 for (size_t i
= 16; i
< 24; i
++)
1174 (*reg_list
)[i
] = &arm11_gdb_dummy_fp_reg
;
1177 (*reg_list
)[24] = &arm11_gdb_dummy_fps_reg
;
1179 for (size_t i
= 0; i
< ARM11_REGCACHE_COUNT
; i
++)
1181 if (arm11_reg_defs
[i
].gdb_num
== -1)
1184 (*reg_list
)[arm11_reg_defs
[i
].gdb_num
] = arm11
->reg_list
+ i
;
1190 /* target memory access
1191 * size: 1 = byte (8bit), 2 = half-word (16bit), 4 = word (32bit)
1192 * count: number of items of <size>
1194 int arm11_read_memory(struct target_s
*target
, uint32_t address
, uint32_t size
, uint32_t count
, uint8_t *buffer
)
1196 /** \todo TODO: check if buffer cast to uint32_t* and uint16_t* might cause alignment problems */
1200 if (target
->state
!= TARGET_HALTED
)
1202 LOG_WARNING("target was not halted");
1203 return ERROR_TARGET_NOT_HALTED
;
1206 LOG_DEBUG("ADDR %08" PRIx32
" SIZE %08" PRIx32
" COUNT %08" PRIx32
"", address
, size
, count
);
1208 arm11_common_t
* arm11
= target
->arch_info
;
1210 arm11_run_instr_data_prepare(arm11
);
1212 /* MRC p14,0,r0,c0,c5,0 */
1213 arm11_run_instr_data_to_core1(arm11
, 0xee100e15, address
);
1218 /** \todo TODO: check if dirty is the right choice to force a rewrite on arm11_resume() */
1219 arm11
->reg_list
[ARM11_RC_R1
].dirty
= 1;
1221 for (size_t i
= 0; i
< count
; i
++)
1223 /* ldrb r1, [r0], #1 */
1225 arm11_run_instr_no_data1(arm11
,
1226 !arm11_config_memrw_no_increment
? 0xe4d01001 : 0xe5d01000);
1229 /* MCR p14,0,R1,c0,c5,0 */
1230 arm11_run_instr_data_from_core(arm11
, 0xEE001E15, &res
, 1);
1239 arm11
->reg_list
[ARM11_RC_R1
].dirty
= 1;
1241 for (size_t i
= 0; i
< count
; i
++)
1243 /* ldrh r1, [r0], #2 */
1244 arm11_run_instr_no_data1(arm11
,
1245 !arm11_config_memrw_no_increment
? 0xe0d010b2 : 0xe1d010b0);
1249 /* MCR p14,0,R1,c0,c5,0 */
1250 arm11_run_instr_data_from_core(arm11
, 0xEE001E15, &res
, 1);
1252 uint16_t svalue
= res
;
1253 memcpy(buffer
+ i
* sizeof(uint16_t), &svalue
, sizeof(uint16_t));
1261 uint32_t instr
= !arm11_config_memrw_no_increment
? 0xecb05e01 : 0xed905e00;
1262 /** \todo TODO: buffer cast to uint32_t* causes alignment warnings */
1263 uint32_t *words
= (uint32_t *)buffer
;
1265 /* LDC p14,c5,[R0],#4 */
1266 /* LDC p14,c5,[R0] */
1267 arm11_run_instr_data_from_core(arm11
, instr
, words
, count
);
1272 arm11_run_instr_data_finish(arm11
);
1277 int arm11_write_memory(struct target_s
*target
, uint32_t address
, uint32_t size
, uint32_t count
, uint8_t *buffer
)
1281 if (target
->state
!= TARGET_HALTED
)
1283 LOG_WARNING("target was not halted");
1284 return ERROR_TARGET_NOT_HALTED
;
1287 LOG_DEBUG("ADDR %08" PRIx32
" SIZE %08" PRIx32
" COUNT %08" PRIx32
"", address
, size
, count
);
1289 arm11_common_t
* arm11
= target
->arch_info
;
1291 arm11_run_instr_data_prepare(arm11
);
1293 /* MRC p14,0,r0,c0,c5,0 */
1294 arm11_run_instr_data_to_core1(arm11
, 0xee100e15, address
);
1300 arm11
->reg_list
[ARM11_RC_R1
].dirty
= 1;
1302 for (size_t i
= 0; i
< count
; i
++)
1304 /* MRC p14,0,r1,c0,c5,0 */
1305 arm11_run_instr_data_to_core1(arm11
, 0xee101e15, *buffer
++);
1307 /* strb r1, [r0], #1 */
1309 arm11_run_instr_no_data1(arm11
,
1310 !arm11_config_memrw_no_increment
? 0xe4c01001 : 0xe5c01000);
1318 arm11
->reg_list
[ARM11_RC_R1
].dirty
= 1;
1320 for (size_t i
= 0; i
< count
; i
++)
1323 memcpy(&value
, buffer
+ i
* sizeof(uint16_t), sizeof(uint16_t));
1325 /* MRC p14,0,r1,c0,c5,0 */
1326 arm11_run_instr_data_to_core1(arm11
, 0xee101e15, value
);
1328 /* strh r1, [r0], #2 */
1330 arm11_run_instr_no_data1(arm11
,
1331 !arm11_config_memrw_no_increment
? 0xe0c010b2 : 0xe1c010b0);
1338 uint32_t instr
= !arm11_config_memrw_no_increment
? 0xeca05e01 : 0xed805e00;
1340 /** \todo TODO: buffer cast to uint32_t* causes alignment warnings */
1341 uint32_t *words
= (uint32_t*)buffer
;
1343 if (!arm11_config_memwrite_burst
)
1345 /* STC p14,c5,[R0],#4 */
1346 /* STC p14,c5,[R0]*/
1347 arm11_run_instr_data_to_core(arm11
, instr
, words
, count
);
1351 /* STC p14,c5,[R0],#4 */
1352 /* STC p14,c5,[R0]*/
1353 arm11_run_instr_data_to_core_noack(arm11
, instr
, words
, count
);
1361 /* r0 verification */
1362 if (!arm11_config_memrw_no_increment
)
1366 /* MCR p14,0,R0,c0,c5,0 */
1367 arm11_run_instr_data_from_core(arm11
, 0xEE000E15, &r0
, 1);
1369 if (address
+ size
* count
!= r0
)
1371 LOG_ERROR("Data transfer failed. (%d)", (int)((r0
- address
) - size
* count
));
1373 if (arm11_config_memwrite_burst
)
1374 LOG_ERROR("use 'arm11 memwrite burst disable' to disable fast burst mode");
1376 if (arm11_config_memwrite_error_fatal
)
1382 arm11_run_instr_data_finish(arm11
);
1388 /* write target memory in multiples of 4 byte, optimized for writing large quantities of data */
1389 int arm11_bulk_write_memory(struct target_s
*target
, uint32_t address
, uint32_t count
, uint8_t *buffer
)
1393 if (target
->state
!= TARGET_HALTED
)
1395 LOG_WARNING("target was not halted");
1396 return ERROR_TARGET_NOT_HALTED
;
1399 return arm11_write_memory(target
, address
, 4, count
, buffer
);
1402 /* here we have nothing target specific to contribute, so we fail and then the
1403 * fallback code will read data from the target and calculate the CRC on the
1406 int arm11_checksum_memory(struct target_s
*target
, uint32_t address
, uint32_t count
, uint32_t* checksum
)
1411 /* target break-/watchpoint control
1412 * rw: 0 = write, 1 = read, 2 = access
1414 int arm11_add_breakpoint(struct target_s
*target
, breakpoint_t
*breakpoint
)
1418 arm11_common_t
* arm11
= target
->arch_info
;
1421 if (breakpoint
->type
== BKPT_SOFT
)
1423 LOG_INFO("sw breakpoint requested, but software breakpoints not enabled");
1424 return ERROR_TARGET_RESOURCE_NOT_AVAILABLE
;
1428 if (!arm11
->free_brps
)
1430 LOG_DEBUG("no breakpoint unit available for hardware breakpoint");
1431 return ERROR_TARGET_RESOURCE_NOT_AVAILABLE
;
1434 if (breakpoint
->length
!= 4)
1436 LOG_DEBUG("only breakpoints of four bytes length supported");
1437 return ERROR_TARGET_RESOURCE_NOT_AVAILABLE
;
1445 int arm11_remove_breakpoint(struct target_s
*target
, breakpoint_t
*breakpoint
)
1449 arm11_common_t
* arm11
= target
->arch_info
;
1456 int arm11_add_watchpoint(struct target_s
*target
, watchpoint_t
*watchpoint
)
1458 FNC_INFO_NOTIMPLEMENTED
;
1463 int arm11_remove_watchpoint(struct target_s
*target
, watchpoint_t
*watchpoint
)
1465 FNC_INFO_NOTIMPLEMENTED
;
1470 // HACKHACKHACK - FIXME mode/state
1471 /* target algorithm support */
1472 int arm11_run_algorithm(struct target_s
*target
, int num_mem_params
, mem_param_t
*mem_params
,
1473 int num_reg_params
, reg_param_t
*reg_params
, uint32_t entry_point
, uint32_t exit_point
,
1474 int timeout_ms
, void *arch_info
)
1476 arm11_common_t
*arm11
= target
->arch_info
;
1477 // enum armv4_5_state core_state = arm11->core_state;
1478 // enum armv4_5_mode core_mode = arm11->core_mode;
1479 uint32_t context
[16];
1481 int exit_breakpoint_size
= 0;
1482 int retval
= ERROR_OK
;
1483 LOG_DEBUG("Running algorithm");
1486 if (target
->state
!= TARGET_HALTED
)
1488 LOG_WARNING("target not halted");
1489 return ERROR_TARGET_NOT_HALTED
;
1493 // if (armv4_5_mode_to_number(arm11->core_mode)==-1)
1494 // return ERROR_FAIL;
1497 for (size_t i
= 0; i
< 16; i
++)
1499 context
[i
] = buf_get_u32((uint8_t*)(&arm11
->reg_values
[i
]),0,32);
1500 LOG_DEBUG("Save %zi: 0x%" PRIx32
"",i
,context
[i
]);
1503 cpsr
= buf_get_u32((uint8_t*)(arm11
->reg_values
+ ARM11_RC_CPSR
),0,32);
1504 LOG_DEBUG("Save CPSR: 0x%" PRIx32
"", cpsr
);
1506 for (int i
= 0; i
< num_mem_params
; i
++)
1508 target_write_buffer(target
, mem_params
[i
].address
, mem_params
[i
].size
, mem_params
[i
].value
);
1511 // Set register parameters
1512 for (int i
= 0; i
< num_reg_params
; i
++)
1514 reg_t
*reg
= register_get_by_name(arm11
->core_cache
, reg_params
[i
].reg_name
, 0);
1517 LOG_ERROR("BUG: register '%s' not found", reg_params
[i
].reg_name
);
1521 if (reg
->size
!= reg_params
[i
].size
)
1523 LOG_ERROR("BUG: register '%s' size doesn't match reg_params[i].size", reg_params
[i
].reg_name
);
1526 arm11_set_reg(reg
,reg_params
[i
].value
);
1527 // printf("%i: Set %s =%08x\n", i, reg_params[i].reg_name,val);
1530 exit_breakpoint_size
= 4;
1532 /* arm11->core_state = arm11_algorithm_info->core_state;
1533 if (arm11->core_state == ARMV4_5_STATE_ARM)
1534 exit_breakpoint_size = 4;
1535 else if (arm11->core_state == ARMV4_5_STATE_THUMB)
1536 exit_breakpoint_size = 2;
1539 LOG_ERROR("BUG: can't execute algorithms when not in ARM or Thumb state");
1545 /* arm11 at this point only supports ARM not THUMB mode
1546 however if this test needs to be reactivated the current state can be read back
1549 if (arm11_algorithm_info
->core_mode
!= ARMV4_5_MODE_ANY
)
1551 LOG_DEBUG("setting core_mode: 0x%2.2x", arm11_algorithm_info
->core_mode
);
1552 buf_set_u32(arm11
->reg_list
[ARM11_RC_CPSR
].value
, 0, 5, arm11_algorithm_info
->core_mode
);
1553 arm11
->reg_list
[ARM11_RC_CPSR
].dirty
= 1;
1554 arm11
->reg_list
[ARM11_RC_CPSR
].valid
= 1;
1558 if ((retval
= breakpoint_add(target
, exit_point
, exit_breakpoint_size
, BKPT_HARD
)) != ERROR_OK
)
1560 LOG_ERROR("can't add breakpoint to finish algorithm execution");
1561 retval
= ERROR_TARGET_FAILURE
;
1565 // no debug, otherwise breakpoint is not set
1566 CHECK_RETVAL(target_resume(target
, 0, entry_point
, 1, 0));
1568 CHECK_RETVAL(target_wait_state(target
, TARGET_HALTED
, timeout_ms
));
1570 if (target
->state
!= TARGET_HALTED
)
1572 CHECK_RETVAL(target_halt(target
));
1574 CHECK_RETVAL(target_wait_state(target
, TARGET_HALTED
, 500));
1576 retval
= ERROR_TARGET_TIMEOUT
;
1578 goto del_breakpoint
;
1581 if (buf_get_u32(arm11
->reg_list
[15].value
, 0, 32) != exit_point
)
1583 LOG_WARNING("target reentered debug state, but not at the desired exit point: 0x%4.4" PRIx32
"",
1584 buf_get_u32(arm11
->reg_list
[15].value
, 0, 32));
1585 retval
= ERROR_TARGET_TIMEOUT
;
1586 goto del_breakpoint
;
1589 for (int i
= 0; i
< num_mem_params
; i
++)
1591 if (mem_params
[i
].direction
!= PARAM_OUT
)
1592 target_read_buffer(target
, mem_params
[i
].address
, mem_params
[i
].size
, mem_params
[i
].value
);
1595 for (int i
= 0; i
< num_reg_params
; i
++)
1597 if (reg_params
[i
].direction
!= PARAM_OUT
)
1599 reg_t
*reg
= register_get_by_name(arm11
->core_cache
, reg_params
[i
].reg_name
, 0);
1602 LOG_ERROR("BUG: register '%s' not found", reg_params
[i
].reg_name
);
1606 if (reg
->size
!= reg_params
[i
].size
)
1608 LOG_ERROR("BUG: register '%s' size doesn't match reg_params[i].size", reg_params
[i
].reg_name
);
1612 buf_set_u32(reg_params
[i
].value
, 0, 32, buf_get_u32(reg
->value
, 0, 32));
1617 breakpoint_remove(target
, exit_point
);
1621 for (size_t i
= 0; i
< 16; i
++)
1623 LOG_DEBUG("restoring register %s with value 0x%8.8" PRIx32
"",
1624 arm11
->reg_list
[i
].name
, context
[i
]);
1625 arm11_set_reg(&arm11
->reg_list
[i
], (uint8_t*)&context
[i
]);
1627 LOG_DEBUG("restoring CPSR with value 0x%8.8" PRIx32
"", cpsr
);
1628 arm11_set_reg(&arm11
->reg_list
[ARM11_RC_CPSR
], (uint8_t*)&cpsr
);
1630 // arm11->core_state = core_state;
1631 // arm11->core_mode = core_mode;
1636 int arm11_target_create(struct target_s
*target
, Jim_Interp
*interp
)
1640 NEW(arm11_common_t
, arm11
, 1);
1642 arm11
->target
= target
;
1644 if (target
->tap
== NULL
)
1647 if (target
->tap
->ir_length
!= 5)
1649 LOG_ERROR("'target arm11' expects IR LENGTH = 5");
1650 return ERROR_COMMAND_SYNTAX_ERROR
;
1653 target
->arch_info
= arm11
;
1658 int arm11_init_target(struct command_context_s
*cmd_ctx
, struct target_s
*target
)
1660 /* Initialize anything we can set up without talking to the target */
1661 return arm11_build_reg_cache(target
);
1664 /* talk to the target and set things up */
1665 int arm11_examine(struct target_s
*target
)
1669 arm11_common_t
* arm11
= target
->arch_info
;
1673 arm11_add_IR(arm11
, ARM11_IDCODE
, ARM11_TAP_DEFAULT
);
1675 scan_field_t idcode_field
;
1677 arm11_setup_field(arm11
, 32, NULL
, &arm11
->device_id
, &idcode_field
);
1679 arm11_add_dr_scan_vc(1, &idcode_field
, TAP_DRPAUSE
);
1683 arm11_add_debug_SCAN_N(arm11
, 0x00, ARM11_TAP_DEFAULT
);
1685 arm11_add_IR(arm11
, ARM11_INTEST
, ARM11_TAP_DEFAULT
);
1687 scan_field_t chain0_fields
[2];
1689 arm11_setup_field(arm11
, 32, NULL
, &arm11
->didr
, chain0_fields
+ 0);
1690 arm11_setup_field(arm11
, 8, NULL
, &arm11
->implementor
, chain0_fields
+ 1);
1692 arm11_add_dr_scan_vc(asizeof(chain0_fields
), chain0_fields
, TAP_IDLE
);
1694 CHECK_RETVAL(jtag_execute_queue());
1696 switch (arm11
->device_id
& 0x0FFFF000)
1698 case 0x07B36000: LOG_INFO("found ARM1136"); break;
1699 case 0x07B56000: LOG_INFO("found ARM1156"); break;
1700 case 0x07B76000: LOG_INFO("found ARM1176"); break;
1703 LOG_ERROR("'target arm11' expects IDCODE 0x*7B*7****");
1708 arm11
->debug_version
= (arm11
->didr
>> 16) & 0x0F;
1710 if (arm11
->debug_version
!= ARM11_DEBUG_V6
&&
1711 arm11
->debug_version
!= ARM11_DEBUG_V61
)
1713 LOG_ERROR("Only ARMv6 v6 and v6.1 architectures supported.");
1717 arm11
->brp
= ((arm11
->didr
>> 24) & 0x0F) + 1;
1718 arm11
->wrp
= ((arm11
->didr
>> 28) & 0x0F) + 1;
1720 /** \todo TODO: reserve one brp slot if we allow breakpoints during step */
1721 arm11
->free_brps
= arm11
->brp
;
1722 arm11
->free_wrps
= arm11
->wrp
;
1724 LOG_DEBUG("IDCODE %08" PRIx32
" IMPLEMENTOR %02x DIDR %08" PRIx32
"",
1726 (int)(arm11
->implementor
),
1729 /* as a side-effect this reads DSCR and thus
1730 * clears the ARM11_DSCR_STICKY_PRECISE_DATA_ABORT / Sticky Precise Data Abort Flag
1731 * as suggested by the spec.
1734 arm11_check_init(arm11
, NULL
);
1736 target_set_examined(target
);
1741 int arm11_quit(void)
1743 FNC_INFO_NOTIMPLEMENTED
;
1748 /** Load a register that is marked !valid in the register cache */
1749 int arm11_get_reg(reg_t
*reg
)
1753 target_t
* target
= ((arm11_reg_state_t
*)reg
->arch_info
)->target
;
1755 if (target
->state
!= TARGET_HALTED
)
1757 LOG_WARNING("target was not halted");
1758 return ERROR_TARGET_NOT_HALTED
;
1761 /** \todo TODO: Check this. We assume that all registers are fetched at debug entry. */
1764 arm11_common_t
*arm11
= target
->arch_info
;
1765 const arm11_reg_defs_t
* arm11_reg_info
= arm11_reg_defs
+ ((arm11_reg_state_t
*)reg
->arch_info
)->def_index
;
1771 /** Change a value in the register cache */
1772 int arm11_set_reg(reg_t
*reg
, uint8_t *buf
)
1776 target_t
* target
= ((arm11_reg_state_t
*)reg
->arch_info
)->target
;
1777 arm11_common_t
*arm11
= target
->arch_info
;
1778 // const arm11_reg_defs_t * arm11_reg_info = arm11_reg_defs + ((arm11_reg_state_t *)reg->arch_info)->def_index;
1780 arm11
->reg_values
[((arm11_reg_state_t
*)reg
->arch_info
)->def_index
] = buf_get_u32(buf
, 0, 32);
1787 int arm11_build_reg_cache(target_t
*target
)
1789 arm11_common_t
*arm11
= target
->arch_info
;
1791 NEW(reg_cache_t
, cache
, 1);
1792 NEW(reg_t
, reg_list
, ARM11_REGCACHE_COUNT
);
1793 NEW(arm11_reg_state_t
, arm11_reg_states
, ARM11_REGCACHE_COUNT
);
1795 if (arm11_regs_arch_type
== -1)
1796 arm11_regs_arch_type
= register_reg_arch_type(arm11_get_reg
, arm11_set_reg
);
1798 register_init_dummy(&arm11_gdb_dummy_fp_reg
);
1799 register_init_dummy(&arm11_gdb_dummy_fps_reg
);
1801 arm11
->reg_list
= reg_list
;
1803 /* Build the process context cache */
1804 cache
->name
= "arm11 registers";
1806 cache
->reg_list
= reg_list
;
1807 cache
->num_regs
= ARM11_REGCACHE_COUNT
;
1809 reg_cache_t
**cache_p
= register_get_last_cache_p(&target
->reg_cache
);
1812 arm11
->core_cache
= cache
;
1813 // armv7m->process_context = cache;
1817 /* Not very elegant assertion */
1818 if (ARM11_REGCACHE_COUNT
!= asizeof(arm11
->reg_values
) ||
1819 ARM11_REGCACHE_COUNT
!= asizeof(arm11_reg_defs
) ||
1820 ARM11_REGCACHE_COUNT
!= ARM11_RC_MAX
)
1822 LOG_ERROR("BUG: arm11->reg_values inconsistent (%d " ZU
" " ZU
" %d)", ARM11_REGCACHE_COUNT
, asizeof(arm11
->reg_values
), asizeof(arm11_reg_defs
), ARM11_RC_MAX
);
1826 for (i
= 0; i
< ARM11_REGCACHE_COUNT
; i
++)
1828 reg_t
* r
= reg_list
+ i
;
1829 const arm11_reg_defs_t
* rd
= arm11_reg_defs
+ i
;
1830 arm11_reg_state_t
* rs
= arm11_reg_states
+ i
;
1834 r
->value
= (uint8_t *)(arm11
->reg_values
+ i
);
1837 r
->bitfield_desc
= NULL
;
1838 r
->num_bitfields
= 0;
1839 r
->arch_type
= arm11_regs_arch_type
;
1843 rs
->target
= target
;
1849 int arm11_handle_bool(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
, bool * var
, char * name
)
1853 LOG_INFO("%s is %s.", name
, *var
? "enabled" : "disabled");
1858 return ERROR_COMMAND_SYNTAX_ERROR
;
1863 case 'f': /* false */
1865 case 'd': /* disable */
1871 case 't': /* true */
1873 case 'e': /* enable */
1879 LOG_INFO("%s %s.", *var
? "Enabled" : "Disabled", name
);
1884 #define BOOL_WRAPPER(name, print_name) \
1885 int arm11_handle_bool_##name(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) \
1887 return arm11_handle_bool(cmd_ctx, cmd, args, argc, &arm11_config_##name, print_name); \
1890 #define RC_TOP(name, descr, more) \
1892 command_t * new_cmd = register_command(cmd_ctx, top_cmd, name, NULL, COMMAND_ANY, descr); \
1893 command_t * top_cmd = new_cmd; \
1897 #define RC_FINAL(name, descr, handler) \
1898 register_command(cmd_ctx, top_cmd, name, handler, COMMAND_ANY, descr);
1900 #define RC_FINAL_BOOL(name, descr, var) \
1901 register_command(cmd_ctx, top_cmd, name, arm11_handle_bool_##var, COMMAND_ANY, descr);
1903 BOOL_WRAPPER(memwrite_burst
, "memory write burst mode")
1904 BOOL_WRAPPER(memwrite_error_fatal
, "fatal error mode for memory writes")
1905 BOOL_WRAPPER(memrw_no_increment
, "\"no increment\" mode for memory transfers")
1906 BOOL_WRAPPER(step_irq_enable
, "IRQs while stepping")
1908 int arm11_handle_vcr(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1912 arm11_vcr
= strtoul(args
[0], NULL
, 0);
1916 return ERROR_COMMAND_SYNTAX_ERROR
;
1919 LOG_INFO("VCR 0x%08" PRIx32
"", arm11_vcr
);
1923 const uint32_t arm11_coproc_instruction_limits
[] =
1925 15, /* coprocessor */
1930 0xFFFFFFFF, /* value */
1933 const char arm11_mrc_syntax
[] = "Syntax: mrc <jtag_target> <coprocessor> <opcode 1> <CRn> <CRm> <opcode 2>. All parameters are numbers only.";
1934 const char arm11_mcr_syntax
[] = "Syntax: mcr <jtag_target> <coprocessor> <opcode 1> <CRn> <CRm> <opcode 2> <32bit value to write>. All parameters are numbers only.";
1936 arm11_common_t
* arm11_find_target(const char * arg
)
1941 tap
= jtag_tap_by_string(arg
);
1946 for (t
= all_targets
; t
; t
= t
->next
)
1951 /* if (t->type == arm11_target) */
1952 if (0 == strcmp(target_get_name(t
), "arm11"))
1953 return t
->arch_info
;
1959 int arm11_handle_mrc_mcr(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
, bool read
)
1961 if (argc
!= (read
? 6 : 7))
1963 LOG_ERROR("Invalid number of arguments. %s", read
? arm11_mrc_syntax
: arm11_mcr_syntax
);
1967 arm11_common_t
* arm11
= arm11_find_target(args
[0]);
1971 LOG_ERROR("Parameter 1 is not a the JTAG chain position of an ARM11 device. %s",
1972 read
? arm11_mrc_syntax
: arm11_mcr_syntax
);
1977 if (arm11
->target
->state
!= TARGET_HALTED
)
1979 LOG_WARNING("target was not halted");
1980 return ERROR_TARGET_NOT_HALTED
;
1985 for (size_t i
= 0; i
< (read
? 5 : 6); i
++)
1987 values
[i
] = strtoul(args
[i
+ 1], NULL
, 0);
1989 if (values
[i
] > arm11_coproc_instruction_limits
[i
])
1991 LOG_ERROR("Parameter %ld out of bounds (%" PRId32
" max). %s",
1993 arm11_coproc_instruction_limits
[i
],
1994 read
? arm11_mrc_syntax
: arm11_mcr_syntax
);
1999 uint32_t instr
= 0xEE000010 |
2007 instr
|= 0x00100000;
2009 arm11_run_instr_data_prepare(arm11
);
2014 arm11_run_instr_data_from_core_via_r0(arm11
, instr
, &result
);
2016 LOG_INFO("MRC p%d, %d, R0, c%d, c%d, %d = 0x%08" PRIx32
" (%" PRId32
")",
2021 (int)(values
[4]), result
, result
);
2025 arm11_run_instr_data_to_core_via_r0(arm11
, instr
, values
[5]);
2027 LOG_INFO("MRC p%d, %d, R0 (#0x%08" PRIx32
"), c%d, c%d, %d",
2028 (int)(values
[0]), (int)(values
[1]),
2030 (int)(values
[2]), (int)(values
[3]), (int)(values
[4]));
2033 arm11_run_instr_data_finish(arm11
);
2039 int arm11_handle_mrc(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2041 return arm11_handle_mrc_mcr(cmd_ctx
, cmd
, args
, argc
, true);
2044 int arm11_handle_mcr(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2046 return arm11_handle_mrc_mcr(cmd_ctx
, cmd
, args
, argc
, false);
2049 int arm11_register_commands(struct command_context_s
*cmd_ctx
)
2053 command_t
* top_cmd
= NULL
;
2055 RC_TOP("arm11", "arm11 specific commands",
2057 RC_TOP("memwrite", "Control memory write transfer mode",
2059 RC_FINAL_BOOL("burst", "Enable/Disable non-standard but fast burst mode (default: enabled)",
2062 RC_FINAL_BOOL("error_fatal", "Terminate program if transfer error was found (default: enabled)",
2063 memwrite_error_fatal
)
2066 RC_FINAL_BOOL("no_increment", "Don't increment address on multi-read/-write (default: disabled)",
2069 RC_FINAL_BOOL("step_irq_enable", "Enable interrupts while stepping (default: disabled)",
2072 RC_FINAL("vcr", "Control (Interrupt) Vector Catch Register",
2075 RC_FINAL("mrc", "Read Coprocessor register",
2078 RC_FINAL("mcr", "Write Coprocessor register",
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)