mips32 : Fixed memory byte access
authorDrasko DRASKOVIC <drasko.draskovic@gmail.com>
Mon, 25 Jul 2011 12:23:35 +0000 (14:23 +0200)
committerØyvind Harboe <oyvind.harboe@zylin.com>
Tue, 9 Aug 2011 21:17:28 +0000 (23:17 +0200)
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).

src/target/mips_m4k.c

index 350ed5139ce0f08a82570626b4db099c1e3bf511..e4ab044ab7039d2c00c4a843ac34930b5b1235dd 100644 (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;