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

Reply via email to