summaryrefslogtreecommitdiff
path: root/common/cmd_itest.c
diff options
context:
space:
mode:
authorStephen Warren <swarren@wwwdotorg.org>2015-10-03 13:56:46 -0600
committerTom Rini <trini@konsulko.com>2015-10-24 13:50:33 -0400
commit7861204c9af7fec1ea9b41541c272516235a6c93 (patch)
tree71f27353e0ccfd62147a6fa10f88f234218dc209 /common/cmd_itest.c
parent40d2154726fd77698103419923a406f051a7199d (diff)
itest: make memory access work under sandbox
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> Reviewed-by: Simon Glass <sjg@chromium.org>
Diffstat (limited to 'common/cmd_itest.c')
-rw-r--r--common/cmd_itest.c21
1 files changed, 16 insertions, 5 deletions
diff --git a/common/cmd_itest.c b/common/cmd_itest.c
index 76af62b46e..596341c963 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);
}