flash/nor/numicro: use flash infrastructure to align write
authorTomas Vanek <vanekt@fbl.cz>
Fri, 20 Dec 2019 22:26:51 +0000 (23:26 +0100)
committerTomas Vanek <vanekt@fbl.cz>
Sat, 7 Mar 2020 15:29:03 +0000 (15:29 +0000)
The aligning code generated a clang static analyzer warning and
imposed huge memory leak. This part of code was removed and
flash infrastructure to alignment is used instead.

Not tested on hw!

Change-Id: I7c71da87547e71d595a7e7071ae5adcc1cecc827
Signed-off-by: Tomas Vanek <vanekt@fbl.cz>
Reviewed-on: http://openocd.zylin.com/5367
Tested-by: jenkins
Reviewed-by: Oleksij Rempel <linux@rempel-privat.de>
src/flash/nor/numicro.c

index c6dbfb851faa03a38124d76ed775c0dd5ead7e22..a4852829e0624e96f3aac58977ba1df3a72f7fff 100644 (file)
@@ -1548,7 +1548,6 @@ static int numicro_write(struct flash_bank *bank, const uint8_t *buffer,
 {
        struct target *target = bank->target;
        uint32_t timeout, status;
-       uint8_t *new_buffer = NULL;
        int retval = ERROR_OK;
 
        if (target->state != TARGET_HALTED) {
@@ -1566,20 +1565,8 @@ static int numicro_write(struct flash_bank *bank, const uint8_t *buffer,
        if (retval != ERROR_OK)
                return retval;
 
-       if (count & 0x3) {
-               uint32_t old_count = count;
-               count = (old_count | 3) + 1;
-               new_buffer = malloc(count);
-               if (new_buffer == NULL) {
-                       LOG_ERROR("odd number of bytes to write and no memory "
-                               "for padding buffer");
-                       return ERROR_FAIL;
-               }
-               LOG_INFO("odd number of bytes to write (%d), extending to %d "
-                       "and padding with 0xff", old_count, count);
-               memset(new_buffer, 0xff, count);
-               buffer = memcpy(new_buffer, buffer, old_count);
-       }
+       assert(offset % 4 == 0);
+       assert(count % 4 == 0);
 
        uint32_t words_remaining = count / 4;
 
@@ -1597,13 +1584,10 @@ static int numicro_write(struct flash_bank *bank, const uint8_t *buffer,
 
                        LOG_DEBUG("write longword @ %08X", offset + i);
 
-                       uint8_t padding[4] = {0xff, 0xff, 0xff, 0xff};
-                       memcpy(padding, buffer + i, MIN(4, count-i));
-
                        retval = target_write_u32(target, NUMICRO_FLASH_ISPADR, bank->base + offset + i);
                        if (retval != ERROR_OK)
                                return retval;
-                       retval = target_write_memory(target, NUMICRO_FLASH_ISPDAT, 4, 1, padding);
+                       retval = target_write_memory(target, NUMICRO_FLASH_ISPDAT, 4, 1, buffer + i);
                        if (retval != ERROR_OK)
                                return retval;
                        retval = target_write_u32(target, NUMICRO_FLASH_ISPTRG, ISPTRG_ISPGO);
@@ -1754,6 +1738,7 @@ FLASH_BANK_COMMAND_HANDLER(numicro_flash_bank_command)
        memset(bank_info, 0, sizeof(struct numicro_flash_bank));
 
        bank->driver_priv = bank_info;
+       bank->write_start_alignment = bank->write_end_alignment = 4;
 
        return ERROR_OK;