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>
*/
static uint32_t max_tar_block_size(uint32_t tar_autoincr_block, uint32_t address)
{
*/
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);
}
/***************************************************************************
}
/***************************************************************************
while (wcount > 0) {
/* Adjust to write blocks within boundaries aligned to the TAR auto-increment size */
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;
if (wcount < blocksize)
blocksize = wcount;
int nbytes;
/* Adjust to write blocks within boundaries aligned to the TAR auto-increment size */
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;
if (wcount < blocksize)
blocksize = wcount;
* TAR autoincrement size (at least 2^10). Autoincrement
* mode avoids an extra per-word roundtrip to update TAR.
*/
* 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;
if (wcount < blocksize)
blocksize = wcount;
int nbytes;
/* Adjust to read blocks within boundaries aligned to the TAR autoincremnent size*/
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;
if (wcount < blocksize)
blocksize = wcount;