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).
This commit is contained in:
parent
c18e02387b
commit
827057f560
|
@ -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)))
|
if (((size == 4) && (address & 0x3u)) || ((size == 2) && (address & 0x1u)))
|
||||||
return ERROR_TARGET_UNALIGNED_ACCESS;
|
return ERROR_TARGET_UNALIGNED_ACCESS;
|
||||||
|
|
||||||
/* mips32_..._write_mem with size 4/2 requires uint32_t/uint16_t in host */
|
/** correct endianess if we have word or hword access */
|
||||||
/* endianness, but byte array represents target endianness */
|
uint8_t *t = NULL;
|
||||||
uint8_t * t = NULL;
|
if (size > 1)
|
||||||
t = malloc(count * sizeof(uint32_t));
|
|
||||||
if (t == NULL)
|
|
||||||
{
|
{
|
||||||
LOG_ERROR("Out of memory");
|
/* mips32_..._write_mem with size 4/2 requires uint32_t/uint16_t in host */
|
||||||
return ERROR_FAIL;
|
/* endianness, but byte array represents target endianness */
|
||||||
}
|
t = malloc(count * sizeof(uint32_t));
|
||||||
|
if (t == NULL)
|
||||||
uint32_t i, t32;
|
|
||||||
uint16_t t16;
|
|
||||||
for(i = 0; i < (count*size); i += size)
|
|
||||||
{
|
|
||||||
switch(size)
|
|
||||||
{
|
{
|
||||||
case 4:
|
LOG_ERROR("Out of memory");
|
||||||
t32 = target_buffer_get_u32(target,&buffer[i]);
|
return ERROR_FAIL;
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint32_t i, t32;
|
||||||
|
uint16_t t16;
|
||||||
|
for(i = 0; i < (count*size); i += size)
|
||||||
|
{
|
||||||
|
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 */
|
/* if noDMA off, use DMAACC mode for memory write */
|
||||||
int retval;
|
int retval;
|
||||||
|
|
Loading…
Reference in New Issue