1 /***************************************************************************
2 * Copyright (C) 2008 digenius technology GmbH. *
4 * This program is free software; you can redistribute it and/or modify *
5 * it under the terms of the GNU General Public License as published by *
6 * the Free Software Foundation; either version 2 of the License, or *
7 * (at your option) any later version. *
9 * This program is distributed in the hope that it will be useful, *
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
12 * GNU General Public License for more details. *
14 * You should have received a copy of the GNU General Public License *
15 * along with this program; if not, write to the *
16 * Free Software Foundation, Inc., *
17 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
18 ***************************************************************************/
32 #define _DEBUG_INSTRUCTION_EXECUTION_
37 #define FNC_INFO DEBUG("-")
43 #define FNC_INFO_NOTIMPLEMENTED do { DEBUG("NOT IMPLEMENTED"); /*exit(-1);*/ } while (0)
45 #define FNC_INFO_NOTIMPLEMENTED
48 static void arm11_on_enter_debug_state(arm11_common_t
* arm11
);
51 bool arm11_config_memwrite_burst
= true;
52 bool arm11_config_memwrite_error_fatal
= true;
56 #define ARM11_HANDLER(x) \
59 target_type_t arm11_target
=
64 ARM11_HANDLER(arch_state
),
66 ARM11_HANDLER(target_request_data
),
69 ARM11_HANDLER(resume
),
72 ARM11_HANDLER(assert_reset
),
73 ARM11_HANDLER(deassert_reset
),
74 ARM11_HANDLER(soft_reset_halt
),
75 ARM11_HANDLER(prepare_reset_halt
),
77 ARM11_HANDLER(get_gdb_reg_list
),
79 ARM11_HANDLER(read_memory
),
80 ARM11_HANDLER(write_memory
),
82 ARM11_HANDLER(bulk_write_memory
),
84 ARM11_HANDLER(checksum_memory
),
86 ARM11_HANDLER(add_breakpoint
),
87 ARM11_HANDLER(remove_breakpoint
),
88 ARM11_HANDLER(add_watchpoint
),
89 ARM11_HANDLER(remove_watchpoint
),
91 ARM11_HANDLER(run_algorithm
),
93 ARM11_HANDLER(register_commands
),
94 ARM11_HANDLER(target_command
),
95 ARM11_HANDLER(init_target
),
99 int arm11_regs_arch_type
= -1;
117 ARM11_REGISTER_SPSR_FIQ
,
118 ARM11_REGISTER_SPSR_SVC
,
119 ARM11_REGISTER_SPSR_ABT
,
120 ARM11_REGISTER_SPSR_IRQ
,
121 ARM11_REGISTER_SPSR_UND
,
122 ARM11_REGISTER_SPSR_MON
,
131 typedef struct arm11_reg_defs_s
136 enum arm11_regtype type
;
139 /* update arm11_regcache_ids when changing this */
140 static const arm11_reg_defs_t arm11_reg_defs
[] =
142 {"r0", 0, 0, ARM11_REGISTER_CORE
},
143 {"r1", 1, 1, ARM11_REGISTER_CORE
},
144 {"r2", 2, 2, ARM11_REGISTER_CORE
},
145 {"r3", 3, 3, ARM11_REGISTER_CORE
},
146 {"r4", 4, 4, ARM11_REGISTER_CORE
},
147 {"r5", 5, 5, ARM11_REGISTER_CORE
},
148 {"r6", 6, 6, ARM11_REGISTER_CORE
},
149 {"r7", 7, 7, ARM11_REGISTER_CORE
},
150 {"r8", 8, 8, ARM11_REGISTER_CORE
},
151 {"r9", 9, 9, ARM11_REGISTER_CORE
},
152 {"r10", 10, 10, ARM11_REGISTER_CORE
},
153 {"r11", 11, 11, ARM11_REGISTER_CORE
},
154 {"r12", 12, 12, ARM11_REGISTER_CORE
},
155 {"sp", 13, 13, ARM11_REGISTER_CORE
},
156 {"lr", 14, 14, ARM11_REGISTER_CORE
},
157 {"pc", 15, 15, ARM11_REGISTER_CORE
},
159 #if ARM11_REGCACHE_FREGS
160 {"f0", 0, 16, ARM11_REGISTER_FX
},
161 {"f1", 1, 17, ARM11_REGISTER_FX
},
162 {"f2", 2, 18, ARM11_REGISTER_FX
},
163 {"f3", 3, 19, ARM11_REGISTER_FX
},
164 {"f4", 4, 20, ARM11_REGISTER_FX
},
165 {"f5", 5, 21, ARM11_REGISTER_FX
},
166 {"f6", 6, 22, ARM11_REGISTER_FX
},
167 {"f7", 7, 23, ARM11_REGISTER_FX
},
168 {"fps", 0, 24, ARM11_REGISTER_FPS
},
171 {"cpsr", 0, 25, ARM11_REGISTER_CPSR
},
173 #if ARM11_REGCACHE_MODEREGS
174 {"r8_fiq", 8, -1, ARM11_REGISTER_FIQ
},
175 {"r9_fiq", 9, -1, ARM11_REGISTER_FIQ
},
176 {"r10_fiq", 10, -1, ARM11_REGISTER_FIQ
},
177 {"r11_fiq", 11, -1, ARM11_REGISTER_FIQ
},
178 {"r12_fiq", 12, -1, ARM11_REGISTER_FIQ
},
179 {"r13_fiq", 13, -1, ARM11_REGISTER_FIQ
},
180 {"r14_fiq", 14, -1, ARM11_REGISTER_FIQ
},
181 {"spsr_fiq", 0, -1, ARM11_REGISTER_SPSR_FIQ
},
183 {"r13_svc", 13, -1, ARM11_REGISTER_SVC
},
184 {"r14_svc", 14, -1, ARM11_REGISTER_SVC
},
185 {"spsr_svc", 0, -1, ARM11_REGISTER_SPSR_SVC
},
187 {"r13_abt", 13, -1, ARM11_REGISTER_ABT
},
188 {"r14_abt", 14, -1, ARM11_REGISTER_ABT
},
189 {"spsr_abt", 0, -1, ARM11_REGISTER_SPSR_ABT
},
191 {"r13_irq", 13, -1, ARM11_REGISTER_IRQ
},
192 {"r14_irq", 14, -1, ARM11_REGISTER_IRQ
},
193 {"spsr_irq", 0, -1, ARM11_REGISTER_SPSR_IRQ
},
195 {"r13_und", 13, -1, ARM11_REGISTER_UND
},
196 {"r14_und", 14, -1, ARM11_REGISTER_UND
},
197 {"spsr_und", 0, -1, ARM11_REGISTER_SPSR_UND
},
200 {"r13_mon", 13, -1, ARM11_REGISTER_MON
},
201 {"r14_mon", 14, -1, ARM11_REGISTER_MON
},
202 {"spsr_mon", 0, -1, ARM11_REGISTER_SPSR_MON
},
205 /* Debug Registers */
206 {"dscr", 0, -1, ARM11_REGISTER_DSCR
},
207 {"wdtr", 0, -1, ARM11_REGISTER_WDTR
},
208 {"rdtr", 0, -1, ARM11_REGISTER_RDTR
},
211 enum arm11_regcache_ids
214 ARM11_RC_RX
= ARM11_RC_R0
,
229 ARM11_RC_SP
= ARM11_RC_R13
,
231 ARM11_RC_LR
= ARM11_RC_R14
,
233 ARM11_RC_PC
= ARM11_RC_R15
,
235 #if ARM11_REGCACHE_FREGS
237 ARM11_RC_FX
= ARM11_RC_F0
,
250 #if ARM11_REGCACHE_MODEREGS
288 #define ARM11_GDB_REGISTER_COUNT 26
290 u8 arm11_gdb_dummy_fp_value
[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
292 reg_t arm11_gdb_dummy_fp_reg
=
294 "GDB dummy floating-point register", arm11_gdb_dummy_fp_value
, 0, 1, 96, NULL
, 0, NULL
, 0
297 u8 arm11_gdb_dummy_fps_value
[] = {0, 0, 0, 0};
299 reg_t arm11_gdb_dummy_fps_reg
=
301 "GDB dummy floating-point status register", arm11_gdb_dummy_fps_value
, 0, 1, 32, NULL
, 0, NULL
, 0
306 /** Check and if necessary take control of the system
308 * \param arm11 Target state variable.
309 * \param dscr If the current DSCR content is
310 * available a pointer to a word holding the
311 * DSCR can be passed. Otherwise use NULL.
313 void arm11_check_init(arm11_common_t
* arm11
, u32
* dscr
)
317 u32 dscr_local_tmp_copy
;
321 dscr
= &dscr_local_tmp_copy
;
322 *dscr
= arm11_read_DSCR(arm11
);
325 if (!(*dscr
& ARM11_DSCR_MODE_SELECT
))
327 DEBUG("Bringing target into debug mode");
329 *dscr
|= ARM11_DSCR_MODE_SELECT
; /* Halt debug-mode */
330 arm11_write_DSCR(arm11
, *dscr
);
332 /* add further reset initialization here */
334 if (*dscr
& ARM11_DSCR_CORE_HALTED
)
336 arm11
->target
->state
= TARGET_HALTED
;
337 arm11
->target
->debug_reason
= arm11_get_DSCR_debug_reason(*dscr
);
341 arm11
->target
->state
= TARGET_RUNNING
;
342 arm11
->target
->debug_reason
= DBG_REASON_NOTHALTED
;
345 arm11_sc7_clear_vbw(arm11
);
352 (arm11->reg_values[ARM11_RC_##x])
354 /** Save processor state.
356 * This is called when the HALT instruction has succeeded
357 * or on other occasions that stop the processor.
360 static void arm11_on_enter_debug_state(arm11_common_t
* arm11
)
365 for(i
= 0; i
< asizeof(arm11
->reg_values
); i
++)
367 arm11
->reg_list
[i
].valid
= 1;
368 arm11
->reg_list
[i
].dirty
= 0;
373 R(DSCR
) = arm11_read_DSCR(arm11
);
377 if (R(DSCR
) & ARM11_DSCR_WDTR_FULL
)
379 arm11_add_debug_SCAN_N(arm11
, 0x05, -1);
381 arm11_add_IR(arm11
, ARM11_INTEST
, -1);
383 scan_field_t chain5_fields
[3];
385 arm11_setup_field(arm11
, 32, NULL
, &R(WDTR
), chain5_fields
+ 0);
386 arm11_setup_field(arm11
, 1, NULL
, NULL
, chain5_fields
+ 1);
387 arm11_setup_field(arm11
, 1, NULL
, NULL
, chain5_fields
+ 2);
389 arm11_add_dr_scan_vc(asizeof(chain5_fields
), chain5_fields
, TAP_PD
);
393 arm11
->reg_list
[ARM11_RC_WDTR
].valid
= 0;
397 /* DSCR: set ARM11_DSCR_EXECUTE_ARM_INSTRUCTION_ENABLE */
398 /* ARM1176 spec says this is needed only for wDTR/rDTR's "ITR mode", but not to issue ITRs
399 ARM1136 seems to require this to issue ITR's as well */
401 u32 new_dscr
= R(DSCR
) | ARM11_DSCR_EXECUTE_ARM_INSTRUCTION_ENABLE
;
403 /* this executes JTAG queue: */
405 arm11_write_DSCR(arm11
, new_dscr
);
409 Before executing any instruction in debug state you have to drain the write buffer.
410 This ensures that no imprecise Data Aborts can return at a later point:*/
412 /** \todo TODO: Test drain write buffer. */
417 /* MRC p14,0,R0,c5,c10,0 */
418 // arm11_run_instr_no_data1(arm11, /*0xee150e1a*/0xe320f000);
420 /* mcr 15, 0, r0, cr7, cr10, {4} */
421 arm11_run_instr_no_data1(arm11
, 0xee070f9a);
423 u32 dscr
= arm11_read_DSCR(arm11
);
425 DEBUG("DRAIN, DSCR %08x", dscr
);
427 if (dscr
& ARM11_DSCR_STICKY_IMPRECISE_DATA_ABORT
)
429 arm11_run_instr_no_data1(arm11
, 0xe320f000);
431 dscr
= arm11_read_DSCR(arm11
);
433 DEBUG("DRAIN, DSCR %08x (DONE)", dscr
);
441 arm11_run_instr_data_prepare(arm11
);
446 /** \todo TODO: handle other mode registers */
449 for (i
= 0; i
< 15; i
++)
451 /* MCR p14,0,R?,c0,c5,0 */
452 arm11_run_instr_data_from_core(arm11
, 0xEE000E15 | (i
<< 12), &R(RX
+ i
), 1);
458 /* check rDTRfull in DSCR */
460 if (R(DSCR
) & ARM11_DSCR_RDTR_FULL
)
462 /* MRC p14,0,R0,c0,c5,0 (move rDTR -> r0 (-> wDTR -> local var)) */
463 arm11_run_instr_data_from_core_via_r0(arm11
, 0xEE100E15, &R(RDTR
));
467 arm11
->reg_list
[ARM11_RC_RDTR
].valid
= 0;
472 /* MRS r0,CPSR (move CPSR -> r0 (-> wDTR -> local var)) */
473 arm11_run_instr_data_from_core_via_r0(arm11
, 0xE10F0000, &R(CPSR
));
477 /* MOV R0,PC (move PC -> r0 (-> wDTR -> local var)) */
478 arm11_run_instr_data_from_core_via_r0(arm11
, 0xE1A0000F, &R(PC
));
480 /* adjust PC depending on ARM state */
482 if (R(CPSR
) & ARM11_CPSR_J
) /* Java state */
484 arm11
->reg_values
[ARM11_RC_PC
] -= 0;
486 else if (R(CPSR
) & ARM11_CPSR_T
) /* Thumb state */
488 arm11
->reg_values
[ARM11_RC_PC
] -= 4;
492 arm11
->reg_values
[ARM11_RC_PC
] -= 8;
495 if (arm11
->simulate_reset_on_next_halt
)
497 arm11
->simulate_reset_on_next_halt
= false;
499 DEBUG("Reset c1 Control Register");
501 /* Write 0 (reset value) to Control register 0 to disable MMU/Cache etc. */
503 /* MCR p15,0,R0,c1,c0,0 */
504 arm11_run_instr_data_to_core_via_r0(arm11
, 0xee010f10, 0);
510 arm11_run_instr_data_finish(arm11
);
512 arm11_dump_reg_changes(arm11
);
515 void arm11_dump_reg_changes(arm11_common_t
* arm11
)
518 for(i
= 0; i
< ARM11_REGCACHE_COUNT
; i
++)
520 if (!arm11
->reg_list
[i
].valid
)
522 if (arm11
->reg_history
[i
].valid
)
523 INFO("%8s INVALID (%08x)", arm11_reg_defs
[i
].name
, arm11
->reg_history
[i
].value
);
527 if (arm11
->reg_history
[i
].valid
)
529 if (arm11
->reg_history
[i
].value
!= arm11
->reg_values
[i
])
530 INFO("%8s %08x (%08x)", arm11_reg_defs
[i
].name
, arm11
->reg_values
[i
], arm11
->reg_history
[i
].value
);
534 INFO("%8s %08x (INVALID)", arm11_reg_defs
[i
].name
, arm11
->reg_values
[i
]);
541 /** Restore processor state
543 * This is called in preparation for the RESTART function.
546 void arm11_leave_debug_state(arm11_common_t
* arm11
)
550 arm11_run_instr_data_prepare(arm11
);
552 /** \todo TODO: handle other mode registers */
554 /* restore R1 - R14 */
556 for (i
= 1; i
< 15; i
++)
558 if (!arm11
->reg_list
[ARM11_RC_RX
+ i
].dirty
)
561 /* MRC p14,0,r?,c0,c5,0 */
562 arm11_run_instr_data_to_core1(arm11
, 0xee100e15 | (i
<< 12), R(RX
+ i
));
564 // DEBUG("RESTORE R" ZU " %08x", i, R(RX + i));
567 arm11_run_instr_data_finish(arm11
);
570 /* spec says clear wDTR and rDTR; we assume they are clear as
571 otherwise our programming would be sloppy */
574 u32 DSCR
= arm11_read_DSCR(arm11
);
576 if (DSCR
& (ARM11_DSCR_RDTR_FULL
| ARM11_DSCR_WDTR_FULL
))
578 ERROR("wDTR/rDTR inconsistent (DSCR %08x)", DSCR
);
582 arm11_run_instr_data_prepare(arm11
);
584 /* restore original wDTR */
586 if ((R(DSCR
) & ARM11_DSCR_WDTR_FULL
) || arm11
->reg_list
[ARM11_RC_WDTR
].dirty
)
588 /* MCR p14,0,R0,c0,c5,0 */
589 arm11_run_instr_data_to_core_via_r0(arm11
, 0xee000e15, R(WDTR
));
595 arm11_run_instr_data_to_core_via_r0(arm11
, 0xe129f000, R(CPSR
));
601 arm11_run_instr_data_to_core_via_r0(arm11
, 0xe1a0f000, R(PC
));
606 /* MRC p14,0,r0,c0,c5,0 */
607 arm11_run_instr_data_to_core1(arm11
, 0xee100e15, R(R0
));
609 arm11_run_instr_data_finish(arm11
);
614 arm11_write_DSCR(arm11
, R(DSCR
));
619 if (R(DSCR
) & ARM11_DSCR_RDTR_FULL
|| arm11
->reg_list
[ARM11_RC_RDTR
].dirty
)
621 arm11_add_debug_SCAN_N(arm11
, 0x05, -1);
623 arm11_add_IR(arm11
, ARM11_EXTEST
, -1);
625 scan_field_t chain5_fields
[3];
627 u8 Ready
= 0; /* ignored */
628 u8 Valid
= 0; /* ignored */
630 arm11_setup_field(arm11
, 32, &R(RDTR
), NULL
, chain5_fields
+ 0);
631 arm11_setup_field(arm11
, 1, &Ready
, NULL
, chain5_fields
+ 1);
632 arm11_setup_field(arm11
, 1, &Valid
, NULL
, chain5_fields
+ 2);
634 arm11_add_dr_scan_vc(asizeof(chain5_fields
), chain5_fields
, TAP_PD
);
637 arm11_record_register_history(arm11
);
640 void arm11_record_register_history(arm11_common_t
* arm11
)
643 for(i
= 0; i
< ARM11_REGCACHE_COUNT
; i
++)
645 arm11
->reg_history
[i
].value
= arm11
->reg_values
[i
];
646 arm11
->reg_history
[i
].valid
= arm11
->reg_list
[i
].valid
;
648 arm11
->reg_list
[i
].valid
= 0;
649 arm11
->reg_list
[i
].dirty
= 0;
654 /* poll current target status */
655 int arm11_poll(struct target_s
*target
)
659 arm11_common_t
* arm11
= target
->arch_info
;
661 if (arm11
->trst_active
)
664 u32 dscr
= arm11_read_DSCR(arm11
);
666 DEBUG("DSCR %08x", dscr
);
668 arm11_check_init(arm11
, &dscr
);
670 if (dscr
& ARM11_DSCR_CORE_HALTED
)
672 if (target
->state
!= TARGET_HALTED
)
674 enum target_state old_state
= target
->state
;
676 DEBUG("enter TARGET_HALTED");
677 target
->state
= TARGET_HALTED
;
678 target
->debug_reason
= arm11_get_DSCR_debug_reason(dscr
);
679 arm11_on_enter_debug_state(arm11
);
681 target_call_event_callbacks(target
,
682 old_state
== TARGET_DEBUG_RUNNING
? TARGET_EVENT_DEBUG_HALTED
: TARGET_EVENT_HALTED
);
687 if (target
->state
!= TARGET_RUNNING
&& target
->state
!= TARGET_DEBUG_RUNNING
)
689 DEBUG("enter TARGET_RUNNING");
690 target
->state
= TARGET_RUNNING
;
691 target
->debug_reason
= DBG_REASON_NOTHALTED
;
697 /* architecture specific status reply */
698 int arm11_arch_state(struct target_s
*target
)
700 FNC_INFO_NOTIMPLEMENTED
;
706 /* target request support */
707 int arm11_target_request_data(struct target_s
*target
, u32 size
, u8
*buffer
)
709 FNC_INFO_NOTIMPLEMENTED
;
716 /* target execution control */
717 int arm11_halt(struct target_s
*target
)
721 arm11_common_t
* arm11
= target
->arch_info
;
723 DEBUG("target->state: %s", target_state_strings
[target
->state
]);
725 if (target
->state
== TARGET_UNKNOWN
)
727 arm11
->simulate_reset_on_next_halt
= true;
730 if (target
->state
== TARGET_HALTED
)
732 WARNING("target was already halted");
733 return ERROR_TARGET_ALREADY_HALTED
;
736 if (arm11
->trst_active
)
738 arm11
->halt_requested
= true;
742 arm11_add_IR(arm11
, ARM11_HALT
, TAP_RTI
);
744 jtag_execute_queue();
750 dscr
= arm11_read_DSCR(arm11
);
752 if (dscr
& ARM11_DSCR_CORE_HALTED
)
756 arm11_on_enter_debug_state(arm11
);
758 enum target_state old_state
= target
->state
;
760 target
->state
= TARGET_HALTED
;
761 target
->debug_reason
= arm11_get_DSCR_debug_reason(dscr
);
763 target_call_event_callbacks(target
,
764 old_state
== TARGET_DEBUG_RUNNING
? TARGET_EVENT_DEBUG_HALTED
: TARGET_EVENT_HALTED
);
770 int arm11_resume(struct target_s
*target
, int current
, u32 address
, int handle_breakpoints
, int debug_execution
)
774 // DEBUG("current %d address %08x handle_breakpoints %d debug_execution %d",
775 // current, address, handle_breakpoints, debug_execution);
777 arm11_common_t
* arm11
= target
->arch_info
;
779 DEBUG("target->state: %s", target_state_strings
[target
->state
]);
781 if (target
->state
!= TARGET_HALTED
)
783 WARNING("target was not halted");
784 return ERROR_TARGET_NOT_HALTED
;
790 INFO("RESUME PC %08x%s", R(PC
), !current
? "!" : "");
792 /* clear breakpoints/watchpoints and VCR*/
793 arm11_sc7_clear_vbw(arm11
);
795 /* Set up breakpoints */
796 if (!debug_execution
)
798 /* check if one matches PC and step over it if necessary */
802 for (bp
= target
->breakpoints
; bp
; bp
= bp
->next
)
804 if (bp
->address
== R(PC
))
806 DEBUG("must step over %08x", bp
->address
);
807 arm11_step(target
, 1, 0, 0);
812 /* set all breakpoints */
816 for (bp
= target
->breakpoints
; bp
; bp
= bp
->next
)
818 arm11_sc7_action_t brp
[2];
821 brp
[0].address
= ARM11_SC7_BVR0
+ brp_num
;
822 brp
[0].value
= bp
->address
;
824 brp
[1].address
= ARM11_SC7_BCR0
+ brp_num
;
825 brp
[1].value
= 0x1 | (3 << 1) | (0x0F << 5) | (0 << 14) | (0 << 16) | (0 << 20) | (0 << 21);
827 arm11_sc7_run(arm11
, brp
, asizeof(brp
));
829 DEBUG("Add BP " ZU
" at %08x", brp_num
, bp
->address
);
834 arm11_sc7_set_vcr(arm11
, arm11_vcr
);
838 arm11_leave_debug_state(arm11
);
840 arm11_add_IR(arm11
, ARM11_RESTART
, TAP_RTI
);
842 jtag_execute_queue();
846 u32 dscr
= arm11_read_DSCR(arm11
);
848 DEBUG("DSCR %08x", dscr
);
850 if (dscr
& ARM11_DSCR_CORE_RESTARTED
)
854 if (!debug_execution
)
856 target
->state
= TARGET_RUNNING
;
857 target
->debug_reason
= DBG_REASON_NOTHALTED
;
858 target_call_event_callbacks(target
, TARGET_EVENT_RESUMED
);
862 target
->state
= TARGET_DEBUG_RUNNING
;
863 target
->debug_reason
= DBG_REASON_NOTHALTED
;
864 target_call_event_callbacks(target
, TARGET_EVENT_DEBUG_RESUMED
);
870 int arm11_step(struct target_s
*target
, int current
, u32 address
, int handle_breakpoints
)
874 DEBUG("target->state: %s", target_state_strings
[target
->state
]);
876 if (target
->state
!= TARGET_HALTED
)
878 WARNING("target was not halted");
879 return ERROR_TARGET_NOT_HALTED
;
882 arm11_common_t
* arm11
= target
->arch_info
;
887 INFO("STEP PC %08x%s", R(PC
), !current
? "!" : "");
889 /** \todo TODO: Thumb not supported here */
891 u32 next_instruction
;
893 arm11_read_memory_word(arm11
, R(PC
), &next_instruction
);
896 if ((next_instruction
& 0xFFF00070) == 0xe1200070)
899 arm11
->reg_list
[ARM11_RC_PC
].valid
= 1;
900 arm11
->reg_list
[ARM11_RC_PC
].dirty
= 0;
901 INFO("Skipping BKPT");
903 /* skip over Wait for interrupt / Standby */
904 /* mcr 15, 0, r?, cr7, cr0, {4} */
905 else if ((next_instruction
& 0xFFFF0FFF) == 0xee070f90)
908 arm11
->reg_list
[ARM11_RC_PC
].valid
= 1;
909 arm11
->reg_list
[ARM11_RC_PC
].dirty
= 0;
910 INFO("Skipping WFI");
912 /* ignore B to self */
913 else if ((next_instruction
& 0xFEFFFFFF) == 0xeafffffe)
915 INFO("Not stepping jump to self");
919 /** \todo TODO: check if break-/watchpoints make any sense at all in combination
922 /** \todo TODO: check if disabling IRQs might be a good idea here. Alternatively
923 * the VCR might be something worth looking into. */
926 /* Set up breakpoint for stepping */
928 arm11_sc7_action_t brp
[2];
931 brp
[0].address
= ARM11_SC7_BVR0
;
932 brp
[0].value
= R(PC
);
934 brp
[1].address
= ARM11_SC7_BCR0
;
935 brp
[1].value
= 0x1 | (3 << 1) | (0x0F << 5) | (0 << 14) | (0 << 16) | (0 << 20) | (2 << 21);
937 arm11_sc7_run(arm11
, brp
, asizeof(brp
));
941 arm11_leave_debug_state(arm11
);
943 arm11_add_IR(arm11
, ARM11_RESTART
, TAP_RTI
);
945 jtag_execute_queue();
947 /** \todo TODO: add a timeout */
953 u32 dscr
= arm11_read_DSCR(arm11
);
955 DEBUG("DSCR %08x", dscr
);
957 if ((dscr
& (ARM11_DSCR_CORE_RESTARTED
| ARM11_DSCR_CORE_HALTED
)) ==
958 (ARM11_DSCR_CORE_RESTARTED
| ARM11_DSCR_CORE_HALTED
))
962 /* clear breakpoint */
963 arm11_sc7_clear_vbw(arm11
);
966 arm11_on_enter_debug_state(arm11
);
969 // target->state = TARGET_HALTED;
970 target
->debug_reason
= DBG_REASON_SINGLESTEP
;
972 target_call_event_callbacks(target
, TARGET_EVENT_HALTED
);
978 /* target reset control */
979 int arm11_assert_reset(struct target_s
*target
)
984 /* assert reset lines */
985 /* resets only the DBGTAP, not the ARM */
987 jtag_add_reset(1, 0);
988 jtag_add_sleep(5000);
990 arm11_common_t
* arm11
= target
->arch_info
;
991 arm11
->trst_active
= true;
997 int arm11_deassert_reset(struct target_s
*target
)
1002 DEBUG("target->state: %s", target_state_strings
[target
->state
]);
1004 /* deassert reset lines */
1005 jtag_add_reset(0, 0);
1007 arm11_common_t
* arm11
= target
->arch_info
;
1008 arm11
->trst_active
= false;
1010 if (arm11
->halt_requested
)
1011 return arm11_halt(target
);
1017 int arm11_soft_reset_halt(struct target_s
*target
)
1019 FNC_INFO_NOTIMPLEMENTED
;
1024 int arm11_prepare_reset_halt(struct target_s
*target
)
1026 FNC_INFO_NOTIMPLEMENTED
;
1032 /* target register access for gdb */
1033 int arm11_get_gdb_reg_list(struct target_s
*target
, struct reg_s
**reg_list
[], int *reg_list_size
)
1037 arm11_common_t
* arm11
= target
->arch_info
;
1039 if (target
->state
!= TARGET_HALTED
)
1041 return ERROR_TARGET_NOT_HALTED
;
1044 *reg_list_size
= ARM11_GDB_REGISTER_COUNT
;
1045 *reg_list
= malloc(sizeof(reg_t
*) * ARM11_GDB_REGISTER_COUNT
);
1048 for (i
= 16; i
< 24; i
++)
1050 (*reg_list
)[i
] = &arm11_gdb_dummy_fp_reg
;
1053 (*reg_list
)[24] = &arm11_gdb_dummy_fps_reg
;
1057 for (i
= 0; i
< ARM11_REGCACHE_COUNT
; i
++)
1059 if (arm11_reg_defs
[i
].gdb_num
== -1)
1062 (*reg_list
)[arm11_reg_defs
[i
].gdb_num
] = arm11
->reg_list
+ i
;
1069 /* target memory access
1070 * size: 1 = byte (8bit), 2 = half-word (16bit), 4 = word (32bit)
1071 * count: number of items of <size>
1073 int arm11_read_memory(struct target_s
*target
, u32 address
, u32 size
, u32 count
, u8
*buffer
)
1075 /** \todo TODO: check if buffer cast to u32* and u16* might cause alignment problems */
1079 DEBUG("ADDR %08x SIZE %08x COUNT %08x", address
, size
, count
);
1081 arm11_common_t
* arm11
= target
->arch_info
;
1083 arm11_run_instr_data_prepare(arm11
);
1085 /* MRC p14,0,r0,c0,c5,0 */
1086 arm11_run_instr_data_to_core1(arm11
, 0xee100e15, address
);
1091 /** \todo TODO: check if dirty is the right choice to force a rewrite on arm11_resume() */
1092 arm11
->reg_list
[ARM11_RC_R1
].dirty
= 1;
1095 for (i
= 0; i
< count
; i
++)
1097 /* ldrb r1, [r0], #1 */
1098 arm11_run_instr_no_data1(arm11
, 0xe4d01001);
1101 /* MCR p14,0,R1,c0,c5,0 */
1102 arm11_run_instr_data_from_core(arm11
, 0xEE001E15, &res
, 1);
1111 arm11
->reg_list
[ARM11_RC_R1
].dirty
= 1;
1113 u16
* buf16
= (u16
*)buffer
;
1116 for (i
= 0; i
< count
; i
++)
1118 /* ldrh r1, [r0], #2 */
1119 arm11_run_instr_no_data1(arm11
, 0xe0d010b2);
1123 /* MCR p14,0,R1,c0,c5,0 */
1124 arm11_run_instr_data_from_core(arm11
, 0xEE001E15, &res
, 1);
1134 /* LDC p14,c5,[R0],#4 */
1135 arm11_run_instr_data_from_core(arm11
, 0xecb05e01, (u32
*)buffer
, count
);
1139 arm11_run_instr_data_finish(arm11
);
1144 int arm11_write_memory(struct target_s
*target
, u32 address
, u32 size
, u32 count
, u8
*buffer
)
1148 DEBUG("ADDR %08x SIZE %08x COUNT %08x", address
, size
, count
);
1150 arm11_common_t
* arm11
= target
->arch_info
;
1152 arm11_run_instr_data_prepare(arm11
);
1154 /* MRC p14,0,r0,c0,c5,0 */
1155 arm11_run_instr_data_to_core1(arm11
, 0xee100e15, address
);
1161 arm11
->reg_list
[ARM11_RC_R1
].dirty
= 1;
1164 for (i
= 0; i
< count
; i
++)
1166 /* MRC p14,0,r1,c0,c5,0 */
1167 arm11_run_instr_data_to_core1(arm11
, 0xee101e15, *buffer
++);
1169 /* strb r1, [r0], #1 */
1170 arm11_run_instr_no_data1(arm11
, 0xe4c01001);
1178 arm11
->reg_list
[ARM11_RC_R1
].dirty
= 1;
1180 u16
* buf16
= (u16
*)buffer
;
1183 for (i
= 0; i
< count
; i
++)
1185 /* MRC p14,0,r1,c0,c5,0 */
1186 arm11_run_instr_data_to_core1(arm11
, 0xee101e15, *buf16
++);
1188 /* strh r1, [r0], #2 */
1189 arm11_run_instr_no_data1(arm11
, 0xe0c010b2);
1196 /** \todo TODO: check if buffer cast to u32* might cause alignment problems */
1198 if (!arm11_config_memwrite_burst
)
1200 /* STC p14,c5,[R0],#4 */
1201 arm11_run_instr_data_to_core(arm11
, 0xeca05e01, (u32
*)buffer
, count
);
1205 /* STC p14,c5,[R0],#4 */
1206 arm11_run_instr_data_to_core_noack(arm11
, 0xeca05e01, (u32
*)buffer
, count
);
1213 /* r0 verification */
1217 /* MCR p14,0,R0,c0,c5,0 */
1218 arm11_run_instr_data_from_core(arm11
, 0xEE000E15, &r0
, 1);
1220 if (address
+ size
* count
!= r0
)
1222 ERROR("Data transfer failed. (%d)", (r0
- address
) - size
* count
);
1224 if (arm11_config_memwrite_burst
)
1225 ERROR("use 'arm11 memwrite burst disable' to disable fast burst mode");
1227 if (arm11_config_memwrite_error_fatal
)
1234 arm11_run_instr_data_finish(arm11
);
1243 /* write target memory in multiples of 4 byte, optimized for writing large quantities of data */
1244 int arm11_bulk_write_memory(struct target_s
*target
, u32 address
, u32 count
, u8
*buffer
)
1248 return arm11_write_memory(target
, address
, 4, count
, buffer
);
1252 int arm11_checksum_memory(struct target_s
*target
, u32 address
, u32 count
, u32
* checksum
)
1254 FNC_INFO_NOTIMPLEMENTED
;
1260 /* target break-/watchpoint control
1261 * rw: 0 = write, 1 = read, 2 = access
1263 int arm11_add_breakpoint(struct target_s
*target
, breakpoint_t
*breakpoint
)
1267 arm11_common_t
* arm11
= target
->arch_info
;
1270 if (breakpoint
->type
== BKPT_SOFT
)
1272 INFO("sw breakpoint requested, but software breakpoints not enabled");
1273 return ERROR_TARGET_RESOURCE_NOT_AVAILABLE
;
1277 if (!arm11
->free_brps
)
1279 INFO("no breakpoint unit available for hardware breakpoint");
1280 return ERROR_TARGET_RESOURCE_NOT_AVAILABLE
;
1283 if (breakpoint
->length
!= 4)
1285 INFO("only breakpoints of four bytes length supported");
1286 return ERROR_TARGET_RESOURCE_NOT_AVAILABLE
;
1294 int arm11_remove_breakpoint(struct target_s
*target
, breakpoint_t
*breakpoint
)
1298 arm11_common_t
* arm11
= target
->arch_info
;
1305 int arm11_add_watchpoint(struct target_s
*target
, watchpoint_t
*watchpoint
)
1307 FNC_INFO_NOTIMPLEMENTED
;
1312 int arm11_remove_watchpoint(struct target_s
*target
, watchpoint_t
*watchpoint
)
1314 FNC_INFO_NOTIMPLEMENTED
;
1320 /* target algorithm support */
1321 int arm11_run_algorithm(struct target_s
*target
, int num_mem_params
, mem_param_t
*mem_params
, int num_reg_params
, reg_param_t
*reg_param
, u32 entry_point
, u32 exit_point
, int timeout_ms
, void *arch_info
)
1323 FNC_INFO_NOTIMPLEMENTED
;
1328 int arm11_target_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
, struct target_s
*target
)
1334 ERROR("'target arm11' 4th argument <jtag chain pos>");
1338 int chain_pos
= strtoul(args
[3], NULL
, 0);
1340 NEW(arm11_common_t
, arm11
, 1);
1342 arm11
->target
= target
;
1344 /* prepare JTAG information for the new target */
1345 arm11
->jtag_info
.chain_pos
= chain_pos
;
1346 arm11
->jtag_info
.scann_size
= 5;
1348 arm_jtag_setup_connection(&arm11
->jtag_info
);
1350 jtag_device_t
*device
= jtag_get_device(chain_pos
);
1352 if (device
->ir_length
!= 5)
1354 ERROR("'target arm11' expects 'jtag_device 5 0x01 0x1F 0x1E'");
1358 target
->arch_info
= arm11
;
1363 int arm11_init_target(struct command_context_s
*cmd_ctx
, struct target_s
*target
)
1367 arm11_common_t
* arm11
= target
->arch_info
;
1371 arm11_add_IR(arm11
, ARM11_IDCODE
, -1);
1373 scan_field_t idcode_field
;
1375 arm11_setup_field(arm11
, 32, NULL
, &arm11
->device_id
, &idcode_field
);
1377 arm11_add_dr_scan_vc(1, &idcode_field
, TAP_PD
);
1381 arm11_add_debug_SCAN_N(arm11
, 0x00, -1);
1383 arm11_add_IR(arm11
, ARM11_INTEST
, -1);
1385 scan_field_t chain0_fields
[2];
1387 arm11_setup_field(arm11
, 32, NULL
, &arm11
->didr
, chain0_fields
+ 0);
1388 arm11_setup_field(arm11
, 8, NULL
, &arm11
->implementor
, chain0_fields
+ 1);
1390 arm11_add_dr_scan_vc(asizeof(chain0_fields
), chain0_fields
, TAP_RTI
);
1392 jtag_execute_queue();
1395 switch (arm11
->device_id
& 0x0FFFF000)
1397 case 0x07B36000: INFO("found ARM1136"); break;
1398 case 0x07B56000: INFO("found ARM1156"); break;
1399 case 0x07B76000: INFO("found ARM1176"); break;
1402 ERROR("'target arm11' expects IDCODE 0x*7B*7****");
1407 arm11
->debug_version
= (arm11
->didr
>> 16) & 0x0F;
1409 if (arm11
->debug_version
!= ARM11_DEBUG_V6
&&
1410 arm11
->debug_version
!= ARM11_DEBUG_V61
)
1412 ERROR("Only ARMv6 v6 and v6.1 architectures supported.");
1417 arm11
->brp
= ((arm11
->didr
>> 24) & 0x0F) + 1;
1418 arm11
->wrp
= ((arm11
->didr
>> 28) & 0x0F) + 1;
1420 /** \todo TODO: reserve one brp slot if we allow breakpoints during step */
1421 arm11
->free_brps
= arm11
->brp
;
1422 arm11
->free_wrps
= arm11
->wrp
;
1424 DEBUG("IDCODE %08x IMPLEMENTOR %02x DIDR %08x",
1429 arm11_build_reg_cache(target
);
1432 /* as a side-effect this reads DSCR and thus
1433 * clears the ARM11_DSCR_STICKY_PRECISE_DATA_ABORT / Sticky Precise Data Abort Flag
1434 * as suggested by the spec.
1437 arm11_check_init(arm11
, NULL
);
1442 int arm11_quit(void)
1444 FNC_INFO_NOTIMPLEMENTED
;
1449 /** Load a register that is marked !valid in the register cache */
1450 int arm11_get_reg(reg_t
*reg
)
1454 target_t
* target
= ((arm11_reg_state_t
*)reg
->arch_info
)->target
;
1456 if (target
->state
!= TARGET_HALTED
)
1458 return ERROR_TARGET_NOT_HALTED
;
1461 /** \todo TODO: Check this. We assume that all registers are fetched at debug entry. */
1464 arm11_common_t
*arm11
= target
->arch_info
;
1465 const arm11_reg_defs_t
* arm11_reg_info
= arm11_reg_defs
+ ((arm11_reg_state_t
*)reg
->arch_info
)->def_index
;
1471 /** Change a value in the register cache */
1472 int arm11_set_reg(reg_t
*reg
, u8
*buf
)
1476 target_t
* target
= ((arm11_reg_state_t
*)reg
->arch_info
)->target
;
1477 arm11_common_t
*arm11
= target
->arch_info
;
1478 // const arm11_reg_defs_t * arm11_reg_info = arm11_reg_defs + ((arm11_reg_state_t *)reg->arch_info)->def_index;
1480 arm11
->reg_values
[((arm11_reg_state_t
*)reg
->arch_info
)->def_index
] = buf_get_u32(buf
, 0, 32);
1488 void arm11_build_reg_cache(target_t
*target
)
1490 arm11_common_t
*arm11
= target
->arch_info
;
1492 NEW(reg_cache_t
, cache
, 1);
1493 NEW(reg_t
, reg_list
, ARM11_REGCACHE_COUNT
);
1494 NEW(arm11_reg_state_t
, arm11_reg_states
, ARM11_REGCACHE_COUNT
);
1496 if (arm11_regs_arch_type
== -1)
1497 arm11_regs_arch_type
= register_reg_arch_type(arm11_get_reg
, arm11_set_reg
);
1499 arm11
->reg_list
= reg_list
;
1501 /* Build the process context cache */
1502 cache
->name
= "arm11 registers";
1504 cache
->reg_list
= reg_list
;
1505 cache
->num_regs
= ARM11_REGCACHE_COUNT
;
1507 reg_cache_t
**cache_p
= register_get_last_cache_p(&target
->reg_cache
);
1510 // armv7m->core_cache = cache;
1511 // armv7m->process_context = cache;
1515 /* Not very elegant assertion */
1516 if (ARM11_REGCACHE_COUNT
!= asizeof(arm11
->reg_values
) ||
1517 ARM11_REGCACHE_COUNT
!= asizeof(arm11_reg_defs
) ||
1518 ARM11_REGCACHE_COUNT
!= ARM11_RC_MAX
)
1520 ERROR("arm11->reg_values inconsistent (%d " ZU
" " ZU
" %d)", ARM11_REGCACHE_COUNT
, asizeof(arm11
->reg_values
), asizeof(arm11_reg_defs
), ARM11_RC_MAX
);
1524 for (i
= 0; i
< ARM11_REGCACHE_COUNT
; i
++)
1526 reg_t
* r
= reg_list
+ i
;
1527 const arm11_reg_defs_t
* rd
= arm11_reg_defs
+ i
;
1528 arm11_reg_state_t
* rs
= arm11_reg_states
+ i
;
1532 r
->value
= (u8
*)(arm11
->reg_values
+ i
);
1535 r
->bitfield_desc
= NULL
;
1536 r
->num_bitfields
= 0;
1537 r
->arch_type
= arm11_regs_arch_type
;
1541 rs
->target
= target
;
1547 int arm11_handle_bool(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
, bool * var
, char * name
)
1551 INFO("%s is %s.", name
, *var
? "enabled" : "disabled");
1556 return ERROR_COMMAND_SYNTAX_ERROR
;
1561 case 'f': /* false */
1563 case 'd': /* disable */
1569 case 't': /* true */
1571 case 'e': /* enable */
1577 INFO("%s %s.", *var
? "Enabled" : "Disabled", name
);
1583 #define BOOL_WRAPPER(name, print_name) \
1584 int arm11_handle_bool_##name(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) \
1586 return arm11_handle_bool(cmd_ctx, cmd, args, argc, &arm11_config_##name, print_name); \
1589 #define RC_TOP(name, descr, more) \
1591 command_t * new_cmd = register_command(cmd_ctx, top_cmd, name, NULL, COMMAND_ANY, descr); \
1592 command_t * top_cmd = new_cmd; \
1596 #define RC_FINAL(name, descr, handler) \
1597 register_command(cmd_ctx, top_cmd, name, handler, COMMAND_ANY, descr);
1599 #define RC_FINAL_BOOL(name, descr, var) \
1600 register_command(cmd_ctx, top_cmd, name, arm11_handle_bool_##var, COMMAND_ANY, descr);
1603 BOOL_WRAPPER(memwrite_burst
, "memory write burst mode")
1604 BOOL_WRAPPER(memwrite_error_fatal
, "fatal error mode for memory writes")
1607 int arm11_handle_vcr(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1611 arm11_vcr
= strtoul(args
[0], NULL
, 0);
1615 return ERROR_COMMAND_SYNTAX_ERROR
;
1618 INFO("VCR 0x%08X", arm11_vcr
);
1623 int arm11_register_commands(struct command_context_s
*cmd_ctx
)
1627 command_t
* top_cmd
= NULL
;
1629 RC_TOP( "arm11", "arm11 specific commands",
1631 RC_TOP( "memwrite", "Control memory write transfer mode",
1633 RC_FINAL_BOOL( "burst", "Enable/Disable non-standard but fast burst mode (default: enabled)",
1636 RC_FINAL_BOOL( "error_fatal",
1637 "Terminate program if transfer error was found (default: enabled)",
1638 memwrite_error_fatal
)
1641 RC_FINAL( "vcr", "Control (Interrupt) Vector Catch 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)