Use map_sysmem when accessing memory in setexpr

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

Signed-off-by: Joe Hershberger <joe.hershberger@ni.com>
Cc: Simon Glass <sjg@chromium.org>
Reviewed-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
Joe Hershberger 2015-05-11 13:53:13 -05:00 committed by Tom Rini
parent 9597494ebf
commit 2068cea173

View file

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