arm_adi_v5: Fix packed transfers crossing TAR auto-increment block 49/1649/2
authorAndreas Fritiofson <andreas.fritiofson@gmail.com>
Sun, 22 Sep 2013 21:14:17 +0000 (23:14 +0200)
committerSpencer Oliver <spen@spen-soft.co.uk>
Wed, 2 Oct 2013 21:53:59 +0000 (21:53 +0000)
The word count returned from max_tar_block_size() was compared with the
count of half-word/bytes in the u16 and u8 packed access functions,
causing an infinite loop if the access actually crossed the boundary.

Change max_tar_block_size() to return a byte count, and scale at the call
site.

Change-Id: I2fe9b5941eb485f3d8219cfdd29fb71e02006de4
Signed-off-by: Andreas Fritiofson <andreas.fritiofson@gmail.com>
Reviewed-on: http://openocd.zylin.com/1649
Tested-by: jenkins
Reviewed-by: Spencer Oliver <spen@spen-soft.co.uk>
src/target/arm_adi_v5.c

index 309296acfa6d37342356291c2424d1d1b1bd45bb..67fb23b2ec5dea39e3508fd9924a5a1c3cf85091 100644 (file)
@@ -82,7 +82,7 @@
 */
 static uint32_t max_tar_block_size(uint32_t tar_autoincr_block, uint32_t address)
 {
-       return (tar_autoincr_block - ((tar_autoincr_block - 1) & address)) >> 2;
+       return tar_autoincr_block - ((tar_autoincr_block - 1) & address);
 }
 
 /***************************************************************************
@@ -271,7 +271,7 @@ int mem_ap_write_buf_u32(struct adiv5_dap *dap, const uint8_t *buffer, int count
 
        while (wcount > 0) {
                /* Adjust to write blocks within boundaries aligned to the TAR auto-increment size */
-               blocksize = max_tar_block_size(dap->tar_autoincr_block, address);
+               blocksize = max_tar_block_size(dap->tar_autoincr_block, address) / 4;
                if (wcount < blocksize)
                        blocksize = wcount;
 
@@ -324,7 +324,7 @@ static int mem_ap_write_buf_packed_u16(struct adiv5_dap *dap,
                int nbytes;
 
                /* Adjust to write blocks within boundaries aligned to the TAR auto-increment size */
-               blocksize = max_tar_block_size(dap->tar_autoincr_block, address);
+               blocksize = max_tar_block_size(dap->tar_autoincr_block, address) / 2;
 
                if (wcount < blocksize)
                        blocksize = wcount;
@@ -534,8 +534,7 @@ int mem_ap_read_buf_u32(struct adiv5_dap *dap, uint8_t *buffer,
                 * TAR autoincrement size (at least 2^10).  Autoincrement
                 * mode avoids an extra per-word roundtrip to update TAR.
                 */
-               blocksize = max_tar_block_size(dap->tar_autoincr_block,
-                               address);
+               blocksize = max_tar_block_size(dap->tar_autoincr_block, address) / 4;
                if (wcount < blocksize)
                        blocksize = wcount;
 
@@ -601,7 +600,7 @@ static int mem_ap_read_buf_packed_u16(struct adiv5_dap *dap,
                int nbytes;
 
                /* Adjust to read blocks within boundaries aligned to the TAR autoincremnent size*/
-               blocksize = max_tar_block_size(dap->tar_autoincr_block, address);
+               blocksize = max_tar_block_size(dap->tar_autoincr_block, address) / 2;
                if (wcount < blocksize)
                        blocksize = wcount;
 

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)