This is an automated email from Gerrit.

Steven Stallion ([email protected]) just uploaded a new patch set to Gerrit, 
which you can find at http://openocd.zylin.com/4114

-- gerrit

commit 30c234cb9624f0b1a22de80d75cef117a075845e
Author: Steven Stallion <[email protected]>
Date:   Mon May 1 14:50:42 2017 -0500

    target: provide default checksum_memory function
    
    This patch adds a default implementation for checksum_memory. There are
    fewer targets that support hardware-assisted checksumming than not;
    because of this it doesn't make much sense for this to be a required
    part of the target type interface.
    
    Change-Id: I1568a4bd1481777f2fb04fc09468665a33687463
    Signed-off-by: Steven Stallion <[email protected]>

diff --git a/src/target/dsp5680xx.c b/src/target/dsp5680xx.c
index a50f2cd..78bc563 100644
--- a/src/target/dsp5680xx.c
+++ b/src/target/dsp5680xx.c
@@ -1494,24 +1494,6 @@ static int dsp5680xx_read_buffer(struct target *t, 
target_addr_t a, uint32_t siz
 }
 
 /**
- * This function is not implemented.
- * It returns an error in order to get OpenOCD to do read out the data
- * and calculate the CRC, or try a binary comparison.
- *
- * @param target
- * @param address Start address of the image.
- * @param size In bytes.
- * @param checksum
- *
- * @return
- */
-static int dsp5680xx_checksum_memory(struct target *t, target_addr_t a, 
uint32_t s,
-                                    uint32_t *checksum)
-{
-       return ERROR_FAIL;
-}
-
-/**
  * Calculates a signature over @word_count words in the data from @buff16.
  * The algorithm used is the same the FM uses, so the @return may be used to 
compare
  * with the one generated by the FM module, and check if flashing was 
successful.
@@ -2290,8 +2272,6 @@ struct target_type dsp5680xx_target = {
        .read_memory = dsp5680xx_read,
        .write_memory = dsp5680xx_write,
 
-       .checksum_memory = dsp5680xx_checksum_memory,
-
        .target_create = dsp5680xx_target_create,
        .init_target = dsp5680xx_init_target,
 };
diff --git a/src/target/nds32_v2.c b/src/target/nds32_v2.c
index 29489a0..f20ec7d 100644
--- a/src/target/nds32_v2.c
+++ b/src/target/nds32_v2.c
@@ -404,14 +404,6 @@ static int nds32_v2_deassert_reset(struct target *target)
        return ERROR_OK;
 }
 
-static int nds32_v2_checksum_memory(struct target *target,
-               target_addr_t address, uint32_t count, uint32_t *checksum)
-{
-       LOG_WARNING("Not implemented: %s", __func__);
-
-       return ERROR_FAIL;
-}
-
 static int nds32_v2_add_breakpoint(struct target *target,
                struct breakpoint *breakpoint)
 {
@@ -761,8 +753,6 @@ struct target_type nds32_v2_target = {
        .read_memory = nds32_v2_read_memory,
        .write_memory = nds32_v2_write_memory,
 
-       .checksum_memory = nds32_v2_checksum_memory,
-
        /* breakpoint/watchpoint */
        .add_breakpoint = nds32_v2_add_breakpoint,
        .remove_breakpoint = nds32_v2_remove_breakpoint,
diff --git a/src/target/nds32_v3.c b/src/target/nds32_v3.c
index e5d146b..ebd3780 100644
--- a/src/target/nds32_v3.c
+++ b/src/target/nds32_v3.c
@@ -492,8 +492,6 @@ struct target_type nds32_v3_target = {
        .read_memory = nds32_v3_read_memory,
        .write_memory = nds32_v3_write_memory,
 
-       .checksum_memory = nds32_v3_checksum_memory,
-
        /* breakpoint/watchpoint */
        .add_breakpoint = nds32_v3_add_breakpoint,
        .remove_breakpoint = nds32_v3_remove_breakpoint,
diff --git a/src/target/nds32_v3_common.c b/src/target/nds32_v3_common.c
index 271ffdd..d91f3e2 100644
--- a/src/target/nds32_v3_common.c
+++ b/src/target/nds32_v3_common.c
@@ -367,14 +367,6 @@ int nds32_v3_target_request_data(struct target *target,
        return ERROR_OK;
 }
 
-int nds32_v3_checksum_memory(struct target *target,
-               target_addr_t address, uint32_t count, uint32_t *checksum)
-{
-       LOG_WARNING("Not implemented: %s", __func__);
-
-       return ERROR_FAIL;
-}
-
 /**
  * find out which watchpoint hits
  * get exception address and compare the address to watchpoints
diff --git a/src/target/nds32_v3m.c b/src/target/nds32_v3m.c
index 86903a5..d87b369 100644
--- a/src/target/nds32_v3m.c
+++ b/src/target/nds32_v3m.c
@@ -479,8 +479,6 @@ struct target_type nds32_v3m_target = {
        .read_memory = nds32_v3_read_memory,
        .write_memory = nds32_v3_write_memory,
 
-       .checksum_memory = nds32_v3_checksum_memory,
-
        /* breakpoint/watchpoint */
        .add_breakpoint = nds32_v3m_add_breakpoint,
        .remove_breakpoint = nds32_v3m_remove_breakpoint,
diff --git a/src/target/openrisc/or1k.c b/src/target/openrisc/or1k.c
index 3895ddf..7730b52 100644
--- a/src/target/openrisc/or1k.c
+++ b/src/target/openrisc/or1k.c
@@ -1206,12 +1206,6 @@ int or1k_get_gdb_fileio_info(struct target *target, 
struct gdb_fileio_info *file
        return ERROR_FAIL;
 }
 
-static int or1k_checksum_memory(struct target *target, target_addr_t address,
-               uint32_t count, uint32_t *checksum) {
-
-       return ERROR_FAIL;
-}
-
 static int or1k_profiling(struct target *target, uint32_t *samples,
                uint32_t max_num_samples, uint32_t *num_samples, uint32_t 
seconds)
 {
@@ -1447,7 +1441,6 @@ struct target_type or1k_target = {
 
        .read_memory = or1k_read_memory,
        .write_memory = or1k_write_memory,
-       .checksum_memory = or1k_checksum_memory,
 
        .commands = or1k_command_handlers,
        .add_breakpoint = or1k_add_breakpoint,
diff --git a/src/target/target.c b/src/target/target.c
index e04ecc4..867def3 100644
--- a/src/target/target.c
+++ b/src/target/target.c
@@ -58,6 +58,8 @@
 /* default halt wait timeout (ms) */
 #define DEFAULT_HALT_TIMEOUT 5000
 
+static int target_checksum_memory_default(struct target *target, uint32_t 
address,
+               uint32_t size, uint32_t* checksum);
 static int target_read_buffer_default(struct target *target, target_addr_t 
address,
                uint32_t count, uint8_t *buffer);
 static int target_write_buffer_default(struct target *target, target_addr_t 
address,
@@ -1256,6 +1258,9 @@ static int target_init_one(struct command_context 
*cmd_ctx,
                type->virt2phys = identity_virt2phys;
        }
 
+       if (target->type->checksum_memory == NULL)
+               target->type->checksum_memory = target_checksum_memory_default;
+
        if (target->type->read_buffer == NULL)
                target->type->read_buffer = target_read_buffer_default;
 
@@ -2164,42 +2169,50 @@ static int target_read_buffer_default(struct target 
*target, target_addr_t addre
        return ERROR_OK;
 }
 
-int target_checksum_memory(struct target *target, target_addr_t address, 
uint32_t size, uint32_t* crc)
+int target_checksum_memory(struct target *target, uint32_t address, uint32_t 
size, uint32_t* crc)
 {
-       uint8_t *buffer;
-       int retval;
-       uint32_t i;
        uint32_t checksum = 0;
+
        if (!target_was_examined(target)) {
                LOG_ERROR("Target not examined yet");
                return ERROR_FAIL;
        }
 
-       retval = target->type->checksum_memory(target, address, size, 
&checksum);
-       if (retval != ERROR_OK) {
-               buffer = malloc(size);
-               if (buffer == NULL) {
-                       LOG_ERROR("error allocating buffer for section (%" 
PRId32 " bytes)", size);
-                       return ERROR_COMMAND_SYNTAX_ERROR;
-               }
-               retval = target_read_buffer(target, address, size, buffer);
-               if (retval != ERROR_OK) {
-                       free(buffer);
-                       return retval;
-               }
+       int retval = target->type->checksum_memory(target, address, size, 
&checksum);
+       if (retval != ERROR_OK)
+               return retval;
 
-               /* convert to target endianness */
-               for (i = 0; i < (size/sizeof(uint32_t)); i++) {
-                       uint32_t target_data;
-                       target_data = target_buffer_get_u32(target, 
&buffer[i*sizeof(uint32_t)]);
-                       target_buffer_set_u32(target, 
&buffer[i*sizeof(uint32_t)], target_data);
-               }
+       *crc = checksum;
 
-               retval = image_calculate_checksum(buffer, size, &checksum);
+       return retval;
+}
+
+static int target_checksum_memory_default(struct target *target, uint32_t 
address, uint32_t size, uint32_t* checksum)
+{
+       uint8_t *buffer;
+       int retval;
+       uint32_t i;
+
+       buffer = malloc(size);
+       if (buffer == NULL) {
+               LOG_ERROR("error allocating buffer for section (%" PRId32 " 
bytes)", size);
+               return ERROR_COMMAND_SYNTAX_ERROR;
+       }
+       retval = target_read_buffer(target, address, size, buffer);
+       if (retval != ERROR_OK) {
                free(buffer);
+               return retval;
        }
 
-       *crc = checksum;
+       /* convert to target endianness */
+       for (i = 0; i < (size/sizeof(uint32_t)); i++) {
+               uint32_t target_data;
+               target_data = target_buffer_get_u32(target, 
&buffer[i*sizeof(uint32_t)]);
+               target_buffer_set_u32(target, &buffer[i*sizeof(uint32_t)], 
target_data);
+       }
+
+       retval = image_calculate_checksum(buffer, size, checksum);
+       free(buffer);
 
        return retval;
 }

-- 

------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
OpenOCD-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/openocd-devel

Reply via email to