[PATCH] RFC: spl: fit: Use libfdt functions to read stringlist
Simon Glass
sjg at chromium.org
Thu Feb 25 20:31:23 CET 2021
At present the code here reimplements a few libfdt functions and does not
always respect the property length. The !str check is unlikely to fire
since 1 is added to the string address. If strchr() returns NULL then the
code produces (void*)1 instead. Also it might extend beyond the property
value since strchr() does not have a maximum length.
In any case it does not seem worthwhile to implement the libfdt functions
again, despite small code-size advantages. There is no function to return
the count after a failed get, but we can call two functions. We could add
one if code size is considered critical here.
Update the code to use libfdt directly.
For lion-rk3368 (aarch64) this adds 68 bytes of code.
For am57xx_hs_evm (arm) it adds 134 bytes.
Signed-off-by: Simon Glass <sjg at chromium.org>
---
common/spl/spl_fit.c | 31 +++++++++++--------------------
1 file changed, 11 insertions(+), 20 deletions(-)
diff --git a/common/spl/spl_fit.c b/common/spl/spl_fit.c
index 75c8ff065bb..3b5307e4b2d 100644
--- a/common/spl/spl_fit.c
+++ b/common/spl/spl_fit.c
@@ -83,33 +83,24 @@ static int spl_fit_get_image_name(const struct spl_fit_info *ctx,
const char **outname)
{
struct udevice *sysinfo;
- const char *name, *str;
- __maybe_unused int node;
- int len, i;
- bool found = true;
-
- name = fdt_getprop(ctx->fit, ctx->conf_node, type, &len);
- if (!name) {
- debug("cannot find property '%s': %d\n", type, len);
- return -EINVAL;
- }
+ const char *str;
+ int count;
+ bool found;
- str = name;
- for (i = 0; i < index; i++) {
- str = strchr(str, '\0') + 1;
- if (!str || (str - name >= len)) {
- found = false;
- break;
- }
- }
+ count = fdt_stringlist_count(ctx->fit, ctx->conf_node, type);
+ str = fdt_stringlist_get(ctx->fit, ctx->conf_node, type, index, NULL);
+ found = str;
if (!found && CONFIG_IS_ENABLED(SYSINFO) && !sysinfo_get(&sysinfo)) {
int rc;
/*
* no string in the property for this index. Check if the
- * sysinfo-level code can supply one.
+ * sysinfo-level code can supply one. Subtract the number of
+ * strings found in the devicetre node, so that @index numbers
+ * the options in order from 0, starting with the devicetree
+ * property and ending with sysinfo.
*/
- rc = sysinfo_get_fit_loadable(sysinfo, index - i - 1, type,
+ rc = sysinfo_get_fit_loadable(sysinfo, index - count, type,
&str);
if (rc && rc != -ENOENT)
return rc;
--
2.30.1.766.gb4fecdf3b7-goog
More information about the U-Boot
mailing list