diff mbox

[U-Boot,1/2] itest: make memory access work under sandbox

Message ID 1443765407-1559-1-git-send-email-swarren@wwwdotorg.org
State Superseded
Headers show

Commit Message

Stephen Warren Oct. 2, 2015, 5:56 a.m. UTC
itest accesses memory, and hence must map/unmap it. Without doing so, it
accesses invalid addresses and crashes.

Signed-off-by: Stephen Warren <swarren@wwwdotorg.org>
---
 common/cmd_itest.c | 21 ++++++++++++++++-----
 1 file changed, 16 insertions(+), 5 deletions(-)

Comments

Simon Glass Oct. 3, 2015, 2:30 p.m. UTC | #1
On 2 October 2015 at 06:56, Stephen Warren <swarren@wwwdotorg.org> wrote:
> itest accesses memory, and hence must map/unmap it. Without doing so, it
> accesses invalid addresses and crashes.
>
> Signed-off-by: Stephen Warren <swarren@wwwdotorg.org>
> ---
>  common/cmd_itest.c | 21 ++++++++++++++++-----
>  1 file changed, 16 insertions(+), 5 deletions(-)

Reviewed-by: Simon Glass <sjg@chromium.org>
diff mbox

Patch

diff --git a/common/cmd_itest.c b/common/cmd_itest.c
index 76af62b46ee2..596341c9635a 100644
--- a/common/cmd_itest.c
+++ b/common/cmd_itest.c
@@ -15,6 +15,9 @@ 
 #include <common.h>
 #include <config.h>
 #include <command.h>
+#include <mapmem.h>
+
+#include <asm/io.h>
 
 #define EQ	0
 #define NE	1
@@ -49,16 +52,24 @@  static const op_tbl_t op_table [] = {
 static long evalexp(char *s, int w)
 {
 	long l = 0;
-	long *p;
+	unsigned long addr;
+	void *buf;
 
 	/* if the parameter starts with a * then assume is a pointer to the value we want */
 	if (s[0] == '*') {
-		p = (long *)simple_strtoul(&s[1], NULL, 16);
+		addr = simple_strtoul(&s[1], NULL, 16);
+		buf = map_physmem(addr, w, MAP_WRBACK);
+		if (!buf) {
+			puts("Failed to map physical memory\n");
+			return 0;
+		}
 		switch (w) {
-		case 1: return((long)(*(unsigned char *)p));
-		case 2: return((long)(*(unsigned short *)p));
-		case 4: return(*p);
+		case 1: l = (long)(*(unsigned char *)buf);
+		case 2: l = (long)(*(unsigned short *)buf);
+		case 4: l = (long)(*(unsigned long *)buf);
 		}
+		unmap_physmem(buf, w);
+		return l;
 	} else {
 		l = simple_strtoul(s, NULL, 16);
 	}