- armv7a->armv4_5_mmu.armv4_5_cache.d_u_cache_enabled =
- (cortex_a8->cp15_control_reg & 0x4U) ? 1 : 0;
- armv7a->armv4_5_mmu.armv4_5_cache.i_cache_enabled =
- (cortex_a8->cp15_control_reg & 0x1000U) ? 1 : 0;
-
-
-}
-
-int cortex_a8_step(struct target_s *target, int current, uint32_t address,
- int handle_breakpoints)
-{
- struct armv7a_common_s *armv7a = target_to_armv7a(target);
- struct armv4_5_common_s *armv4_5 = &armv7a->armv4_5_common;
- breakpoint_t *breakpoint = NULL;
- breakpoint_t stepbreakpoint;
-
- int timeout = 100;
-
- if (target->state != TARGET_HALTED)
- {
- LOG_WARNING("target not halted");
- return ERROR_TARGET_NOT_HALTED;
- }
-
- /* current = 1: continue on current pc, otherwise continue at <address> */
- if (!current)
- {
- buf_set_u32(ARMV7A_CORE_REG_MODE(armv4_5->core_cache,
- armv4_5->core_mode, ARM_PC).value,
- 0, 32, address);
- }
- else
- {
- address = buf_get_u32(ARMV7A_CORE_REG_MODE(armv4_5->core_cache,
- armv4_5->core_mode, ARM_PC).value,
- 0, 32);
- }
-
- /* The front-end may request us not to handle breakpoints.
- * But since Cortex-A8 uses breakpoint for single step,
- * we MUST handle breakpoints.
- */
- handle_breakpoints = 1;
- if (handle_breakpoints) {
- breakpoint = breakpoint_find(target,
- buf_get_u32(ARMV7A_CORE_REG_MODE(armv4_5->core_cache,
- armv4_5->core_mode, 15).value,
- 0, 32));
- if (breakpoint)
- cortex_a8_unset_breakpoint(target, breakpoint);
- }
-
- /* Setup single step breakpoint */
- stepbreakpoint.address = address;
- stepbreakpoint.length = (armv7a->core_state == ARMV7A_STATE_THUMB) ? 2 : 4;
- stepbreakpoint.type = BKPT_HARD;
- stepbreakpoint.set = 0;
-
- /* Break on IVA mismatch */
- cortex_a8_set_breakpoint(target, &stepbreakpoint, 0x04);
-
- target->debug_reason = DBG_REASON_SINGLESTEP;
-
- cortex_a8_resume(target, 1, address, 0, 0);
-
- while (target->state != TARGET_HALTED)
- {
- cortex_a8_poll(target);
- if (--timeout == 0)
- {
- LOG_WARNING("timeout waiting for target halt");
- break;
- }
- }
-
- cortex_a8_unset_breakpoint(target, &stepbreakpoint);
- if (timeout > 0) target->debug_reason = DBG_REASON_BREAKPOINT;
-
- if (breakpoint)
- cortex_a8_set_breakpoint(target, breakpoint, 0);
-
- if (target->state != TARGET_HALTED)
- LOG_DEBUG("target stepped");
-
- return ERROR_OK;
-}
-
-int cortex_a8_restore_context(target_t *target)
-{
- int i;
- uint32_t value;
- struct armv7a_common_s *armv7a = target_to_armv7a(target);
- struct armv4_5_common_s *armv4_5 = &armv7a->armv4_5_common;
-
- LOG_DEBUG(" ");
-
- if (armv7a->pre_restore_context)
- armv7a->pre_restore_context(target);
-
- for (i = 15; i >= 0; i--)
- {
- if (ARMV7A_CORE_REG_MODE(armv4_5->core_cache,
- armv4_5->core_mode, i).dirty)
- {
- value = buf_get_u32(ARMV7A_CORE_REG_MODE(armv4_5->core_cache,
- armv4_5->core_mode, i).value,
- 0, 32);
- /* TODO Check return values */
- cortex_a8_dap_write_coreregister_u32(target, value, i);
- }
- }
-
- if (armv7a->post_restore_context)
- armv7a->post_restore_context(target);