From 46bb40821f71a3e2f7933a5659d596751ac23c52 Mon Sep 17 00:00:00 2001
From: Stefan Mahr <stefan.mahr@sphairon.com>
Date: Wed, 10 Aug 2011 23:42:28 +0200
Subject: [PATCH 3/3] mips: fix potential alignment error

---
 src/target/mips_m4k.c |   20 +++++++++++++++++++-
 1 files changed, 19 insertions(+), 1 deletions(-)

diff --git a/src/target/mips_m4k.c b/src/target/mips_m4k.c
index facf9a5..7be96a4 100644
--- a/src/target/mips_m4k.c
+++ b/src/target/mips_m4k.c
@@ -870,7 +870,22 @@ 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;
 
-	void * t = buffer;
+	/* since we don't know if buffer is aligned, we allocate new mem that is always aligned */
+	void *t = NULL;
+
+	if (size > 1)
+	{
+		t = malloc(count * size * sizeof(uint8_t));
+		if (t == NULL)
+		{
+			LOG_ERROR("Out of memory");
+			return ERROR_FAIL;
+		}
+	}
+	else
+	{
+		t = buffer;
+	}
 
 	/* if noDMA off, use DMAACC mode for memory read */
 	int retval;
@@ -894,6 +909,9 @@ static int mips_m4k_read_memory(struct target *target, uint32_t address,
 		}
 	}
 
+	if ((size > 1) && (t != NULL))
+		free(t);
+
 	return retval;
 }
 
-- 
1.7.1

