Merge branch 'master' of git://git.denx.de/u-boot-x86
[oweals/u-boot.git] / common / cmd_itest.c
index 10d53a063be915c47b8f42fc2af797960ba8ce4a..91ae5c2704c882be8d4457d67d5f8488b19d2f1c 100644 (file)
@@ -2,7 +2,7 @@
  * (C) Copyright 2003
  * Tait Electronics Limited, Christchurch, New Zealand
  *
- * SPDX-License-Identifier:    GPL-2.0+ 
+ * SPDX-License-Identifier:    GPL-2.0+
  */
 
 /*
@@ -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,21 +52,35 @@ 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);
+                       break;
+               case 2:
+                       l = (long)(*(unsigned short *)buf);
+                       break;
+               case 4:
+                       l = (long)(*(unsigned long *)buf);
+                       break;
                }
+               unmap_physmem(buf, w);
+               return l;
        } else {
                l = simple_strtoul(s, NULL, 16);
        }
 
-       return (l & ((1 << (w * 8)) - 1));
+       return l & ((1UL << (w * 8)) - 1);
 }
 
 static char * evalstr(char *s)
@@ -71,6 +88,19 @@ static char * evalstr(char *s)
        /* if the parameter starts with a * then assume a string pointer else its a literal */
        if (s[0] == '*') {
                return (char *)simple_strtoul(&s[1], NULL, 16);
+       } else if (s[0] == '$') {
+               int i = 2;
+
+               if (s[1] != '{')
+                       return NULL;
+
+               while (s[i] != '}') {
+                       if (s[i] == 0)
+                               return NULL;
+                       i++;
+               }
+               s[i] = 0;
+               return  getenv((const char *)&s[2]);
        } else {
                return s;
        }