David Brownell <david-b@pacbell.net>:
authorntfreak <ntfreak@b42882b7-edfa-0310-969c-e2dbd0fdcd60>
Tue, 21 Jul 2009 20:03:17 +0000 (20:03 +0000)
committerntfreak <ntfreak@b42882b7-edfa-0310-969c-e2dbd0fdcd60>
Tue, 21 Jul 2009 20:03:17 +0000 (20:03 +0000)
Revert parts of the previous ARMv7-M register patch.
It turns out that part of the issue is a documentation
problem for the Cortex-M3 r1 parts. So for the rest,
simpler fixes are possible (in followup patch).

git-svn-id: svn://svn.berlios.de/openocd/trunk@2552 b42882b7-edfa-0310-969c-e2dbd0fdcd60

src/target/armv7m.c
src/target/armv7m.h
src/target/cortex_m3.c
src/target/cortex_m3.h

index 02a664aa6517b1e291580798e84aa40616cf8e1b..5849443018afb4c75481110bc3dae203db8e85c8 100644 (file)
@@ -60,8 +60,8 @@ char* armv7m_core_reg_list[] =
        "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12",
        "sp", "lr", "pc",
        "xPSR", "msp", "psp",
-       /* reg 20 has 4 bytes: CONTROL, FAULTMASK, BASEPRI, PRIMASK */
-       "spec20",
+       /* Registers accessed through special reg 20 */
+       "primask", "basepri", "faultmask", "control"
 };
 
 uint8_t armv7m_gdb_dummy_fp_value[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
@@ -111,11 +111,11 @@ armv7m_core_reg_t armv7m_core_reg_list_arch_info[] =
        {17, ARMV7M_REGISTER_CORE_GP, ARMV7M_MODE_ANY, NULL, NULL}, /* MSP */
        {18, ARMV7M_REGISTER_CORE_GP, ARMV7M_MODE_ANY, NULL, NULL}, /* PSP */
 
-       /* FIXME the register numbers here are core-specific.
-        * Numbers 0..18 above work for all Cortex-M3 revisions.
-        * Number 20 below works for CM3 r2p0 and later.
-        */
-       {20, ARMV7M_REGISTER_CORE_SP, ARMV7M_MODE_ANY, NULL, NULL},
+       /*  CORE_SP are accesible using coreregister 20 */
+       {19, ARMV7M_REGISTER_CORE_SP, ARMV7M_MODE_ANY, NULL, NULL}, /* PRIMASK */
+       {20, ARMV7M_REGISTER_CORE_SP, ARMV7M_MODE_ANY, NULL, NULL}, /* BASEPRI */
+       {21, ARMV7M_REGISTER_CORE_SP, ARMV7M_MODE_ANY, NULL, NULL}, /* FAULTMASK */
+       {22, ARMV7M_REGISTER_CORE_SP, ARMV7M_MODE_ANY, NULL, NULL}  /* CONTROL */
 };
 
 int armv7m_core_reg_arch_type = -1;
@@ -387,21 +387,12 @@ int armv7m_run_algorithm(struct target_s *target, int num_mem_params, mem_param_
                armv7m_set_core_reg(reg, reg_params[i].value);
        }
 
-       /* NOTE:  CONTROL is bits 31:24 of SPEC20 register, if it's present;
-        * holding a two-bit field.
-        *
-        * FIXME need a solution using ARMV7M_T_MSR().  Use it at least for
-        * earlier cores.
-        */
-       if (armv7m_algorithm_info->core_mode != ARMV7M_MODE_ANY
-                       && armv7m->has_spec20)
+       if (armv7m_algorithm_info->core_mode != ARMV7M_MODE_ANY)
        {
                LOG_DEBUG("setting core_mode: 0x%2.2x", armv7m_algorithm_info->core_mode);
-
-               buf_set_u32(armv7m->core_cache->reg_list[ARMV7M_SPEC20].value,
-                               24, 2, armv7m_algorithm_info->core_mode);
-               armv7m->core_cache->reg_list[ARMV7M_SPEC20].dirty = 1;
-               armv7m->core_cache->reg_list[ARMV7M_SPEC20].valid = 1;
+               buf_set_u32(armv7m->core_cache->reg_list[ARMV7M_CONTROL].value, 0, 1, armv7m_algorithm_info->core_mode);
+               armv7m->core_cache->reg_list[ARMV7M_CONTROL].dirty = 1;
+               armv7m->core_cache->reg_list[ARMV7M_CONTROL].valid = 1;
        }
 
        /* ARMV7M always runs in Thumb state */
index 17e3ff382f05b9bc0fafddb2ba6ace5ea097cf81..ec90b7150d0d8a16ab31724970156fb6922f5912 100644 (file)
@@ -61,15 +61,10 @@ enum
        ARMV7M_xPSR = 16,
        ARMV7M_MSP,
        ARMV7M_PSP,
-
-       /* FIXME the register numbers here are core-specific.  Cortex-M3
-        * through r1p1 only defines registers up to PSP; see ARM DDI 0337E.
-        *
-        * It's r2p0 (see ARM DDI 0337G) which defines the register that's
-        * called SPEC20 here, with four single-byte fields with CONTROL
-        * (highest byte), FAULTMASK, BASEPRI, and PRIMASK (lowest byte).
-        */
-       ARMV7M_SPEC20 = 20,
+       ARMV7M_PRIMASK,
+       ARMV7M_BASEPRI,
+       ARMV7M_FAULTMASK,
+       ARMV7M_CONTROL,
        ARMV7NUMCOREREGS
 };
 
@@ -83,7 +78,6 @@ typedef struct armv7m_common_s
        int exception_number;
        swjdp_common_t swjdp_info;
 
-       bool has_spec20;
 
        /* Direct processor core register read and writes */
        int (*load_core_reg_u32)(struct target_s *target, enum armv7m_regtype type, uint32_t num, uint32_t *value);
index 8cb1bd4e7a69c5dd09527500cc48e4fcb44436fe..94d420468e488971c4d5b0c3c1cb13cdf148d120 100644 (file)
@@ -395,7 +395,7 @@ int cortex_m3_debug_entry(target_t *target)
 
        /* Examine target state and mode */
        /* First load register acessible through core debug port*/
-       for (i = 0; i < ARMV7NUMCOREREGS; i++)
+       for (i = 0; i < ARMV7M_PRIMASK; i++)
        {
                if (!armv7m->core_cache->reg_list[i].valid)
                        armv7m->read_core_reg(target, i);
@@ -418,19 +418,22 @@ int cortex_m3_debug_entry(target_t *target)
                cortex_m3_store_core_reg_u32(target, ARMV7M_REGISTER_CORE_GP, 16, xPSR &~ 0xff);
        }
 
+       /* Now we can load SP core registers */
+       for (i = ARMV7M_PRIMASK; i < ARMV7NUMCOREREGS; i++)
+       {
+               if (!armv7m->core_cache->reg_list[i].valid)
+                       armv7m->read_core_reg(target, i);
+       }
+
        /* Are we in an exception handler */
        if (xPSR & 0x1FF)
        {
                armv7m->core_mode = ARMV7M_MODE_HANDLER;
                armv7m->exception_number = (xPSR & 0x1FF);
        }
-       else if (armv7m->has_spec20)
+       else
        {
-               /* NOTE:  CONTROL is bits 31:24 of SPEC20 register, holding
-                * a two-bit field.  Unavailable before r2p0...
-                */
-               armv7m->core_mode = buf_get_u32(
-                       armv7m->core_cache->reg_list[ARMV7M_SPEC20].value, 24, 2);
+               armv7m->core_mode = buf_get_u32(armv7m->core_cache->reg_list[ARMV7M_CONTROL].value, 0, 1);
                armv7m->exception_number = 0;
        }
 
@@ -633,26 +636,16 @@ int cortex_m3_resume(struct target_s *target, int current, uint32_t address, int
        if (debug_execution)
        {
                /* Disable interrupts */
-               /* We disable interrupts in the PRIMASK register instead
-                * of masking with C_MASKINTS,
+               /* We disable interrupts in the PRIMASK register instead of masking with C_MASKINTS,
                 * This is probably the same issue as Cortex-M3 Errata  377493:
-                * C_MASKINTS in parallel with disabled interrupts can cause
-                * local faults to not be taken.  (FIXED in r1p0 and later.)
-                *
-                * NOTE:  PRIMASK is bits 7:0 of SPEC20 register, holding a
-                * one bit field.  Available this way for r2p0 and later...
-                */
-               if (armv7m->has_spec20) {
-                       buf_set_u32(armv7m->core_cache->reg_list[ARMV7M_SPEC20]
-                                       .value, 0, 1, 1);
-                       armv7m->core_cache->reg_list[ARMV7M_SPEC20].dirty = 1;
-                       armv7m->core_cache->reg_list[ARMV7M_SPEC20].valid = 1;
-               }
+                * C_MASKINTS in parallel with disabled interrupts can cause local faults to not be taken. */
+               buf_set_u32(armv7m->core_cache->reg_list[ARMV7M_PRIMASK].value, 0, 32, 1);
+               armv7m->core_cache->reg_list[ARMV7M_PRIMASK].dirty = 1;
+               armv7m->core_cache->reg_list[ARMV7M_PRIMASK].valid = 1;
 
                /* Make sure we are in Thumb mode */
                buf_set_u32(armv7m->core_cache->reg_list[ARMV7M_xPSR].value, 0, 32,
-                       buf_get_u32(armv7m->core_cache->reg_list[ARMV7M_xPSR].value, 0, 32)
-                       | (1 << 24));
+                       buf_get_u32(armv7m->core_cache->reg_list[ARMV7M_xPSR].value, 0, 32) | (1 << 24));
                armv7m->core_cache->reg_list[ARMV7M_xPSR].dirty = 1;
                armv7m->core_cache->reg_list[ARMV7M_xPSR].valid = 1;
        }
@@ -1474,14 +1467,8 @@ int cortex_m3_examine(struct target_s *target)
                if ((retval = target_read_u32(target, CPUID, &cpuid)) != ERROR_OK)
                        return retval;
 
-               if (((cpuid >> 4) & 0xc3f) == 0xc23) {
+               if (((cpuid >> 4) & 0xc3f) == 0xc23)
                        LOG_DEBUG("CORTEX-M3 processor detected");
-                       if (((cpuid >> 20) & 0xf) >= 2) {
-                               armv7m->has_spec20 = true;
-                               LOG_DEBUG("r2p0 or later detected");
-                       }
-               } else
-                       LOG_WARNING("not a CORTEX-M3 processor?");
                LOG_DEBUG("cpuid: 0x%8.8" PRIx32 "", cpuid);
 
                target_read_u32(target, NVIC_ICTR, &ictr);
index ba61b1cba45ab08f1f44e4b86dd25a1ccf93df2e..e6714d0077fde554af5453a4692f3e5cc167cbc8 100644 (file)
@@ -117,21 +117,6 @@ extern char* cortex_m3_state_strings[];
 #define FPCR_REPLACE_BKPT_HIGH  (2 << 30)
 #define FPCR_REPLACE_BKPT_BOTH  (3 << 30)
 
-/* Use MRS/MSR to read/write any of these special registers.  Some of
- * them (xPSR, MSP, PSP) are always available using DCRxR.  Starting in
- * Cortex-M3 r2p0, some (CONTROL, BASEPRI, and *MASK) are also available
- * through DCRxR.
- * NOTE: this listing omits xPSR components and other mixtures.
- */
-#define SR_XPSR                3
-#define SR_MSP         8
-#define SR_PSP         9
-#define SR_PRIMASK     16
-#define SR_BASEPRI     17
-#define SR_BASEPRI_MAX 18
-#define SR_FAULTMASK   19
-#define SR_CONTROL     20
-
 typedef struct  cortex_m3_fp_comparator_s
 {
        int used;

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)