aarch64: handle semihosting in aarch32 state
[fw/openocd] / src / target / arm7_9_common.c
index 7f0e3adb38826aa8d2b43a1d8308db7cef99aa31..797f61c9373b400991bc464e9c749321507eab28 100644 (file)
@@ -24,9 +24,7 @@
  *   GNU General Public License for more details.                          *
  *                                                                         *
  *   You should have received a copy of the GNU General Public License     *
- *   along with this program; if not, write to the                         *
- *   Free Software Foundation, Inc.,                                       *
- *   51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.           *
+ *   along with this program.  If not, see <http://www.gnu.org/licenses/>. *
  ***************************************************************************/
 
 #ifdef HAVE_CONFIG_H
@@ -57,8 +55,8 @@
  * shadowed registers, and support for the Thumb instruction set.
  *
  * Processor differences include things like presence or absence of MMU
- * and cache, pipeline sizes, use of a modified Harvard Architecure
- * (with separate instruction and data busses from the CPU), support
+ * and cache, pipeline sizes, use of a modified Harvard Architecture
+ * (with separate instruction and data buses from the CPU), support
  * for cpu clock gating during idle, and more.
  */
 
@@ -103,7 +101,8 @@ static void arm7_9_assign_wp(struct arm7_9_common *arm7_9, struct breakpoint *br
                arm7_9->wp_available--;
        } else
                LOG_ERROR("BUG: no hardware comparator available");
-       LOG_DEBUG("BPID: %" PRId32 " (0x%08" PRIx32 ") using hw wp: %d",
+
+       LOG_DEBUG("BPID: %" PRIu32 " (0x%08" TARGET_PRIxADDR ") using hw wp: %d",
                        breakpoint->unique_id,
                        breakpoint->address,
                        breakpoint->set);
@@ -189,7 +188,7 @@ static int arm7_9_set_breakpoint(struct target *target, struct breakpoint *break
        struct arm7_9_common *arm7_9 = target_to_arm7_9(target);
        int retval = ERROR_OK;
 
-       LOG_DEBUG("BPID: %" PRId32 ", Address: 0x%08" PRIx32 ", Type: %d",
+       LOG_DEBUG("BPID: %" PRIu32 ", Address: 0x%08" TARGET_PRIxADDR ", Type: %d",
                breakpoint->unique_id,
                breakpoint->address,
                breakpoint->type);
@@ -246,7 +245,7 @@ static int arm7_9_set_breakpoint(struct target *target, struct breakpoint *break
                        if (retval != ERROR_OK)
                                return retval;
                        if (verify != arm7_9->arm_bkpt) {
-                               LOG_ERROR("Unable to set 32 bit software breakpoint at address %08" PRIx32
+                               LOG_ERROR("Unable to set 32 bit software breakpoint at address %08" TARGET_PRIxADDR
                                                " - check that memory is read/writable", breakpoint->address);
                                return ERROR_OK;
                        }
@@ -266,7 +265,7 @@ static int arm7_9_set_breakpoint(struct target *target, struct breakpoint *break
                        if (retval != ERROR_OK)
                                return retval;
                        if (verify != arm7_9->thumb_bkpt) {
-                               LOG_ERROR("Unable to set thumb software breakpoint at address %08" PRIx32
+                               LOG_ERROR("Unable to set thumb software breakpoint at address %08" TARGET_PRIxADDR
                                                " - check that memory is read/writable", breakpoint->address);
                                return ERROR_OK;
                        }
@@ -301,7 +300,7 @@ static int arm7_9_unset_breakpoint(struct target *target, struct breakpoint *bre
        int retval = ERROR_OK;
        struct arm7_9_common *arm7_9 = target_to_arm7_9(target);
 
-       LOG_DEBUG("BPID: %" PRId32 ", Address: 0x%08" PRIx32,
+       LOG_DEBUG("BPID: %" PRIu32 ", Address: 0x%08" TARGET_PRIxADDR,
                breakpoint->unique_id,
                breakpoint->address);
 
@@ -311,7 +310,7 @@ static int arm7_9_unset_breakpoint(struct target *target, struct breakpoint *bre
        }
 
        if (breakpoint->type == BKPT_HARD) {
-               LOG_DEBUG("BPID: %" PRId32 " Releasing hw wp: %d",
+               LOG_DEBUG("BPID: %" PRIu32 " Releasing hw wp: %d",
                        breakpoint->unique_id,
                        breakpoint->set);
                if (breakpoint->set == 1) {
@@ -350,12 +349,12 @@ static int arm7_9_unset_breakpoint(struct target *target, struct breakpoint *bre
                        if (retval != ERROR_OK)
                                return retval;
                        current_instr = target_buffer_get_u16(target, (uint8_t *)&current_instr);
-                       if (current_instr == arm7_9->thumb_bkpt)
+                       if (current_instr == arm7_9->thumb_bkpt) {
                                retval = target_write_memory(target,
                                                breakpoint->address, 2, 1, breakpoint->orig_instr);
                                if (retval != ERROR_OK)
                                        return retval;
-
+                       }
                }
 
                if (--arm7_9->sw_breakpoint_count == 0) {
@@ -628,16 +627,16 @@ int arm7_9_execute_sys_speed(struct target *target)
        /* set RESTART instruction */
        if (arm7_9->need_bypass_before_restart) {
                arm7_9->need_bypass_before_restart = 0;
-               retval = arm_jtag_set_instr(jtag_info, 0xf, NULL, TAP_IDLE);
+               retval = arm_jtag_set_instr(jtag_info->tap, 0xf, NULL, TAP_IDLE);
                if (retval != ERROR_OK)
                        return retval;
        }
-       retval = arm_jtag_set_instr(jtag_info, 0x4, NULL, TAP_IDLE);
+       retval = arm_jtag_set_instr(jtag_info->tap, 0x4, NULL, TAP_IDLE);
        if (retval != ERROR_OK)
                return retval;
 
-       long long then = timeval_ms();
-       int timeout;
+       int64_t then = timeval_ms();
+       bool timeout;
        while (!(timeout = ((timeval_ms()-then) > 1000))) {
                /* read debug status register */
                embeddedice_read_reg(dbg_stat);
@@ -682,11 +681,11 @@ static int arm7_9_execute_fast_sys_speed(struct target *target)
        /* set RESTART instruction */
        if (arm7_9->need_bypass_before_restart) {
                arm7_9->need_bypass_before_restart = 0;
-               retval = arm_jtag_set_instr(jtag_info, 0xf, NULL, TAP_IDLE);
+               retval = arm_jtag_set_instr(jtag_info->tap, 0xf, NULL, TAP_IDLE);
                if (retval != ERROR_OK)
                        return retval;
        }
-       retval = arm_jtag_set_instr(jtag_info, 0x4, NULL, TAP_IDLE);
+       retval = arm_jtag_set_instr(jtag_info->tap, 0x4, NULL, TAP_IDLE);
        if (retval != ERROR_OK)
                return retval;
 
@@ -875,6 +874,13 @@ int arm7_9_assert_reset(struct target *target)
        enum reset_types jtag_reset_config = jtag_get_reset_config();
        bool use_event = false;
 
+       /* TODO: apply hw reset signal in not examined state */
+       if (!(target_was_examined(target))) {
+               LOG_WARNING("Reset is not asserted because the target is not examined.");
+               LOG_WARNING("Use a reset button or power cycle the target.");
+               return ERROR_TARGET_NOT_EXAMINED;
+       }
+
        LOG_DEBUG("target->state: %s", target_state_name(target));
 
        if (target_has_event_action(target, TARGET_EVENT_RESET_ASSERT))
@@ -1003,7 +1009,7 @@ int arm7_9_deassert_reset(struct target *target)
 
 /**
  * Clears the halt condition for an ARM7/9 target.  If it isn't coming out of
- * reset and if DBGRQ is used, it is progammed to be deasserted.  If the reset
+ * reset and if DBGRQ is used, it is programmed to be deasserted.  If the reset
  * vector catch was used, it is restored.  Otherwise, the control value is
  * restored and the watchpoint unit is restored if it was in use.
  *
@@ -1135,20 +1141,20 @@ int arm7_9_soft_reset_halt(struct target *target)
        cpsr &= ~0xff;
        cpsr |= 0xd3;
        arm_set_cpsr(arm, cpsr);
-       arm->cpsr->dirty = 1;
+       arm->cpsr->dirty = true;
 
        /* start fetching from 0x0 */
        buf_set_u32(arm->pc->value, 0, 32, 0x0);
-       arm->pc->dirty = 1;
-       arm->pc->valid = 1;
+       arm->pc->dirty = true;
+       arm->pc->valid = true;
 
        /* reset registers */
        for (i = 0; i <= 14; i++) {
                struct reg *r = arm_reg_current(arm, i);
 
                buf_set_u32(r->value, 0, 32, 0xffffffff);
-               r->dirty = 1;
-               r->valid = 1;
+               r->dirty = true;
+               r->valid = true;
        }
 
        retval = target_call_event_callbacks(target, TARGET_EVENT_HALTED);
@@ -1340,7 +1346,7 @@ static int arm7_9_debug_entry(struct target *target)
                buf_set_u32(r->value, 0, 32, context[i]);
                /* r0 and r15 (pc) have to be restored later */
                r->dirty = (i == 0) || (i == 15);
-               r->valid = 1;
+               r->valid = true;
        }
 
        LOG_DEBUG("entered debug state at PC 0x%" PRIx32 "", context[15]);
@@ -1353,8 +1359,8 @@ static int arm7_9_debug_entry(struct target *target)
                if (retval != ERROR_OK)
                        return retval;
                buf_set_u32(arm->spsr->value, 0, 32, spsr);
-               arm->spsr->dirty = 0;
-               arm->spsr->valid = 1;
+               arm->spsr->dirty = false;
+               arm->spsr->valid = true;
        }
 
        retval = jtag_execute_queue();
@@ -1385,6 +1391,11 @@ static int arm7_9_full_context(struct target *target)
        int retval;
        struct arm7_9_common *arm7_9 = target_to_arm7_9(target);
        struct arm *arm = &arm7_9->arm;
+       struct {
+               uint32_t value;
+               uint8_t *reg_p;
+       } read_cache[6 * (16 + 1)];
+       int read_cache_idx = 0;
 
        LOG_DEBUG("-");
 
@@ -1405,13 +1416,13 @@ static int arm7_9_full_context(struct target *target)
                uint32_t mask = 0;
                uint32_t *reg_p[16];
                int j;
-               int valid = 1;
+               bool valid = true;
 
                /* check if there are invalid registers in the current mode
                 */
                for (j = 0; j <= 16; j++) {
-                       if (ARMV4_5_CORE_REG_MODE(arm->core_cache, armv4_5_number_to_mode(i), j).valid == 0)
-                               valid = 0;
+                       if (!ARMV4_5_CORE_REG_MODE(arm->core_cache, armv4_5_number_to_mode(i), j).valid)
+                               valid = false;
                }
 
                if (!valid) {
@@ -1425,19 +1436,21 @@ static int arm7_9_full_context(struct target *target)
                        arm7_9->write_xpsr_im8(target, tmp_cpsr & 0xff, 0, 0);
 
                        for (j = 0; j < 15; j++) {
-                               if (ARMV4_5_CORE_REG_MODE(arm->core_cache,
-                                               armv4_5_number_to_mode(i), j).valid == 0) {
-                                       reg_p[j] = (uint32_t *)ARMV4_5_CORE_REG_MODE(
+                               if (!ARMV4_5_CORE_REG_MODE(arm->core_cache,
+                                               armv4_5_number_to_mode(i), j).valid) {
+                                       read_cache[read_cache_idx].reg_p = ARMV4_5_CORE_REG_MODE(
                                                        arm->core_cache,
                                                        armv4_5_number_to_mode(i),
                                                        j).value;
+                                       reg_p[j] = &read_cache[read_cache_idx].value;
+                                       read_cache_idx++;
                                        mask |= 1 << j;
                                        ARMV4_5_CORE_REG_MODE(arm->core_cache,
                                                armv4_5_number_to_mode(i),
-                                               j).valid = 1;
+                                               j).valid = true;
                                        ARMV4_5_CORE_REG_MODE(arm->core_cache,
                                                armv4_5_number_to_mode(i),
-                                               j).dirty = 0;
+                                               j).dirty = false;
                                }
                        }
 
@@ -1446,15 +1459,16 @@ static int arm7_9_full_context(struct target *target)
                                arm7_9->read_core_regs(target, mask, reg_p);
 
                        /* check if the PSR has to be read */
-                       if (ARMV4_5_CORE_REG_MODE(arm->core_cache, armv4_5_number_to_mode(i),
-                                       16).valid == 0) {
-                               arm7_9->read_xpsr(target,
-                                       (uint32_t *)ARMV4_5_CORE_REG_MODE(arm->core_cache,
-                                               armv4_5_number_to_mode(i), 16).value, 1);
+                       if (!ARMV4_5_CORE_REG_MODE(arm->core_cache, armv4_5_number_to_mode(i),
+                                       16).valid) {
+                               read_cache[read_cache_idx].reg_p = ARMV4_5_CORE_REG_MODE(arm->core_cache,
+                                       armv4_5_number_to_mode(i), 16).value;
+                               arm7_9->read_xpsr(target, &read_cache[read_cache_idx].value, 1);
+                               read_cache_idx++;
                                ARMV4_5_CORE_REG_MODE(arm->core_cache, armv4_5_number_to_mode(i),
-                                       16).valid = 1;
+                                       16).valid = true;
                                ARMV4_5_CORE_REG_MODE(arm->core_cache, armv4_5_number_to_mode(i),
-                                       16).dirty = 0;
+                                       16).dirty = false;
                        }
                }
        }
@@ -1466,6 +1480,14 @@ static int arm7_9_full_context(struct target *target)
        retval = jtag_execute_queue();
        if (retval != ERROR_OK)
                return retval;
+       /*
+        * FIXME: regs in cache should be tagged as 'valid' only now,
+        * not before the jtag_execute_queue()
+        */
+       while (read_cache_idx) {
+               read_cache_idx--;
+               buf_set_u32(read_cache[read_cache_idx].reg_p, 0, 32, read_cache[read_cache_idx].value);
+       }
        return ERROR_OK;
 }
 
@@ -1488,7 +1510,7 @@ static int arm7_9_restore_context(struct target *target)
        struct reg *reg;
        enum arm_mode current_mode = arm->core_mode;
        int i, j;
-       int dirty;
+       bool dirty;
        int mode_change;
 
        LOG_DEBUG("-");
@@ -1512,15 +1534,15 @@ static int arm7_9_restore_context(struct target *target)
        for (i = 0; i < 6; i++) {
                LOG_DEBUG("examining %s mode",
                        arm_mode_name(arm->core_mode));
-               dirty = 0;
+               dirty = false;
                mode_change = 0;
                /* check if there are dirty registers in the current mode
                */
                for (j = 0; j <= 16; j++) {
                        reg = &ARMV4_5_CORE_REG_MODE(arm->core_cache, armv4_5_number_to_mode(i), j);
-                       if (reg->dirty == 1) {
-                               if (reg->valid == 1) {
-                                       dirty = 1;
+                       if (reg->dirty) {
+                               if (reg->valid) {
+                                       dirty = true;
                                        LOG_DEBUG("examining dirty reg: %s", reg->name);
                                        struct arm_reg *reg_arch_info;
                                        reg_arch_info = reg->arch_info;
@@ -1561,12 +1583,12 @@ static int arm7_9_restore_context(struct target *target)
                                                armv4_5_number_to_mode(i),
                                                j);
 
-                               if (reg->dirty == 1) {
+                               if (reg->dirty) {
                                        regs[j] = buf_get_u32(reg->value, 0, 32);
                                        mask |= 1 << j;
                                        num_regs++;
-                                       reg->dirty = 0;
-                                       reg->valid = 1;
+                                       reg->dirty = false;
+                                       reg->valid = true;
                                        LOG_DEBUG("writing register %i mode %s "
                                                "with value 0x%8.8" PRIx32, j,
                                                arm_mode_name(arm->core_mode),
@@ -1608,15 +1630,15 @@ static int arm7_9_restore_context(struct target *target)
                arm7_9->write_xpsr(target,
                        buf_get_u32(arm->cpsr->value, 0, 32)
                        & ~0x20, 0);
-               arm->cpsr->dirty = 0;
-               arm->cpsr->valid = 1;
+               arm->cpsr->dirty = false;
+               arm->cpsr->valid = true;
        }
 
        /* restore PC */
        LOG_DEBUG("writing PC with value 0x%8.8" PRIx32,
                buf_get_u32(arm->pc->value, 0, 32));
        arm7_9->write_pc(target, buf_get_u32(arm->pc->value, 0, 32));
-       arm->pc->dirty = 0;
+       arm->pc->dirty = false;
 
        return ERROR_OK;
 }
@@ -1639,11 +1661,11 @@ static int arm7_9_restart_core(struct target *target)
        if (arm7_9->need_bypass_before_restart) {
                arm7_9->need_bypass_before_restart = 0;
 
-               retval = arm_jtag_set_instr(jtag_info, 0xf, NULL, TAP_IDLE);
+               retval = arm_jtag_set_instr(jtag_info->tap, 0xf, NULL, TAP_IDLE);
                if (retval != ERROR_OK)
                        return retval;
        }
-       retval = arm_jtag_set_instr(jtag_info, 0x4, NULL, TAP_IDLE);
+       retval = arm_jtag_set_instr(jtag_info->tap, 0x4, NULL, TAP_IDLE);
        if (retval != ERROR_OK)
                return retval;
 
@@ -1687,7 +1709,7 @@ static void arm7_9_enable_breakpoints(struct target *target)
 
 int arm7_9_resume(struct target *target,
        int current,
-       uint32_t address,
+       target_addr_t address,
        int handle_breakpoints,
        int debug_execution)
 {
@@ -1719,7 +1741,7 @@ int arm7_9_resume(struct target *target,
                breakpoint = breakpoint_find(target,
                                buf_get_u32(arm->pc->value, 0, 32));
                if (breakpoint != NULL) {
-                       LOG_DEBUG("unset breakpoint at 0x%8.8" PRIx32 " (id: %" PRId32,
+                       LOG_DEBUG("unset breakpoint at 0x%8.8" TARGET_PRIxADDR " (id: %" PRIu32,
                                breakpoint->address,
                                breakpoint->unique_id);
                        retval = arm7_9_unset_breakpoint(target, breakpoint);
@@ -1778,7 +1800,7 @@ int arm7_9_resume(struct target *target,
                        LOG_DEBUG("new PC after step: 0x%8.8" PRIx32,
                                buf_get_u32(arm->pc->value, 0, 32));
 
-                       LOG_DEBUG("set breakpoint at 0x%8.8" PRIx32 "", breakpoint->address);
+                       LOG_DEBUG("set breakpoint at 0x%8.8" TARGET_PRIxADDR "", breakpoint->address);
                        retval = arm7_9_set_breakpoint(target, breakpoint);
                        if (retval != ERROR_OK)
                                return retval;
@@ -1889,7 +1911,7 @@ void arm7_9_disable_eice_step(struct target *target)
        embeddedice_store_reg(&arm7_9->eice_cache->reg_list[EICE_W1_CONTROL_VALUE]);
 }
 
-int arm7_9_step(struct target *target, int current, uint32_t address, int handle_breakpoints)
+int arm7_9_step(struct target *target, int current, target_addr_t address, int handle_breakpoints)
 {
        struct arm7_9_common *arm7_9 = target_to_arm7_9(target);
        struct arm *arm = &arm7_9->arm;
@@ -2018,8 +2040,8 @@ static int arm7_9_read_core_reg(struct target *target, struct reg *r,
        if (retval != ERROR_OK)
                return retval;
 
-       r->valid = 1;
-       r->dirty = 0;
+       r->valid = true;
+       r->dirty = false;
        buf_set_u32(r->value, 0, 32, value);
 
        if ((mode != ARM_MODE_ANY) && (mode != arm->core_mode)
@@ -2033,7 +2055,7 @@ static int arm7_9_read_core_reg(struct target *target, struct reg *r,
 }
 
 static int arm7_9_write_core_reg(struct target *target, struct reg *r,
-       int num, enum arm_mode mode, uint32_t value)
+       int num, enum arm_mode mode, uint8_t *value)
 {
        uint32_t reg[16];
        struct arm_reg *areg = r->arch_info;
@@ -2058,7 +2080,7 @@ static int arm7_9_write_core_reg(struct target *target, struct reg *r,
 
        if ((num >= 0) && (num <= 15)) {
                /* write a normal core register */
-               reg[num] = value;
+               reg[num] = buf_get_u32(value, 0, 32);
 
                arm7_9->write_core_regs(target, 1 << num, reg);
        } else {
@@ -2067,15 +2089,16 @@ static int arm7_9_write_core_reg(struct target *target, struct reg *r,
                */
                int spsr = (areg->mode != ARM_MODE_ANY);
 
+               uint32_t t = buf_get_u32(value, 0, 32);
                /* if we're writing the CPSR, mask the T bit */
                if (!spsr)
-                       value &= ~0x20;
+                       t &= ~0x20;
 
-               arm7_9->write_xpsr(target, value, spsr);
+               arm7_9->write_xpsr(target, t, spsr);
        }
 
-       r->valid = 1;
-       r->dirty = 0;
+       r->valid = true;
+       r->dirty = false;
 
        if ((mode != ARM_MODE_ANY) && (mode != arm->core_mode)
                        && (areg->mode != ARM_MODE_ANY)) {
@@ -2088,7 +2111,7 @@ static int arm7_9_write_core_reg(struct target *target, struct reg *r,
 }
 
 int arm7_9_read_memory(struct target *target,
-       uint32_t address,
+       target_addr_t address,
        uint32_t size,
        uint32_t count,
        uint8_t *buffer)
@@ -2103,7 +2126,7 @@ int arm7_9_read_memory(struct target *target,
        int retval;
        int last_reg = 0;
 
-       LOG_DEBUG("address: 0x%8.8" PRIx32 ", size: 0x%8.8" PRIx32 ", count: 0x%8.8" PRIx32 "",
+       LOG_DEBUG("address: 0x%8.8" TARGET_PRIxADDR ", size: 0x%8.8" PRIx32 ", count: 0x%8.8" PRIx32 "",
                address, size, count);
 
        if (target->state != TARGET_HALTED) {
@@ -2241,7 +2264,8 @@ int arm7_9_read_memory(struct target *target,
 
        if (((cpsr & 0x1f) == ARM_MODE_ABT) && (arm->core_mode != ARM_MODE_ABT)) {
                LOG_WARNING(
-                       "memory read caused data abort (address: 0x%8.8" PRIx32 ", size: 0x%" PRIx32 ", count: 0x%" PRIx32 ")",
+                       "memory read caused data abort "
+                       "(address: 0x%8.8" TARGET_PRIxADDR ", size: 0x%" PRIx32 ", count: 0x%" PRIx32 ")",
                        address,
                        size,
                        count);
@@ -2257,7 +2281,7 @@ int arm7_9_read_memory(struct target *target,
 }
 
 int arm7_9_write_memory(struct target *target,
-       uint32_t address,
+       target_addr_t address,
        uint32_t size,
        uint32_t count,
        const uint8_t *buffer)
@@ -2454,7 +2478,8 @@ int arm7_9_write_memory(struct target *target,
 
        if (((cpsr & 0x1f) == ARM_MODE_ABT) && (arm->core_mode != ARM_MODE_ABT)) {
                LOG_WARNING(
-                       "memory write caused data abort (address: 0x%8.8" PRIx32 ", size: 0x%" PRIx32 ", count: 0x%" PRIx32 ")",
+                       "memory write caused data abort "
+                       "(address: 0x%8.8" TARGET_PRIxADDR ", size: 0x%" PRIx32 ", count: 0x%" PRIx32 ")",
                        address,
                        size,
                        count);
@@ -2470,7 +2495,7 @@ int arm7_9_write_memory(struct target *target,
 }
 
 int arm7_9_write_memory_opt(struct target *target,
-       uint32_t address,
+       target_addr_t address,
        uint32_t size,
        uint32_t count,
        const uint8_t *buffer)
@@ -2570,7 +2595,7 @@ static const uint32_t dcc_code[] = {
 };
 
 int arm7_9_bulk_write_memory(struct target *target,
-       uint32_t address,
+       target_addr_t address,
        uint32_t count,
        const uint8_t *buffer)
 {
@@ -2626,7 +2651,7 @@ int arm7_9_bulk_write_memory(struct target *target,
                uint32_t endaddress = buf_get_u32(reg_params[0].value, 0, 32);
                if (endaddress != (address + count*4)) {
                        LOG_ERROR(
-                               "DCC write failed, expected end address 0x%08" PRIx32 " got 0x%0" PRIx32 "",
+                               "DCC write failed, expected end address 0x%08" TARGET_PRIxADDR " got 0x%0" PRIx32 "",
                                (address + count*4),
                                endaddress);
                        retval = ERROR_FAIL;
@@ -2673,6 +2698,15 @@ int arm7_9_examine(struct target *target)
        return retval;
 }
 
+void arm7_9_deinit(struct target *target)
+{
+       struct arm7_9_common *arm7_9 = target_to_arm7_9(target);
+
+       if (target_was_examined(target))
+               embeddedice_free_reg_cache(arm7_9->eice_cache);
+
+       arm_jtag_close_connection(&arm7_9->jtag_info);
+}
 
 int arm7_9_check_reset(struct target *target)
 {
@@ -2738,14 +2772,14 @@ COMMAND_HANDLER(handle_arm7_9_dbgrq_command)
        struct arm7_9_common *arm7_9 = target_to_arm7_9(target);
 
        if (!is_arm7_9(arm7_9)) {
-               command_print(CMD_CTX, "current target isn't an ARM7/ARM9 target");
+               command_print(CMD, "current target isn't an ARM7/ARM9 target");
                return ERROR_TARGET_INVALID;
        }
 
        if (CMD_ARGC > 0)
                COMMAND_PARSE_ENABLE(CMD_ARGV[0], arm7_9->use_dbgrq);
 
-       command_print(CMD_CTX,
+       command_print(CMD,
                "use of EmbeddedICE dbgrq instead of breakpoint for target halt %s",
                (arm7_9->use_dbgrq) ? "enabled" : "disabled");
 
@@ -2758,14 +2792,14 @@ COMMAND_HANDLER(handle_arm7_9_fast_memory_access_command)
        struct arm7_9_common *arm7_9 = target_to_arm7_9(target);
 
        if (!is_arm7_9(arm7_9)) {
-               command_print(CMD_CTX, "current target isn't an ARM7/ARM9 target");
+               command_print(CMD, "current target isn't an ARM7/ARM9 target");
                return ERROR_TARGET_INVALID;
        }
 
        if (CMD_ARGC > 0)
                COMMAND_PARSE_ENABLE(CMD_ARGV[0], arm7_9->fast_memory_access);
 
-       command_print(CMD_CTX,
+       command_print(CMD,
                "fast memory access is %s",
                (arm7_9->fast_memory_access) ? "enabled" : "disabled");
 
@@ -2778,14 +2812,14 @@ COMMAND_HANDLER(handle_arm7_9_dcc_downloads_command)
        struct arm7_9_common *arm7_9 = target_to_arm7_9(target);
 
        if (!is_arm7_9(arm7_9)) {
-               command_print(CMD_CTX, "current target isn't an ARM7/ARM9 target");
+               command_print(CMD, "current target isn't an ARM7/ARM9 target");
                return ERROR_TARGET_INVALID;
        }
 
        if (CMD_ARGC > 0)
                COMMAND_PARSE_ENABLE(CMD_ARGV[0], arm7_9->dcc_downloads);
 
-       command_print(CMD_CTX,
+       command_print(CMD,
                "dcc downloads are %s",
                (arm7_9->dcc_downloads) ? "enabled" : "disabled");
 
@@ -2839,7 +2873,7 @@ int arm7_9_init_arch_info(struct target *target, struct arm7_9_common *arm7_9)
        arm7_9->dcc_downloads = false;
 
        arm->arch_info = arm7_9;
-       arm->core_type = ARM_MODE_ANY;
+       arm->core_type = ARM_CORE_TYPE_STD;
        arm->read_core_reg = arm7_9_read_core_reg;
        arm->write_core_reg = arm7_9_write_core_reg;
        arm->full_context = arm7_9_full_context;
@@ -2850,12 +2884,12 @@ int arm7_9_init_arch_info(struct target *target, struct arm7_9_common *arm7_9)
                return retval;
 
        return target_register_timer_callback(arm7_9_handle_target_request,
-               1, 1, target);
+               1, TARGET_TIMER_TYPE_PERIODIC, target);
 }
 
 static const struct command_registration arm7_9_any_command_handlers[] = {
        {
-               "dbgrq",
+               .name = "dbgrq",
                .handler = handle_arm7_9_dbgrq_command,
                .mode = COMMAND_ANY,
                .usage = "['enable'|'disable']",
@@ -2863,7 +2897,7 @@ static const struct command_registration arm7_9_any_command_handlers[] = {
                        "for target halt requests",
        },
        {
-               "fast_memory_access",
+               .name = "fast_memory_access",
                .handler = handle_arm7_9_fast_memory_access_command,
                .mode = COMMAND_ANY,
                .usage = "['enable'|'disable']",
@@ -2871,7 +2905,7 @@ static const struct command_registration arm7_9_any_command_handlers[] = {
                        "but potentially safer accesses",
        },
        {
-               "dcc_downloads",
+               .name = "dcc_downloads",
                .handler = handle_arm7_9_dcc_downloads_command,
                .mode = COMMAND_ANY,
                .usage = "['enable'|'disable']",