aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorStefan Mahr <stefan.mahr@sphairon.com>2011-08-10 23:42:28 +0200
committerØyvind Harboe <oyvind.harboe@zylin.com>2011-08-12 12:00:51 +0200
commit45b5c838a66b200bd05d401f2b245bba3fd46d9d (patch)
tree963da32b335d9811526f96089080c2c340482d9d /src
parent85f1963d52a4aa2a82f6966dc9a16f5d48b0b93d (diff)
downloadriscv-openocd-45b5c838a66b200bd05d401f2b245bba3fd46d9d.zip
riscv-openocd-45b5c838a66b200bd05d401f2b245bba3fd46d9d.tar.gz
riscv-openocd-45b5c838a66b200bd05d401f2b245bba3fd46d9d.tar.bz2
mips: fix potential alignment error
Diffstat (limited to 'src')
-rw-r--r--src/target/mips_m4k.c20
1 files changed, 19 insertions, 1 deletions
diff --git a/src/target/mips_m4k.c b/src/target/mips_m4k.c
index facf9a5..7be96a4 100644
--- a/src/target/mips_m4k.c
+++ b/src/target/mips_m4k.c
@@ -870,7 +870,22 @@ static int mips_m4k_read_memory(struct target *target, uint32_t address,
if (((size == 4) && (address & 0x3u)) || ((size == 2) && (address & 0x1u)))
return ERROR_TARGET_UNALIGNED_ACCESS;
- void * t = buffer;
+ /* since we don't know if buffer is aligned, we allocate new mem that is always aligned */
+ void *t = NULL;
+
+ if (size > 1)
+ {
+ t = malloc(count * size * sizeof(uint8_t));
+ if (t == NULL)
+ {
+ LOG_ERROR("Out of memory");
+ return ERROR_FAIL;
+ }
+ }
+ else
+ {
+ t = buffer;
+ }
/* if noDMA off, use DMAACC mode for memory read */
int retval;
@@ -894,6 +909,9 @@ static int mips_m4k_read_memory(struct target *target, uint32_t address,
}
}
+ if ((size > 1) && (t != NULL))
+ free(t);
+
return retval;
}