diff options
Diffstat (limited to 'recipes/u-boot/u-boot-git/0007-cmd_setexpr-allow-memory-addresses-and-env-vars-in-e.patch')
-rw-r--r-- | recipes/u-boot/u-boot-git/0007-cmd_setexpr-allow-memory-addresses-and-env-vars-in-e.patch | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/recipes/u-boot/u-boot-git/0007-cmd_setexpr-allow-memory-addresses-and-env-vars-in-e.patch b/recipes/u-boot/u-boot-git/0007-cmd_setexpr-allow-memory-addresses-and-env-vars-in-e.patch new file mode 100644 index 0000000000..10fc4735a2 --- /dev/null +++ b/recipes/u-boot/u-boot-git/0007-cmd_setexpr-allow-memory-addresses-and-env-vars-in-e.patch @@ -0,0 +1,93 @@ +From 0d685fe90ab92ccb9f15b7d79b1063f5b79b2dd5 Mon Sep 17 00:00:00 2001 +From: Frans Meulenbroeks <fransmeulenbroeks@gmail.com> +Date: Thu, 25 Feb 2010 11:05:31 +0100 +Subject: [PATCH 7/7] cmd_setexpr: allow memory addresses and env vars in expressions + +This patch add functionality to use memory addresses and environment variables in +expressions. This increases the power of expressions substantially + +It adheres to the standard convemtions: memory addresses can be given in the format +*address (e.g. *1000), environment variables as $this_var. +environment variables are not processed recursively but can contain both constants +and memory addresses. + +Rationale for this change is that it allows masking off bits from a byte that is +obtained by reading data from e.g. i2c. + +Signed-off-by: Frans Meulenbroeks <fransmeulenbroeks@gmail.com> + +--- + +If recursive environment vars is desired: this can be added easily by changing the +if statement into a while statement. +I figured that would be somewhat over the top though (and, unless you take +special precautions you can run into an endless loop if an env var contains +its own name. +If it is desired, please let me know and I happily will add it. +--- + common/cmd_setexpr.c | 31 ++++++++++++++++++++++++++++--- + 1 files changed, 28 insertions(+), 3 deletions(-) + +diff --git a/common/cmd_setexpr.c b/common/cmd_setexpr.c +index f8b5d4d..a7c6f53 100644 +--- a/common/cmd_setexpr.c ++++ b/common/cmd_setexpr.c +@@ -28,10 +28,32 @@ + #include <config.h> + #include <command.h> + ++static ulong get_arg(char *s, int w) ++{ ++ ulong *p; ++ ++ /* if the parameter starts with a $ replace it with the environment value */ ++ if (s[0] == '$') { ++ s = getenv(&s[1]); ++ } ++ /* if the parameter starts with a * then assume is a pointer to the value we want */ ++ if (s[0] == '*') { ++ p = (ulong *)simple_strtoul(&s[1], NULL, 16); ++ switch (w) { ++ case 1: return((ulong)(*(uchar *)p)); ++ case 2: return((ulong)(*(ushort *)p)); ++ case 4: return(*p); ++ } ++ } else { ++ return simple_strtoul(s, NULL, 16); ++ } ++} ++ + int do_setexpr(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) + { + ulong a, b; + char buf[16]; ++ int w; + + /* Validate arguments */ + if ((argc != 5) || (strlen(argv[3]) != 1)) { +@@ -39,8 +61,10 @@ int do_setexpr(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) + return 1; + } + +- a = simple_strtoul(argv[2], NULL, 16); +- b = simple_strtoul(argv[4], NULL, 16); ++ w = cmd_get_data_size(argv[0], 4); ++ ++ a = get_arg(argv[2], w); ++ b = get_arg(argv[4], w); + + switch (argv[3][0]) { + case '|': sprintf(buf, "%lx", (a | b)); break; +@@ -64,7 +88,8 @@ int do_setexpr(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) + U_BOOT_CMD( + setexpr, 5, 0, do_setexpr, + "set environment variable as the result of eval expression", +- "name value1 <op> value2\n" ++ "[.b, .w, .l] name value1 <op> value2\n" + " - set environment variable 'name' to the result of the evaluated\n" + " express specified by <op>. <op> can be &, |, ^, +, -, *, /, %" ++ " size argument is only meaningful if value1 and/or value2 are memory addresses" + ); +-- +1.7.0 + |