aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDrasko DRASKOVIC <drasko.draskovic@gmail.com>2011-07-25 14:23:35 +0200
committerØyvind Harboe <oyvind.harboe@zylin.com>2011-08-09 23:17:28 +0200
commit827057f5608653ef721c0fef46277d3791f00adb (patch)
treefd048871983510dff74351f6b0ac35c8bd29282a
parentc18e02387b0628a9ecfc41a65af4802e8b95357e (diff)
downloadriscv-openocd-827057f5608653ef721c0fef46277d3791f00adb.zip
riscv-openocd-827057f5608653ef721c0fef46277d3791f00adb.tar.gz
riscv-openocd-827057f5608653ef721c0fef46277d3791f00adb.tar.bz2
mips32 : Fixed memory byte access
Function mips_m4k_write_memory() does endianess byte swap, but this procedure break one byte access (temporary array overwrites content in buffer). As a fix, this endianess swap and buffer affecting is preformed only on hword and word accesses (not on byte access).
-rw-r--r--src/target/mips_m4k.c49
1 files changed, 27 insertions, 22 deletions
diff --git a/src/target/mips_m4k.c b/src/target/mips_m4k.c
index 350ed51..e4ab044 100644
--- a/src/target/mips_m4k.c
+++ b/src/target/mips_m4k.c
@@ -923,33 +923,38 @@ static int mips_m4k_write_memory(struct target *target, uint32_t address,
if (((size == 4) && (address & 0x3u)) || ((size == 2) && (address & 0x1u)))
return ERROR_TARGET_UNALIGNED_ACCESS;
- /* mips32_..._write_mem with size 4/2 requires uint32_t/uint16_t in host */
- /* endianness, but byte array represents target endianness */
- uint8_t * t = NULL;
- t = malloc(count * sizeof(uint32_t));
- if (t == NULL)
+ /** correct endianess if we have word or hword access */
+ uint8_t *t = NULL;
+ if (size > 1)
{
- LOG_ERROR("Out of memory");
- return ERROR_FAIL;
- }
+ /* mips32_..._write_mem with size 4/2 requires uint32_t/uint16_t in host */
+ /* endianness, but byte array represents target endianness */
+ t = malloc(count * sizeof(uint32_t));
+ if (t == NULL)
+ {
+ LOG_ERROR("Out of memory");
+ return ERROR_FAIL;
+ }
- uint32_t i, t32;
- uint16_t t16;
- for(i = 0; i < (count*size); i += size)
- {
- switch(size)
+ uint32_t i, t32;
+ uint16_t t16;
+ for(i = 0; i < (count*size); i += size)
{
- case 4:
- t32 = target_buffer_get_u32(target,&buffer[i]);
- h_u32_to_le(&t[i], t32);
- break;
- case 2:
- t16 = target_buffer_get_u16(target,&buffer[i]);
- h_u16_to_le(&t[i], t16);
- break;
+ switch(size)
+ {
+ case 4:
+ t32 = target_buffer_get_u32(target,&buffer[i]);
+ h_u32_to_le(&t[i], t32);
+ break;
+ case 2:
+ t16 = target_buffer_get_u16(target,&buffer[i]);
+ h_u16_to_le(&t[i], t16);
+ break;
+ }
}
+
+ buffer = t;
}
- buffer = t;
/* if noDMA off, use DMAACC mode for memory write */
int retval;