projects
/
fw
/
openocd
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
|
inline
| side by side (parent:
28f088d
)
mips: fix reading uint32 and uint16 when running on big endian host
author
Stefan Mahr
<stefan.mahr@sphairon.com>
Wed, 10 Aug 2011 21:29:20 +0000
(23:29 +0200)
committer
Øyvind Harboe
<oyvind.harboe@zylin.com>
Fri, 12 Aug 2011 10:00:46 +0000
(12:00 +0200)
src/target/mips_m4k.c
patch
|
blob
|
history
diff --git
a/src/target/mips_m4k.c
b/src/target/mips_m4k.c
index e4ab044ab7039d2c00c4a843ac34930b5b1235dd..facf9a5676f843d4f1e42ecf4ffe34c20c798818 100644
(file)
--- a/
src/target/mips_m4k.c
+++ b/
src/target/mips_m4k.c
@@
-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)))
return ERROR_TARGET_UNALIGNED_ACCESS;
if (((size == 4) && (address & 0x3u)) || ((size == 2) && (address & 0x1u)))
return ERROR_TARGET_UNALIGNED_ACCESS;
+ void * t = buffer;
+
/* if noDMA off, use DMAACC mode for memory read */
int retval;
if (ejtag_info->impcode & EJTAG_IMP_NODMA)
/* if noDMA off, use DMAACC mode for memory read */
int retval;
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);
- if (ERROR_OK != retval)
- return retval;
+ retval = mips32_dmaacc_read_mem(ejtag_info, address, size, count, t);
/* mips32_..._read_mem with size 4/2 returns uint32_t/uint16_t in host */
/* endianness, but byte array should represent target endianness */
/* mips32_..._read_mem with size 4/2 returns uint32_t/uint16_t in host */
/* endianness, but byte array should represent target endianness */
- uint32_t i, t32;
- uint16_t t16;
- for(i = 0; i < (count*size); i += size)
+ if (ERROR_OK == retval)
{
switch(size)
{
case 4:
{
switch(size)
{
case 4:
- t32 = le_to_h_u32(&buffer[i]);
- target_buffer_set_u32(target,&buffer[i], t32);
+ target_buffer_set_u32_array(target,buffer,count,t);
break;
case 2:
break;
case 2:
- t16 = le_to_h_u16(&buffer[i]);
- target_buffer_set_u16(target,&buffer[i], t16);
+ target_buffer_set_u16_array(target,buffer,count,t);
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;
/** correct endianess if we have word or hword access */
return ERROR_TARGET_UNALIGNED_ACCESS;
/** correct endianess if we have word or hword access */
-
uint8_t
*t = NULL;
+
void
*t = NULL;
if (size > 1)
{
/* mips32_..._write_mem with size 4/2 requires uint32_t/uint16_t in host */
/* endianness, but byte array represents target endianness */
if (size > 1)
{
/* mips32_..._write_mem with size 4/2 requires uint32_t/uint16_t in host */
/* endianness, but byte array represents target endianness */
- t = malloc(count * size
of(uint32
_t));
+ t = malloc(count * size
* sizeof(uint8
_t));
if (t == NULL)
{
LOG_ERROR("Out of memory");
return ERROR_FAIL;
}
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)
{
{
- 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;
- }
+ case 4:
+ target_buffer_get_u32_array(target,buffer,count,(uint32_t*)t);
+ break;
+ case 2:
+ target_buffer_get_u16_array(target,buffer,count,(uint16_t*)t);
+ 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, */
/* but byte array represents target endianness */
/* mips32_pracc_fastdata_xfer requires uint32_t in host endianness, */
/* but byte array represents target endianness */
- uint
8_t *
t = NULL;
+ uint
32_t *
t = NULL;
t = malloc(count * sizeof(uint32_t));
if (t == NULL)
{
t = malloc(count * sizeof(uint32_t));
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;
- for(i = 0; i < (count*4); i += 4)
- {
- t32 = target_buffer_get_u32(target,&buffer[i]);
- h_u32_to_le(&t[i], t32);
- }
+ target_buffer_get_u32_array(target,buffer,count,t);
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)
free(t);
if (t != NULL)
free(t);