armv4_5: Integrate build of erase check code
authorAndreas Färber <afaerber@suse.de>
Sun, 29 Nov 2015 03:15:57 +0000 (04:15 +0100)
committerAndreas Fritiofson <andreas.fritiofson@gmail.com>
Sun, 22 May 2016 14:50:49 +0000 (15:50 +0100)
Add rules to build armv4_5_erase_check.inc, and convert the code to
target endianness the least intrusive way.

Drop an unused word from the assembler sources to make the ARM bytecode
fully match that of armv4_5.c and to not break ARMv4 assumptions.

This completes the build rules for contrib/loaders/erase_check directory.

Change-Id: I36be7a944e26142088195fa3fb072d4e577bf328
Signed-off-by: Andreas Färber <afaerber@suse.de>
Reviewed-on: http://openocd.zylin.com/3135
Tested-by: jenkins
Reviewed-by: Andreas Fritiofson <andreas.fritiofson@gmail.com>
contrib/loaders/erase_check/Makefile
contrib/loaders/erase_check/armv4_5_erase_check.inc [new file with mode: 0644]
contrib/loaders/erase_check/armv4_5_erase_check.s
src/target/armv4_5.c

index 32b751754c46c8fe72c0c833dcdaf5c72004c284..cd4d3221fcc3d5d075338b52992b575a2ab145ec 100644 (file)
@@ -4,7 +4,16 @@ ARM_CROSS_COMPILE ?= arm-none-eabi-
 ARM_AS      ?= $(ARM_CROSS_COMPILE)as
 ARM_OBJCOPY ?= $(ARM_CROSS_COMPILE)objcopy
 
-arm: armv7m_erase_check.inc armv7m_0_erase_check.inc
+arm: armv4_5_erase_check.inc armv7m_erase_check.inc armv7m_0_erase_check.inc
+
+armv4_5_%.elf: armv4_5_%.s
+       $(ARM_AS) $< -o $@
+
+armv4_5_%.bin: armv4_5_%.elf
+       $(ARM_OBJCOPY) -Obinary $< $@
+
+armv4_5_%.inc: armv4_5_%.bin
+       $(BIN2C) < $< > $@
 
 armv7m_%.elf: armv7m_%.s
        $(ARM_AS) $< -o $@
diff --git a/contrib/loaders/erase_check/armv4_5_erase_check.inc b/contrib/loaders/erase_check/armv4_5_erase_check.inc
new file mode 100644 (file)
index 0000000..f7f8ddf
--- /dev/null
@@ -0,0 +1,3 @@
+/* Autogenerated with ../../../src/helper/bin2char.sh */
+0x01,0x30,0xd0,0xe4,0x03,0x20,0x02,0xe0,0x01,0x10,0x51,0xe2,0xfb,0xff,0xff,0x1a,
+0x70,0x00,0x20,0xe1,
index 6d075a91f7a762645274e1a99b81c22494a19472..6c7d27f0580863090fa385a192775b69a7a54dec 100644 (file)
@@ -36,6 +36,4 @@ loop:
 end:
        bkpt    #0
 
-CRC32XOR:      .word   0x04c11db7
-
        .end
index ba873b05b3bf9214eddecead67acd84cb367bbaf..e6bfca688b8c8ac9a38086403a5d865ba947724c 100644 (file)
@@ -1523,30 +1523,24 @@ int arm_blank_check_memory(struct target *target,
        uint32_t i;
        uint32_t exit_var = 0;
 
-       /* see contrib/loaders/erase_check/armv4_5_erase_check.s for src */
-
-       static const uint32_t check_code[] = {
-               /* loop: */
-               0xe4d03001,             /* ldrb r3, [r0], #1 */
-               0xe0022003,             /* and r2, r2, r3    */
-               0xe2511001,             /* subs r1, r1, #1   */
-               0x1afffffb,             /* bne loop          */
-               /* end: */
-               0xe1200070,             /* bkpt #0 */
+       static const uint8_t check_code_le[] = {
+#include "../../contrib/loaders/erase_check/armv4_5_erase_check.inc"
        };
 
+       assert(sizeof(check_code_le) % 4 == 0);
+
        /* make sure we have a working area */
        retval = target_alloc_working_area(target,
-                       sizeof(check_code), &check_algorithm);
+                       sizeof(check_code_le), &check_algorithm);
        if (retval != ERROR_OK)
                return retval;
 
        /* convert code into a buffer in target endianness */
-       for (i = 0; i < ARRAY_SIZE(check_code); i++) {
+       for (i = 0; i < ARRAY_SIZE(check_code_le) / 4; i++) {
                retval = target_write_u32(target,
                                check_algorithm->address
                                + i * sizeof(uint32_t),
-                               check_code[i]);
+                               le_to_h_u32(&check_code_le[i * 4]));
                if (retval != ERROR_OK)
                        goto cleanup;
        }
@@ -1566,7 +1560,7 @@ int arm_blank_check_memory(struct target *target,
 
        /* armv4 must exit using a hardware breakpoint */
        if (arm->is_armv4)
-               exit_var = check_algorithm->address + sizeof(check_code) - 4;
+               exit_var = check_algorithm->address + sizeof(check_code_le) - 4;
 
        retval = target_run_algorithm(target, 0, NULL, 3, reg_params,
                        check_algorithm->address,