]> git.sur5r.net Git - openocd/commitdiff
mips32.c: cache debug caps and support EJTAG 2.0 specific changes
authorOleksij Rempel <linux@rempel-privat.de>
Wed, 5 Feb 2014 22:11:15 +0000 (23:11 +0100)
committerSpencer Oliver <spen@spen-soft.co.uk>
Tue, 19 Aug 2014 20:18:02 +0000 (20:18 +0000)
EJTAG v2.0 indicated some debug caps in IMP register.
V2.6 moved them to DCR register. To make it more universal,
convert this values and store them for later use.

Change-Id: Id6b9f47c9c2ea94d37281ebfcae5acf357261ddf
Signed-off-by: Oleksij Rempel <linux@rempel-privat.de>
Reviewed-on: http://openocd.zylin.com/1932
Tested-by: jenkins
Reviewed-by: Spencer Oliver <spen@spen-soft.co.uk>
src/target/mips32.c
src/target/mips_ejtag.h

index 795efddf033ac158edf4b5d59d119d6b75520793..d842705fffd1ba8561c328d9e2d2d0dbefa50275 100644 (file)
@@ -536,31 +536,36 @@ int mips32_configure_break_unit(struct target *target)
        if (retval != ERROR_OK)
                return retval;
 
-       /* EJTAG 2.0 defines IB and DB bits in IMP instead of DCR.
-        * Since these DCR bits should be reserved on EJTAG 2.0, we can
-        * just remap them. */
+       /* EJTAG 2.0 defines IB and DB bits in IMP instead of DCR. */
        if (ejtag_info->ejtag_version == EJTAG_VERSION_20) {
+               ejtag_info->debug_caps = dcr & EJTAG_DCR_ENM;
                if (!(ejtag_info->impcode & EJTAG_V20_IMP_NOIB))
-                       dcr |= EJTAG_DCR_IB;
+                       ejtag_info->debug_caps |= EJTAG_DCR_IB;
                if (!(ejtag_info->impcode & EJTAG_V20_IMP_NODB))
-                       dcr |= EJTAG_DCR_DB;
-       }
+                       ejtag_info->debug_caps |= EJTAG_DCR_DB;
+       } else
+               /* keep  debug caps for later use */
+               ejtag_info->debug_caps = dcr & (EJTAG_DCR_ENM
+                               | EJTAG_DCR_IB | EJTAG_DCR_DB);
+
 
-       if (dcr & EJTAG_DCR_IB) {
+       if (ejtag_info->debug_caps & EJTAG_DCR_IB) {
                retval = mips32_configure_ibs(target);
                if (retval != ERROR_OK)
                        return retval;
        }
 
-       if (dcr & EJTAG_DCR_DB) {
+       if (ejtag_info->debug_caps & EJTAG_DCR_DB) {
                retval = mips32_configure_dbs(target);
                if (retval != ERROR_OK)
                        return retval;
        }
 
        /* check if target endianness settings matches debug control register */
-       if (((dcr & EJTAG_DCR_ENM) && (target->endianness == TARGET_LITTLE_ENDIAN)) ||
-                       (!(dcr & EJTAG_DCR_ENM) && (target->endianness == TARGET_BIG_ENDIAN)))
+       if (((ejtag_info->debug_caps & EJTAG_DCR_ENM)
+                       && (target->endianness == TARGET_LITTLE_ENDIAN)) ||
+                       (!(ejtag_info->debug_caps & EJTAG_DCR_ENM)
+                        && (target->endianness == TARGET_BIG_ENDIAN)))
                LOG_WARNING("DCR endianness settings does not match target settings");
 
        LOG_DEBUG("DCR 0x%" PRIx32 " numinst %i numdata %i", dcr, mips32->num_inst_bpoints,
index 4c8933c74b42c404b8e6f5e0229399a31388b38c..3e0d83101e5e121af274835be2da413691498be4 100644 (file)
@@ -194,6 +194,7 @@ struct mips_ejtag {
 
        /* Memory-Mapped Registers. This addresses are not same on different
         * EJTAG versions. */
+       uint32_t debug_caps;
        uint32_t ejtag_ibs_addr;        /* Instruction Address Break Status */
        uint32_t ejtag_iba0_addr;       /* IAB channel 0 */
        uint32_t ejtag_ibc_offs;        /* IAB Control offset */