[PATCH 14/24] bootstd: Read the Operating System name for distro/scripts
Heinrich Schuchardt
xypron.glpk at gmx.de
Tue Oct 18 00:14:18 CEST 2022
On 10/17/22 22:29, Simon Glass wrote:
> Add the concept of an OS name to the bootflow. This typically includes the
> OS name, version and kernel version.
>
> Implement this for the distro and script bootmeths so that it works with
> Armbian and older version of Fedora.
How do you plan to detect the distro?
Best regards
Heinrich
>
> Signed-off-by: Simon Glass <sjg at chromium.org>
> ---
>
> boot/bootflow.c | 1 +
> boot/bootmeth_distro.c | 36 ++++++++++++++++++++++++++++++++++++
> boot/bootmeth_script.c | 34 ++++++++++++++++++++++++++++++++++
> cmd/bootflow.c | 1 +
> include/bootflow.h | 3 +++
> test/boot/bootflow.c | 1 +
> 6 files changed, 76 insertions(+)
>
> diff --git a/boot/bootflow.c b/boot/bootflow.c
> index f9ad4099244..163cd4953dd 100644
> --- a/boot/bootflow.c
> +++ b/boot/bootflow.c
> @@ -354,6 +354,7 @@ void bootflow_free(struct bootflow *bflow)
> free(bflow->subdir);
> free(bflow->fname);
> free(bflow->buf);
> + free(bflow->os_name);
> }
>
> void bootflow_remove(struct bootflow *bflow)
> diff --git a/boot/bootmeth_distro.c b/boot/bootmeth_distro.c
> index 5c6c687f0a6..6ef0fa1f2c9 100644
> --- a/boot/bootmeth_distro.c
> +++ b/boot/bootmeth_distro.c
> @@ -66,6 +66,38 @@ static int distro_check(struct udevice *dev, struct bootflow_iter *iter)
> return 0;
> }
>
> +/**
> + * distro_fill_info() - Decode the extlinux file to find out distro info
> + *
> + * @bflow: Bootflow to process
> + * @return 0 if OK, -ve on error
> + */
> +static int distro_fill_info(struct bootflow *bflow)
> +{
> + struct membuff mb;
> + char line[200];
> + char *data;
> + int len;
> +
> + log_debug("parsing bflow file size %x\n", bflow->size);
> + membuff_init(&mb, bflow->buf, bflow->size);
> + membuff_putraw(&mb, bflow->size, true, &data);
> + while (len = membuff_readline(&mb, line, sizeof(line) - 1, ' '), len) {
> + char *tok, *p = line;
> +
> + tok = strsep(&p, " ");
> + if (p) {
> + if (!strcmp("label", tok)) {
> + bflow->os_name = strdup(p);
> + if (!bflow->os_name)
> + return log_msg_ret("os", -ENOMEM);
> + }
> + }
> + }
> +
> + return 0;
> +}
> +
> static int distro_read_bootflow(struct udevice *dev, struct bootflow *bflow)
> {
> struct blk_desc *desc;
> @@ -99,6 +131,10 @@ static int distro_read_bootflow(struct udevice *dev, struct bootflow *bflow)
> if (ret)
> return log_msg_ret("read", ret);
>
> + ret = distro_fill_info(bflow);
> + if (ret)
> + return log_msg_ret("inf", ret);
> +
> return 0;
> }
>
> diff --git a/boot/bootmeth_script.c b/boot/bootmeth_script.c
> index d1c3f940037..8ba9d93a080 100644
> --- a/boot/bootmeth_script.c
> +++ b/boot/bootmeth_script.c
> @@ -35,6 +35,36 @@ static int script_check(struct udevice *dev, struct bootflow_iter *iter)
> return 0;
> }
>
> +/**
> + * script_fill_info() - Decode the U-Boot script to find out distro info
> + *
> + * @bflow: Bootflow to process
> + * @return 0 if OK, -ve on error
> + */
> +static int script_fill_info(struct bootflow *bflow)
> +{
> + char *name = NULL;
> + char *data;
> + uint len;
> + int ret;
> +
> + log_debug("parsing bflow file size %x\n", bflow->size);
> +
> + ret = image_locate_script(bflow->buf, bflow->size, NULL, &data, &len);
> + if (!ret) {
> + if (strstr(data, "armbianEnv"))
> + name = "Armbian";
> + }
> +
> + if (name) {
> + bflow->os_name = strdup(name);
> + if (!bflow->os_name)
> + return log_msg_ret("os", -ENOMEM);
> + }
> +
> + return 0;
> +}
> +
> static int script_read_bootflow(struct udevice *dev, struct bootflow *bflow)
> {
> struct blk_desc *desc = NULL;
> @@ -75,6 +105,10 @@ static int script_read_bootflow(struct udevice *dev, struct bootflow *bflow)
> if (ret)
> return log_msg_ret("read", ret);
>
> + ret = script_fill_info(bflow);
> + if (ret)
> + return log_msg_ret("inf", ret);
> +
> return 0;
> }
>
> diff --git a/cmd/bootflow.c b/cmd/bootflow.c
> index 313103d2775..6b8ac8c8504 100644
> --- a/cmd/bootflow.c
> +++ b/cmd/bootflow.c
> @@ -337,6 +337,7 @@ static int do_bootflow_info(struct cmd_tbl *cmdtp, int flag, int argc,
> printf("Filename: %s\n", bflow->fname);
> printf("Buffer: %lx\n", (ulong)map_to_sysmem(bflow->buf));
> printf("Size: %x (%d bytes)\n", bflow->size, bflow->size);
> + printf("OS: %s\n", bflow->os_name ? bflow->os_name : "(none)");
> printf("Error: %d\n", bflow->err);
> if (dump && bflow->buf) {
> /* Set some sort of maximum on the size */
> diff --git a/include/bootflow.h b/include/bootflow.h
> index 32dbbbbe261..776158c65df 100644
> --- a/include/bootflow.h
> +++ b/include/bootflow.h
> @@ -52,6 +52,8 @@ enum bootflow_state_t {
> * @buf: Bootflow file contents (allocated)
> * @size: Size of bootflow file in bytes
> * @err: Error number received (0 if OK)
> + * @os_name: Name of the OS / distro being booted, or NULL if not known
> + * (allocated)
> */
> struct bootflow {
> struct list_head bm_node;
> @@ -68,6 +70,7 @@ struct bootflow {
> char *buf;
> int size;
> int err;
> + char *os_name;
> };
>
> /**
> diff --git a/test/boot/bootflow.c b/test/boot/bootflow.c
> index e1e07082105..3296316cf0d 100644
> --- a/test/boot/bootflow.c
> +++ b/test/boot/bootflow.c
> @@ -188,6 +188,7 @@ static int bootflow_cmd_info(struct unit_test_state *uts)
> ut_assert_nextline("Filename: /extlinux/extlinux.conf");
> ut_assert_nextlinen("Buffer: ");
> ut_assert_nextline("Size: 253 (595 bytes)");
> + ut_assert_nextline("OS: Fedora-Workstation-armhfp-31-1.9 (5.3.7-301.fc31.armv7hl)");
> ut_assert_nextline("Error: 0");
> ut_assert_console_end();
>
More information about the U-Boot
mailing list