Browse Source

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).
tags/v0.6.0-rc1
Drasko DRASKOVIC 13 years ago
committed by Øyvind Harboe
parent
commit
827057f560
1 changed files with 27 additions and 22 deletions
  1. +27
    -22
      src/target/mips_m4k.c

+ 27
- 22
src/target/mips_m4k.c View File

@@ -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;


Loading…
Cancel
Save