From: Lukas Funke <lukas.fu...@weidmueller.com> Extend setexpr_get_arg() function in order to handle bitmaps with length greater than 8 byte. If the bitmap is provided as hex string the string is parsed into a bitmap.
Signed-off-by: Lukas Funke <lukas.fu...@weidmueller.com> --- (no changes since v1) cmd/setexpr.c | 29 ++++++++++++++++++++++++++--- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/cmd/setexpr.c b/cmd/setexpr.c index 9caa68d20d..fed457bb7e 100644 --- a/cmd/setexpr.c +++ b/cmd/setexpr.c @@ -17,6 +17,7 @@ #include <malloc.h> #include <mapmem.h> #include <linux/sizes.h> +#include <linux/err.h> #include "printf.h" #define MAX_STR_LEN 128 @@ -24,6 +25,8 @@ int setexpr_get_arg(char *s, int w, struct expr_arg *argp) { struct expr_arg arg; + uchar *bmap; + ulong val; /* * If the parameter starts with a '*' then assume it is a pointer to @@ -32,7 +35,6 @@ int setexpr_get_arg(char *s, int w, struct expr_arg *argp) if (s[0] == '*') { ulong *p; ulong addr; - ulong val; int len; char *str; @@ -71,17 +73,38 @@ int setexpr_get_arg(char *s, int w, struct expr_arg *argp) unmap_sysmem(p); arg.ival = val; break; - default: +#if BITS_PER_LONG == 64 + case 8: p = map_sysmem(addr, sizeof(ulong)); val = *p; unmap_sysmem(p); arg.ival = val; break; +#endif + default: + p = map_sysmem(addr, w); + bmap = malloc(w); + if (!bmap) { + printf("Out of memory\n"); + return -ENOMEM; + } + memcpy(bmap, p, w); + arg.bmap = bmap; + unmap_sysmem(p); } } else { if (w == CMD_DATA_SIZE_STR) return -EINVAL; - arg.ival = hextoul(s, NULL); + if (w > sizeof(ulong)) { + bmap = hextobarray(s); + if (IS_ERR(bmap)) { + printf("Out of memory\n"); + return -ENOMEM; + } + arg.bmap = bmap; + } else { + arg.ival = hextoul(s, NULL); + } } *argp = arg; -- 2.30.2