ARMv7M: use software breakpoints for algorithms
authorSpencer Oliver <ntfreak@users.sourceforge.net>
Tue, 2 Feb 2010 13:22:07 +0000 (13:22 +0000)
committerSpencer Oliver <ntfreak@users.sourceforge.net>
Sun, 28 Feb 2010 22:26:52 +0000 (22:26 +0000)
 - armv7m_run_algorithm now requires all algorithms to use
   a software breakpoint at their exit address
 - updated all algorithms to support this

Signed-off-by: Spencer Oliver <ntfreak@users.sourceforge.net>
src/flash/nor/at91sam3.c
src/flash/nor/lpc2000.c
src/flash/nor/stellaris.c
src/flash/nor/stm32x.c
src/target/armv7m.c

index 1b2f27c2550062a148912d6898a910c1b3b0c2ab..5f013ed8546762be59010280b9ab7d52d1145398 100644 (file)
@@ -2046,9 +2046,7 @@ sam3_page_write_opcodes[] = {
        0x10,0xf0,0x01,0x0f,
        //  41 0024 FBD0                beq     .L4
        0xfb,0xd0,
-       //  42                  .done:
-       //  43 0026 FEE7                b       .done
-       0xfe,0xe7
+       0x00,0xBE                               /* bkpt #0 */
 };
 
 
index fc2b1cfc9ae54cc8148ee7a120ea49aacfd18ece..6674f171aa550ddbc64cb5eab117c77bc7e0e071 100644 (file)
@@ -267,7 +267,7 @@ static int lpc2000_iap_call(struct flash_bank *bank, int code, uint32_t param_ta
                                target_buffer_set_u32(target, jump_gate,
                                                ARMV4_5_T_BX(12));
                                target_buffer_set_u32(target, jump_gate + 4,
-                                               ARMV4_5_T_B(0xfffffe));
+                                               ARMV5_T_BKPT(0));
                                break;
                        case lpc2000_v1:
                        case lpc2000_v2:
index 21a0cffd44aecebd864a3ce55e1d4ddbd0633e71..b80daed1d42fef23682c449c8625ef2a855942c2 100644 (file)
@@ -805,8 +805,7 @@ static const uint8_t stellaris_write_code[] =
        0x04,0x36,                      /* adds r6, r6, #4 */
        0x96,0x42,                      /* cmp  r6, r2 */
        0xF4,0xD1,                      /* bne  mainloop */
-                                               /* exit: */
-       0xFE,0xE7,                      /* b exit */
+       0x00,0xBE,              /* bkpt #0 */
 /* pFLASH_CTRL_BASE: */
        0x00,0xD0,0x0F,0x40,    /* .word        0x400FD000 */
 /* FLASHWRITECMD: */
index bfdd3cd0110a46d859dcdff708924c932afeae1f..53fc4ea23a56ffcd9ebd81a2013d10fb5d5f53e8 100644 (file)
@@ -459,8 +459,7 @@ static int stm32x_write_block(struct flash_bank *bank, uint8_t *buffer, uint32_t
                0x01, 0xD1,                                     /* bne  exit */
                0x01, 0x3A,                                     /* subs r2, r2, #1 */
                0xED, 0xD1,                                     /* bne  write */
-                                                                       /* exit: */
-               0xFE, 0xE7,                                     /* b exit */
+               0x00, 0xBE,                             /* bkpt #0 */
                0x10, 0x20, 0x02, 0x40,         /* STM32_FLASH_CR:      .word 0x40022010 */
                0x0C, 0x20, 0x02, 0x40          /* STM32_FLASH_SR:      .word 0x4002200C */
        };
index 466c0b2a9f8cf598a24461302dfd46e49ecd652c..056ac7b2d066a411f6048a595d7f848ca5a55276 100644 (file)
@@ -338,6 +338,9 @@ int armv7m_run_algorithm(struct target *target,
        int retval = ERROR_OK;
        uint32_t context[ARMV7M_NUM_REGS];
 
+       /* NOTE: armv7m_run_algorithm requires that each algorithm uses a software breakpoint
+        * at the exit point */
+
        if (armv7m_algorithm_info->common_magic != ARMV7M_COMMON_MAGIC)
        {
                LOG_ERROR("current target isn't an ARMV7M target");
@@ -395,22 +398,8 @@ int armv7m_run_algorithm(struct target *target,
                armv7m->core_cache->reg_list[ARMV7M_CONTROL].valid = 1;
        }
 
-       /* REVISIT speed things up (3% or so in one case) by requiring
-        * algorithms to include a BKPT instruction at each exit point.
-        * This eliminates overheads of adding/removing a breakpoint.
-        */
-
-       /* ARMV7M always runs in Thumb state */
-       if ((retval = breakpoint_add(target, exit_point, 2, BKPT_SOFT)) != ERROR_OK)
-       {
-               LOG_ERROR("can't add breakpoint to finish algorithm execution");
-               return ERROR_TARGET_FAILURE;
-       }
-
        retval = armv7m_run_and_wait(target, entry_point, timeout_ms, exit_point, armv7m);
 
-       breakpoint_remove(target, exit_point);
-
        if (retval != ERROR_OK)
        {
                return retval;
@@ -594,8 +583,7 @@ int armv7m_checksum_memory(struct target *target,
                                                                /* ncomp: */
                0x429C,                                 /* cmp  r4, r3 */
                0xD1E9,                                 /* bne  nbyte */
-                                                               /* end: */
-               0xE7FE,                                 /* b    end */
+               0xBE00,                         /* bkpt #0 */
                0x1DB7, 0x04C1                  /* CRC32XOR:    .word 0x04C11DB7 */
        };
 
@@ -659,8 +647,7 @@ int armv7m_blank_check_memory(struct target *target,
                0xEA02, 0x0203,         /* and  r2, r2, r3 */
                0x3901,                         /* subs r1, r1, #1 */
                0xD1F9,                         /* bne  loop */
-               /* end: */
-               0xE7FE,                         /* b    end */
+               0xBE00,                 /* bkpt #0 */
        };
 
        /* make sure we have a working area */

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)