[U-Boot] [PATCH 2/2] Use map_sysmem when accessing memory in setexpr

Joe Hershberger joe.hershberger at ni.com
Mon May 11 20:53:13 CEST 2015


The setexpr command used to segfault when accessing memory in sandbox.
The pointer accesses should be mapped.

Signed-off-by: Joe Hershberger <joe.hershberger at ni.com>
Cc: Simon Glass <sjg at chromium.org>
---

 common/cmd_setexpr.c | 32 +++++++++++++++++++++++---------
 1 file changed, 23 insertions(+), 9 deletions(-)

diff --git a/common/cmd_setexpr.c b/common/cmd_setexpr.c
index 926339b..e7194fc 100644
--- a/common/cmd_setexpr.c
+++ b/common/cmd_setexpr.c
@@ -12,23 +12,37 @@
 #include <common.h>
 #include <config.h>
 #include <command.h>
+#include <mapmem.h>
 
 static ulong get_arg(char *s, int w)
 {
-	ulong *p;
-
 	/*
-	 * if the parameter starts with a '*' then assume
-	 * it is a pointer to the value we want
+	 * If the parameter starts with a '*' then assume it is a pointer to
+	 * the value we want.
 	 */
-
 	if (s[0] == '*') {
-		p = (ulong *)simple_strtoul(&s[1], NULL, 16);
+		ulong *p;
+		ulong addr;
+		ulong val;
+
+		addr = simple_strtoul(&s[1], NULL, 16);
 		switch (w) {
-		case 1: return((ulong)(*(uchar *)p));
-		case 2: return((ulong)(*(ushort *)p));
+		case 1:
+			p = map_sysmem(addr, sizeof(uchar));
+			val = (ulong)*(uchar *)p;
+			unmap_sysmem(p);
+			return val;
+		case 2:
+			p = map_sysmem(addr, sizeof(ushort));
+			val = (ulong)*(ushort *)p;
+			unmap_sysmem(p);
+			return val;
 		case 4:
-		default: return(*p);
+		default:
+			p = map_sysmem(addr, sizeof(ulong));
+			val = *p;
+			unmap_sysmem(p);
+			return val;
 		}
 	} else {
 		return simple_strtoul(s, NULL, 16);
-- 
1.7.11.5



More information about the U-Boot mailing list