Fix memory commands for 64-bit platforms

For aarch64, unsigned long is 64-bit data. Memory commands should be fixed
with u32 for 32-bit address access. To be clear, ushort is replace with
u16, u_char is replaced with u8.

Signed-off-by: York Sun <yorksun@freescale.com>
Acked-by: Wolfgang Denk <wd@denx.de>
master
York Sun 10 years ago committed by Tom Rini
parent e22361af07
commit 76698b4e6c
  1. 72
      common/cmd_mem.c

@ -188,11 +188,11 @@ static int do_mem_mw(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
buf = map_sysmem(addr, bytes);
while (count-- > 0) {
if (size == 4)
*((ulong *)buf) = (ulong)writeval;
*((u32 *)buf) = (u32)writeval;
else if (size == 2)
*((ushort *)buf) = (ushort)writeval;
*((u16 *)buf) = (u16)writeval;
else
*((u_char *)buf) = (u_char)writeval;
*((u8 *)buf) = (u8)writeval;
buf += size;
}
unmap_sysmem(buf);
@ -300,14 +300,14 @@ static int do_mem_cmp(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
for (ngood = 0; ngood < count; ++ngood) {
ulong word1, word2;
if (size == 4) {
word1 = *(ulong *)buf1;
word2 = *(ulong *)buf2;
word1 = *(u32 *)buf1;
word2 = *(u32 *)buf2;
} else if (size == 2) {
word1 = *(ushort *)buf1;
word2 = *(ushort *)buf2;
word1 = *(u16 *)buf1;
word2 = *(u16 *)buf2;
} else {
word1 = *(u_char *)buf1;
word2 = *(u_char *)buf2;
word1 = *(u8 *)buf1;
word2 = *(u8 *)buf2;
}
if (word1 != word2) {
ulong offset = buf1 - base;
@ -433,11 +433,11 @@ static int do_mem_cp(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
src = map_sysmem(addr, bytes);
while (count-- > 0) {
if (size == 4)
*((ulong *)buf) = *((ulong *)src);
*((u32 *)buf) = *((u32 *)src);
else if (size == 2)
*((ushort *)buf) = *((ushort *)src);
*((u16 *)buf) = *((u16 *)src);
else
*((u_char *)buf) = *((u_char *)src);
*((u8 *)buf) = *((u8 *)src);
src += size;
buf += size;
@ -467,9 +467,9 @@ static int do_mem_loop(cmd_tbl_t *cmdtp, int flag, int argc,
{
ulong addr, length, i, bytes;
int size;
volatile uint *longp;
volatile ushort *shortp;
volatile u_char *cp;
volatile u32 *longp;
volatile u16 *shortp;
volatile u8 *cp;
const void *buf;
if (argc < 3)
@ -498,23 +498,23 @@ static int do_mem_loop(cmd_tbl_t *cmdtp, int flag, int argc,
*/
if (length == 1) {
if (size == 4) {
longp = (uint *)buf;
longp = (u32 *)buf;
for (;;)
i = *longp;
}
if (size == 2) {
shortp = (ushort *)buf;
shortp = (u16 *)buf;
for (;;)
i = *shortp;
}
cp = (u_char *)buf;
cp = (u8 *)buf;
for (;;)
i = *cp;
}
if (size == 4) {
for (;;) {
longp = (uint *)buf;
longp = (u32 *)buf;
i = length;
while (i-- > 0)
*longp++;
@ -522,14 +522,14 @@ static int do_mem_loop(cmd_tbl_t *cmdtp, int flag, int argc,
}
if (size == 2) {
for (;;) {
shortp = (ushort *)buf;
shortp = (u16 *)buf;
i = length;
while (i-- > 0)
*shortp++;
}
}
for (;;) {
cp = (u_char *)buf;
cp = (u8 *)buf;
i = length;
while (i-- > 0)
*cp++;
@ -544,9 +544,9 @@ int do_mem_loopw (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
{
ulong addr, length, i, data, bytes;
int size;
volatile uint *longp;
volatile ushort *shortp;
volatile u_char *cp;
volatile u32 *longp;
volatile u16 *shortp;
volatile u8 *cp;
void *buf;
if (argc < 4)
@ -578,23 +578,23 @@ int do_mem_loopw (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
*/
if (length == 1) {
if (size == 4) {
longp = (uint *)buf;
longp = (u32 *)buf;
for (;;)
*longp = data;
}
if (size == 2) {
shortp = (ushort *)buf;
shortp = (u16 *)buf;
for (;;)
*shortp = data;
}
cp = (u_char *)buf;
cp = (u8 *)buf;
for (;;)
*cp = data;
}
if (size == 4) {
for (;;) {
longp = (uint *)buf;
longp = (u32 *)buf;
i = length;
while (i-- > 0)
*longp++ = data;
@ -602,14 +602,14 @@ int do_mem_loopw (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
}
if (size == 2) {
for (;;) {
shortp = (ushort *)buf;
shortp = (u16 *)buf;
i = length;
while (i-- > 0)
*shortp++ = data;
}
}
for (;;) {
cp = (u_char *)buf;
cp = (u8 *)buf;
i = length;
while (i-- > 0)
*cp++ = data;
@ -1054,11 +1054,11 @@ mod_mem(cmd_tbl_t *cmdtp, int incrflag, int flag, int argc, char * const argv[])
ptr = map_sysmem(addr, size);
printf("%08lx:", addr);
if (size == 4)
printf(" %08x", *((uint *)ptr));
printf(" %08x", *((u32 *)ptr));
else if (size == 2)
printf(" %04x", *((ushort *)ptr));
printf(" %04x", *((u16 *)ptr));
else
printf(" %02x", *((u_char *)ptr));
printf(" %02x", *((u8 *)ptr));
nbytes = readline (" ? ");
if (nbytes == 0 || (nbytes == 1 && console_buffer[0] == '-')) {
@ -1088,11 +1088,11 @@ mod_mem(cmd_tbl_t *cmdtp, int incrflag, int flag, int argc, char * const argv[])
reset_cmd_timeout();
#endif
if (size == 4)
*((uint *)ptr) = i;
*((u32 *)ptr) = i;
else if (size == 2)
*((ushort *)ptr) = i;
*((u16 *)ptr) = i;
else
*((u_char *)ptr) = i;
*((u8 *)ptr) = i;
if (incrflag)
addr += size;
}

Loading…
Cancel
Save