Compare commits

...

2 Commits

Author SHA1 Message Date
Simon Glass
7c8f839875 bootstd: Improve parsing on extlinux.conf files
These files can have tabs, but they are currently parsed as separate
lines. Fix this.

Also, some files provide a separate 'menu label' which has more
information than the 'label', so use that if available.

Finally, we don't yet have the ability to parse all entries in the
file until the user actually boots the extlinux.conf file. At present,
this means that the last entry is shown. It seems better to use the
first entry, so update it.

Signed-off-by: Simon Glass <sjg@chromium.org>
2025-05-24 07:39:08 -06:00
Simon Glass
f9babb61ff bootstd: Add a function to find an image by type
Provide a way to locate an image in a bootflow based on its type.

Signed-off-by: Simon Glass <sjg@chromium.org>
2025-05-24 07:39:02 -06:00
5 changed files with 59 additions and 3 deletions

View File

@@ -998,6 +998,19 @@ struct bootflow_img *bootflow_img_add(struct bootflow *bflow, const char *fname,
return ptr;
}
const struct bootflow_img *bootflow_img_find(const struct bootflow *bflow,
enum bootflow_img_t type)
{
const struct bootflow_img *img;
alist_for_each(img, &bflow->images) {
if (img->type == type)
return img;
}
return NULL;
}
int bootflow_get_seq(const struct bootflow *bflow)
{
struct bootstd_priv *std;

View File

@@ -388,7 +388,7 @@ int bootmeth_alloc_other(struct bootflow *bflow, const char *fname,
if (ret)
return log_msg_ret("all", ret);
if (!bootflow_img_add(bflow, bflow->fname, type, map_to_sysmem(buf),
if (!bootflow_img_add(bflow, bflow->fname, type, abuf_addr(buf),
size))
return log_msg_ret("boi", -ENOMEM);

View File

@@ -83,13 +83,29 @@ static int extlinux_fill_info(struct bootflow *bflow)
log_debug("parsing bflow file size %x\n", bflow->size);
membuf_init(&mb, bflow->buf, bflow->size);
membuf_putraw(&mb, bflow->size, true, &data);
while (len = membuf_readline(&mb, line, sizeof(line) - 1, ' ', true), len) {
while (len = membuf_readline(&mb, line, sizeof(line) - 1, 0, true), len) {
char *tok, *p = line;
const char *name = NULL;
if (*p == '#')
continue;
while (*p == ' ' || *p == '\t')
p++;
tok = strsep(&p, " ");
if (p) {
if (!strcmp("label", tok)) {
bflow->os_name = strdup(p);
name = p;
if (bflow->os_name)
break; /* just find the first */
} else if (!strcmp("menu", tok)) {
tok = strsep(&p, " ");
if (!strcmp("label", tok)) {
name = p;
}
}
if (name) {
free(bflow->os_name);
bflow->os_name = strdup(name);
if (!bflow->os_name)
return log_msg_ret("os", -ENOMEM);
}

View File

@@ -647,6 +647,17 @@ const char *bootflow_img_type_name(enum bootflow_img_t type);
struct bootflow_img *bootflow_img_add(struct bootflow *bflow, const char *fname,
enum bootflow_img_t type, ulong addr,
ulong size);
/**
* bootflow_img_find() - Find the first image of a given type
*
* @bflow: Bootflow to search
* @type: Image type to search for
* Return: Pointer to image, or NULL if not found
*/
const struct bootflow_img *bootflow_img_find(const struct bootflow *bflow,
enum bootflow_img_t type);
/**
* bootflow_get_seq() - Get the sequence number of a bootflow
*

View File

@@ -1488,6 +1488,22 @@ static int bootstd_images(struct unit_test_state *uts)
ptr = map_sysmem(img->addr, 0);
ut_asserteq(0, *(ulong *)ptr);
/* check we can find images */
bflow = alist_get(&std->bootflows, 1, struct bootflow);
img = bootflow_img_find(bflow, (enum bootflow_img_t)IH_TYPE_SCRIPT);
ut_assertnonnull(img);
ut_asserteq(IH_TYPE_SCRIPT, img->type);
ut_asserteq(map_to_sysmem(bflow->buf), img->addr);
ut_asserteq(bflow->size, img->size);
img = bootflow_img_find(bflow, BFI_LOGO);
ut_assertnonnull(img);
ut_asserteq(BFI_LOGO, img->type);
ut_asserteq(map_to_sysmem(bflow->logo), img->addr);
ut_asserteq(bflow->logo_size, img->size);
ut_assertnull(bootflow_img_find(bflow, BFI_CMDLINE));
ut_assert_console_end();
return 0;