mips: fix reading uint32 and uint16 when running on big endian host

This commit is contained in:
Stefan Mahr 2011-08-10 23:29:20 +02:00 committed by Øyvind Harboe
parent 28f088dc66
commit 85f1963d52
1 changed files with 20 additions and 37 deletions

View File

@ -870,35 +870,31 @@ static int mips_m4k_read_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;
void * t = buffer;
/* if noDMA off, use DMAACC mode for memory read */ /* if noDMA off, use DMAACC mode for memory read */
int retval; int retval;
if (ejtag_info->impcode & EJTAG_IMP_NODMA) if (ejtag_info->impcode & EJTAG_IMP_NODMA)
retval = mips32_pracc_read_mem(ejtag_info, address, size, count, (void *)buffer); retval = mips32_pracc_read_mem(ejtag_info, address, size, count, t);
else else
retval = mips32_dmaacc_read_mem(ejtag_info, address, size, count, (void *)buffer); retval = mips32_dmaacc_read_mem(ejtag_info, address, size, count, t);
if (ERROR_OK != retval)
return retval;
/* mips32_..._read_mem with size 4/2 returns uint32_t/uint16_t in host */ /* mips32_..._read_mem with size 4/2 returns uint32_t/uint16_t in host */
/* endianness, but byte array should represent target endianness */ /* endianness, but byte array should represent target endianness */
uint32_t i, t32; if (ERROR_OK == retval)
uint16_t t16;
for(i = 0; i < (count*size); i += size)
{ {
switch(size) switch(size)
{ {
case 4: case 4:
t32 = le_to_h_u32(&buffer[i]); target_buffer_set_u32_array(target,buffer,count,t);
target_buffer_set_u32(target,&buffer[i], t32);
break; break;
case 2: case 2:
t16 = le_to_h_u16(&buffer[i]); target_buffer_set_u16_array(target,buffer,count,t);
target_buffer_set_u16(target,&buffer[i], t16);
break; break;
} }
} }
return ERROR_OK; return retval;
} }
static int mips_m4k_write_memory(struct target *target, uint32_t address, static int mips_m4k_write_memory(struct target *target, uint32_t address,
@ -924,35 +920,27 @@ static int mips_m4k_write_memory(struct target *target, uint32_t address,
return ERROR_TARGET_UNALIGNED_ACCESS; return ERROR_TARGET_UNALIGNED_ACCESS;
/** correct endianess if we have word or hword access */ /** correct endianess if we have word or hword access */
uint8_t *t = NULL; void *t = NULL;
if (size > 1) if (size > 1)
{ {
/* mips32_..._write_mem with size 4/2 requires uint32_t/uint16_t in host */ /* mips32_..._write_mem with size 4/2 requires uint32_t/uint16_t in host */
/* endianness, but byte array represents target endianness */ /* endianness, but byte array represents target endianness */
t = malloc(count * sizeof(uint32_t)); t = malloc(count * size * sizeof(uint8_t));
if (t == NULL) if (t == NULL)
{ {
LOG_ERROR("Out of memory"); LOG_ERROR("Out of memory");
return ERROR_FAIL; return ERROR_FAIL;
} }
uint32_t i, t32;
uint16_t t16;
for(i = 0; i < (count*size); i += size)
{
switch(size) switch(size)
{ {
case 4: case 4:
t32 = target_buffer_get_u32(target,&buffer[i]); target_buffer_get_u32_array(target,buffer,count,(uint32_t*)t);
h_u32_to_le(&t[i], t32);
break; break;
case 2: case 2:
t16 = target_buffer_get_u16(target,&buffer[i]); target_buffer_get_u16_array(target,buffer,count,(uint16_t*)t);
h_u16_to_le(&t[i], t16);
break; break;
} }
}
buffer = t; buffer = t;
} }
@ -1078,7 +1066,7 @@ static int mips_m4k_bulk_write_memory(struct target *target, uint32_t address,
/* mips32_pracc_fastdata_xfer requires uint32_t in host endianness, */ /* mips32_pracc_fastdata_xfer requires uint32_t in host endianness, */
/* but byte array represents target endianness */ /* but byte array represents target endianness */
uint8_t * t = NULL; uint32_t *t = NULL;
t = malloc(count * sizeof(uint32_t)); t = malloc(count * sizeof(uint32_t));
if (t == NULL) if (t == NULL)
{ {
@ -1086,15 +1074,10 @@ static int mips_m4k_bulk_write_memory(struct target *target, uint32_t address,
return ERROR_FAIL; return ERROR_FAIL;
} }
uint32_t i, t32; target_buffer_get_u32_array(target,buffer,count,t);
for(i = 0; i < (count*4); i += 4)
{
t32 = target_buffer_get_u32(target,&buffer[i]);
h_u32_to_le(&t[i], t32);
}
retval = mips32_pracc_fastdata_xfer(ejtag_info, mips32->fast_data_area, write_t, address, retval = mips32_pracc_fastdata_xfer(ejtag_info, mips32->fast_data_area, write_t, address,
count, (uint32_t*) (void *)t); count, t);
if (t != NULL) if (t != NULL)
free(t); free(t);