[PATCH v3 10/11] setexptr: Extend setexpr_get_arg() to handle pointer to memory
lukas.funke-oss at weidmueller.com
lukas.funke-oss at weidmueller.com
Wed Jan 10 10:10:36 CET 2024
From: Lukas Funke <lukas.funke at 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.funke at 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
More information about the U-Boot
mailing list