diff options
author | Drasko 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 |
commit | 827057f5608653ef721c0fef46277d3791f00adb (patch) | |
tree | fd048871983510dff74351f6b0ac35c8bd29282a /src | |
parent | c18e02387b0628a9ecfc41a65af4802e8b95357e (diff) |
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).
Diffstat (limited to 'src')
-rw-r--r-- | src/target/mips_m4k.c | 49 |
1 files changed, 27 insertions, 22 deletions
diff --git a/src/target/mips_m4k.c b/src/target/mips_m4k.c index 350ed513..e4ab044a 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; |